ARIMA模型计算RSS时触发ValueError报错求助
解决ARIMA模型计算RSS时的ValueError问题
我来帮你搞定这个报错!你遇到的ValueError: Cannot add integral value to Timestamp without freq.主要是因为维度不匹配和索引对齐的问题,咱们一步步拆解解决:
问题回顾
你基于自相关函数(ACF)和偏自相关函数(PACF)构建了AR(6,0,0)模型,拟合和绘图功能都正常,但计算RSS(残差平方和)时触发了时间戳相关的错误,代码和报错信息如下:
你的代码:
import matplotlib.pylab as plt from matplotlib.pylab import rcParams rcParams['figure.figsize'] = 15, 6 import pandas as pd from statsmodels.tsa.arima_model import ARIMA df = pd.read_csv('data.csv', header=0, index_col=0, parse_dates=True, sep=';') model = ARIMA(df, order=(6, 0, 0)) results_ARIMA = model.fit(disp=-1) plt.plot(df, color='blue', label='Original') plt.plot(results_ARIMA.fittedvalues, color='red', label='Predicted') plt.plot(results_ARIMA.predict(start = 23, end = 34, dynamic=True), color='red') plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-df)**2))
报错信息:
File "C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile execfile(filename, namespace) File "C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile exec(compile(f.read(), filename, 'exec'), namespace) File "C:/Users/Patrick Ulanday/Desktop/Thesis/ARIMA/CRWFR_boundary_ARIMA/ARIMA.py", line 64, in print ('RSS: %.4f'% sum((results_ARIMA.fittedvalues-df)**2)) File "pandas/_libs/tslib.pyx", line 787, in pandas._libs.tslib.Timestamp.__radd__ File "pandas/_libs/tslib.pyx", line 1275, in pandas._libs.tslib._Timestamp.__add__ ValueError: Cannot add integral value to Timestamp without freq.
报错原因
- 维度不匹配:你传给ARIMA模型的是整个DataFrame
df,但模型输出的fittedvalues是单维Series。当你执行fittedvalues - df时,pandas会广播生成DataFrame,后续求和操作会错误地把时间戳索引当成数值参与计算,触发报错。 - 索引对齐问题:AR(6)模型需要前6个观测值作为滞后项,所以
fittedvalues是从第7个观测开始生成的,直接和整个df做减法会产生大量NaN,进一步引发计算异常。
解决方案
最省心的方法是直接用模型结果的resid属性(残差序列)来计算RSS——resid已经自动对齐了原始值和拟合值,并且只保留有效的残差数据:
修改后的代码:
import matplotlib.pylab as plt from matplotlib.pylab import rcParams rcParams['figure.figsize'] = 15, 6 import pandas as pd from statsmodels.tsa.arima_model import ARIMA # 读取数据,建议明确提取目标时间序列列(替换成你实际的列名) df = pd.read_csv('data.csv', header=0, index_col=0, parse_dates=True, sep=';') ts = df['your_target_column'] # 比如你数据里的列叫'value'就改成df['value'] # 用单变量Series构建模型,避免维度问题 model = ARIMA(ts, order=(6, 0, 0)) results_ARIMA = model.fit(disp=-1) plt.plot(ts, color='blue', label='Original') plt.plot(results_ARIMA.fittedvalues, color='red', label='Predicted') plt.plot(results_ARIMA.predict(start=23, end=34, dynamic=True), color='red') # 用resid计算RSS,自动忽略前6个无效的NaN残差 rss = sum(results_ARIMA.resid.dropna() ** 2) plt.title(f'RSS: {rss:.4f}') plt.legend() plt.show()
备选方案(如果坚持用fittedvalues计算)
如果你想手动用拟合值计算,需要确保两者都是Series且索引对齐:
# 提取原始序列中对应拟合值的部分(从第7个观测开始) original_subset = ts[6:] rss = sum((results_ARIMA.fittedvalues - original_subset) ** 2)
小提示
以后构建单变量时间序列模型时,尽量传入Series而不是DataFrame,这样能避免很多不必要的维度和索引问题~
内容的提问来源于stack exchange,提问作者Patrick Jackson
相关产品推荐
相关产品推荐

