检测原始数据的变化

时间:2018-01-18 11:31:40

标签: javascript node.js express data-analysis

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

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

我的问题是:

  1. 有哪些算法/功能可以检测水箱水位的变化?我如何将它们应用到我的应用程序中?
  2. 何时应进行数据处理?当数据被解析并保存到服务器中?在一天结束时,有一个功能可以查看当天的所有数据吗?
  3. 在解析阶段是否值得考虑某种数据清理?我注意到由于噪音导致数据出现随机峰值的时间。
  4. 如果在完成交货后立即开始清空水箱,我应该如何处理事件?我将需要算法足够稳健,以便检测斜率方向的变化为事件的结束。此示例位于提供的图像中。
  5. 我意识到可能很难将强大的解决方案整合在一起。有时候坦克在被填充的同时被清空。这使得难以测量这些减少量。唯一知道发生这种情况的是在交付扁线期间大约15分钟的斜率,并且交付的固定金额低于通常的交付总额。

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

1 个答案:

答案 0 :(得分:1)

  1. 您应该能够开发一种算法来指定填充或排空(坦克级别的变化)的含义。一个好的起点是Y秒内的X%。然后进行校准以避免误报或漏报(例如,当没有填充时显示填充而不是填充时发生填充。一种可能的方法是在一段时间内(例如10分钟)平均燃料水平并进行比较接下来10分钟的平均值。如果差异超过阈值(比如说5%),你可以称之为改变。

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

  3. 您几乎肯定需要对传入数据执行类似低通过滤的操作。你不想根据水平的临时峰值显示坦克填充。使用一组值很容易做到这一点。如上所述,移动平均线,例如最后10分钟的水平,是平滑数据的另一种方式。你可能永远不会得到0%的假阳性率或0%的假阴性率,你只能瞄准尽可能低的价值。

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