【问题标题】:Rolling window forecast in pythonpython中的滚动窗口预测
【发布时间】:2015-05-08 16:48:22
【问题描述】:

几天前我问了this 问题,但没有得到任何答复。所以我自己动手做滚动窗口。我对回归预测的有限掌握阻碍了我的进步。

但我想做的是根据截至时间 t-255(周期开始)的可用信息对未来 n 天进行预测,然后根据来自t - 255 + n(直到周期结束),例如如果 n = 5,则窗口应产生 255 到 250 的预测,下一个窗口在 250 到 245 等。

from harrv import mdl, df
import scipy as sp
import pandas as pd
import numpy as np

b0, b1, b2, b3 = mdl.params[0], mdl.params[1], mdl.params[2], mdl.params[3]
rv1, rv5, rv22, mu = df.RV1, df.RV5, df.RV22, b0
walk = sp.stats.invgauss.rvs(mu, size = len(rv1))
pre, p = [], []

def window(seq, n):
    """
    seq -> the sequence over which prediction should be performed

    a rolling window function to calculate n-step ahead prediction"""
    for i in reversed(xrange(0, len(seq))):
        for j in range(1, n):
            pre = b0 + rv1[i] * b1**j + rv5[i] * b2**j + rv22[i] * b3**j + walk[i]           
            p.append(pre)
            i = i + n

    return p

其中 mdl 是我的 HAC-OLS 估计的 HAR-RV 模型,参数为 params,我不希望随机噪声有太大的影响,所以我将它的 MU 设置为截距,它非常小。 我不确定我现在是否也这样做,而且更紧迫的是,我不能选择大于 2 的 n 值,因为当我这样做时,这表明:

predi = window(rv1, 4)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-480-bbee880e0682> in <module>()
----> 1 predi = window(rv1, 4)

/Users/NiklasLindeke/Python/window_analysis.py in window(seq, n)
     17     for i in reversed(xrange(0, len(seq))):
     18         for j in range(1, n):
---> 19             pre = b0 + rv1[i] * b1**j + rv5[i] * b2**j + rv22[i] * b3**j + walk[i]
     20             p.append(pre)
     21             i = i + n

/Users/NiklasLindeke/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/series.pyc in __getitem__(self, key)
    512     def __getitem__(self, key):
    513         try:
--> 514             result = self.index.get_value(self, key)
    515 
    516             if not np.isscalar(result):

/Users/NiklasLindeke/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/index.pyc in get_value(self, series, key)
   1458 
   1459         try:
-> 1460             return self._engine.get_value(s, k)
   1461         except KeyError as e1:
   1462             if len(self) > 0 and self.inferred_type in ['integer','boolean']:

/Users/NiklasLindeke/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_value (pandas/index.c:3113)()

/Users/NiklasLindeke/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_value (pandas/index.c:2844)()

/Users/NiklasLindeke/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/index.so in pandas.index.IndexEngine.get_loc (pandas/index.c:3704)()

/Users/NiklasLindeke/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/hashtable.so in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:7255)()

/Users/NiklasLindeke/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/hashtable.so in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:7193)()

KeyError: 259

然而,当我在第一个 for 循环的末尾使用 i = i + n 时,错误消失了,但是当我这样做时,p 中附加了更多内容。

我现在对如何做到这一点没有任何想法。

【问题讨论】:

  • 你到底想在这里做什么?如果您想计算每天、每周等的预测,您应该在外循环中将 I 加一(这似乎是您尝试做的)。当你每天计算对未来的所有预测时,你自然会得到很多 P。现在在内部循环中使用 I+N,您最终会指向变量 RVx 或 walk 的大小。
  • 请参阅编辑,对我的目标进行更具体的描述。
  • 您是否尝试使用“pre = ...”行创建一个数组?我不知道您拥有的数据类型,但在我看来您创建了一个整数。这看起来很奇怪,因为您从定义 pre = [] 开始,但基本上稍后重新定义它。此外,您的索引已关闭您的内部循环为 I 添加了不同的值,并且这些值在外部循环中持续存在,可能导致索引出错(太高)。
  • 第一个预测是 b0,第二个预测是 rv1[i]*b1**j 等等?我不熟悉您所指的 HAC-xx 方法,但对我来说对所有预测使用相同的 I 值似乎很奇怪(为什么不 i+j?)。
  • 第一个预测是方程加上一个噪声项,因为 j 从 1 开始。我不能让它假设任何附加信息。当它在 i 的某个级别开始预测时,它需要根据直到时间 i 的可用信息提前生成 n 个预测,并沿着序列移动直到下一个适当的步进点,即 i + n。跨度>

标签: python regression forecasting


【解决方案1】:

也许是这样的?

for i in reversed(xrange(n, len(seq), n)):
    for j in range(1, n):
        pre = b0 + rv1[i] * b1**j + rv5[i] * b2**j + rv22[i] * b3**j + walk[i]           
        p.append(pre)
        i = i - 1

【讨论】:

  • 您可能还想输入 range(1, n+1)。否则,如果 N = 5,您将获得 1-4、6-9 等值。外循环可能有同样的问题,这取决于你的情况..
  • 它无法处理 n > 2 的问题仍然存在,并且由于某种原因它仅返回 128 行数据。但是,当我在第一个循环中取出 n 时,它会返回适当数量的行。
  • 您希望有多少行? 255/5 就是 51。所以我想我还是不太了解你。如果索引太大,您是否仍然遇到同样的错误?
  • 不,我希望有 255 行,因为“i”将数据集从模型进行预测的位置移动,而前面的 n 天是它附加 p 的位置并一直执行到 255。但是循环中的第三个参数是跳过,当它已经有 i -1 时,它不应该这样跳过。
  • 如果我们取 seq = 255 和 n = 5,第一行创建一个列表 [250,245,240,235, ...]。这意味着结果列表将包含 51 个值,其中第一个是 i = 250,249,248,247,246 的数组。内部 i -1 就是这样,它在外部循环内执行 249,248,247,246。想要与众不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2020-08-18
相关资源
最近更新 更多