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

如何对DataFrame中非平稳列差分并跟踪未差分列(代码问题排查)

时间序列差分处理不生效问题的解决方案

问题背景

需要对数据框train_WE_exog_A_2019中的所有非平稳列执行差分处理,自定义函数adfuller_test返回1表示非平稳、0表示平稳;同时需跟踪各列的差分次数,方便后续预测时执行逆操作。但原有代码未实际执行差分操作,两次运行adfuller_test得到的平稳性结果完全一致。

错误原因

原有代码存在两个核心问题:

  1. 列赋值方式错误:train_exog_diff.column = column.diff().dropna()中的.column是固定属性名,并非动态指向当前循环的列,导致差分结果从未被正确写入目标数据框。
  2. 未实现迭代差分逻辑:仅单次判断平稳性后尝试差分,但未循环处理直到列平稳,也未更新循环中的列数据。

修正后的代码

# 初始化差分后的数据框(复制原数据避免修改原始数据)
train_exog_diff = train_WE_exog_A_2019.copy()
# 初始化字典跟踪每列的差分次数(用于后续逆操作)
diff_tracker = {col: 0 for col in train_exog_diff.columns}

# 遍历每一列,循环差分至平稳
for col in train_exog_diff.columns:
    # 持续检查平稳性,直到列平稳或达到差分次数上限
    while adfuller_test(train_exog_diff[col], name=col) == 1:
        # 执行一阶差分并丢弃缺失值
        train_exog_diff[col] = train_exog_diff[col].diff().dropna()
        diff_tracker[col] += 1
        # 设置差分次数上限,避免极端情况下的无限循环
        if diff_tracker[col] >= 3:
            print(f"警告:列 {col} 经过3次差分后仍未平稳,停止处理")
            break

# 验证处理后的平稳性结果
post_diff_results = [adfuller_test(train_exog_diff[col], name=col) for col in train_exog_diff.columns]
print("处理后各列平稳性结果:", post_diff_results)
print("各列差分次数记录:", diff_tracker)

关键说明

  • 使用train_exog_diff[col]动态定位列进行赋值,确保差分结果被正确保存到目标数据框的对应列。
  • 通过while循环实现迭代差分,直到列达到平稳状态,同时设置差分次数上限(如3次)防止死循环。
  • diff_tracker字典记录每列的差分次数,后续逆操作时可通过多次调用cumsum()还原原始数据(例如差分2次的列需要执行2次累加)。

内容的提问来源于stack exchange,提问作者Hans.nl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:35:29