计算移动平均/滚动函数的快速方法,允许自定义权重

2024-02-29

一个可以用TTR:SMA() or TTR::EMA()但这些不允许自定义权重。我想出的一种解决方案是使用data.table::frollapply:

library(data.table)
x <- data.table(type=rep(1:100, 10000), val=sample(1:1000000, 1000000))

my.roll.2 <- function(x, weights=NULL) {
    n <- length(x)
    if(is.null(weights)) weights <- 1/(1:n)
    sum(weights[1:n]*x, na.rm=T)/sum(weights[1:n])
}

my.roll.1 <- function(x, n, name, ref.col, val.col, weights=NULL) {
    x[, (name) := frollapply(get(val.col), n, my.roll.2, weights=weights), by=ref.col]
}

然而性能my.roll.1不太好(输入数据越大,与其他情况相比,情况会呈指数级恶化):

library(microbenchmark)
library(TTR)
n <- 10
name <- 'test'
microbenchmark(
    my.roll=my.roll.1(x, n, name, 'type', 'val')
  , frollmean=x[, (name):=data.table::frollmean(val, n), type]
  , EMA=x[, (name):=TTR::EMA(val, n), type]
  , times=10L
)

Results:

Unit: milliseconds
      expr       min        lq       mean     median        uq       max neval
   my.roll 7661.0278 7666.0732 7698.69693 7693.28025 7708.6880 7778.6171    10
 frollmean   17.1724   17.6321   19.54878   19.56485   20.9490   23.5549    10
       EMA   43.0090   43.7332   45.92251   45.79210   47.2391   51.9399    10

data.table::frollmean速度非常快(用 C 实现),但它不使用任何权重。TTR::EMA仅使用 EMA 特定权重/平滑(唯一的灵活性是使用参数wilder=TRUE or wilder=FALSE)。我的需求是实现的功能my.roll.1但要更快。


正如评论中提到的,可能的解决方案使用stats::filter.

请注意以下参数:

  • Sides = 1 以便过滤器仅使用过去的值
  • 系数顺序反转1/(n:1)因为过滤器计算从最近的值开始
my.roll[,test2:=filter(val,prop.table(1/n:1),sides=1),by=.(type)]
# Conversion from ts to numeric
my.roll[,test2:=as.numeric(test2)][]

# type    val     test    test2
# <int>  <int>    <num>    <num>
#       1:     1 955625       NA       NA
#       2:     2 979596       NA       NA
#       3:     3 578778       NA       NA
#       4:     4 174631       NA       NA
#       5:     5 459947       NA       NA
# ---                               
#  999996:    96 191233 620505.8 620505.8
#  999997:    97 626522 398615.6 398615.6
#  999998:    98 527846 565061.2 565061.2
#  999999:    99 480277 537305.9 537305.9
# 1000000:   100 757433 395458.3 395458.3

all.equal(my.roll$test,my.roll$test2)
#[1] TRUE

速度对比:

microbenchmark::microbenchmark(
  my.roll=my.roll.1(x, n, name, 'type', 'val'),
  filter={my.roll[,test2:=filter(val,prop.table(1/n:1),sides=1),by=.(type)][];
          my.roll[,test2:=as.numeric(test2)][]
          }
  , times=10L
)

Unit: milliseconds
    expr       min        lq       mean     median        uq       max neval
 my.roll 2194.3200 2203.3726 2264.67423 2245.04510 2314.2377 2401.1156    10
  filter   73.1602   76.3098   78.18358   77.25665   80.4204   85.0567    10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算移动平均/滚动函数的快速方法,允许自定义权重 的相关文章

  • 带有 geom_errorbar 的position_dodge

    我有以下代码 require ggplot2 pd lt position dodge 0 3 ggplot dt aes x Time y OR colour Group geom errorbar aes ymin CI lower y
  • mclapply 调用应该嵌套吗?

    正在筑巢parallel mclapply是个好主意吗 require parallel ans lt mclapply 1 3 function x mclapply 1 3 function y y x unlist ans Outpu
  • 向图像添加坐标,以用作 R 中的 Leaflet、Shiny 和 Shinydashboard 包中的地图

    我计划使用 Leaflet Shiny 和 Shinydashboard 沿着以下很棒的路线创建一个带有医院 OHS 事件标记的交互式地图交互式地图和直方图模板 http shiny rstudio com gallery superzip
  • R中的不定积分

    我正在计算方程的不定积分 我将加速度计的数据通过可视化 C 程序输入到 R 中 然后就可以很简单地得出一个方程来表示加速度曲线 这一切都很好 但是我还需要计算撞击速度 根据我在高中时代的理解 我的加速度曲线的不定积分将产生速度方程 我知道执
  • 在 R 中使用 gsub 删除尾随空格[重复]

    这个问题在这里已经有答案了 有没有人有一个技巧可以用 gsub 删除变量上的尾随空格 以下是我的数据示例 正如您所看到的 我在变量中同时包含尾随空格和嵌入空格 county lt c mississippi mississippi cany
  • 使用 RMySQL 会干扰 RPostgreSQL

    我有一个 R 脚本 我想从 MySQL 数据库中提取一些数据 然后从 PostgreSQL 数据库中提取一些数据 但是 从 RMySQL 加载 MySQL 驱动程序会阻止我从以下位置加载 PostgreSQL 驱动程序 PostgreSQL
  • 绘制具有数据子集的图层时,因子水平的顺序会发生变化

    我试图控制图例中项目的顺序ggplot2我查找了其他一些类似的问题 并发现了如何更改我正在绘制的因子变量的水平顺序 我正在绘制 12 月 1 月 7 月和 6 月 4 个月的数据 如果我只对所有月份执行一个绘图命令 它会按预期工作 图例中排
  • 列槽不足

    当尝试为 data table 中的每个变量 108 个变量 创建 12 个滞后时 我收到一条错误 指出列槽不足 此操作应创建大约 1200 个变量或列 Data A as data table Datos A Varnames names
  • 如何从多边形数据中提取栅格值然后加入到空间数据框中?

    我想将多边形数据和栅格数据合并到一个数据框中 以便随后在 R 中使用 randomForests 包 这涉及首先提取每个多边形的平均栅格值 到目前为止 我有以下内容 load libraries library raster library
  • 在 R 中使用 spplot 将多个绘图放在一个页面上?

    我知道如何在使用简单函数图时绘制两个图 old par lt par mfrow c 1 2 plot faithful main Faithful eruptions plot large islands main Islands yla
  • 在 R 中按组检查重叠开始和结束时间

    我想检查数据的重叠 这是数据 ID lt c rep 1 3 rep 3 5 rep 4 4 rep 5 5 Begin lt c 0 2 5 3 7 8 7 25 25 10 15 17 20 1 NA 10 11 13 End lt c
  • 循环中的knitr模板和子文档

    圣诞节前我之前问过跨多个 knitr 文档的单一样式表 https stackoverflow com questions 20370584 single style sheet across multiple knitr document
  • 使用 R 读取和转换二进制原始数据

    我有一个file https drive google com file d 0BxMpk0nhnJy6SFhxd2xuMzJYYlk edit usp sharing其中包含原始 二进制数据和 ascii 它包含一个时间戳和一个代表速度的
  • R:如何根据规范更改数据框中的列名称

    我有一个数据框 它的开头如下 SM H1455 SM V1456 SM K1457 SM X1461 SM K1462 ENSG00000000419 8 290 270 314 364 240 ENSG00000000457 8 252
  • R-在多个图的外缘绘制居中图例

    我想在具有多个绘图的设备中的绘图区域之外绘制居中图例 SO 中提出了许多关于更改 R 图中图例位置的问题 略有不同 例如 1 R 组合图的通用标题和图例 https stackoverflow com questions 8736966 r
  • 分组和计数以获得接近值

    我想计算每country的次数status is open以及次数status is closed 然后计算closerate per country Data customer lt c 1 2 3 4 5 6 7 8 9 country
  • 对于多项式,获取其所有极值并通过突出显示所有单调部分来绘制它

    有人问我这个有趣的问题 我认为值得将其发布在这里 因为 Stack Overflow 上还没有任何相关线程 假设我有长度为的多项式系数n vector pc 其中次数多项式n 1对于变量x可以以其原始形式表示 pc 1 pc 2 x pc
  • Shiny可以识别用鼠标选择的文本(突出显示的文本)吗?

    我需要用户将文本片段分配给 Shiny 中的类别或 代码 基本上 我希望用户突出显示输出中的文本 在下面的示例中 来自table or text输出 然后按一个按钮 code 并将选定的文本分配给应用程序内的对象 在下面的应用程序中 所选文
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 将 read.csv 与符号链接文件一起使用

    我正在尝试做什么 我的源文件非常大 我想避免将其复制到其他文件夹中 我决定创建一个指向大文件的符号链接并想使用read csv读取文件 文件夹结构 项目1 数据 源文件 csv 项目2 数据 别名到源文件 csv 什么地方出了错 读取源文件

随机推荐

  • 高效利用Android资源

    我试图弄清楚如何有效地使用 Android 的资源系统 既提供最高分辨率的资源 又保持较小的 apk 大小 我的资源文件夹 drawable normal mdpi drawable normal hdpi drawable large m
  • 使用 OpenMP 在两个内核上设置线程关联

    我使用的是C程序 在Windows7上用gcc 4 9 2编译 使用OpenMP 4 0 我的电脑是双核 四个线程 我想使用线程亲和力传播并使用放置在不同核心上的 2 个线程 因此 当我从 DOS 设置环境变量时 设置 OMP NUM TH
  • Xamarin-Android 和 UWP 之间的蓝牙连接

    在相当多的时间里 我一直在努力寻找一个可行的解决方案来通过 IP 连接或蓝牙连接 Android 设备和 UWP 应用程序 在 PC 上 主要问题是找到一组足够简单但又保证可以工作的代码或示例 这样我的努力就不会白费 这种情况已经持续了一个
  • 为什么要加密用户密码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么不存储原始密码 https stackoverflow com questions 3107810 why arent original passwords stored 如果密码是数据中最不有
  • Laravel 设置无法打开流

    我正在尝试设置 laravel 但事实证明它是正确的 我从 github 克隆了它 还使用 Composer 克隆了 Laravel 这两种技术都可以工作 这很好 因为它是我真正想学习的东西 比我想象的简单 然而 当我尝试导航到名为 iPr
  • Rowset不支持向后滚动

    我正在尝试使用以下代码查询 MySQL 数据库 declare the variables Dim Connection Dim Recordset Dim SQL declare the SQL statement that will q
  • 读取分区镶木地板时,Spark 错误地将以“d”或“f”结尾的分区名称解释为数字

    我在用着spark read parquet 从分区中组织镶木地板文件的文件夹中读取 当分区名称以以下结尾时 结果将是错误的f or d 显然 Spark 会将它们解释为数字而不是字符串 我创建了一个最小的测试用例 如下所示来重现该问题 d
  • 无法在 eclipse 中安装 blackberry webworks 插件

    using http www blackberry com go eclipseUpdate 3 6 java http www blackberry com go eclipseUpdate 3 6 java 我安装了Blackberry
  • Python TypeVar 中输出变量和第一个参数之间的区别

    我正在查看 Python TypeVar 的文档 但无法弄清楚第一个参数 或者可能是赋值变量 的含义 从 3 8 文档 A TypeVar A str bytes Must be str or bytes def longest x A y
  • pyautogui,屏幕截图功能无法识别已安装的 Pillow 模块

    我想在Pycharm中执行这段代码 x y pyautogui locateCenterOnScreen LVL35 png 但我收到这条消息 ImportError Pillow module must be installed to u
  • 如何在android布局中创建固定页脚?

    我正在使用以下代码在活动底部显示按钮
  • 如何将程序限制为单个实例

    我有一个 C 控制台应用程序 我想限制我的应用程序一次仅运行一个实例 我如何在 C 中实现这一目标 我会用一个Mutex http msdn microsoft com en us library system threading mute
  • 引导 gem5 X86 Ubuntu 完整系统模拟

    我需要在 gem5 上运行相对较新版本的 x86 磁盘映像 从 开始本指南 http www lowepower com jason creating disk images for gem5 html我使用了带有 Kernel v3 2
  • 实施到我的应用程序的深层链接后,应用程序图标不出现

    我正在 Android Studio 中开发一个应用程序 它运行得很好 但是在实现了到我的启动活动的深层链接后 我的应用程序没有出现在菜单中的应用程序图标 我知道该应用程序已安装 因为它出现在 设置 gt 应用程序 中 我知道问题出在man
  • 如何将 python 字符串转换为 ucs2 十六进制?

    我一直在寻找这个 但找不到 尽管它看起来很简单 我需要在 url 中发送 ucs2 十六进制字符串 但我不知道如何将 python 字符串转换为 ucs2 十六进制 有什么想法吗 gt gt gt encode utf16 b xff xf
  • 将视频字幕与文本转语音同步

    我尝试创建一个文本视频 其中的文本通过文本转语音进行叙述 为了创建视频文件 我使用VideoFileWriter of Aforge Net如下 VideoWriter new VideoFileWriter VideoWriter Ope
  • R 中通过列值的排列进行聚合

    背景 我正在处理出发地 目的地数据 我想计算每对城市之间的比例流量 但是 我发现很难按每对城市聚合数据 因为这些城市对涉及列条目的排列 我可以使用大量 for 循环和条件通过暴力来完成此操作 但这需要很长时间才能计算 具体来说给定以下形式的
  • 在 React-Redux 中实时重新排序列表的最佳方法?

    I m currently build an app that have a realtime list the view of list as bellow picture 当触发以下操作之一时 此列表将实时更新 有消息更新 update
  • 如何以角反应形式保存价值?

    当用户导航到不同的组件 例如隐私策略 并返回表单时 我希望在角度表单输入字段中保留值 当用户从隐私政策返回到表单时 他应该看到之前输入的数据 单击 保存 按钮后如何保留数据 当用户单击 保存 按钮时 我们调用下面的方法 它会删除旧密钥并将新
  • 计算移动平均/滚动函数的快速方法,允许自定义权重

    一个可以用TTR SMA or TTR EMA 但这些不允许自定义权重 我想出的一种解决方案是使用data table frollapply library data table x lt data table type rep 1 100