【问题标题】:Get places in a given geographical area (code optimization)获取给定地理区域的地点(代码优化)
【发布时间】:2019-03-10 13:18:31
【问题描述】:

我有一个带有纬度和经度的数据框 (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))

但是,我想让代码更快,因为它非常慢。

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

提前致谢。

附: haversine 是众所周知的函数,用于获取从 lat 和 lng 开始的公里距离。

【问题讨论】:

    标签: python dataframe optimization haversine


    【解决方案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 的每对行之间的距离。

    此外,您应该修改 hasrsine 函数,以便能够接受 DataFrame 行。

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 2012-11-03
      • 1970-01-01
      • 2014-12-21
      • 2013-10-06
      • 2023-03-13
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多