在金融领域,我们通常需要从一个时间序列数据流中计算出移动窗口聚合值,以移动平均为例,假设我们有以下数据流(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 中以“优雅”的方式做到这一点吗?