python - Как решить "ValueError: Форма переданных значений (228, 1), индексы подразумевают (228, 7)" - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь закончить sh от выполнения задания для курса, и мне трудно заставить один аспект моего кода работать правильно.

Я использую API-интерфейс foursquare, чтобы исследовать окрестности в Портленде и найти, в каких из них есть книжные магазины (и подобные места). Я близок к тому, чтобы он выполнялся, но я продолжаю отмечать вышеупомянутый ValueError и не знаю, как реструктурировать мой DF, чтобы он имел правильную форму.

Вот мой код:

def getNearbyVenues(names, latitudes, longitudes, limit=500):

    venues_list=[]
    for name, lat, lng in zip(names, latitudes, longitudes):
        print(name)
        url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&ll={},{}&v={}&query={}&radius={}&limit={}'.format(
            CLIENT_ID, 
            CLIENT_SECRET, 
            VERSION,
            lat,
            lng,
            query, 
            radius, 
            LIMIT)

        try:
            results = requests.get(url, "none").json()['response']['groups'][0]['items']


            venues_list.extend([(
                name, 
                lat, 
                lng, 
                v['venue']['name'], 
                v['venue']['location']['lat'], 
                v['venue']['location']['lng'],  
                v['venue']['categories'][0]['name']) for v in results])

        except KeyError:
            venues_list.extend([
                name,
                lat,
                lng]) 

    nearby_venues = pd.DataFrame(venues_list, columns = ['Neighborhood', 
                  'Neighborhood Latitude', 
                  'Neighborhood Longitude', 
                  'Venue', 
                  'Venue Latitude', 
                  'Venue Longitude', 
                  'Venue Category'])

    return(nearby_venues)

*** NEXT CELL***

PDX_venues = getNearbyVenues(names=PDX_NeighDF['Neighborhood'],
                             latitudes=PDX_NeighDF['Latitude'],
                             longitudes=PDX_NeighDF['Longitude']
                             )

PDX_venues.head()

Я взял исходную функцию из предыдущей лаборатории в курсе, поэтому я знаю, что она должна работать. Первая ячейка на самом деле выполняется нормально, но ValueError помечается в следующей ячейке, где я пытаюсь использовать определенную функцию. Что заставляет меня думать, что проблема должна быть в самой функции. Мне пришлось внести в него некоторые изменения для своего уникального задания, чтобы это могло быть частью проблемы. Вот изменения в функцию, которую я сделал за пределами базовых c входов:

  1. В некоторых районах Портленда нет мест, которые были возвращены в моем запросе API и которые помечали «KeyError», поскольку в возвращаемом json у них не было секции «group», поэтому мне пришлось добавить строки «try / исключением», за исключением районов, которые не возвращали места. Это работало нормально, когда я впервые запустил его и разрешил ячейка для выполнения. Однако использование этой функции в следующей ячейке привело к значению «ValueError».

  2. Я попытался исправить ValueError в следующей ячейке, изменив venues_list.append .extend по предложению другого пользователя в сообщении stackoverflow, у которого возникла проблема, аналогичная моей. Похоже, это не сильно помогло, так как я все еще получаю ValueError, но до того, как он был помечен как имеющий один элемент вместо 7 (то же самое вопрос, другая форма).

Любая помощь будет принята с благодарностью, это был трудный проект, и я был Я смог продвинуться далеко вперед, используя свои собственные ресурсы, но эта проблема меня полностью озадачила. Заранее спасибо!

Кроме того, вот полная трассировка ValueError:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/conda/envs/python/lib/python3.6/site-packages/pandas/core/internals/managers.py in create_block_manager_from_blocks(blocks, axes)
   1677                 blocks = [
-> 1678                     make_block(values=blocks[0], placement=slice(0, len(axes[0])))
   1679                 ]

~/conda/envs/python/lib/python3.6/site-packages/pandas/core/internals/blocks.py in make_block(values, placement, klass, ndim, dtype, fastpath)
   3283 
-> 3284     return klass(values, ndim=ndim, placement=placement)
   3285 

~/conda/envs/python/lib/python3.6/site-packages/pandas/core/internals/blocks.py in __init__(self, values, placement, ndim)
   2791 
-> 2792         super().__init__(values, ndim=ndim, placement=placement)
   2793 

~/conda/envs/python/lib/python3.6/site-packages/pandas/core/internals/blocks.py in __init__(self, values, placement, ndim)
    127                 "Wrong number of items passed {val}, placement implies "
--> 128                 "{mgr}".format(val=len(self.values), mgr=len(self.mgr_locs))
    129             )

ValueError: Wrong number of items passed 1, placement implies 7

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-40-66be6cf8c7d3> in <module>
      1 PDX_venues = getNearbyVenues(names=PDX_NeighDF['Neighborhood'],
      2                              latitudes=PDX_NeighDF['Latitude'],
----> 3                              longitudes=PDX_NeighDF['Longitude']
      4                              )
      5 

<ipython-input-39-53e5a94bf83d> in getNearbyVenues(names, latitudes, longitudes, limit)
     39                   'Venue Latitude',
     40                   'Venue Longitude',
---> 41                   'Venue Category'])
     42 
     43     return(nearby_venues)

~/conda/envs/python/lib/python3.6/site-packages/pandas/core/frame.py in __init__(self, data, index, columns, dtype, copy)
    462                     mgr = arrays_to_mgr(arrays, columns, index, columns, dtype=dtype)
    463                 else:
--> 464                     mgr = init_ndarray(data, index, columns, dtype=dtype, copy=copy)
    465             else:
    466                 mgr = init_dict({}, index, columns, dtype=dtype)

~/conda/envs/python/lib/python3.6/site-packages/pandas/core/internals/construction.py in init_ndarray(values, index, columns, dtype, copy)
    211         block_values = [values]
    212 
--> 213     return create_block_manager_from_blocks(block_values, [columns, index])
    214 
    215 

~/conda/envs/python/lib/python3.6/site-packages/pandas/core/internals/managers.py in create_block_manager_from_blocks(blocks, axes)
   1686         blocks = [getattr(b, "values", b) for b in blocks]
   1687         tot_items = sum(b.shape[0] for b in blocks)
-> 1688         construction_error(tot_items, blocks[0].shape[1:], axes, e)
   1689 
   1690 

~/conda/envs/python/lib/python3.6/site-packages/pandas/core/internals/managers.py in construction_error(tot_items, block_shape, axes, e)
   1717         raise ValueError("Empty data passed with indices specified.")
   1718     raise ValueError(
-> 1719         "Shape of passed values is {0}, indices imply {1}".format(passed, implied)
   1720     )
   1721 

ValueError: Shape of passed values is (228, 1), indices imply (228, 7)

1 Ответ

0 голосов
/ 30 января 2020

Проблема может сводиться к вашему предложению except, которое не заключено во встроенный кортеж, как предложение try. В результате venues_list расширяет каждый элемент базовой коллекции. Поэтому вместо [(tuple of vals), tuple(val1, val2, val3), (tuple of vals)] вы передаете [(tuple of vals), val1, val2, val3, (tuple of vals)] в DataFrame конструктор.

except KeyError:
     venues_list.extend([(
           name,
           lat,
           lng)]) 

Также рассмотрите возможность перехвата любого исключения, которое может быть связано с вызовом запроса API, а не просто возвращено json. Также добавьте numpy.nan для пропущенных столбцов (поэтому NaN, а не None приводит к кадру данных).

except Exception as e:
     print(e.message)

     venues_list.extend([(
           name,
           lat,
           lng,
           np.nan,
           np.nan,
           np.nan,
           np.nan)]) 
...