You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}}

当前实现步骤

  1. 初始化速度列:
df_yt["Vx"] = 0
df_yt["Vy"] = 0
df_yt["Vz"] = 0
  1. 设置第一行速度值:
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
  1. 尝试用向量化方式计算后续速度:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:40:31