Расчет площади под кривой (AUC) графика скорости (м / с) в зависимости от времени (в секунду) с использованием панд и numpy trapz - PullRequest
0 голосов
/ 05 марта 2019

Я работаю с этим CSV-файлом .Я пытаюсь вычислить расстояние, которое машина проехала за 700 секунд, которые она записала.Расстояние должно быть площадью под графиком, так как (м / с) * (s) должно быть метров.

Это мой код:

import csv
import pprint
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
from numpy import trapz


df = pd.read_csv("AutoRitData.csv")

new = df.filter(['timestamp','speed'], axis=1)
new_array = np.concatenate( new.values, axis=0 )
print(new_array)
area = trapz(new_array, dx=1)
print("area =", area)

df.plot(x='timestamp', y='speed')
plt.show()


# print(df.columns)

Я запутался, почему результат эторазные для разных значений дх.На мой взгляд, увеличение количества трапеций (меньшее dx) должно сделать результат более точным, а не меньшим.Или de dx не ширина трапоидов?

Кроме того, я хотел бы изменить цвет линии, где значения кривой выше 13,9 (что составляет 50 км / ч).

Я надеюсь, что кто-то, кто знаком с научным / физическим программированием, сможет мне помочь.

График результатов выглядит следующим образом:

enter image description here

1 Ответ

2 голосов
/ 05 марта 2019

Если вы видите документацию по numpy.trapz

https://docs.scipy.org/doc/numpy/reference/generated/numpy.trapz.html, вы заметите, что dx = 1 по умолчанию - и вы можете иметь любой скаляр

Наилучшая точность, это сделать

import numpy as np 
dx = np.diff(new['timestamp'])

, если ваши временные интервалы меняются и в секундах этого должно быть достаточно

На самом деле, dx должны быть единицами вашего времени, т.е. если вы интегрируете km /h, тогда dx = 3600, если вы планируете умножить на секунды (700).

Для ответа на ваш вопрос dx:

INTEGRAL (Скорость * dx)

Это dx трапеции --- но ваши данные разрешены во времени за 1 секунду, поэтомуВы не можете произвольно установить DX.Если бы у вас было 0,5 секунд данных, вы могли бы сделать dx = 0,5

**** РЕДАКТИРОВАТЬ ****

import pandas as pd
import numpy as np

Df = pd.read_csv('AutoRitData.csv')
Distance1 = np.trapz(Df['speed'],dx=1)
Distance2 = np.trapz(Df['speed'],dx=0.5)
Distance3 = np.trapz(Df['speed'],dx=np.diff(Df['timestamp']))

>>>  Distance1 = 10850.064
>>>  Distance2 = 5425.03
>>>  Distance3 = 10850.064

Очевидно, что Distance3 и Distance1 являются правильными ответами, так как ваши данныене доступен при dx = 0,5, т.е.полсекундное разрешение.

...