Функция для расчета скорости в кадре данных pandas

Мне было интересно, есть ли какая-то функция/библиотека, которая может вычислять скорость в кадре данных 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()))

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

Спасибо!


person Oam    schedule 18.06.2020    source источник
comment
скорость в какой точке? Начальная скорость?   -  person Ann Zen    schedule 18.06.2020
comment
@AnnZen больше похож на временной ряд скорости, поэтому для каждого индекса (0-3 выше) я хотел бы иметь вектор скорости   -  person Oam    schedule 18.06.2020
comment
Является ли speed именем фрейма данных?   -  person Suraj Subramanian    schedule 18.06.2020
comment
@SurajSubramanian Да, для ускорения я создаю новый df с именем acc, но да.   -  person Oam    schedule 18.06.2020


Ответы (2)


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.

Длину этого вектора можно вычислить по его норме, и она также равна квадратному корню из 2.

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

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

person warped    schedule 18.06.2020
comment
это выводит скаляр, разве скорость не является вектором? - person Oam; 18.06.2020
comment
с предоставленным вами кадром данных это выводит четыре значения, соответствующие скорости в каждый момент времени. Я отредактировал вывод в ответ - person warped; 18.06.2020
comment
Итак, в каждый момент времени скорость является скаляром, связанным с векторами положения в этом индексе? Если да, то почему? (Извините, я давно их не изучал, поэтому плохо помню) - person Oam; 18.06.2020
comment
@oam я пытался объяснить двумерный случай в своем редактировании - person warped; 18.06.2020

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

person Cz_    schedule 18.06.2020