我目前正在尝试使用Python进行地理编码。流程如下:我有两个数据帧(df1和df2,房屋和学校),具有纬度和经度值,并且想要找到df1中每个观测值的df2中最近的邻居。我使用以下代码:
from tqdm import tqdm
import numpy as np
import pandas as pd
import math
def distance(lat1, long1, lat2, long2):
R = 6371 # Earth Radius in Km
dLat = math.radians(lat2 - lat1) # Convert Degrees 2 Radians
dLong = math.radians(long2 - long1)
lat1 = math.radians(lat1)
lat2 = math.radians(lat2)
a = math.sin(dLat/2) * math.sin(dLat/2) + math.sin(dLong/2) * math.sin(dLong/2) * math.cos(lat1) * math.cos(lat2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = R * c
return d
dists = []
schools =[]
for index, row1 in tqdm(df1.iterrows()):
for index, row2 in df2.iterrows():
dists.append(distance(row1.lat, row1.lng, row2.Latitude, row2.Longitude))
schools.append(min(dists))
del dists [:]
df1["school"] = pd.Series(schools)
代码可以运行,但是速度非常慢。使用tqdm后,每秒只能处理2个df1的迭代。相比之下,我使用STATA中的geonear完成了整个任务,对于df1中所有观察值(950个),仅需1秒钟。我在geonear的帮助文件中读到,他们使用聚类来避免计算所有距离,而只计算最近的距离。然而,在添加聚类功能之前(这也可能会消耗CPU资源),我想知道是否有人看到了一些可以加快当前进程速度的方法(我是Python的新手,可能存在一些低效的代码导致进程变慢)。或者,也许有一个可以更快地处理这个任务的软件包?
如果它需要的时间比STATA长,那么也没关系,但不要接近7分钟...
先感谢您的帮助。