【问题标题】:Aggregating timeseries from sensors从传感器聚合时间序列
【发布时间】:2024-01-23 17:59:01
【问题描述】:

我有大约 500 个传感器,每个传感器大约每分钟发出一次值。可以假设传感器的值保持不变,直到发出下一个值,从而创建一个时间序列。传感器在何时发出数据时并不同步(因此观察时间戳会有所不同),但所有数据都集中收集并存储在每个传感器上(以允许按传感器子集进行过滤)。

如何生成一个汇总时间序列,以提供来自传感器的数据总和? n (需要在 1 天的一组观察中创建时间序列 - 因此需要考虑每天 24x60x500 的观察)。计算还需要快速,最好在

示例 - 原始输入:

q)n:10
q)tbl:([]time:n?.z.t;sensor:n?3;val:n?100.0)
q)select from tbl
time         sensor val
----------------------------    
01:43:58.525 0      33.32978
04:35:12.181 0      78.75249
04:35:31.388 0      1.898088    
02:31:11.594 1      16.63539
07:16:40.320 1      52.34027
00:49:55.557 2      45.47007
01:18:57.918 2      42.46532
02:37:14.070 2      91.98683
03:48:43.055 2      41.855
06:34:32.414 2      9.840246

我正在寻找的输出应该显示相同的时间戳,以及跨传感器的总和。如果传感器没有在匹配的时间戳处定义记录,则应使用它的先前值(记录仅暗示传感器输出更改的时间)。

预期输出,按时间排序

time         aggregatedvalue
----------------------------    
00:49:55.557   45.47007  / 0 (sensor 0) + 0 (sensor 1) + 45.47007 (sensor 2)
01:18:57.918   42.46532  / 0 (sensor 0) + 0 (sensor 1) + 42.46532 (new value on sensor 2)
01:43:58.525   75.7951   / 33.32978 + 0 + 42.46532
02:31:11.594   92.43049  / 33.32978 + 16.63539 + 42.46532
02:37:14.070   141.952   / 33.32978 + 16.63539 + 91.98683
03:48:43.055   91.82017  / 33.32978 + 16.63539 + 41.855
04:35:12.181   137.24288 / 78.75249 + 16.63539 + 41.855
04:35:31.388   60.388478 / 1.898088 + 16.63539 + 41.855   
06:34:32.414   28.373724 / 1.898088 + 16.63539 + 9.840246 
07:16:40.320   64.078604 / 1.898088 + 52.34027 + 9.840246

【问题讨论】:

    标签: time-series kdb


    【解决方案1】:

    我假设记录按时间顺序输入,因此 tbl 将按时间排序。如果不是这种情况,请先按时间对表格进行排序。

    d 是传感器每次最后价格的字典。下面的解决方案可能不是最优雅的,我可以想象有一种性能更高的方法不需要每个。

    q)d:(`long$())!`float$()
    q)f:{d[x]::y;sum d} 
    q)update agg:f'[sensor;val] from tbl
    time         sensor val      agg     
    -------------------------------------
    00:34:28.887 2      53.47096 53.47096
    01:05:42.696 2      40.66642 40.66642
    01:26:21.548 1      41.1597  81.82612
    01:53:10.321 1      51.70911 92.37553
    03:42:39.320 1      17.80839 58.47481
    05:15:26.418 2      51.59796 69.40635
    05:47:49.777 0      30.17723 99.58358
    11:32:19.305 0      39.27524 108.6816
    11:37:56.091 0      71.11716 140.5235
    12:09:18.458 1      78.5033  201.2184
    

    您的 720k 记录数据集相对较小,因此任何聚合都应该在 1 秒以内。如果您存储了很多天的数据,您可能需要考虑here 概述的一些技术(展开、分区等)。

    【讨论】:

    • 感谢您的快速回复,但输出不太正确。我已经用预期的输出更新了问题。我有大约 3 年的数据,因此还需要查看展开/分区。
    • 刚刚更新了我的答案。正如我所提到的,可能有更有效的方法可以以矢量形式执行此操作。
    • 好的,这给出了正确的输出。不幸的是,无法保证到达顺序(仅是大概的时间顺序)
    【解决方案2】:

    自从我花了很多时间在这件事上已经有一段时间了。在您有大量批次并以特定间隔执行线性插值计算并存储此数据后,是否有帮助。我研究过按时间排序的传感器数据,但传感器仅在数据实际发生变化时才发送数据。为了加快报告和其他计算,我们实际上汇总了特定时间段(如 1 秒、30 秒、1 分钟)的数据,通常会在此过程中进行您所说的平均。在这样做的同时,我们也执行线性插值。

    缺点是需要额外的存储空间。但是性能提升是显着的。

    看起来您已经提出了一个很好的解决方案。

    【讨论】: