Панды Широта-Долгота до расстояния между последовательными рядами [дубликаты]

На этот вопрос уже есть ответ здесь:

Быстрая аппроксимация Haversine (Python / Pandas) 5 ответов

У меня есть следующее в DataFrame Pandas в Python 2.7:

Ser_Numb        LAT      LONG
       1  74.166061 30.512811
       2  72.249672 33.427724
       3  67.499828 37.937264
       4  84.253715 69.328767
       5  72.104828 33.823462
       6  63.989462 51.918173
       7  80.209112 33.530778
       8  68.954132 35.981256
       9  83.378214 40.619652
       10 68.778571 6.607066

Я рассчитываю рассчитать расстояние между последовательными строками в кадре данных. Вывод должен выглядеть примерно так:

Ser_Numb          LAT        LONG   Distance
       1    74.166061   30.512811          0
       2    72.249672   33.427724          d_between_Ser_Numb2 and Ser_Numb1
       3    67.499828   37.937264          d_between_Ser_Numb3 and Ser_Numb2
       4    84.253715   69.328767          d_between_Ser_Numb4 and Ser_Numb3
       5    72.104828   33.823462          d_between_Ser_Numb5 and Ser_Numb4
       6    63.989462   51.918173          d_between_Ser_Numb6 and Ser_Numb5
       7    80.209112   33.530778   .
       8    68.954132   35.981256   .
       9    83.378214   40.619652   .
       10   68.778571   6.607066    .

попытка

Эта почта выглядит несколько похожим, но он рассчитывает расстояние между фиксированными точками. Мне нужно расстояние между последовательными точками.

Я попытался адаптировать это следующим образом:

df['LAT_rad'], df['LON_rad'] = np.radians(df['LAT']), np.radians(df['LONG'])
df['dLON'] = df['LON_rad'] - np.radians(df['LON_rad'].shift(1))
df['dLAT'] = df['LAT_rad'] - np.radians(df['LAT_rad'].shift(1))
df['distance'] = 6367 * 2 * np.arcsin(np.sqrt(np.sin(df['dLAT']/2)**2 + math.cos(df['LAT_rad'].astype(float).shift(-1)) * np.cos(df['LAT_rad']) * np.sin(df['dLON']/2)**2))

Однако я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\Python27\test.py", line 115, in <module>
    df['distance'] = 6367 * 2 * np.arcsin(np.sqrt(np.sin(df['dLAT']/2)**2 + math.cos(df['LAT_rad'].astype(float).shift(-1)) * np.cos(df['LAT_rad']) * np.sin(df['dLON']/2)**2))
  File "C:\Python27\lib\site-packages\pandas\core\series.py", line 78, in wrapper
    "{0}".format(str(converter)))
TypeError: cannot convert the series to <type 'float'>
[Finished in 2.3s with exit code 1]

Эта ошибка была исправлена ​​из комментария MaxU. С исправлением вывод этого расчета не имеет смысла - расстояние составляет почти 8000 км:

   Ser_Numb        LAT       LONG   LAT_rad   LON_rad      dLON      dLAT     distance
0         1  74.166061  30.512811  1.294442  0.532549       NaN       NaN          NaN
1         2  72.249672  33.427724  1.260995  0.583424  0.574129  1.238402  8010.487211
2         3  67.499828  37.937264  1.178094  0.662130  0.651947  1.156086  7415.364469
3         4  84.253715  69.328767  1.470505  1.210015  1.198459  1.449943  9357.184623
4         5  72.104828  33.823462  1.258467  0.590331  0.569212  1.232802  7992.087820
5         6  63.989462  51.918173  1.116827  0.906143  0.895840  1.094862  7169.812123
6         7  80.209112  33.530778  1.399913  0.585222  0.569407  1.380421  8851.558260
7         8  68.954132  35.981256  1.203477  0.627991  0.617777  1.179044  7559.609520
8         9  83.378214  40.619652  1.455224  0.708947  0.697986  1.434220  9194.371978
9        10  68.778571   6.607066  1.200413  0.115315  0.102942  1.175014          NaN

В соответствии с:

этотонлайн калькулятор: Если я использую Latitude1 = 74.166061, Longitude1 = 30.512811, Latitude2 = 72.249672, Longitude2 = 33.427724, тогда я получу 233 кмнайдена функция haversineВот как:print haversine(30.512811, 74.166061, 33.427724, 72.249672) тогда я получаю 232,55 км

Ответ должен быть 233 км, но мой подход дает ~ 8000 км. Я думаю, что что-то не так с тем, как я пытаюсь перебирать последовательные строки.

Вопрос: Есть ли способ сделать это в Пандах? Или мне нужно перебирать кадры данных по одной строке за раз?

Дополнительная информация:

Чтобы создать вышеуказанный DF, выберите его и скопируйте в буфер обмена. Затем:

import pandas as pd
df = pd.read_clipboard()
print df

Ответы на вопрос(1)

Ваш ответ на вопрос