gpt4 book ai didi

r - 使用 data.table 加速 rollapply

转载 作者:行者123 更新时间:2023-12-02 13:58:43 25 4
gpt4 key购买 nike

我是 data.tables 的新手,所以如果这是一个非常基本的问题,我深表歉意。

我听说 data.tables 在处理大量数据时显着提高了计算时间,因此想看看 data.table 是否能够帮助加快 rollapply 函数的速度。

如果我们有一些单变量数据

xts.obj <- xts(rnorm(1e6), order.by=as.POSIXct(Sys.time()-1e6:1), tz="GMT") 
colnames(xts.obj) <- "rtns"

宽度为 100、p 为 0.75 的简单滚动分位数需要非常长的时间...

即代码行

xts.obj$quant.75 <- rollapply(xts.obj$rtns,width=100, FUN='quantile', p=0.75) 

似乎需要永远......

data.table 可以做些什么来加快速度吗?即是否有可以应用的通用滚动功能?

也许有一个例程,可以将 xts 对象转换为 data.table 对象,以加速方式执行该功能,然后在最后重新转换回 xts?

提前致谢

HLM

附:我似乎在 data.table 邮件列表上没有得到太多回复,所以我在这里发帖,看看是否能得到更好的回复。

快速浏览另一个使用数据帧的示例,data.table 解决方案似乎比 rollapply 函数花费更长的时间,如下所示:

> x <- data.frame(x=rnorm(10000))
> x.dt <- data.table(x)
> system.time(l1 <- as.numeric(rollapply(x,width=10,FUN=quantile,p=0.75)))
user system elapsed
2.69 0.00 2.68
> system.time(l <- as.numeric(unlist(x.dt[,lapply(1:((nrow(x.dt))-10+1), function(i){ x.dt[i:(i+10-1),quantile(x,p=0.75)]})])))
user system elapsed
11.22 0.00 11.51
> identical(l,l1)
[1] TRUE

最佳答案

datatable 在这里是完全无关紧要的 - 你本质上是在向量上运行 sapply ,这几乎是你可以获得的最快的操作(除了转到 C)。数据帧和数据表总是比向量慢。您可以通过使用直接向量(无需 xts 调度)获得一些好处,但快速完成此操作的唯一简单方法是并行化:

> x = as.vector(xts.obj$rtns)
> system.time(unclass(mclapply(1:(length(x) - 99),
function(i) quantile(x[i:(i + 99)], p=0.75), mc.cores=32)))
user system elapsed
325.481 15.533 11.221

如果您需要更快,那么您可能需要编写一个专门的函数:简单的 apply 方法会对每个 block 重新排序,这显然是浪费 - 您所需要做的就是删除一个元素并在下一个元素中排序一个获得分位数,所以如果你这样做,你可以预期大约 50 倍的加速 - 但你必须自己编写代码(所以只有当你更频繁地使用它时才值得......)。

关于r - 使用 data.table 加速 rollapply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12150472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com