gpt4 book ai didi

reactive-programming - 如何在 RxJava 中计算移动平均值

转载 作者:行者123 更新时间:2023-12-04 11:38:42 24 4
gpt4 key购买 nike

在金融领域,我们通常需要从时间序列数据流中计算移动窗口聚合值,以移动平均为例,假设我们有以下数据流(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]),...

要计算移动平均线,我们似乎可以通过以下方式进行:
  • 从原始流构建一个 Observable
  • 通过将值聚合到组中,从原始流构建一个 Observable
  • 使用聚合运算符计算步骤 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

    关于reactive-programming - 如何在 RxJava 中计算移动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811745/

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