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

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(使用前将#替换为@)

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

  • 我无法下载 R 中的 reshape2 包 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试安装 R 包时收到此响应 gt installed packages reshape2 Package LibPath V
  • 正则表达式字符串中第一个和最后一个非点的位置

    我希望找到字符串的第一个和最后一个非点元素的位置 理想情况下我想这样做regex在基地R 我已经写过R解决问题的代码 不过 我对一个感兴趣regex解决方案 感谢您的任何建议 这是一个示例数据集和R代码以获得所需的结果 此代码拆分字符串并使
  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • 如何使用 usmap 标记数字而不是名称?

    我知道 usmap 有一个选项label in plot usmap 我想标记一些数字 而不是状态名称 我想 usmap 中应该有与州质心坐标相关的数据 但我不知道如何找到它 如果我能得到 坐标然后我可以用它来标记数字geom text 这
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • 删除特定数据表上的所有边框

    我需要使用 PrimeFaces 隐藏一个数据表的所有边框 而不是全部 我尝试了很多事情 但没有人奏效 有谁知道该怎么做 我已将以下样式 单独 应用于ui datatable class border hidden important bo
  • 为什么 dplyr filter() 不能在函数内工作(即使用变量作为列名)?

    使用 dplyr 函数对数据进行过滤 分组和变异的函数 基本管道序列在函数之外工作得很好 这就是我使用真实列名称的地方 将其放入一个函数中 其中列名称是一个变量 并且某些函数可以工作 但有些函数则不能 尤其是 dplyr filter 例如
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • R 中的列乘以子字符串

    假设我有一个数据框 其中包含多个组件及其在多个列中列出的属性 并且我想对这些列运行多个函数 我的方法是尝试将其基于每个列标题中的子字符串 但我无法弄清楚如何做到这一点 下面是数据框的示例 Basket F Type 1 F Qty 1 F
  • 将每列的值乘以 R 中另一个 data.frame 中的权重

    我有两个data frames df and weights 代码如下 df看起来像这样 id a b d EE f 1 this 0 23421153 0 02324956 0 5457353 0 73068586 0 5642554 2
  • 朴素贝叶斯分类器仅基于先验概率做出决策

    我试图根据推文的情绪将推文分为三类 买入 持有 卖出 我正在使用 R 和包 e1071 我有两个数据框 一个训练集和一组需要预测情绪的新推文 训练集数据框 text sentiment this stock is a good buy Bu
  • 所有 x 轴标签未以 45 度显示

    I m having the code as like below But I m not getting all the x axis labels and it is not displaying in 45 degree when I
  • R:如何获取该月的周数

    我是 R 新手 我想要该日期所属月份的周数 通过使用以下代码 gt CurrentDate lt Sys Date gt Week Number lt format CurrentDate format U gt Week Number 3
  • 投资决策:R中的NPV、IRR、PB计算

    我正在尝试计算不同数量项目的净现值 NPV 内部收益率 IRR 和投资回收期 PB 时间 以评估哪个投资项目提供最佳回报 到目前为止 我可以为每个项目单独计算几行代码 但我想做的是 编写一个函数 它接受一个包含许多不同项目及其现金流的矩阵
  • 如何从 R 读取 PDF 元数据

    我们很好奇 有没有一种方法可以从 R 读取 PDF 元数据 例如下面显示的信息 通过搜索我对此无能为力 r pdf metadata在当前的问题库中 非常欢迎任何指点 我想不出纯 R 的方法来执行此操作 但您可能可以安装您最喜欢的 PDF
  • 以编程方式将字符串宽度值插入到 sprintf() 中

    我正在尝试以编程方式将字符串宽度值插入到sprintf 格式 期望的结果是 sprintf 20s hello 1 hello 但我想插入20在同一通话中即时进行 因此它可以是任何号码 我努力了 sprintf ds 20 hello 1
  • SPSS 中的标准化残差与 R rstandard(lm()) 不匹配

    在寻找 R 相关解决方案时 我发现 R 和 SPSS 版本 24 在计算简单线性模型中的标准化残差方面存在一些不一致 看来SPSS所谓的标准化残差匹配 R学生化残差 我完全不认为某处存在软件错误 但显然这两个程序之间存在差异 看看这个例子
  • applyStrategy 错误

    我是R新手 最近运行后遇到以下错误applyStrategy函数来自quantstrat包裹 Error in eval expr envir enclos object signal not found Error in colnames
  • 任意列中包含字符串的子集行

    我有一个如下所示的数据集 Col1 Col2 Col3 abckel NA 7 jdmelw njabc NA 8 jdken jdne 如何对数据集进行子集化 使其仅保留包含字符串 abc 的行 最终预期输出 Col1 Col2 Col3
  • 麦当劳 omega:R 中的警告

    我正在计算几种不同尺度的欧米茄 并在 R 中使用不同的 omega 函数获取不同比例的不同警告消息 我的问题是如何解释这些警告以及报告检索到的 omega 统计数据是否安全 当我使用 从 alpha 到 omega 内部一致性估计普遍问题的

随机推荐

  • 高效利用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