Python Pandas Применение функции обратного геокодирования ко всем столбцам занимает слишком много времени? - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь преобразовать геокодирование 4 столбцов в названия местоположений с помощью этой библиотеки.https://github.com/thampiman/reverse-geocoder код работает, но даже для 20 строк это занимает около 30 секунд, у меня более 100 000 строк, поэтому это занимает вечность. Интересно, почему это происходит?

Пример данных

pickup_longitude pickup_latitude dropoff_longitude dropoff_latitude
-73.982155 40.767937 -73.964630 40.765602
-73.981049 40.744339 -73.973000 40.789989

Результат:

 pickup_longitude pickup_latitude dropoff_longitude dropoff_latitude pickup_district dropoff_district
    -73.982155 40.767937 -73.964630 40.765602 Manhattan Manhattan
    -73.981049 40.744339 -73.973000 40.789989 Long Island City Manhattan

Код:

ds['pickup_district'] = ds.apply(lambda row: rg.search((row['pickup_latitude'],row['pickup_longitude']))[0]['name'],axis=1)
ds['dropoff_district'] = ds.apply(lambda row: rg.search((row['dropoff_latitude'],row['dropoff_longitude']))[0]['name'],axis=1)

плюс басмадан geçmeyin sincaplar;)

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Ваша текущая структура вызывает метод rg.search один раз для каждой строки в вашем DataFrame.

Было бы более эффективно сначала создать список кортежей, а затем вызвать rg.search один раз для удаленияи один раз для пикапа.Например:

pickup_coords = ds[['pickup_latitude', 'pickup_longitude']].apply(tuple, axis=1).tolist()
dropoff_coords = ds[['dropoff_latitude', 'dropoff_longitude']].apply(tuple, axis=1).tolist()

pickup_results = rg.search(pickup_coords, mode=2)
ds['pickup_district'] = [x['name'] for x in pickup_results]

dropoff_results = rg.search(dropoff_coords, mode=2)
ds['dropoff_district'] = [x['name'] for x in dropoff_results]
1 голос
/ 06 марта 2019

Вы можете позвонить в библиотеку со всеми местами одновременно.Например:

pickups = list(zip(ds.pickup_latitude, ds.pickup_longitude))
dropoffs = list(zip(ds.dropoff_latitude, ds.dropoff_longitude))

pickup_locations = rg.search(pickups)
dropoff_locations = rg.search(dropoffs)

ds['pickup_district'] = [p["name"] for p in pickup_locations]
ds['dropoff_district'] = [d["name"] for d in dropoff_locations]

Это намного быстрее, чем вызов для каждой строки (как применяется).

...