Python ARIMA时间序列预测:解决forecast_variance属性不存在报错
问题原因与解决方案
核心报错原因
statsmodels.tsa.arima.model.ARIMA训练得到的ARIMAResults对象没有forecast_variance方法,你混淆了旧版ARIMA(如statsmodels.tsa.arima_model.ARIMA)和新版接口的用法。新版ARIMA的预测方差需要通过get_forecast()方法获取,而非直接调用forecast_variance。
具体修改步骤
1. 修正预测值与方差的获取逻辑
在calculate_prediction_intervals方法中,替换原有的预测代码:
# 原错误代码 forecast = model_fit.forecast(steps=n_forecast_steps) forecast_variance = model_fit.forecast_variance(steps=n_forecast_steps) stderr = np.sqrt(model_fit.forecast_variance(steps=n_forecast_steps)) # 修改为 forecast_result = model_fit.get_forecast(steps=n_forecast_steps) forecast = forecast_result.predicted_mean # 获取点预测值 forecast_variance = forecast_result.var_pred_mean # 获取预测方差 stderr = np.sqrt(forecast_variance) # 计算标准误
2. 修正方法返回值
你调用calculate_prediction_intervals时尝试接收三个返回值,但原方法只返回两个,需要修改方法的return语句:
# 原return语句 return forecast, prediction_intervals # 修改为 return forecast, forecast_variance, prediction_intervals
3. 修正差分逻辑(可选但重要)
你的difference_series方法逻辑错误,累加多次差分结果会导致数据失真,正确的d阶差分应该是逐次对前一次的差分结果再做差分:
def difference_series(self, order): diff_series = self.series.copy() # 执行order[1]次差分 for _ in range(order[1]): diff_series = diff_series.diff().dropna() return diff_series
4. 修正绘图方法的参数匹配
你调用plot_original_series时传入了forecast_variance,但方法定义中没有该参数,且方法内部未用到它,可去掉多余参数:
# 原调用代码 ts_forecast.plot_original_series(forecast, forecast_variance, prediction_intervals, best_order) # 修改为 ts_forecast.plot_original_series(forecast, prediction_intervals, best_order)
同时确保方法定义的参数列表与调用一致:
def plot_original_series(self, forecast, prediction_intervals, order): # 原方法逻辑不变
额外注意事项
- 新版
statsmodels的ARIMA接口(statsmodels.tsa.arima.model.ARIMA)与旧版(statsmodels.tsa.arima_model.ARIMA)API差异较大,建议优先参考官方文档中的新版用法。 - 代码中存在两处重复的
Usage代码块,运行时会执行第二次的实例化逻辑,建议删除其中一处避免混乱。
内容的提问来源于stack exchange,提问作者wasmithpfs
相关产品推荐
相关产品推荐

