如何平滑/减少/过滤大量的传感器数据?

4
我正在为一些产生大量基于时间的数据(如温度、电流或电压)的工业设备构建可视化。所有数据都不断写入SQL Server数据库(无法控制该部分)。
HTML5前端由我使用d3.js制作的交互式缩放图表组成。数据系列可以按需添加(加载)到图表中,此时前端会发送一个ajax请求,ASP.NET MVC和EF6从数据库中获取值并将其作为Json返回。
每个数据元素只是由一个日期时间和一个值组成。请注意,这些值不是定期写入的(例如每2秒钟一次),而是在不规则的时间间隔内写入的。这是因为设备不是定期轮询,而是在特定事件(例如温度升高/降低0.1°C)发生时发送数据。
到目前为止,一切都运行得非常顺畅,但大量数据成为了问题。例如,当我想显示所选的3个月期间的线图时,每个数据系列已经包含约50万个值,因此来自服务器的Json响应也变得越来越大,请求随着时间段的增长而变得更加耗时。
因此,我正在寻找一种减少数据量而不失去相关信息(例如温度曲线中的峰值等)的方法,但同时我也希望平滑信号中的噪声。
这里是一个示例,请记住,这只是一些小时或几天的选定时间段,通常用户也想看到几个月甚至几年的数据: enter image description here 绿线是温度,红色条形图是数字状态的表示(在本例中,加热器使其中一个温度曲线上升)。
您可以清楚地看到信号中的噪音,这就是我想要摆脱的。同时,我希望保留特征,例如加热器打开后温度急剧上升和下降的特征。
我已经尝试将原始数据分成给定长度的块,然后对其中的数据进行聚合,以便在该间隔内获得最小值、最大值和平均值。这种方法有效,但通过这样做,曲线的特征会丢失,一切都变得有点平坦或平均。这里是同一时期稍微缩小一点的图片,以便聚合开始发挥作用: enter image description here 上面系列的平均值显示为绿线,每个块的范围(最小/最大)由平均线周围的绿色区域表示。

当数据从数据库中出来并在发送到前端之前,是否有一种高级算法可以用于过滤/平滑/减少我的数据?我需要寻找哪些关键词?任何特定的库、框架或技术都将受到高度赞赏,对于这个主题的一般评论也很重要。我主要对服务器端解决方案感兴趣,但请随意提及客户端JavaScript解决方案,因为它们可能非常适合其他面临同样问题的人。


你要找的流行词是时间序列。但是它没有银弹可言。但最有可能的是,根据缩放级别,您需要聚合值。因此,对于最小缩放级别,您将大量聚合以减少检索的数据数量,依此类推... - Stanislav Nedeljkovic
你说得对,我已经考虑到了那一点。聚合切割大小取决于图表大小和当前可见时间范围,或者更准确地说:基于可用的图表宽度,图表被分成给定数量的间隔,以便聚合的粒度始终与视觉外观相匹配。当你缩小时(可见范围增加),块间隔变大,块数保持不变。 - Rob
也许考虑从SQL Server转移到NoSQL,并使用Map-Reduce进行聚合。 - Stanislav Nedeljkovic
很遗憾,我无法更改那部分。 - Rob
1个回答

0

有没有一种高级算法可以在数据从数据库中出来并发送到前端之前对其进行过滤/平滑/减少?我需要挖掘哪些关键词?

我问了我在大学工作的朋友,她说傅里叶变换可能可以用...但那对我来说像荷兰语 :)

编辑:我自己再看一下,因为你的数据是时间采样的,我猜你会对离散时间傅里叶变换感兴趣。

进一步搜索这个主题,我找到了这里 - 对于我(虽然不是专家)来说,那似乎是有用的东西...

进一步编辑:

所以,这个链接让我想到你应该能够在服务器端删除(例如)每隔一两个样本点:然后在客户端上,你可以使用那个链接中描述的插值技术(使用傅立叶逆变换),有效地“恢复”客户端上缺失的点:你已经传输了一半的点,但结果图形将完全相同,因为在客户端上你已经插值填充了缺失的样本点…或者我的想法完全错了? :)


@Robert,这对你有帮助吗? :) - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接