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

问题描述 投票:0回答:1

我正在使用这个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不是trapoids的宽度?

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

我希望熟悉科学/物理编程的人可以帮助我。

结果图如下所示:

enter image description here

python pandas distance game-physics scientific-computing
1个回答
2
投票

如果你看到numpy.trapz上的文档

https://docs.scipy.org/doc/numpy/reference/generated/numpy.trapz.html你会注意到,dx = 1是默认值 - 你可以有任何标量

最准确,就是做

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

如果你的timedeltas正在改变,几秒钟就足够了

实际上,dx应该是你的时间单位,即如果你正在积分km / h,那么如果你计划乘以秒数(700),则dx = 3600。

要回答你的问题,dx是

INTEGRAL(Velocity * 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时是不可用的,即。半秒分辨率。

© www.soinside.com 2019 - 2024. All rights reserved.