ARIMA 和 SARIMAX 的参数

Parameters of ARIMA and SARIMAX

我正在做一个关于时间序列和预测的数据分析项目。我有一个数据框,其中包含我需要处理的大量数据 Covid cases。数据框看起来像这样:

            Covid cases  Confirmed Infections Difference
date                                                    
2020-02-24           19                              NaN
2020-02-25            0                            -19.0
2020-02-26            0                              0.0
2020-02-27            1                              1.0
2020-02-28            2                              1.0
...                 ...                              ...
2021-02-25         1502                           -136.0
2021-02-26         1468                            -34.0
2021-02-27         1474                              6.0
2021-02-28          715                           -759.0
2021-03-01          298                           -417.0

为了进行预测,我使用了 ARIMA 模型(数据框是固定的),然后我尝试将预测线应用于我的图表。我正在为 ARIMA 和 SARIMAX 使用一些参数,然后我用 pandas 打印图表。该线符合时间序列,但未出现在该线结束的位置。

代码:

def timeseries(dataframe, city_name):
    cols = ['ID', 'name']  # Creating columns to be dropped
    dataframe.drop(cols, axis=1, inplace=True)  # Dropping columns that I don't need
    dataframe.columns = ["date", "Covid cases"]
    dataframe.describe()
    dataframe.set_index('date', inplace=True)
    dataframe.plot(figsize=(15, 6))  # Setting figure size
    dataframe['Confirmed Infections Difference'] = dataframe['Covid cases'] - dataframe['Covid cases'].shift(1)
    adfuller_test(dataframe['Confirmed Infections Difference'].dropna())
    model = ARIMA(dataframe['Covid cases'], order=(1, 1, 1))
    model_fit = model.fit(disp=0)
    print(model_fit.summary())
    dataframe['forecast'] = model_fit.predict(start=90, end=103, dynamic=True)
    model = sm.tsa.statespace.SARIMAX(dataframe['Covid cases'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
    results = model.fit()
    dataframe['forecast'] = results.predict(start=90, end=103, dynamic=True)
    future_dates = [dataframe.index[-1] + DateOffset(months=x) for x in range(0, 24)]
    future_datest_df = pd.DataFrame(index=future_dates[1:], columns=dataframe.columns)

    future_datest_df.tail()

    future_df = pd.concat([dataframe, future_datest_df])

    future_df['forecast'] = results.predict(start=104, end=120, dynamic=True)
    future_df[['Covid cases', 'forecast']].plot(figsize=(12, 8))

结果图如下:

如您所知,预测似乎没有正确应用。我想我给 ARIMA 和 SARIMAX 的一些参数有问题。

预期图形示例:

提醒:date 专栏是关于每一天的。我要的预报是接下来几天的。

有什么想法吗?

在实施的几个步骤中,您将 dataframe['forecast'] 列与新计算的结果相等(除了两次预测不同模型的值并将数据帧与类似命名的列连接):

print(model_fit.summary())
dataframe['forecast'] = model_fit.predict(start=90, end=103, dynamic=True)

# ...

dataframe['forecast'] = results.predict(start=90, end=103, dynamic=True)

# ...

future_df = pd.concat([dataframe, future_datest_df])

future_df['forecast'] = results.predict(start=104, end=120, dynamic=True)

请确保:

  • 您没有用均衡完全替换列值,而是附加了新的数据帧条目;
  • 由于名称相似的列,您将在最后绘制正确的列。

我不能确定,因为我没有你的代码的完整结果,但情节中的错误可能来自这些方面...