使用 pandas 和 numpy trapz 计算速度(m/s)与时间(每秒)图的曲线下面积(AUC)

Calculating area under curve (AUC) of a speed (m/s) vs time (per second) graph using pandas and numpy trapz

我正在使用这个 csv file。我正在尝试计算汽车在记录的 700 秒内行驶的距离。距离应该是图表下方的区域,因为 (m/s) * (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 值会产生不同的结果。在我看来,制作更多的梯形图(更小的 dx)应该会使结果更准确,而不是更小。还是de dx不是梯形的宽度?

此外,我想更改曲线值高于 13.9(即 50 km/h)的线的颜色。

希望熟悉scientific/physics编程的人能帮帮我。

结果图如下所示:

如果您在 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是

积分(速度 * 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 时不可用,即。半秒分辨率。