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

Pandas中是否有便捷方法还原一阶差分时间序列的真实值?

如何在Pandas中还原差分后的时间序列预测值?

你问的这个问题其实很常见——用差分让时间序列平稳后做预测,最后得把差分预测值还原成原始尺度才能计算误差。Pandas里虽然没有专门的「逆差分」函数,但有一套简洁的标准做法,比你自己写的粗糙逻辑靠谱多了,结合你的示例给你一步步讲:

核心逻辑

差分的逆操作本质就是累加差分序列 + 基准初始值。对于测试集来说,这个基准值就是训练集的最后一个观测值——因为测试集的第一个原始值 = 训练集最后一个值 + 测试集第一个差分,后续的值以此类推累加。

结合你的示例实操

先把你的示例数据用Pandas实现,再演示还原和误差计算:

import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error

# 构造你的示例数据
df = pd.Series([3, 10, 12, 15, 4])
training = df.iloc[:3]  # 训练集:[3, 10, 12]
test = df.iloc[3:]      # 真实测试值:[15, 4]

# 对训练集做一阶差分(去掉空值)
diff_training = training.diff().dropna()  # [7, 2]

# 模拟模型预测的测试集差分(实际场景中这里是模型输出)
pred_diff_test = pd.Series([3, -11])

还原预测值到原始尺度

这一步是关键,用训练集的最后一个值作为基准,对预测的差分做累加后加上基准:

# 还原预测的测试值
pred_test = training.iloc[-1] + pred_diff_test.cumsum()

运行后pred_test就是[15, 4],和真实测试值完全匹配,完美还原。

计算sqrt(RMSE)

现在就可以直接用还原后的预测值和真实测试值计算误差了:

# 计算RMSE的平方根
sqrt_rmse = np.sqrt(mean_squared_error(test, pred_test))
print(f"sqrt(RMSE): {sqrt_rmse}")  # 这里输出0,因为我们用了真实差分模拟预测

扩展:多阶差分的还原

如果你的数据做了多阶差分(比如两次.diff()),只需要重复这个逻辑即可:先还原高阶差分到低阶,再还原到原始尺度,每次都用上一步还原后的最后一个值作为基准。比如二阶差分的还原:

# 对训练集做二阶差分
diff2_training = diff_training.diff().dropna()  # [-5]

# 模拟预测的二阶差分测试序列
pred_diff2_test = pd.Series([1, -14])  # 对应真实测试一阶差分[3,-11]的差分

# 第一步:还原一阶差分
pred_diff_test = diff_training.iloc[-1] + pred_diff2_test.cumsum()  # [2+1=3, 3+(-14)=-11]

# 第二步:还原原始测试值
pred_test = training.iloc[-1] + pred_diff_test.cumsum()  # [12+3=15, 15+(-11)=4]

总结

这个方法完全利用Pandas内置的cumsum()和索引操作,简洁且没有bug。核心就是抓住差分的数学本质:原始序列 = 基准初始值 + 差分序列的累加和,而测试集的基准值就是训练集的最后一个观测点。

内容的提问来源于stack exchange,提问作者Alex Kornakov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:20:11