使用Python进行时间序列预测的标准流程
本文详细演示如何借助 Python 生态进行时间序列预测,完整梳理数据预处理、平稳性 ADF 检验、八二切分训练集、ARIMA 模型拟合并输出预测值的标准操作流程,附赠可直接运行的评估代码。
时间序列预测准备条件与目标
利用 Python 进行单变量时间序列预测的核心目标是建立历史数据的统计规律并外推未来值。本流程以 statsmodels 库中的 ARIMA(自回归积分滑动平均)模型为例,适用于具备一定趋势或季节性波动的时间序列分析。实际操作前需确保运行环境已安装 pandas、numpy、matplotlib、statsmodels 与 scikit-learn。
第1步:导入核心库并初始化示例数据
目的:加载数据分析工具链,构造带索引的时间序列对象以便后续建模。
操作入口:新建 .py 文件或使用 Jupyter Notebook 单元格。
具体动作与参数:通过 pd.date_range 设定起始日期与采样频率(如日频 'D'),利用 np.cumsum() 累积随机正态分布噪声生成非平稳基准数据。该步骤仅用于验证流程通顺,实际项目中应替换为 CSV 读取或 API 拉取的真实业务指标。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
# 生成模拟时间序列数据
np.random.seed(0)
date_range = pd.date_range(start='2020-01-01', periods=100, freq='D')
data = np.random.normal(0, 1, size=(100,)).cumsum()
time_series_data = pd.Series(data, index=date_range)
第2步:执行平稳性统计检验(ADF)
目的:ARIMA 模型要求输入序列呈弱平稳状态。若原始数据存在明显趋势或方差漂移,直接建模会导致伪回归。
具体动作:调用 adfuller() 进行增广迪基-富勒检验。重点关注返回的 p-value 指标。
from statsmodels.tsa.stattools import adfuller
result = adfuller(time_series_data)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
完成判断:当 p-value 小于显著性水平 0.05 时,可判定序列平稳;否则需在模型参数 d(差分阶数)中增加整数进行一阶或多阶差分,直至满足平稳条件。
第3步:划分训练集与测试集
目的:防止未来信息泄露,严格遵循时间序列的前向验证逻辑。
具体动作:按时间顺序切分,通常取 0.8 比例作为训练样本,剩余部分保留至测试集以模拟真实推理场景。
# 拆分数据集
train_size = int(len(time_series_data) * 0.8)
train, test = time_series_data[:train_size], time_series_data[train_size:]
第4步:配置并拟合 ARIMA 模型
目的:将结构化的历史数据传入估计算法(默认最大似然估计),求解最优系数。
参数说明:元组 (p, d, q) 分别代表自回归阶数、差分次数与移动平均阶数。本例采用经验值 (5, 1, 0),生产环境应结合 ACF/PACF 截尾拖尾特征或网格搜索确定。
# 创建 ARIMA 模型
model = ARIMA(train, order=(5, 1, 0))
model_fit = model.fit()
第5步:生成预测结果并计算误差
目的:输出未来步长预测值,并通过量化指标验证模型泛化能力。
具体动作:调用 forecast(steps=...) 获取点预测序列。使用 mean_squared_error 对比测试集真实标签与预测输出。
# 进行预测
predictions = model_fit.forecast(steps=len(test))
predictions_series = pd.Series(predictions, index=test.index)
# 计算均方误差
mse = mean_squared_error(test, predictions_series)
print(f'Mean Squared Error: {mse}')
辅助步骤:可视化诊断与完整脚本归档
目的:直观核对拟合轨迹,便于排查过拟合或欠拟合现象。以下为整合上述逻辑的可独立运行脚本。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.stattools import adfuller
# 生成模拟时间序列数据
np.random.seed(0)
date_range = pd.date_range(start='2020-01-01', periods=100, freq='D')
data = np.random.normal(0, 1, size=(100,)).cumsum()
time_series_data = pd.Series(data, index=date_range)
# 检查时间序列的平稳性
result = adfuller(time_series_data)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
# 拆分数据集
train_size = int(len(time_series_data) * 0.8)
train, test = time_series_data[:train_size], time_series_data[train_size:]
# 创建和训练 ARIMA 模型
model = ARIMA(train, order=(5, 1, 0))
model_fit = model.fit()
# 进行预测
predictions = model_fit.forecast(steps=len(test))
predictions_series = pd.Series(predictions, index=test.index)
# 评估模型
mse = mean_squared_error(test, predictions_series)
print(f'Mean Squared Error: {mse}')
# 可视化
train.plot(label='Training Data')
test.plot(label='Test Data')
predictions_series.plot(label='Predictions')
plt.legend()
plt.show()
排错指南与效果验证
拟合报负概率或非方阵错误:多因样本量过小或参数 (p,d,q) 总和超过数据长度所致。建议调低阶数或扩充历史窗口。
残差检验不通过:若模型未捕捉全部周期规律,预测曲线会呈现系统性滞后。此时应尝试 SARIMA 模型引入季节性参数,或切换至 Prophet、XGBoost 等融合外部特征的算法。
总结
以上就是基于 Python 进行时间序列预测的标准流程与 ARIMA 模型实战要点。掌握数据平稳性校验、合理划分时序切分比例以及关键参数的调试技巧后,即可将该架构迁移至金融行情、库存周转或能耗监测等业务场景。更多关于 Python 数据分析与机器学习建模的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













