【发布时间】:2019-08-20 16:48:11
【问题描述】:
我的问题基于Fast Haversine Approximation (Python/Pandas)
基本上,该问题询问如何计算半正弦距离。我的是如何计算每个客户的连续行之间的 Haversine 距离。
我的数据集看起来像这个虚拟数据集(假设这些是真实坐标):
Customer Lat Lon
A 1 2
A 1 2
B 3 2
B 4 2
所以在这里,我在第一行什么都没有,第二行是 0,第三行什么也没有,因为一个新客户开始了,无论公里的距离在 (3,2) 和 (4,2) 之间在第四个。
这可以不受客户的限制:
def haversine(lat1, lon1, lat2, lon2, to_radians=True):
if to_radians:
lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])
a = np.sin((lat2-lat1)/2.0)**2 + \
np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2
return 6367 * 2 * np.arcsin(np.sqrt(a))
df=data_full
df['dist'] = \
haversine(df.Lon.shift(), df.Lat.shift(),
df.loc[1:, 'Lon'], df.loc[1:, 'Lat'])
但我无法调整它以与每个新客户重新开始。我试过这个:
def haversine(lat1, lon1, lat2, lon2, to_radians=True):
if to_radians:
lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])
a = np.sin((lat2-lat1)/2.0)**2 + \
np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2
return 6367 * 2 * np.arcsin(np.sqrt(a))
df=data_full
df['dist'] = \
df.groupby('Customer_id')['Lat','Lon'].apply(lambda df: haversine(df.Lon.shift(), df.Lat.shift(),
df.loc[1:, 'Lon'], df.loc[1:, 'Lat']))
【问题讨论】:
-
你遇到了什么问题?
标签: python-3.x pandas haversine