p,se,ci = arma_model.forecast(steps = 3,alpha = 0.05)df_forecast = pd.DataFrame({'time':range(1991,1993)}) df_forecast['predict'] = 12000 + np.cumsum(ci) df_forecast报错 Length of values (1) does not match length of index (2)
时间: 2024-03-01 11:54:07 浏览: 59
这个错误的原因是你在创建 `df_forecast` DataFrame 时,指定了 `range(1991,1993)` 作为时间索引,但是在给 `predict` 列赋值时,只提供了一个长度为1的值。因此,长度不匹配导致了该错误。
你可以通过在 `predict` 列中提供一个长度为2的值列表来解决这个问题,如下所示:
```
p,se,ci = arma_model.forecast(steps=3, alpha=0.05)
df_forecast = pd.DataFrame({'time': range(1991, 1994)})
df_forecast['predict'] = [12000 + ci[0], 12000 + np.cumsum(ci)[1], 12000 + np.cumsum(ci)[2]]
```
这将使用 `ci` 中的前两个值来填充 `predict` 列,以匹配索引长度为2的 `df_forecast` DataFrame。
相关问题
p,se,ci = arma_model.forecast(steps = 3,alpha = 0.05) df_forecast = pd.DataFrame({'time':range(1991,2001)}) df_forecast['predict'] = 12000 + ci.cumsum() df_forecast
在这段代码中,`arma_model.forecast(steps = 3, alpha = 0.05)`方法返回了3个值,分别是预测值`p`、标准误差`se`和置信区间`ci`。然后,这些值被用来创建一个新的数据框`df_forecast`,其中`'time'`列包含从1991到2000的年份,`'predict'`列包含12000加上`ci`数组的累积和。这样可以得到一个预测值序列和对应的置信区间,并将它们保存到数据框中以便进一步分析。
需要注意的是,`ci`是一个数组,而不是单个值,因此不能直接调用`ci.cumsum()`方法。如果你想要计算`ci`数组的累积和,可以使用NumPy的`cumsum()`方法,例如:
```python
import numpy as np
import pandas as pd
p, se, ci = arma_model.forecast(steps=3, alpha=0.05)
df_forecast = pd.DataFrame({'time': range(1991, 2001)})
df_forecast['predict'] = 12000 + np.cumsum(ci)
print(df_forecast)
```
在上面的示例中,我们使用了NumPy的`cumsum()`方法来计算`ci`数组的累积和,并将结果添加到`'predict'`列中。这样就能正确地运行代码并得到预期的结果。
sales = list(np.diff(data["#Passengers"])) data2 = { "Month":data1.index[1:], #1月1日是空值,从1月2号开始取 "#Passengers":sales } df = pd.DataFrame(data2) df['Month'] = pd.to_datetime(df['Month']) #df[''date]数据类型为“object”,通过pd.to_datetime将该列数据转换为时间类型,即datetime。 data_diff = df.set_index(['Month'], drop=True) #将日期设置为索引 data_diff.head() print(data_diff) fig = plt.figure(figsize=(12,8)) ax1=fig.add_subplot(211) fig = sm.graphics.tsa.plot_acf(data_diff,lags=20,ax=ax1) ax2 = fig.add_subplot(212) fig = sm.graphics.tsa.plot_pacf(data_diff,lags=20,ax=ax2) plt.show() # 为了控制计算量,我们限制AR最大阶不超过6,MA最大阶不超过4。 sm.tsa.arma_order_select_ic(data_diff,max_ar=100,max_ma=4,ic='aic')['aic_min_order'] # AIC ''' #对模型进行定阶 pmax = int(len(df) / 10) #一般阶数不超过 length /10 qmax = int(len(df) / 10) bic_matrix = [] for p in range(pmax +1): temp= [] for q in range(qmax+1): try: temp.append(ARIMA(data, (p, 1, q)).fit().bic) except: temp.append(None) bic_matrix.append(temp) bic_matrix = pd.DataFrame(bic_matrix) #将其转换成Dataframe 数据结构 p,q = bic_matrix.stack().idxmin() #先使用stack 展平, 然后使用 idxmin 找出最小值的位置 print(u'BIC 最小的p值 和 q 值:%s,%s' %(p,q)) # BIC 最小的p值 和 q 值:0,1 #所以可以建立ARIMA 模型,ARIMA(0,1,1) ''' model = ARIMA(data, (0,1,1)).fit() #model.summary2() predictions_ARIMA_diff = pd.Series(model.fittedvalues, copy=True) print("========") print(predictions_ARIMA_diff.head()) exit() plt.figure(figsize=(10, 6)) plt.plot(predictions_ARIMA_diff,label="forecast_diff") plt.plot(data_diff,label="diff") plt.xlabel('日期',fontsize=12,verticalalignment='top') plt.ylabel('销量差分',fontsize=14,horizontalalignment='center') plt.legend() plt.show()
这段代码首先计算了原始数据的一阶差分,并将差分后的销量数据存储在一个名为"sales"的列表中。然后,根据差分后的销量数据创建了一个新的DataFrame,并将日期列转换为Datetime格式。接下来,将日期列设置为索引,并打印出数据的前几行。
然后,代码绘制了差分后销量数据的自相关性(ACF)和偏自相关性(PACF)图。图形显示了滞后项与自相关系数/偏自相关系数之间的关系。
接下来,代码使用ARMA模型的AIC准则进行了模型定阶。限制了AR最大阶不超过6,MA最大阶不超过4。
然后,代码建立了ARIMA(0,1,1)模型,并使用该模型对差分后的数据进行了拟合。拟合后得到的值存储在predictions_ARIMA_diff中,并打印出前几行。
最后,代码绘制了拟合值和差分后数据的图形,并使用exit()函数退出程序。
阅读全文