我有一个财务时间序列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系列的运行/滚动总和:
如何有效地计算这个?
答案 0 :(得分:1)
我无法捕获毫秒数(但解决方案仍然有效)
.inactiveHdr a:hover {
background: #eee;
text-decoration: none;
}
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。
任何想法如何优化它?谢谢!