6

私が見つけたほとんどのパッケージと投稿は、固定サイズのウィンドウまたは月/週の集計データに適用されます。ローリング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

最初の3つのローリング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

これは固定幅のローリングウィンドウではないことに注意してください。ウィンドウは実際には毎日変化します。

4

3 に答える 3

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は月平均を格納しています。

こんな感じですか?このコードは、月の可変長を考慮しています。それを行うためのより効率的な方法は確かにありますが、これは機能します!

于 2012-05-31T17:11:43.507 に答える
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()

于 2020-04-01T16:14:42.073 に答える
0

ランナーパッケージは、不規則な間隔の時系列でのローリングウィンドウ操作を完全にサポートします。オブジェクトの1か月の移動平均を計算するには、ユーザーにとって何がより重要かによって、(ランナーの時間を依存させるために)または(日数)を指定する必要があります。ユーザーは任意のR関数を適用できます。この場合はを実行します。xidx = datek = "1 months"k = 30mean

# 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
)
于 2020-04-13T07:51:57.507 に答える