【问题标题】:Python- ARIMA predictions returning all NaNsPython-ARIMA 预测返回所有 NaN
【发布时间】:2018-11-29 16:13:25
【问题描述】:

我正在尝试按照这里的时间序列教程(使用我自己的数据集):

https://www.analyticsvidhya.com/blog/2018/02/time-series-forecasting-methods/

令人惊讶的是,我能够圆满完成第 7 部分:ARIMA。在本节中,我有点磕磕绊绊。它的“预测”列中的所有值都是 NaN。

在终端中,我看到了 a date index has been provided but it has no associated frequency information and so will be ignored when forecasting

我的测试数据集在没有交易发生时有一些日期差距,所以我用 test=test.set_index('DATE').asfreq('D', fill_value=0) .我也对我的 ARIMA 数据集做同样的事情,所以索引与测试集匹配。

其余相关代码如下:

train=df[0:180]
test=df[180:]
SARIMA=test.copy()

fit=sm.tsa.statespace.SARIMAX(train['COUNT'], order=(1,1,1), seasonal_order=(0,0,0,5)).fit()
SARIMA['SARIMA']=fit3.predict(start=0, 
    end=93,dynamic=True)

print(SARIMA) 
print(test)

在打印输出中,测试集和 ARIMA 集的索引相同。 ARIMA 包含一列SARIMA,其中包含预测,但它们都是NaN。我错过了什么?

test
DATE        COUNT
2018-06-21    1
2018-06-22    3
..
2018-11-21    3
2018-11-22    4

SARIMA
DATE        COUNT    SARIMA
2018-06-21    1       NaN
2018-06-22    3       NaN
..
2018-11-21    3       NaN
2018-11-22    4        NaN

编辑: 由于某种原因statsmodels 根本无法检测到索引频率。我试过了 SARIMA=SARIMA.set_index('DATE').asfreq('D',fill_value=0) SARIMA.index=pd.to_datetime(SARIMA.index) SARIM.index=pd.DatetimeIndex(SARIMA.index.values, freq='D') 但警告总是出现

编辑:我直接尝试在 Excel 中创建一个新数据集:

DATE       COUNT
2018/01/01   1
2018/01/02   2
..
2018/01/10   3
2018/01/11   4

使用上述相同的行创建模型,除了将enforce_stationarityenforce invertibility 设置为False。所有预测还是NaN

edit3:使用伪造的 excel 数据集,我已经接近了 1 步。通过start='2018-01-01'end='2018-01-21' 得到全0 的预测,这比NaN 好。谁能理解这些结果?

edit4:设置 dynamic=False 返回合理的预测。显然我不是统计学家

【问题讨论】:

  • 训练或测试数据集是否有Nan
  • 运行df.isnull().values.any() 产生False 所以我认为没有NaNs

标签: python-3.x pandas indexing statsmodels arima


【解决方案1】:

这种行为背后的另一个原因可能是“sarimax”参数。我还没有找到覆盖它的方法,所以如果这是原因,请尝试更改您的初始参数。

import random
import statsmodels.api
import numpy as np
import matplotlib.pyplot as plt

endog = np.array(random.sample(range(100,200), 17))

for cd in range(2):

    m = statsmodels.api.tsa.statespace.SARIMAX(
                                                    endog = endog,
                                                    order = (1,1,1),
                                                    seasonal_order = (0,cd,0,12),
                                                    trend = 'n'
                                               ).fit()


    plt.plot(endog)
    plt.plot(m.fittedvalues)
    plt.title('D: ' + str(cd))
    plt.show()

【讨论】:

    【解决方案2】:

    数据集中缺少一些日期 SARIMA.index=pd.DatetimeIndex(SARIMA.index.values, freq='D') 更正了这一点。

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2017-10-13
      • 2016-02-13
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      • 2021-03-01
      相关资源
      最近更新 更多