我目前正在构建一个Web应用程序,该应用程序充当储罐级别的仪表板。它解析来自坦克中多个传感器的输入数据,并将这些值存储在数据库中。该应用程序是使用express / node.js构建的。数据每5分钟采样一次,但每小时发送一次到服务器(每次传输12个采样)。
我目前正在尝试扩展该应用程序的功能,以检测由于填充或排空而引起的储罐液位变化。最终目标是拥有一个每日报告,该报告生成填充/清空事件的摘要以及持续时间和添加或移除的数量。此图显示了一天中的油箱容量-https://imgur.com/a/kZ50N的屏幕截图。
我的问题是:
有哪些可用的算法/功能可检测罐中液位的变化?如何将它们实现到我的应用程序中?
什么时候应该进行数据处理?由于数据已解析并保存到服务器中?在一天结束时,该函数会处理当天的所有数据吗?
在分析阶段是否值得考虑进行某种形式的数据清理?我注意到有时由于噪声而导致数据随机出现尖峰。
当他们在完成交货后立即开始清空储罐时,我该如何处理?我将需要算法足够健壮,以使其能够检测到坡度方向的变化,从而使事件结束。提供的图像中有此示例。
我意识到,很难将一个强大的解决方案组合在一起。有时会在装满油箱的同时将其清空。这使得难以衡量这些减少。唯一要知道的是,这是在交货扁平期间大约15分钟的斜率发生的,并且交货量比通常的总交货量小。
这是一个有趣的项目。感谢您的协助。
最佳答案
您应该能够开发一种算法,该算法指定填充或排空(油箱液位变化)的含义。一个好的起点是Y秒内达到X%。然后,您要进行校准以避免出现误报或误报(例如,在没有燃油时显示加油或在燃油发生时漏油)。一种可能的方法是在一段时间(例如10分钟)内平均加油并进行比较以及接下来10分钟的平均值。如果差异超出阈值(例如5%),则可以将其称为更改。
处理数据的时间取决于所需的时间,因此,如果需要不断向用户通知更改,则可以在查询数据时完成。在写入数据存储时将数据处理为不同级别的更改可能会更高效(您只需执行一次),但是您将无法调整算法。它很可能取决于性能,例如如果有人想提取一年的数据,系统是否可以处理呢?
几乎可以肯定,您需要对传入的数据执行类似低通滤波器的操作。您不希望根据液位的暂时峰值显示储罐填充量。使用值数组很容易做到这一点。如上所述,移动平均线(例如最后10分钟的水平)是使数据平滑的另一种方法。您可能永远不会获得0%的假阳性率或0%的假阴性率,您只能将值设置得尽可能低。
在这种情况下,看起来像是填充,然后清空了水箱。如果您将它们视为两个独立的事件,则只需检测输入数据的变化即可。我建议您创建一个图形,将填充标记为图形以及清空图形。这样,您可以查看数据以确保检测到更改。我还要说的是,您可以使用jasmin.js或cumulage.js为您的计算添加一些非常有用的单元测试。
关于javascript - 检测原始数据的变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48320306/