使用 data.table 加速 rollapply

2023-11-23

我是 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 邮件列表上没有得到太多回应,所以我在这里发帖,看看我是否得到更好的回应。

p.p.s 快速浏览另一个使用数据帧的示例,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

数据表在这里是完全不相关的 - 你本质上是在运行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 方法对每个块重新排序,这显然是浪费 - 您所需要做的就是删除一个元素并排序下一个元素以获得分位数,所以如果你这样做,你可以预期大约 50 倍的加速 - 但你必须自己编写代码(所以只有当你更频繁地使用它时才值得......)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 data.table 加速 rollapply 的相关文章

随机推荐

  • Logback 中的条件功能如何工作?

    我使用这个 logback 配置文件
  • div 末尾的淡入文本?

    是否可以使用 CSS 在 div 末尾附近水平淡入文本 例如这样 CSS 渐变和rgba会做这个工作 Demo 扩展文本版本 更新 div position relative display inline block div span di
  • 如何处理AsyncTask失败

    有没有特定的方法来处理 AsyncTask 中的失败 据我所知 唯一的方法是使用任务的返回值 如果可能的话 我希望能够提供有关失败的更多详细信息 并且 null 并不是很冗长 理想情况下 它会提供一个 onError 处理程序 但我认为它没
  • 从 double 中删除尾随零

    我想删除所有尾随零 而不截断或舍入数字 如果没有 例如 该数字可能类似于12 0 在这种情况下 应删除尾随零 但这个数字也可能是某种东西almost非理性的 比如12 9845927346958762 一直到屏幕边缘 有没有办法设置 Dec
  • IPython 4 shell 不适用于 Sublime REPL

    我在从 Sublime REPL 包运行 IPython shell 时遇到问题 这是我得到的 C Anaconda lib site packages IPython config py 13 ShimWarning The IPytho
  • MVC2:无法使用 TextBoxFor 更改名称?

    我想手动定义文本框的 id 和名称 如下所示 但只改变了id 没有改变name属性 为什么呢
  • 如何在Jquery中将delay()与show()和hide()一起使用

    我该如何使用delay with show and hide 在 Jquery 中 Pass a duration to show and hide 当提供持续时间时 show 成为一种动画方法 E g element delay 1000
  • 从 asp.net web api post 操作重定向

    我对 ASP NET 4 0 Web API 非常陌生 我们可以在 POST 操作结束时重定向到另一个 URL 吗 例如 Response Redirect url 实际上我从 MVC 应用程序上传文件 比如说www abcmvc com
  • 在 Windows 网络中启动远程进程

    我有几台从机和一台主机 它们一起运行分布式应用程序 每台从属机器上的进程都必须具有 GUI 和网络访问权限 我认为这将被称为交互式进程 为了便于使用 如果主机可以启动 停止这些从机上的进程 那就太好了 我的第一个想法是使用 WMI 和 Wi
  • Jenkins 和 Git - 如何获取提交者的名字?

    我正在尝试将更多 GIT 提交信息放入 HipChat 房间 我看到有很多 GIT 变量可以在 jenkins 中使用 我正在执行作业的执行外壳步骤 这些工作 echo GIT BRANCH echo GIT URL echo GIT CO
  • 获取接收者的意图过滤器

    我正在尝试获取处理的接收者列表android intent action BOOT COMPLETED用于其他应用程序 我只能通过以下方式获取具有该操作的应用程序 final PackageManager pm getPackageMana
  • 从 strtok() 获取零长度字符串

    我有一个 CSV 文件 其中包含以下数据 value name test etc 我试图通过使用来分割strtok string 但是 该文件可以包含零长度数据 如下所示 value test etc which strtok 跳过 有什么
  • 如何在reactjs中的map函数内部进行映射

    我有我的表格视图 而且我有正在完善显示的 posfields 使用映射函数 但我的问题是 当我尝试在 posfields 映射函数内映射 td 时 它会抛出错误 headers of undefined this POSFields map
  • 如何在ssl中激活mq

    我正在尝试通过 jms activemq 发送消息 但我希望它采用 ssl 协议 目前它实际上可以在 tcp 中运行 我使用 jndi 带有一个虚拟主题和 2 个队列 有人可以帮助我吗 我尝试了这个 但我卡住了 服务器无法启动 http a
  • safari/chrome onsubmit="location.reload(true)" 不起作用

    我网站上的表单在 Safari Chrome 中无法正常运行 当用户提交表单时 它会打开一个新选项卡 但我希望重新加载原始页面 带有表单的页面 它适用于 IE Opera 和 Firefox 代码
  • 如何刷新 UITableViewController 或 NSFetchedResultsController?

    我的 UITableViewController 或 NSFetchedResultsController 有一点问题 我不确定问题出在哪里 但我猜是 UITableViewController 正如我所说 我使用 NSFetchedRes
  • 从内存中打开?

    我正在寻找一种直接从内存加载生成的目标代码的方法 我知道 如果我将其写入文件 我可以调用 dlopen 来动态加载其符号并链接它们 然而 考虑到它从内存中开始 写入磁盘 然后由 dlopen 重新加载到内存中 这似乎有点迂回 我想知道是否有
  • Android Studio - 无法应用插件 [id 'com.android.application']

    我正在开发一个应用程序 在我的应用程序中 代码中没有错误 但是当我尝试运行我的项目时 它给出了以下错误 错误 1 1 评估项目 app 时出现问题 无法应用插件 id com android application 无法创建 AppPlug
  • 将 REINSTALLMODE 传递到 MSI 文件

    我正在使用 VisualStudio2005 和 vdproj 创建一个简单的 MSI 文件 当我启动它时 我需要传入 REINSTALLMODE 属性 我知道这可以通过命令行完成 如下所示 msiexec exe i foo msi RE
  • 使用 data.table 加速 rollapply

    我是 data tables 的新手 所以如果这是一个非常基本的问题 我深表歉意 我听说 data tables 在处理大量数据时显着提高了计算时间 因此想看看 data table 是否能够帮助加快 rollapply 函数的速度 如果我