我正在使用这个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)的线的颜色。
我希望熟悉科学/物理编程的人可以帮助我。
结果图如下所示:
如果你看到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时是不可用的,即。半秒分辨率。