Python时间序列分析:生成预测区间及ARIMA代码报错解决
时间序列预测区间生成问题修复
报错原因
model_fit.forecast()方法仅返回预测值数组,无法解包为forecast, stderr, conf_int三个变量。正确做法是使用get_forecast()方法获取完整的预测结果对象,从中提取预测值、标准误和置信区间。
修复后的完整代码
import warnings import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA from statsmodels.tools.sm_exceptions import ConvergenceWarning # 忽略警告 warnings.simplefilter('ignore', ConvergenceWarning) warnings.filterwarnings("ignore") # 加载数据 data = pd.read_csv(r"C:\mydirectory\myfile.csv", header=0, parse_dates=True, index_col=0) # 拆分训练集和测试集 train_size = int(len(data) * 0.8) train, test = data.iloc[:train_size], data.iloc[train_size:] # 拟合ARIMA模型 model = ARIMA(train, order=(5, 1, 1)) model_fit = model.fit() # 获取预测结果对象(针对测试集长度的预测) n_forecast = len(test) forecast_result = model_fit.get_forecast(steps=n_forecast) # 提取核心预测数据 forecast = forecast_result.predicted_mean stderr = forecast_result.se_mean conf_int_95 = forecast_result.conf_int(alpha=0.05) # 绘制预测可视化图 plt.figure(figsize=(12, 6)) plt.plot(train.index, train.values, label='训练数据', color='blue') plt.plot(test.index, test.values, label='实际数据', color='green') plt.plot(test.index, forecast, label='预测数据', color='red') plt.fill_between(test.index, conf_int_95[:, 0], conf_int_95[:, 1], color='pink', alpha=0.3, label='95%预测区间') plt.title('时间序列预测与预测区间') plt.xlabel('日期') plt.ylabel('数值') plt.legend(loc='upper left') plt.grid(True) plt.show() # 输出不同置信水平的预测区间(5%到90%) prediction_intervals = [0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90] for alpha in prediction_intervals: conf_int = forecast_result.conf_int(alpha=alpha) # 输出第一个预测步的区间示例,如需全部步长可循环遍历conf_int每一行 print('%.1f%% 预测区间: %.3f 介于 %.3f 和 %.3f 之间' % ((1 - alpha) * 100, forecast.iloc[0], conf_int.iloc[0, 0], conf_int.iloc[0, 1]))
关键修复点
- 替换
forecast()为get_forecast():该方法返回PredictionResults对象,包含预测值、标准误、置信区间等完整信息,彻底避免解包错误。 - 统一区间提取逻辑:使用
conf_int(alpha=alpha)获取对应置信水平的预测区间,alpha为显著性水平(如95%置信区间对应alpha=0.05)。 - 适配Pandas对象操作:
predicted_mean和conf_int返回Pandas Series/DataFrame,用iloc索引更规范。
补充说明
- 预测区间针对未来单个观测值,包含模型误差和随机波动,比针对预测均值的置信区间更宽,符合你对未来值预测的需求。
- 若需预测训练集之后的全新未来值(而非测试集对比),只需将
n_forecast设为目标步数(比如12代表未来12个月),并生成对应的日期索引即可。
内容的提问来源于stack exchange,提问作者wasmithpfs
相关产品推荐
相关产品推荐

