如何在 RxJava 中计算移动平均线

2024-03-06

在金融领域,我们通常需要从时间序列数据流中计算移动窗口总值,以移动平均线为例,假设我们有以下数据流(T是时间戳,V是实际值):

[T0,V0],[T1,V1],[T2,V2],[T3,V3],[T4,V4],[T5,V5],[T6,V6],[T7,V7],[T8,V8],[T9,V9],[T10,1V0],......

从我们得到的流中计算移动平均值 3:

avg([T0,V0],[T1,V1],[T2,V2]),
avg([T1,V1],[T2,V2],[T3,V3]),
avg([T2,V2],[T3,V3],[T4,V4]),
avg([T3,V3],[T4,V4],[T5,V5]),
avg([T4,V4],[T5,V5],[T6,V6]),...

要计算移动平均线,我们似乎可以通过以下方法来完成:

  1. 从原始流构建一个 Observable
  2. 通过将值聚合成组,从原始流构建 Observable
  3. 使用聚合运算符计算步骤 2 中 Observable 的最终结果。

步骤 1 和 3 实现起来很简单,但是,对于步骤 2,似乎当前的 RxJava 没有内置运算符来生成移动窗口组, window/groupBy 运算符似乎不适合这种情况,而且我没有找到这是一种从现有运算符组成解决方案的简单方法,任何人都可以建议如何在 RxJava 中以“优雅”的方式做到这一点吗?


RxJava版本:0.15.1

import java.util.List;                                                          
import rx.Observable;                                                           
import rx.util.functions.Action1;                                               
                                                                                
class Bar {                                                                     
                                                                                
    public static void main(String args[]) {                                    
                                                                                
        Integer arr[] = {1, 2, 3, 4, 5, 6}; // N = 6                            
        Observable<Integer> oi = Observable.from(arr);                          
                                                                                
        // 1.- bundle 3, skip 1                                                 
        oi.buffer(3, 1)                                                         
        /**                                                                     
         * 2.- take only the first X bundles                                    
         * When bundle 3, X = N - 2 => 4                                        
         * When bundle 4, X = N - 3 => 3                                        
         * When bundle a, X = N - (a-1)                                         
         */                                                                     
          .take(4)                                                              
        // 3.- calculate average                                                
          .subscribe(new Action1<List<Integer>>() {                             
            @Override                                                           
            public void call(List<Integer> lst) {                               
                int sum = 0;                                                    
                for(int i = 0; i < lst.size(); i++) {                           
                    sum += lst.get(i);                                          
                }                                                               
                                                                                
                System.out.println("MA(3) " + lst +                             
                                   " => " + sum / lst.size());                  
            }                                                                   
        });                                                                     
                                                                                
    }                                                                           
                                                                                
}  

示例输出:

MA(3) [1, 2, 3] => 2

MA(3) [2, 3, 4] => 3

MA(3) [3, 4, 5] => 4

MA(3) [4, 5, 6] => 5

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

如何在 RxJava 中计算移动平均线 的相关文章

随机推荐

  • “pick”函数的 TypeScript 通用类型(结果对象值类型)

    在编写 pick 函数的类型时遇到问题 当仅选择一个键或具有相同类型值的多个键时 一切正常 但是 如果我尝试选择几个键并且它们的值是不同类型 我会收到错误 不太确定我在哪里犯了错误 感谢您的时间 export interface Mappe
  • 传单地图单击更改颜色,然后再次单击时删除

    我正在使用 Leaflet 制作美国地图 并且具有单击功能来放大和更改州的颜色 这可行 但我不能 单击另一个状态时使颜色返回到之前的颜色 目前 每次我点击一个状态 颜色就会改变 并且不会删除之前的颜色变化 这是我的代码 var map L
  • Python - 使用utf-8编码读取和写入csv文件

    我正在尝试读取一个 csv 文件 其标头包含外来字符 并且我遇到了很多问题 首先 我使用简单的 csv reader 读取文件 filename C Users yuval Desktop new resources mk str mkNu
  • 内联表单,缩小以使标签适合左侧

    标题说标签是因为这是我的用例 但显然它可以是任何元素 我想要实现的是以下表单布局 label input another label input third label input 目前我的 HTML 大致如下 省略细节 div overf
  • 将音频样本从 Float32 移位到 SInt16 会导致严重削波

    我对 iOS 及其 C 基础很陌生 但对一般编程并不熟悉 我的困境是这样的 我正在基于复杂 AudioUnits 的应用程序中实现回声效果 该应用程序需要混响 回声和压缩等 但是 只有当我使用特定的时 回声才能正常工作音频流基本描述我的应用
  • 如何保护 Java/Javafx 代码不被最终用户看到?

    我一个人在一家公司做一个项目已经两年多了 该项目是一个非常大的项目 使用 rxtx 与硬件设备进行通信 我使用 Java 8 和 JAVAFX 作为 UI 现在它几乎完成了 我开始搜索如何交付公司将分发给其客户的最终用户应用程序 问题是 我
  • ValueError:字段 admin.LogEntry.user 是使用惰性引用声明的

    我正在开发一个新的 django 项目并坚持迁移 我想创建一个 UserModel 为了做到这一点 到目前为止我做了两件事 1 我制作了AuthUser模型并在下面的类中设置了一个Meta类 In 模型 py class AuthUser
  • safari - jquery - ajax 500 内部服务器错误

    我创建了一个 jquery ajax 调用 它在 Chrome firefox 和 IE 中运行良好 与 Safari 一样 它在响应中给出 500 内部服务器错误 我认为这可能是由于服务器异常所致 但是当我尝试调试时 我发现它根本没有到达
  • SSDT 架构比较锁 SET QUOTED_IDENTIFIER 为 OFF

    我安装了 Visual studio 2012 并安装了 SSDT 版本 11 1 20627 0 一直困扰我的问题之一是 SSDT 项目中的所有存储过程 当尝试使用模式比较将其推送到服务器时 SP 的 SET QUOTED IDENTIF
  • 使用动态规划求解背包

    我正在使用我在此链接中找到的算法来实现背包问题的片段背包问题 http www es ele tue nl education 5MC10 Solutions knapsack pdf I have also attached the sn
  • 无法运行地图示例

    我正在尝试运行谷歌地图例如 但它一直在控制台中给我 WARNING Application does not specify an API level requirement Device API version is 7 Android
  • “单一分配”对于 boost::make_shared 意味着什么

    在boost文档中make shared http www boost org doc libs 1 47 0 libs smart ptr make shared html 它说 除了方便和风格之外 这样的功能还具有异常安全性和显着性 更
  • Spring 类级别验证和 Thymeleaf

    我正在学习 Spring 框架和 Thymeleaf 我已经知道如何使用类似的东西来显示字段错误 fields errors xx 但是 我对如何在 Thymeleaf 中显示对象错误消息感到困惑 这是我的UserForm class Pa
  • Cocoa 与 MacOS X 钥匙串的接口

    我有一些 Mac 代码需要存储 访问和更新密码 以便将用户与 Web API 连接起来 放置这些信息的正确位置应该是 Mac Keychain 但似乎没有 cocoa 界面 请参阅这个答案 https stackoverflow com a
  • 在 Devise on Rails 中使用单独的身份验证模型

    我有一个简单的解决方案 我用以下对象自己制作 Account 具有 token 字段 在身份验证时返回并在 API 调用中使用 验证 具有 auth type auth id 和对帐户的引用 我有一个单独的验证模型能够连接多种登录方式 设备
  • Android SimpleDateFormat格式问题

    我正在尝试将日期格式化为所需的格式 但我收到的日期错误 这就是我正在做的事情 我收到的日期如下 3 24 2012 8 25 03 AM 3 23 2012 2 57 01 PM 3 15 2012 9 28 01 AM 并想将它们展示为
  • 为什么 KeyPairGenerator.genKeyPair() 这么慢

    我有一些 Java 代码 当我运行函数时KeyPairGenerator genKayPair 工作时间为 40 秒或更长时间 如何改变这种现状呢 如果我跑 openssl req x509 nodes days 365 newkey rs
  • 如何选择.NET版本来编译项目?

    我有VS2005 如何在特定版本的 NET 下编译我的项目 我已经安装了 1 0 2 0 3 0 和 3 5 提前Tnx 恐怕你不能 VS2005仅适用于 NET框架2 0 您需要适当版本的 Visual Studio 才能与其他版本一起使
  • Angular 4文档离线计算机[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想找到 Angular 4 文档的本地 离线版本 https angular io docs htt
  • 如何在 RxJava 中计算移动平均线

    在金融领域 我们通常需要从时间序列数据流中计算移动窗口总值 以移动平均线为例 假设我们有以下数据流 T是时间戳 V是实际值 T0 V0 T1 V1 T2 V2 T3 V3 T4 V4 T5 V5 T6 V6 T7 V7 T8 V8 T9 V