R中的滚动窗口

时间:2019-02-01 14:52:18

标签: r rolling-computation

我有一部分代码是滚动迭代的第一步

class baseclass(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
        self._numeric_attrs = set(kwargs.keys())

    def calcValue(self):
        return sum(getattr(self, attr) for attr in self._numeric_attrs)

因此,基本上,这将为每个for (u in 1:5605){ for (j in 1:498){ work.on.col = j work.dt = data[u:(u+365),work.on.col] # u:(u+365-1) considers the rolling window } } u == 1u == 5605滚动窗口。但是,这是逐步(或在这种情况下:每天)滚动算法。我想将其更改为

  1. 30天:应该改为每30天滚动一次(这是指滚动窗口将删除30天,然后在窗口中增加30天,从而滚动365天)窗口)。或
  2. 通过标识月份。例如,第一次迭代将从2000年1月到2001年1月的每日数据开始。而下一次迭代将从2000年2月到2001年2月开始,依此类推(这种方法更可取)。

数据

j

2 个答案:

答案 0 :(得分:2)

r1以下是最后365行的平均值。 (请注意,这就是要问的问题,但是一年中没有365天的数据,因为似乎缺少周末,所以这不是去年的平均值。)

r2是每30天最后365行的平均值。我再次怀疑那是您想要的,即使那是所要的。

r3是最近12个月的平均值。大概这就是您真正需要的。

每个都是动物园对象。最好将它们保留为动物园对象,以便可以轻松使用该包的其余部分,而不必将它们转换为数据帧,但是如果要转换,则只需使用fortify.zoo(r1),等等。

library(zoo)
z <- zoo(data[-1], data[[1]])

r1 <- rollapplyr(z, 365, mean, fill = NA)

r2 <- rollapplyr(z, 365, mean, by = 30, fill = NA)

z.ym <- aggregate(z, as.yearmon, sum)
z.n <- aggregate(z, as.yearmon, length)
r3 <- rollsumr(z.ym, 12, fill = NA) / rollsumr(z.n, 12, fill = NA)

答案 1 :(得分:1)

如何处理(注意,我切换了循环顺序)

如果要遍历数字:

for (j in 1:498){
  for (u in seq(0,5605-30,30))
{
work.on.col = j
work.dt = data[u:u+30,work.on.col] #u:u+30 iterates i.e: 0:30, 30:60,...etc. It only keeps a 30-day rolling window.
 }
}  

如果您要遍历某个日期(仅当您将rownames作为日期时才有效):

 for (j in 1:498){
  for (u in sapply(seq.Date(as.Date(min(data$Dates)), as.Date(max(data$Dates)), 
                      "day")," [[",30))
{
work.on.col = j
work.dt = data[u:u+30,work.on.col] 
 }
}