Как мне создать еще один CSV-файл из yelp_academic_dataset_business.json, который включает в себя только бизнес отелей, ресторанов или обоих? - PullRequest
0 голосов
/ 31 октября 2018

1 Как создать еще один CSV-файл из yelp_academic_dataset_business.json, который включает в себя только бизнес отелей, ресторанов или обеих категорий?

Исходный набор бизнес-данных yelp содержит строки, в которых есть только дантисты, парикмахерские и т. Д. Я хочу выбрать бизнес отелей, ресторанов и только оба.

Я только начал изучать Python и следую учебному пособию по эксперименту по машинному обучению. Приведенный ниже код дает мне ошибку. Я гуглил и много читал, но до сих пор не понимаю. Любая помощь будет оценена.

Изображение того, как выглядит yelp_academic_dataset_business.csv

изображение кода и сообщения об ошибке

data2 = []
with open('yelp_academic_dataset_business.json') as f:
    for line in f:
        data2.append(json.loads(line))
len(data2)

business_id = []
city = []
state = []
stars = []
review_count = []
categories = []
postal_code = []
latitude = []
longitude = []
pricerange = []
is_open = []
name = []


for entry in range(0, len(data2)): 
    if "Restaurants" in data2[entry]["categories"]:
        business_id.append(data2[entry]['business_id'])
        name.append(data2[entry]['name'])
        city.append(data2[entry]['city'])
        state.append(data2[entry]['state'])
        stars.append(data2[entry]['stars'])
        postal_code.append(data2[entry]['postal_code'])
        review_count.append(data2[entry]['review_count'])
        categories.append(data2[entry]['categories'])
        latitude.append(data2[entry]['latitude'])
        longitude.append(data2[entry]['longitude'])
        is_open.append(data2[entry]['is_open'])
        if 'RestaurantsPriceRange2'in data2[entry]['attributes']:
            pricerange.append(data2[entry]['attributes']['RestaurantsPriceRange2'])
        else:
            pricerange.append(0)

data2 = {'business_id ':business_id,'name':name,'city':city,'state':state,'stars':stars,'review_count':review_count,
    'categories':categories,'latitude':latitude,'longitude':longitude,'is_open':is_open,'pricerange':pricerange,'postal_code':postal_code}

business_data = pd.DataFrame (data2)

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я наконец нашел проблему. Ваш код ломается в бизнесе с индексом 21.

if 'RestaurantsPriceRange2' in data2[entry]['attributes']:

Этот оператор проверяет, находится ли "restaurantPriceRange2" в массиве data2 [entry] ['attribute'], но в бизнесе 21 значение ['attribute'] равно None, я думаю, что у бизнеса нет атрибутов.

print data2[21]

{u'city': u'Cleveland', u'neighborhood': u'Central', u'name': u"Rally's Hamburgers", u'business_id': u'gJ5xSt6147gkcZ9Es0WxlA', u'longitude': -81.6663746, u'hours': None, u'state': u'OH', u'postal_code': u'44115', u'categories': u'Fast Food, Burgers, Restaurants', u'stars': 3.0, u'address': u'3040 Carnegie Ave', u'latitude': 41.4999894, u'review_count': 5, u'attributes': None, u'is_open': 1}

Таким образом, вы можете справиться с ошибкой с помощью If, проверяющего, является ли data2 [entry] ['attribute'] чем-то, а не none.

if data2[entry]['attributes'] != None:

Тестирование. Я также обнаружил, что если "Restaurants" в data2 [entry] ["Categories"]: выдает ту же ошибку в некоторых бизнесах, поэтому весь код будет выглядеть так:

import json;

data2 = []
with open('yelp_academic_dataset_business.json') as f:
    for line in f:
        data2.append(json.loads(line))
len(data2)

business_id = []
city = []
state = []
stars = []
review_count = []
categories = []
postal_code = []
latitude = []
longitude = []
pricerange = []
is_open = []
name = []

for entry in range(0, len(data2)):
    if data2[entry]["categories"] != None:
        if "Restaurants" in data2[entry]["categories"]:
            business_id.append(data2[entry]['business_id'])
            name.append(data2[entry]['name'])
            city.append(data2[entry]['city'])
            state.append(data2[entry]['state'])
            stars.append(data2[entry]['stars'])
            postal_code.append(data2[entry]['postal_code'])
            review_count.append(data2[entry]['review_count'])
            categories.append(data2[entry]['categories'])
            latitude.append(data2[entry]['latitude'])
            longitude.append(data2[entry]['longitude'])
            is_open.append(data2[entry]['is_open'])
            if data2[entry]['attributes'] != None:
                if 'RestaurantsPriceRange2' in data2[entry]['attributes']:
                     pricerange.append(data2[entry]['attributes']['RestaurantsPriceRange2'])
                else:
                    pricerange.append(0)

data2 = {'business_id ':business_id,'name':name,'city':city,'state':state,'stars':stars,'review_count':review_count,'categories':categories,'latitude':latitude,'longitude':longitude,'is_open':is_open,'pricerange':pricerange,'postal_code':postal_code}

Имейте в виду, что когда вы читаете json, вам нужно знать о пустых значениях или пустых массивах, поэтому вы всегда хотите проверить, существует ли значение, чтобы ваша программа не вылетала.

0 голосов
/ 31 октября 2018

Эта ошибка означает, что вы выполняете итерацию для объекта None.

В основном data2[entry]['attributes'] это не список, а None

Так что, когда вы делаете

if 'RestaurantsPriceRange2'in data2[entry]['attributes']:

Вы не можете проверить, есть ли элемент в списке, потому что это не список.

Так что сначала вы должны проверить, если это список. Правильная строка

if data2[entry]['attributes'] and 
   'RestaurantsPriceRange2'in data2[entry]['attributes']:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...