首页 > 解决方案 > python周期性时间序列浮动窗口分析系统架构

问题描述

我正在寻求有关系统设计的帮助/提示。

我有一些带有传感器 PIR(运动)、接触器、温度和湿度的物联网系统......没什么特别的。

我正在收集、过滤数据的原始数据,以在上面建立一些观察结果。到目前为止,我有一些event_rules类绑定到传感器,并根据来自队列(来自传感器)的数据不断返回 True/False。

我知道我需要对现有数据进行一些定期分析,例如,当运动传感器不再报告或传入/现有包括加载数据和在某个时间窗口(计数/平均等)分析数据时,该时间窗口方法可以帮助回答以下问题:

在过去 1 小时内温度升高超过 10 度* 或在过去 10 分钟内未检测到运动或在过去 30 分钟内检测到高/低/未检测到运动

我愚蠢的方法是运行一些半 cron python 线程,它一个接一个地执行规则,并每 N 秒检查一次规则输出,例如每 30 秒。一些规则包括状态机并处理从一种状态到另一种状态的转换。但这太糟糕了,想象一下系统规模扩大,突然系统将每 N 秒检查数百条规则。

我知道需要一些通用的方法。 我该如何处理这个案子?什么是正确的方法?在 uC 世界中,我将其称为如何正确生成将检查规则的系统时钟,但又不是一次全部以一种可配置的方式。

我会感谢这些提示,也许已经有一些 python 库来解决它。我使用 pandas 进行分析,使用机器状态进行状态转换,事件规则在 SQL 数据库中定义,并根据规则类型转换为多态 python 类。

标签: pythonpandascronstate

解决方案


使用 Pandas rolling Window 可能是一种解决方案(来源:pandas.pydata.org: WindowHow to use rolling in pandas?)。

这通常意味着:
步骤 1:
基于行数(增加的索引 ID)或基于时间的(增加的时间戳)定义一个基于时间的窗口

第 2 步:
将此窗口应用于数据集

滚动窗口的原理

下面的代码片段将基本计算(平均值、最小值、最大值)应用于数据帧,并将结果作为新列添加到数据帧中。
为了保持原始数据框干净,我建议使用副本而不是:

import pandas as pd

df = pd.read_csv('[PathToDatasurce]')
df_copy = df.copy()
        
df_copy['moving-average'] = df_15['SourceColumn'].rolling(window=10).mean()
df_copy['moving-average'] = df_15['SourceColumn'].rolling(window=10).min()
df_copy['moving-average'] = df_15['SourceColumn'].rolling(window=10).max()

推荐阅读