我有大约500个传感器,每个传感器大约每分钟发出一次。可以假设传感器的值保持不变,直到发出下一个值,从而创建时间序列。传感器在发射数据时不同步(因此观测时间戳不同),但它们都集中收集并按传感器存储(允许通过传感器子集进行过滤)。
如何生成汇总时间序列,以提供传感器数据的总和? ñ (需要创建超过1天观测值的时间序列 - 因此需要考虑每天24x60x500的观测值)。计算也需要快速,优选地在< 1秒。
示例 - 原始输入:
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
答案 0 :(得分:0)
我假设记录按时间顺序进入,因此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记录数据集相对较小,因此任何聚合都应该在一秒钟之内。如果您存储了很多天的数据,您可能需要考虑一些概述here的技术(展开,分区等)。
答案 1 :(得分:0)
我已经花了很长时间才花了很多时间。在您拥有大批量并以特定间隔执行线性插值计算并存储此数据之后,返回会有所帮助吗?我研究过按时间排序的传感器数据,但传感器只在数据实际发生变化时发送数据。为了加速报告和其他计算,我们实际上在某些时间段(例如1秒,30秒,1分钟)聚合数据,经常进行您正在讨论的平均值。在我们这样做的同时,我们也执行线性插值。
缺点是它需要额外的存储空间。但性能提升非常显着。
看起来你已经提出了一个很好的解决方案。