Мой вопрос основан на этом Fast Haversine Approximation (Python/Pandas)
По сути, этот вопрос спрашивает, как вычислить расстояние гаверсуса. Мой вопрос заключается в том, как рассчитать гаверсинусное расстояние между последовательными строками для каждого клиента.
Мой набор данных выглядит примерно как этот фиктивный (предположим, что это настоящие координаты):
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']))