Есть ли способ ускорить запрос широты и долготы почтовых индексов в большом кадре данных с помощью pgeocode?

#python #pandas #latitude-longitude #postal-code

Вопрос:

У меня есть фрейм данных примерно из 100 тысяч строк с почтовыми кодами и кодами стран. Я хотел бы получить широту и долготу каждого местоположения и сохранить их в двух новых столбцах. У меня есть рабочий код для образца фрейма данных (например, 100 строк), но запуск его для всех фреймов данных занимает так много времени (>1 часа). Я новичок в Python и подозреваю, что должен быть более быстрый способ сделать это с точки зрения:

  1. Для данного postcode и country_code , я запрашиваю дважды, один раз для широты и один раз для долготы. Я вполне убежден, что мне не следует этого делать (т. Е. Я могу сделать один запрос на строку и создать столбцы широты и долготы соответственно).
  2. То, как я определяю функцию get_lat(pcode, country) get_long(pcode, country) и применяю ее к фрейму данных, неэффективно.

Пример моего кода приведен ниже.

 import pgeocode
import numpy as np
import pandas as pd

#Sample data
df = pd.DataFrame({'postcode':['3011','3083','3071','2660','9308','9999'], 'country_code': ['NL','NL','NL','BE','BE','DE']})

#There are blank postcodes and postcodes that pgeocode cannot return any value, so I am using try-except (e.g. last row in sample dataframe): 
#function to get latitude 
def get_lat(pcode, country):
    try:
        nomi = pgeocode.Nominatim(country)
        x = nomi.query_postal_code(pcode).latitude
        return x
    except:
        return np.NaN

#function to get longitude
def get_long(pcode, country):
    try:
        nomi = pgeocode.Nominatim(country)
        x = nomi.query_postal_code(pcode).longitude
        return x
    except:
        return np.NaN

#Find and create new columns for latitude-longitude based on postcode (ex: 5625) and country of postcode (ex: NL)
df['latitude'] = np.vectorize(get_lat)(df['postcode'],df['country_code'])
df['longitude'] = np.vectorize(get_long)(df['postcode'],df['country_code'])
 

Ответ №1:

В качестве альтернативного решения я загрузил файлы txt с этого веб-сайта: http://download.geonames.org/export/zip/

После загрузки файлов остается просто импортировать файл txt и присоединиться. Это намного быстрее, но статично, т. е. вы используете снимок базы данных почтовых индексов в более раннее время.

Еще одним преимуществом является то, что вы можете проверить файлы и проверить формат почтовых индексов. При использовании pgeocode сложнее отслеживать принятый формат почтового индекса и понимать , почему запросы возвращают значение null.