2013-05-03 61 views
2

我有大约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

我假设的记录进行排序来了,在时间顺序,因此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

+0

感谢您的快速回复,但没有得到正确的输出。我更新了预期产出的问题。我有大约3年的数据价值,所以也需要看看splaying/partitioning。 – 2013-05-04 10:34:31

+0

刚刚更新了我的答案。正如我所提到的,可能有更有效的方法以矢量形式进行此操作。 – user1895961 2013-05-05 14:20:20

+0

好的,这给出了正确的输出。很遗憾,没有抵达订单的保证(只有大致的时间订单) – 2013-05-05 17:36:41

0

它已经有一段时间了,因为我花了很多时间。在批量较大并按特定间隔执行线性插值计算并存储此数据后,是否有助于返回?我一直在研究按时间排序的传感器数据,但传感器只在数据实际发生变化时才发送数据。为了加速报告和其他计算,我们实际上在某些时段(例如1秒,30秒,1分钟)汇总数据,通常会在您一路上讨论的平均值。当我们这样做时,我们也执行线性插值。

缺点是它需要额外的存储空间。但是性能提升很大。

看起来你已经有了很好的解决方案。