Это не полный ответ, и мое время истекло, но я уверен, что вы можете взять его отсюда
import numpy as np
import pandas as pd
def cartesian(d):
# cols = d.keys()
d.loc[:, 'key_col'] = 1
outer = pd.merge(d, d, on='key_col', suffixes=('', '_2')).drop('key_col', axis=1).reset_index(drop=True)
return outer
def haversine2(lat1, lat2, lon1, lon2, to_radians=True, R = 6371):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees or in radians)
All (lat, lon) coordinates must have numeric dtypes and be of equal length.
"""
if to_radians:
lat1, lat2, lon1, lon2 = np.radians([lat1, lat2, lon1, lon2])
a = np.sin((lat2-lat1)/2.0)**2 + \
np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2
return R * 2 * np.arcsin(np.sqrt(a))
if __name__ == "__main__":
def main():
a = pd.DataFrame({"ID": [1, 2, 3, 4, 5, 6, 7, 8],
'Latitude': [29.39291, 29.39923, 29.4014, 29.38752, 29.39537, 29.39343, 29.39556, 29.39706],
'Longitude': [-98.50925, -98.51256, -98.51123, -98.52372, -98.50402, -98.49707, -98.53148,
-98.49565]})
cartesian_df = cartesian(a)
print(cartesian_df)
func = lambda row: haversine2(row['Latitude'], row['Latitude_2'], row['Longitude'], row['Longitude_2'])
distances_df = cartesian_df.apply(func, axis=1)
print(distances_df)
result = cartesian_df
result['distances'] = distances_df
print(result)
main()
Это вычисляет столбец distances
для каждой комбинации входов в соответствии с вашим function.
Вы можете переформатировать это в соответствии со своими потребностями.
output:
ID Latitude Longitude ID_2 Latitude_2 Longitude_2 distances
0 1 29.39291 -98.50925 1 29.39291 -98.50925 0.000000
1 1 29.39291 -98.50925 2 29.39923 -98.51256 0.772456
2 1 29.39291 -98.50925 3 29.40140 -98.51123 0.963335
3 1 29.39291 -98.50925 4 29.38752 -98.52372 1.524651
4 1 29.39291 -98.50925 5 29.39537 -98.50402 0.575805
.. .. ... ... ... ... ... ...
59 8 29.39706 -98.49565 4 29.38752 -98.52372 2.919048
60 8 29.39706 -98.49565 5 29.39537 -98.50402 0.832361
61 8 29.39706 -98.49565 6 29.39343 -98.49707 0.426437
62 8 29.39706 -98.49565 7 29.39556 -98.53148 3.475146
63 8 29.39706 -98.49565 8 29.39706 -98.49565 0.000000
Примечание: запуск функции на вашем входе напрямую не дает ожидаемых результатов. попробуйте haversine2(29.39291, 29.39923, -98.50925, -98.51256, to_radians=True, R = 6371)
[это ids = 1, 2] и получите 0.7724556421884609