我正在尝试遵循此处的时间序列教程(使用我自己的数据集):
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_stationarity
和enforce invertibility
设置为False
之外。所有预测仍为NaN
edit3:使用伪造的excel数据集,我已经接近了1步。传递start='2018-01-01'
和end='2018-01-21'
得出全0的预测,比NaN
更好。任何人都可以理解这些结果吗?
edit4:设置dynamic=False
返回了合理的预测。显然我不是统计学家
答案 0 :(得分:0)
数据集中缺少某些日期
PHP
对此进行了纠正。
答案 1 :(得分:0)
此行为背后的另一个原因可能是“ 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()