如何使用大约 pandas DataFrame 加速 geopy 计算。 10 万个条目?

How do I speed up geopy calculations for a pandas DataFrame with approx. 100k entries?

我有一个名为“订单”的 pandas DataFrame,大约有。 100k 个条目 包含地址数据(邮编、城市、国家/地区)。对于每个条目,我想计算到特定预定义地址的距离

到目前为止,我正在使用 for 循环遍历数据帧行并使用 geopy 到 1。获取纬度和经度值 和 2。计算到我预定义地址的距离

尽管这可行,但它需要花费大量时间(超过 15 小时,平均每秒 2 次迭代)并且我认为我还没有找到最有效的方法。虽然我做了很多研究并尝试了矢量化等不同的东西,但这些替代方案似乎并没有加快这个过程(可能是因为我没有以正确的方式实现它们,因为我不是一个非常有经验的 Python 用户).

到目前为止,这是我的代码:

def get_geographic_information():

    latitude = destination_geocode.latitude
    
    longitude = destination_geocode.longitude

    destination_coordinates = (latitude, longitude)

    distance = round(geopy.distance.distance(starting_point_coordinates, destination_coordinates).km, 2)
    
    return latitude, longitude, distance
import geopy
from geopy.geocoders import Nominatim
import geopy.distance

orders["Latitude"] = ""
orders["Longitude"] = ""
orders["Distance"] = ""

geolocator = Nominatim(user_agent="Project01")

starting_point = "my_address"
starting_point_geocode = geolocator.geocode(starting_point, timeout=10000)
starting_point_coordinates = (starting_point_geocode.latitude, starting_point_geocode.longitude)

for index in tqdm(range(len(orders))):
    destination_zip = orders.loc[index, "ZIP"]
    destination_city = orders.loc[index, "City"]
    destination_country = orders.loc[index, "Country"]
        
    destination = destination_zip + " " + destination_city + " " + destination_country
    destination_geocode = geolocator.geocode(destination, timeout=15000)
    
    if destination_geocode != None:
        geographic_information = get_geographic_information()
        
        orders.loc[index, "Latitude"] = geographic_information[0]
        
        orders.loc[index, "Longitude"] = geographic_information[1]
        
        orders.loc[index, "Distance"] = geographic_information[2]
    
    else:
        orders.loc[index, "Latitude"] = "-"
        
        orders.loc[index, "Longitude"] = "-"
        
        orders.loc[index, "Distance"] = "-"

根据我之前的研究,我了解到 for 循环可能是问题所在,但我还没有设法替换它。由于这是我在这里的第一个问题,我将不胜感激任何建设性的反馈。提前致谢!

使用 Nominatim 可能会限制脚本的速度。他们按照这个 link:

将速度限制为每秒 1 个请求

https://operations.osmfoundation.org/policies/nominatim/

加快此脚本速度的唯一方法是找到允许批量请求的不同服务。 Geopy has a list 当前支持的地理编码服务。最好的办法是浏览此列表,看看是否找到处理批量请求的服务(例如 Google V3。这将允许您批量发出请求或使用分布式流程来加快处理速度。