df.diff () дает вам следующую минус текущую строку.
Поскольку ваши bar_head...
столбцы указывают положение, различия, генерируемые df.diff, можно интерпретировать как векторы, указывающие от текущей к следующей позиции. np.linalg.norm этих векторов дает вам длину векторов, то есть расстояние, пройденное за интервал. Деление на временной интервал дает скорость.
diff = df.diff()
coords = [c for c in df.columns if not 'Time' in c]
np.linalg.norm(diff[coords], axis=1)/diff['Time']
0 NaN
1 25.058420
2 23.172492
3 17.487733
редактировать:
объяснение для 2D-случая
предположим, что у нас есть следующий фрейм данных:
df = pd.DataFrame({'time':[0,1], 'x':[1,2], 'y':[1,2]})
time x y
0 0 1 1
1 1 2 2
в момент времени = 0 мы находимся в позиции [1,1] в момент времени = 1 мы переместились в позицию [2,2]
таким образом, мы прошли 1 в направлении x и 1 в направлении y. Наше общее пройденное расстояние равно sqrt (1 ^ 2 + 1 ^ 2) = sqrt (2)
, используя df.diff (), мы получаем
time x y
0 NaN NaN NaN
1 1.0 1.0 1.0
Здесь мы интерпретируем 1.0 , 1.0 в строке 1 как вектор, который указывает от нашей позиции в момент времени t = 0 до нашей позиции в момент времени t = 1.
Длина этого вектора может быть вычислена по его норме, и аналогичным образом вычисляется как квадрат root 2.
Итак, мы можем использовать np.linalg.norm для вычисления расстояния пройдено за интервал времени.
Скорость просто (пройденное расстояние) / (длина временного интервала)