如何对DataFrame中非平稳列差分并跟踪未差分列(代码问题排查)
时间序列差分处理不生效问题的解决方案
问题背景
需要对数据框train_WE_exog_A_2019中的所有非平稳列执行差分处理,自定义函数adfuller_test返回1表示非平稳、0表示平稳;同时需跟踪各列的差分次数,方便后续预测时执行逆操作。但原有代码未实际执行差分操作,两次运行adfuller_test得到的平稳性结果完全一致。
错误原因
原有代码存在两个核心问题:
- 列赋值方式错误:
train_exog_diff.column = column.diff().dropna()中的.column是固定属性名,并非动态指向当前循环的列,导致差分结果从未被正确写入目标数据框。 - 未实现迭代差分逻辑:仅单次判断平稳性后尝试差分,但未循环处理直到列平稳,也未更新循环中的列数据。
修正后的代码
# 初始化差分后的数据框(复制原数据避免修改原始数据) 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
相关产品推荐
相关产品推荐

