Как добавить координаты в CSV-файл с именами состояний в python за меньшее время - PullRequest
0 голосов
/ 29 марта 2020

У меня есть рабочий код, который выполняет работу с использованием opencage API, но занимает значительно больше времени. Как я могу реализовать то же самое за меньшее время. Df содержит список всех городов мира, в которых этот раздел кода проходит по всем названиям городов, и добавляет их координаты

ссылку на мой код и файл csv

изображение

key = 'KEY'  # get Your api key from:  https://opencagedata.com
geocoder = OpenCageGeocode(key)

list_lat = []   
list_long = []

for index, row in df.iterrows():

    State = row['city_ascii']       
    query = str(State)

    results = geocoder.geocode(query)   
    lat = results[0]['geometry']['lat']
    long = results[0]['geometry']['lng']

    list_lat.append(lat)
    list_long.append(long)

df['lat'] = list_lat   
df['lon'] = list_long

df.head()

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Этого можно добиться, используя geopy и pandas:

from geopy.geocoders import Nominatim
import pandas as pd

geolocator = Nominatim(user_agent="so_test_YoDa")

cities = pd.read_csv('cities.csv', header = 0)

def getLatLong(city):
    location = geolocator.geocode(city)

    return location.latitude, location.longitude

cities[["lat", "lon"]] = cities.city.apply(getLatLong).apply(pd.Series)

print(cities)

Выход:

          city        lat         lon
0        Tokyo  35.682839  139.759455
1     New York  40.712728  -74.006015
2  Mexico City  19.432630  -99.133178
3       Mumbai  18.938771   72.835335
4    Sao Paulo -23.550651  -46.633382

Пример данных (CSV):

city
Tokyo
New York
Mexico City
Mumbai
Sao Paulo
0 голосов
/ 31 марта 2020

Возможно, код медленный из-за задержки в сети при многократном нажатии OpenCageGeocode. Параллелизм может помочь с операциями ввода / вывода (в вашем случае выборка координат из удаленного API).

То, что я сделал, это поместил код, который выбирает координаты в функцию, затем выполнил эту функцию со всеми возможными состояниями в пул потоков из 5 работников:

import concurrent.futures

key = 'API KEY'  # get Your api key from:  https://opencagedata.com
geocoder = OpenCageGeocode(key)

list_lat = []   
list_long = []


def load_coords(row):       
    query = str(row['city_ascii'])

    results = geocoder.geocode(query)
    lat = results[0]['geometry']['lat1']
    long = results[0]['geometry']['lng1']

    return (lat, long)


with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    results = executor.map(load_coords, (row for _, row in df.iterrows()))
    for coords in results:
        list_lat.append(coords[0])
        list_long.append(coords[1])

Количество работников определяет, сколько запросов выполняется одновременно, поэтому ваш код будет примерно в пять раз быстрее.

Примечание : Этот код может не работать, потому что у меня нет ключа API для его проверки, а также я удалил обработку ошибок для простоты.

Обновление: Код отредактирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...