Функция для расчета скорости в pandas кадре данных - PullRequest
0 голосов
/ 18 июня 2020

Мне было интересно, есть ли какая-нибудь функция / библиотека, которая может вычислять скорость в pandas кадре данных. У меня есть следующий фрейм данных:

Time    bar_head_x  bar_head_y  bar_head_z
0.00    -203.3502   1554.3486   1102.8210
0.01    -203.4280   1554.3492   1103.0592
0.02    -203.4954   1554.3234   1103.2794   
0.03    -203.5022   1554.2974   1103.4522

Из него я хочу рассчитать скорость, скорость и ускорение. Скорость и ускорение просты: я использовал np.linalg.norm для расчета скорости, например:

speed['head'] = np.linalg.norm(speed[['bar_head_x','bar_head_y','bar_head_z']].values,axis=1)

и .diff() для расчета ускорения по скорости, например:

acc['acc_head'] = (speed['head'].diff()) / ((speed['Time'].diff()))

Но как бы я мог go вычислить скорость таким простым способом? Есть ли такой способ - функция, которая поможет в этом?

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 июня 2020

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 для вычисления расстояния пройдено за интервал времени.

Скорость просто (пройденное расстояние) / (длина временного интервала)

1 голос
/ 18 июня 2020

Если вы ищете вектор скорости, вы можете использовать почти тот же код, который вы использовали для расчета ускорения, за исключением того, что прогоните его над bar_head_x, bar_head_y и bar_head_z, чтобы получить velocity_head_x и и так далее, для каждого компонента вектора скорости.

...