滚动最大值/最小值/总和超过最后x个间隔的时间序列

时间:2017-08-29 04:38:24

标签: r time-series

我有一个财务时间序列data.frame,具有微秒精度:

timestamp                    price  volume
2017-08-29 08:00:00.345678   99.1   10
2017-08-29 08:00:00.674566   98.2   5
....
2017-08-29 16:00:00.111234   97.0   3
2017-08-29 16:00:01.445678   96.5   5

总计:每天约10万条记录。

我看到了几个可以指定滚动窗口宽度的函数,例如: k = 10. 但是k表示为一些观察而不是分钟。

我需要计算runing / rolling Max,Min of Price系列以及Volume系列的运行/滚动总和:

  1. 从时间序列开始后5分钟的时间戳开始
  2. 对于每个后续时间戳:回顾5分钟间隔和
  3. 计算滚动统计数据。
  4. 如何有效地计算这个?

2 个答案:

答案 0 :(得分:1)

您的数据

我无法捕获毫秒数(但解决方案仍然有效)

.inactiveHdr a:hover {
  background: #eee;
  text-decoration: none; 
}

purrr和dplyr溶液

library(lubridate)
df <- data.frame(timestamp = ymd_hms("2017-08-29 08:00:00.345678", "2017-08-29 08:00:00.674566", "2017-08-29 16:00:00.111234", "2017-08-29 16:00:01.445678"),
                 price=c(99.1, 98.2, 97.0, 96.5),
                 volume=c(10,5,3,5))

过滤library(purrr) library(dplyr) timeinterval <- 5*60 # 5 minute 以查看时间间隔内的观察结果,另存为列表

df

汇总列表中的每个data.frame

mdf <- map(1:nrow(df), ~df[df$timestamp >= df[.x,]$timestamp & df$timestamp < df[.x,]$timestamp+timeinterval,])

输出

statdf <- map_df(mdf, ~.x %>% 
                          summarise(timestamp = head(timestamp,1),
                                    max.price = max(price), 
                                    max.volume = max(volume),
                                    sum.price = sum(price),
                                    sum.volume = sum(volume),
                                    min.price = min(price), 
                                    min.volume = min(volume)))

答案 1 :(得分:0)

由于我正在寻找一个向后计算(从时间戳开始,看看5分钟后)我通过#CPak略微修改了这个伟大的解决方案,如下所示:

mdf <- map(1:nrow(df), ~df[df$timestamp <= df[.x,]$timestamp & df$timestamp > df[.x,]$timestamp - timeinterval,])

statdf <- map_df(mdf, ~.x %>% 
                      summarise(timestamp_to = tail(timestamp,1),
                                timestamp_from = head(timestamp,1),
                                max.price = max(price), 
                                min.price = min(price),
                                sum.volume = sum(volume),
                                records = n()))

此外,我添加了记录= n()以查看间隔中已使用了多少条记录。

一个警告:代码在mdf上需要10分钟,在具有100K +记录的数据集上需要6分钟的statdf。

任何想法如何优化它?谢谢!