首页 > 解决方案 > 如何使用特定时间窗口调用函数?

问题描述

假设我有一个动物园对象(或者它可能是一个 data.frame),它在“一天中的时间”上有一个索引并且有一些值(见下面的示例数据):

                    val
...
2006-08-01 12:00    23
2006-08-01 12:01    24
2006-08-01 12:02    25
2006-08-01 12:03    26
2006-08-01 12:04    27
2006-08-01 12:05    28
2006-08-01 12:06    29
...
2006-08-02 12:00    123
2006-08-02 12:01    124
2006-08-02 12:02    125
2006-08-02 12:03    126
2006-08-02 12:04    127
...

我想custom.func(vals)在 12:01 - 12:03 之间调用一个自定义函数(调用它)(即类似于 zoo::rollapply),每次间隔发生时,在这个例子中,每天。我该怎么做?


注意(为了稳健性,考虑以下边缘情况也很好,但不是必需的):

  1. 不要假设我每天都有 12:01 - 12:03 的值
  2. 不要假设每天都存在整个范围 12:01 - 12:03。有些日子我可能只有 12:01 和 12:02,但可能会错过 12:03
  3. 如果我希望我custom.func(vals)在一天的边界上被调用,比如使用val从 23:58 到 00:12 怎么办?

标签: rdataframezoorollapply

解决方案


我推荐runner包,它允许计算不规则时间序列上的任何滚动函数。函数运行器等效于rollApply它可以依赖于日期的区别。runner允许在由k日期idx(或任何整数)定义的窗口长度上应用任何 R 函数。下面的示例计算 5 分钟(5*60 秒)窗口跨度的回归。算法不关心是否会有换日,每次只计算 5 分钟(例如 23:56-00:01)。

创建数据:

set.seed(1)
x <- cumsum(rnorm(1000))
y <- 3 * x + rnorm(1000)
time <- as.POSIXct(cumsum(sample(60:120, 1000, replace = TRUE)), 
                   origin = Sys.Date()) # unequaly spaced time series
data <- data.frame(time, y, x)

要在滑动窗口上调用的自定义函数:

library(runner)

running_regression <- function(idx) {
  predict(lm(y ~ x, data = data))[max(idx)]
}

data$pred <- runner(seq_along(x), 
                    k = 60 * 5,
                    idx = time,
                    f = running_regression)



一旦我们创建了具有滚动 5 分钟预测的数据集,那么我们就可以只过滤特定的窗口——在这里,只有每小时的 1 分钟。这意味着我们总是保持 {hh}:56 - {hh+1}:01


library(dplyr)
library(lubridate)
filtered <-
  data %>% 
  filter(minute(time) == 1)


plot(data$time, data$y, type = "l", col = "red")
points(filtered$time, filtered$pred, col = "blue")

在此处输入图像描述

小插图中还有一些其他示例如何使用runner


推荐阅读