我找到的大多数软件包和帖子都适用于固定大小的窗口或汇总的月/周数据。是否可以计算滚动k月平均值?
例如,对于 1个月滚动窗口,假设数据为:
Date Value
2012-05-28 101
2012-05-25 99
2012-05-24 102
....
2012-04-30 78
2012-04-27 82
2012-04-26 77
2012-04-25 75
2012-04-24 76
前三个滚动1个月的窗口应该是:
1. 2012-05-28 to 2012-04-30
2. 2012-05-25 to 2012-04-26
3. 2012-05-24 to 2012-04-25
请注意,这不是固定宽度滚动窗口。窗口实际上每天都在变化。
非常感谢先进!
答案 0 :(得分:1)
我使用此代码根据每日价格数据计算月平均值。
#function for extracting month is in the lubridate package
install.packages(c("plyr", "lubridate"))
require(plyr); require(lubridate)
#read the daily data
daily = read.csv("daily_lumber_prices.csv")
price = daily$Open
date = daily$Date
#convert date to a usable format
date = strptime(date, "%d-%b-%y")
mon = month(date)
T = length(price)
#need to know when months change
change_month = rep(0,T)
for(t in 2:T){
if(mon[t] != mon[t-1]){
change_month[t-1] = 1
}
}
month_avg = rep(0,T)
total = 0
days = 0
for(t in 1:T){
if(change_month[t] == 0){
#cumulative sums for each variable
total = total + price[t]
days = days + 1
}
else{
#need to include the current month in the calculation
month_avg[t] = (total + price[t]) / (days + 1)
#reset the variables
total = 0
days = 0
}
}
因此,变量month_avg存储月平均值。
是这样的吗?此代码考虑了可变长度的月份。肯定有一种更有效的方法,但这很有效!
答案 1 :(得分:0)
假设您的数据帧为df
,这对我有用:
df$past_avg = sapply(df$Date, function(i){
i = as.POSIXct(i)
mean(subset(df, Date > (i - months(1)) & Date < i)$Value)
})
仅使用基数R。您可以通过更改months()
中的值来将其调整为过去的任意几个月。
答案 2 :(得分:0)
runner软件包完全支持在不规则间隔的时间序列上滚动Windows操作。要计算x
对象的 1个月移动平均值,必须指定idx = date
(取决于运行时间)和k = "1 months"
或k = 30
(天)取决于对用户更重要的内容。用户可以apply any R function-在这种情况下,我们执行mean
。
# example data
x <- cumsum(rnorm(20))
date <- Sys.Date() + cumsum(sample(1:5, 20, replace = TRUE)) # unequaly spaced time series
# calculate rolling average
runner::runner(
x = x,
k = "1 months",
idx = date,
f = mean
)