获取给定地理区域中的地点(代码优化)

时间:2019-03-10 13:18:32

标签: python dataframe optimization haversine

我有一个具有经纬度和经度的数据框架(restaurants)和一个具有经纬度和经度的邻域(area)的数据框架。

我想针对每个社区计算3公里(numberR)地区的餐馆数量。

我已经编写了以下代码,并且可以正常工作:

df=pd.DataFrame()
numberR=[]
radius=3

for element in range(0,area['lon'].count()): #for every neighborhood  
    df=pd.DataFrame()
    df['destLat']=restaurants['lat']
    df['originLat']=areas['lat'][element]
    df['destLon']= restaurants['lng']
    df['originLon']=area['lon'][element]

    for i, row in df.iterrows():
        #for every restaurant I compute the distance from my neighborhood in km
        l=[haversine(df.originLon[i],df.originLat[i],df.destLon[i],df.destLat[i]) for i, row in df.iterrows()]

    numberR.append(sum(x<radius for x in l))

但是,由于速度很慢,我想使代码更快。

您是否知道如何在更短的时间内达到相同的结果?

谢谢。

P.S。 haversine是众所周知的函数,用于从lat和lng开始获取以千米为单位的距离。

1 个答案:

答案 0 :(得分:1)

我建议您使用scipy.spacial.distance中的功能。

from scipy.spatial.distance import cdist

distances = cdist(areas, restaurants, metric=haversine)  # metric accepts a callable
sum(distances > 3)  # sums columns

cdist函数计算两个DataFrame的每对行之间的距离。

此外,您还应该修改Haversine函数,使其能够接受DataFrame行。