缓存时间序列的差异聚合

Lou*_*Lou 7 language-agnostic algorithm caching aggregate

是否有可能预先计算(缓存)两个信号差异的值的聚合(最小值/最大值/平均值)?

我有几个通道(例如50个),每秒进行一次或多次测量,我可以轻松存储预先计算的1分钟或15分钟聚合,以便更快地显示.

但其中一个要求是显示相对值的图表.例如,如果我有频道C1,C2并且C3用户希望在单独的图表上查看平均值C1和平均值(C2 - C3)(或最小值/最大值15分钟).

例如,假设我有这两个频道(还有48个频道):

t(min)    0    +1   +2   +3   +4   +5   +6   +7   +8   +9   +10
C1       0.0  0.1  0.2 -0.1  0.0  0.1  0.3  0.5  0.7  0.9  0.2
C2       0.1  0.4  0.2  0.1 -0.1  0.5  0.6  0.1  0.2  0.3  0.0
Run Code Online (Sandbox Code Playgroud)

我可以预先计算并存储5分钟的聚合:

t(min)    0 to +4    +5 to +10
C1_min     -0.1         0.1
C1_max      0.2         0.9
C2_min     -0.1         0.0
C2_max      0.4         0.6
Run Code Online (Sandbox Code Playgroud)

并且很容易从中获得10分钟或15分钟的聚合.

但是,如果用户想要查看min(C2-C1)max(C2-C1)5分钟聚合,对于这50个频道的任何组合,似乎我无法重复使用此信息.

换句话说,在我看来,除了存储这些元组的每个可能组合之外,不可能预先计算它,因为min(C2-C3)不相等min(C2)-min(C3).

我错过了一些可能有助于我更快地计算这些值的想法吗?

Abe*_*awa 1

C2您只需要拥有和的所有数据即可C3获得聚合min(C2-C3)

但是,如果您的目标是最小化执行此计算所需的数据,我建议您按以下方式执行(此解决方案将需要处理大数字 - 取决于通道数量):

如果您知道所有通道的值都不会超过某个值(假设是10),那么我们可以将所有通道的数据合并到 1 个通道中,我们将其命名为C

计算C

C = (C1 * 10^1) + (C2 * 10^2) + (C3 * 10^3) + .. + (Cn * 10^n).
Run Code Online (Sandbox Code Playgroud)

您最终会得到一个C嵌入了所有通道值的通道。

然后,要计算某个时刻 2 个通道之间的差异,您所要做的就是C动态“提取”这 2 个通道的值:

C1 = floor((C mod 10^1) / 10^(1-p)) / 10^p
C2 = floor((C mod 10^2) / 10^(2-p)) / 10^p
...
Cn = floor((C mod 10^n) / 10^(n-p)) / 10^p
Run Code Online (Sandbox Code Playgroud)

其中p是提取的通道值的小数精度。

在这种情况下,两个通道之间的差异计算xy使用预先计算C将是:

min(Cy-Cx) = min((floor((C mod 10^y) / 10^(y-p)) / 10^p) - (floor((C mod 10^x) / 10^(x-p)) / 10^p))
Run Code Online (Sandbox Code Playgroud)

然后您可以在一段时间内汇总这些值。希望能帮助到你。