我有一个测量液体体积的传感器。这种液体会慢慢消耗,并在需要时重新填充。我想检测的是这种液体被“偷走”或填充的次数。被盗是指液体体积突然下降。反之将被视为填充。从传感器获取的值具有较小的尖峰,如果有足够的测量值有助于做到这一点,则应该忽略这些尖峰。
是否有任何统计方法(文档)或编程算法(任何语言)甚至更好的 sql 函数/查询(任何数据库)来完成上述场景?
我有一个测量液体体积的传感器。这种液体会慢慢消耗,并在需要时重新填充。我想检测的是这种液体被“偷走”或填充的次数。被盗是指液体体积突然下降。反之将被视为填充。从传感器获取的值具有较小的尖峰,如果有足够的测量值有助于做到这一点,则应该忽略这些尖峰。
是否有任何统计方法(文档)或编程算法(任何语言)甚至更好的 sql 函数/查询(任何数据库)来完成上述场景?
您通常希望发现异常值。
您是否有想要保留的基线值,或者您想要与当前的运行平均值进行比较?
您认为什么是突然下降 - 它是绝对术语(如 5l)还是相对术语(当前音量的 5%)。
如果您依赖运行平均值,这里是一个大概的描述。
on volumeChange do
calculate new runningAverage
if (runningAverage outside allowedRange(oldRunningAverage)) then raise warning
oldRunningAverage := runningAverage
你需要知道的是:
allowedRange
定义的这是 5 次测量(蓝色)的简单移动平均值(红色)的图示:
也许值得您看看Microsoft StreamInsight:
正如 Microsoft SQL Server 旨在管理静态数据一样,StreamInsight 旨在分析动态数据。对于 StreamInsight,流是具有与其关联的时间的数据序列。示例是提供交易所中不同股票随时间变化的价格的股票代码流,或者提供传感器随时间报告的温度值的温度传感器流。
StreamInsight 程序通过一组查询来传递流,这些查询分析数据,观察有趣的信息。然后,它会输出从查询中派生的信息,例如由于查询识别出异常而生成的警报。
计算关于时间的一阶导数应该会给你你正在寻找的东西。使用时间增量 > 1 的样本应该有助于消除小的跳跃。