使用 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 时不可用,即。半秒分辨率。
我正在使用这个 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 时不可用,即。半秒分辨率。