计算数据框熊猫点之间距离的通用函数

时间:2019-07-03 05:54:47

标签: python-3.x

我有一个数据帧,其中有cellID的纬度和经度列(70,000行)。 我的实际要求是计算所有点之间的距离(成对)。但是由于我只有8GB的内存,所以我无法做到这一点。因此,我认为一个更好的解决方案是编写一个通用函数,该函数可以找到任意两个给定点之间的距离[dist(orig,dest)],还可以计算从一个点(orig)到数据帧中所有其他点的距离未提及“目标”参数,并且还提供了一个选项,以过滤距离小于某些kms [dist(orig,dest,fltr_km)]的距离。 我想以最快的方式计算这些。 我已经尝试了一些在Internet上找到的代码,并进行了一些修改,并且可以正常工作。

import pandas as pd
import numpy as np
import os
rr=os.getcwd()
df1=pd.read_csv(rr+'\\siteDB.csv')
df=df1[['Parent_Fdn_EUtranCellFDD','Lat','Long']]
df=df.drop_duplicates()
df.index=df.Parent_Fdn_EUtranCellFDD
print(df.index[3])
import math
def distance_calc(lon1, lat1, lon2, lat2):
    #print(lon1[0], lon2[0])
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])

    dlon = lon2 - lon1
    dlat = lat2 - lat1

    a = np.sin(dlat / 2.0) ** 2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon / 2.0) ** 2

    c = 2 * np.arcsin(np.sqrt(a))
    km = 6367 * c

    return km
def get_distance(lat_1, lng_1, lat_2, lng_2): 
    d_lat = lat_2 - lat_1
    d_lng = lng_2 - lng_1 

    temp = (  
         math.sin(d_lat / 2) ** 2 
       + math.cos(lat_1) 
       * math.cos(lat_2) 
       * math.sin(d_lng / 2) ** 2
    )

    return 6373.0 * (2 * math.atan2(math.sqrt(temp), math.sqrt(1 - temp)))
lat = df['Lat'].values
lon = df['Long'].values
import time

dist=[]
g=len(lat)
def dist(orig, dest=None, ftr_km=None, greater_than=False):
    t1=time.time()
    if dest==None:

        d = distance_calc(np.full((g), df.loc[orig, 'Long']), np.full((g), df.loc[orig, 'Lat']), lon, lat)
        if ftr_km !=  None:

            df['d'] = pd.Series(d, index=df.index)
            if greater_than:
                df1=df[df['d'] > ftr_km]
                t2=time.time()
                print(t2-t1)
                df1.to_excel(rr+'\\out.xlsx')
            else:
                df1=df[df['d'] < ftr_km]
                t2=time.time()
                print(t2-t1)
                df1.to_excel(rr+'\\out.xlsx')
        else:
            df1=df.copy(deep=True)
            df1['d'] = pd.Series(d, index=df.index)
            t2=time.time()
            print(t2-t1)
            df1.to_excel(rr+'\\out.xlsx')
    else:
        print(df.loc[orig, 'Lat'])
        d = get_distance(df.loc[orig, 'Lat'], df.loc[orig, 'Long'],df.loc[dest, 'Lat'], df.loc[dest, 'Long'])

        t2=time.time()
        print(t2-t1)

如果有比这更好和有效的解决方案,谁能提供给我?

0 个答案:

没有答案