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