如何使用大约 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。这将允许您批量发出请求或使用分布式流程来加快处理速度。
我有一个名为“订单”的 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。这将允许您批量发出请求或使用分布式流程来加快处理速度。