Pandas公式计算加速度转速度结果异常问题求助
加速度计数据积分计算速度的问题
数据结构
处理的DataFrame结构如下:
{'T': {0: 0.007719999999999999, 1: 0.016677999999999797, 2: 0.024630999999996697, 3: 0.0325849999999983, 4: 0.040530999999995196}, 'Ax': {0: 0.16, 1: 0.28, 2: 0.28, 3: 0.44, 4: 0.57}, 'Ay': {0: 8.0, 1: 7.9, 2: 7.87, 3: 7.87, 4: 7.9}, 'Az': {0: 3.83, 1: 3.83, 2: 3.79, 3: 3.76, 4: 3.76}, 'delta T': {0: 0.00772, 1: 0.008957999999999798, 2: 0.0079529999999969, 3: 0.007954000000001606, 4: 0.007945999999996893}}
当前实现步骤
- 初始化速度列:
df_yt["Vx"] = 0 df_yt["Vy"] = 0 df_yt["Vz"] = 0
- 设置第一行速度值:
df_yt.loc[0,"Vx"] = 0.16*0.007720 df_yt.loc[0,"Vy"] = 8.00*0.007720 df_yt.loc[0,"Vz"] = 3.83*0.007720
- 尝试用向量化方式计算后续速度:
df_yt.loc[1:,"Vx"] = df_yt["Vx"].shift(1) + df_yt["Ax"]*df_yt["delta T"] df_yt.loc[1:,"Vy"] = df_yt["Vy"].shift(1) + df_yt["Ay"]*df_yt["delta T"] df_yt.loc[1:,"Vz"] = df_yt["Vz"].shift(1) + df_yt["Az"]*df_yt["delta T"]
问题描述
代码无报错,但计算结果不符合预期。例如索引2的Vx预期为0.003743 + 0.28*0.007953 = 0.005970,但实际计算值错误。
问题原因
pandas的向量化操作基于原始列数据计算,df_yt["Vx"].shift(1)调用的是初始设置的Vx列(仅第一行有值,其余为0),而非逐行计算后更新的Vx值。因此后续行的计算都是基于0 + Ax*deltaT,而非前一行的实际速度值。
解决方案
方法1:高效累积求和(推荐)
速度计算本质是加速度与时间间隔乘积的累积求和,直接用cumsum()实现:
# 直接计算速度的累积和,无需手动初始化第一行 df_yt["Vx"] = (df_yt["Ax"] * df_yt["delta T"]).cumsum() df_yt["Vy"] = (df_yt["Ay"] * df_yt["delta T"]).cumsum() df_yt["Vz"] = (df_yt["Az"] * df_yt["delta T"]).cumsum()
该方法会自动从第一行开始累积,结果完全符合前一行速度 + 当前行Ax*deltaT的逻辑。
方法2:逐行循环计算(适合小数据集)
如果需要明确逐行更新的逻辑,可使用循环:
# 初始化速度列并设置第一行 df_yt["Vx"] = 0 df_yt["Vy"] = 0 df_yt["Vz"] = 0 df_yt.loc[0,"Vx"] = df_yt.loc[0,"Ax"] * df_yt.loc[0,"delta T"] df_yt.loc[0,"Vy"] = df_yt.loc[0,"Ay"] * df_yt.loc[0,"delta T"] df_yt.loc[0,"Vz"] = df_yt.loc[0,"Az"] * df_yt.loc[0,"delta T"] # 逐行计算后续速度 for i in range(1, len(df_yt)): df_yt.loc[i, "Vx"] = df_yt.loc[i-1, "Vx"] + df_yt.loc[i, "Ax"] * df_yt.loc[i, "delta T"] df_yt.loc[i, "Vy"] = df_yt.loc[i-1, "Vy"] + df_yt.loc[i, "Ay"] * df_yt.loc[i, "delta T"] df_yt.loc[i, "Vz"] = df_yt.loc[i-1, "Vz"] + df_yt.loc[i, "Az"] * df_yt.loc[i, "delta T"]
验证
以索引2的Vx为例,计算结果为:0.16*0.00772 + 0.28*0.008958 + 0.28*0.007953 = 0.005970,与预期完全一致。
内容的提问来源于stack exchange,提问作者Francisco Barroca
相关产品推荐
相关产品推荐

