代码之家  ›  专栏  ›  技术社区  ›  Mejezza

检测原始数据中的更改

  •  0
  • Mejezza  · 技术社区  · 7 年前

    我目前正在构建一个web应用程序,用作储罐液位仪表板。它解析来自坦克中多个传感器的传入数据,并将这些值存储在数据库中。应用程序是使用express/node构建的。js。数据每5分钟采样一次,但每小时发送到服务器(每次传输12个样本)。

    我目前正在尝试扩展应用程序的功能,以检测油箱液位因加注或排空而发生的变化。最终目标是编制每日报告,生成填充/清空事件的摘要,以及添加或删除的时间和数量。此图显示了一天内储罐容量的屏幕截图- https://imgur.com/a/kZ50N .

    我的问题是:

    1. 有哪些算法/功能可用于检测油箱液位的变化?我将如何在应用程序中实现它们?
    2. 数据处理应在何时进行?当数据被解析并保存到服务器时?在一天结束时使用一个函数来检查当天的所有数据?
    3. 是否值得考虑在解析阶段进行某种数据清理?我注意到,有时由于噪声,数据中会出现随机尖峰。
    4. 当他们在完成交付后立即开始清空储罐时,我应该如何处理事件?我需要算法足够健壮,能够检测到坡度方向的变化,从而作为事件的结束。这方面的示例如所提供的图像所示。

    我意识到,可能很难找到一个可靠的解决方案。有时油箱在加注的同时排空。这使得很难衡量这些减少。唯一要知道的是,这是在大约15分钟的交付期间发生的,并且交付量比通常的交付总量少。

    这是一个有趣的项目。谢谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Terry Lennox    7 年前
    1. 您应该能够开发一种算法来指定填充或排空(油箱液位的变化)的含义。一个好的开始位置是Y秒内的X%。然后进行校准,以避免误报或漏报(例如,在没有加油时显示加油,而在加油时丢失加油)。一种可能的方法是在一段时间内(比如10分钟)平均燃油油位,并将其与接下来10分钟的平均值进行比较。如果差异超过阈值(比如5%),您可以将其称为更改。

    2. 处理数据的时间取决于需要数据的时间,因此,如果需要不断通知用户更改,可以通过查询数据来完成。在写入数据存储时将数据处理为级别更改可能更有效(您只需执行一次),但是您将无法调整算法。这很可能取决于性能,例如,如果有人想提取一年的数据,系统是否能够处理这一问题?

    3. 几乎可以肯定的是,您需要对传入数据进行低通滤波器之类的操作。您不希望根据液位的临时峰值显示油箱加注。使用值数组很容易做到这一点。如上所述,移动平均值(比如最后10分钟的水平)是平滑数据的另一种方法。您可能永远不会得到0%的假阳性率或0%的假阴性率,您只能将目标值尽可能低。

    4. 在这种情况下,看起来就像是先加注,然后排空油箱。如果您认为这是两个独立的事件,那么您可以简单地检测传入数据的更改。我建议您创建一个图形,将填充标记为图形上的符号,并将其清空。这样,您可以查看数据以确保检测到更改。我还想说,您可以使用jasmin为您的计算添加一些非常有用的单元测试。js或黄瓜。js。