start/end statsmodels AutoReg.predict 参数的含义
Meaning of start/end params of statsmodels AutoReg.predict
我知道之前有人问过这个问题,但解决方案与新 statsmodel
版本 (0.12) 无关。
我在 pandas
中有这个数据集,数据框的名称是 train
:
date value
2017-01-09 0.331836
2017-01-10 0.330815
2017-01-11 0.329794
2017-01-12 0.328773
2017-01-13 0.327752
... ...
2020-05-29 0.254081
2020-05-30 0.267420
2020-05-31 0.280758
2020-06-01 0.294097
2020-06-02 0.309384
日期列是索引,我的最迟日期是 2020-06-02。我想获得从上次日期算起的 14 天的预报,即 2020-06-03(含)至 2020-06-16(含)期间的预报。我不确定我是否正确理解了开始和结束参数。
from statsmodels.tsa.ar_model import AutoReg,ar_select_order
f = 14
mod = ar_select_order(train[y_col].ravel(), maxlag=15)
AutoRegfit = AutoReg(train[y_col].ravel(), trend='c', lags=mod.ar_lags).fit()
AutoRegfit.predict(start=len(train),end=len(train)+f-1,dynamic=False)
>>> array([0.32489822, 0.34010067, 0.35508626, 0.36968769, 0.38416325,
0.39825263, 0.41186002, 0.42501389, 0.43766567, 0.44985079,
0.46153405, 0.47270074, 0.48336156, 0.49351065])
这看起来不错,但是,这是否意味着第一个预测 (0.32489822) 属于日期 2020-06-03 或 2020-06-02?因为通常在 python 中,当您指定一个范围时,第一个值被包括在内,最后一个不包括在内。
在文档中说:
the first forecast is start
这是否意味着 start
参数应该是 len(train)+1
而不是 len(train)
?
这里没有设置 start=len(train)
是正确的。请注意,在此上下文中,Python 中的索引从 0 开始。因此,pandas 系列中的最后一个可用索引将是 len(train)-1
.
验证这一点的一种简单方法是将 .predict()
的预测与手动计算的预测进行比较。因为我无权访问您的数据,所以我将使用 documentation 中的太阳黑子示例进行说明。在那里我们估计以下自回归模型
import statsmodels.api as sm
from statsmodels.tsa.ar_model import AutoReg
data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
res = AutoReg(data, lags=[1, 11, 12]).fit()
使用 .predict()
预测明年的价值现在产生
print(res.predict(start=len(data), end=len(data)))
>>> 35.964103
与人工计算的预测相同
print(sum(res.params * [1, *data.iloc[[-1, -11, -12]]]))
>>> 35.964103
我知道之前有人问过这个问题,但解决方案与新 statsmodel
版本 (0.12) 无关。
我在 pandas
中有这个数据集,数据框的名称是 train
:
date value
2017-01-09 0.331836
2017-01-10 0.330815
2017-01-11 0.329794
2017-01-12 0.328773
2017-01-13 0.327752
... ...
2020-05-29 0.254081
2020-05-30 0.267420
2020-05-31 0.280758
2020-06-01 0.294097
2020-06-02 0.309384
日期列是索引,我的最迟日期是 2020-06-02。我想获得从上次日期算起的 14 天的预报,即 2020-06-03(含)至 2020-06-16(含)期间的预报。我不确定我是否正确理解了开始和结束参数。
from statsmodels.tsa.ar_model import AutoReg,ar_select_order
f = 14
mod = ar_select_order(train[y_col].ravel(), maxlag=15)
AutoRegfit = AutoReg(train[y_col].ravel(), trend='c', lags=mod.ar_lags).fit()
AutoRegfit.predict(start=len(train),end=len(train)+f-1,dynamic=False)
>>> array([0.32489822, 0.34010067, 0.35508626, 0.36968769, 0.38416325,
0.39825263, 0.41186002, 0.42501389, 0.43766567, 0.44985079,
0.46153405, 0.47270074, 0.48336156, 0.49351065])
这看起来不错,但是,这是否意味着第一个预测 (0.32489822) 属于日期 2020-06-03 或 2020-06-02?因为通常在 python 中,当您指定一个范围时,第一个值被包括在内,最后一个不包括在内。
在文档中说:
the first forecast is start
这是否意味着 start
参数应该是 len(train)+1
而不是 len(train)
?
这里没有设置 start=len(train)
是正确的。请注意,在此上下文中,Python 中的索引从 0 开始。因此,pandas 系列中的最后一个可用索引将是 len(train)-1
.
验证这一点的一种简单方法是将 .predict()
的预测与手动计算的预测进行比较。因为我无权访问您的数据,所以我将使用 documentation 中的太阳黑子示例进行说明。在那里我们估计以下自回归模型
import statsmodels.api as sm
from statsmodels.tsa.ar_model import AutoReg
data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
res = AutoReg(data, lags=[1, 11, 12]).fit()
使用 .predict()
预测明年的价值现在产生
print(res.predict(start=len(data), end=len(data)))
>>> 35.964103
与人工计算的预测相同
print(sum(res.params * [1, *data.iloc[[-1, -11, -12]]]))
>>> 35.964103