我有一部分代码是滚动迭代的第一步
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 == 1
到u == 5605
滚动窗口。但是,这是逐步(或在这种情况下:每天)滚动算法。我想将其更改为
j
答案 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]
}
}