检测原始数据的变化

Detecting change in raw data

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

我目前正在尝试扩展应用程序的功能,以检测由于加注或排空而导致的水箱液位变化。最终目标是生成一份每日报告,生成填充/清空事件的摘要,其中包含添加或移除的持续时间和数量。此图显示了一天内油箱容量的屏幕截图 - https://imgur.com/a/kZ50N

我的问题是:

  1. 有哪些算法/函数可用于检测水箱液位的变化?我如何将它们实施到我的应用程序中?
  2. 数据处理应该在什么时候进行?随着数据被解析并保存到服务器中?在一天结束时使用一个函数来处理当天的所有数据?
  3. 是否值得考虑在解析阶段进行某种数据清理?我注意到数据中有时会因噪声而出现随机尖峰。
  4. 我应该如何处理完成交付后立即开始清空水箱的事件?我将需要算法足够强大,以便它检测到斜坡方向的变化是事件的结束。这方面的例子在提供的图片中。

我意识到可能很难组合出一个可靠的解决方案。有时,水箱在被注满的同时被清空。这使得很难衡量这些减少。唯一知道发生这种情况的是在大约 15 分钟的交付平线期间的斜率,并且交付量比通常的交付总量少一个固定数量。

这是一个很有趣的项目。感谢您的帮助。

  1. 您应该能够开发一种算法来指定填充或排空(罐液位变化)的含义。一个好的起点是 Y 秒内的 X%。然后,您进行校准以避免误报或漏报(例如,在出现 none 时显示加注,而不是在加注发生时显示加注。一种可能的方法是在一段时间内(比如 10 分钟)对燃油液位进行平均) 并将其与接下来 10 分钟的平均值进行比较。如果差异超过阈值(比如 5%),则可以称之为变化。

  2. 何时处理数据取决于何时需要它,因此如果需要不断通知用户更改,可以通过查询数据来完成。将数据处理为写入数据存储时的级别变化可能会更有效(您只执行一次),但是您失去了调整算法的能力。它很可能取决于性能,例如如果有人想拉取一年的数据,系统能处理吗?

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

  4. 在这种情况下,它看起来像是先填充然后清空水箱。如果您将这些视为两个独立的事件,那么您可以简单地检测传入数据的变化。我建议您创建一个图形标记填充作为图形上的符号以及清空。通过这种方式,您可以观察数据以确保检测到变化。我还想说您可以使用 jasmin.js 或 cucumber.js.

  5. 为您的计算添加一些非常有用的单元测试