python - python周期性时间序列浮动窗口分析系统架构
问题描述
我正在寻求有关系统设计的帮助/提示。
我有一些带有传感器 PIR(运动)、接触器、温度和湿度的物联网系统......没什么特别的。
我正在收集、过滤数据的原始数据,以在上面建立一些观察结果。到目前为止,我有一些event_rules类绑定到传感器,并根据来自队列(来自传感器)的数据不断返回 True/False。
我知道我需要对现有数据进行一些定期分析,例如,当运动传感器不再报告或传入/现有包括加载数据和在某个时间窗口(计数/平均等)分析数据时,该时间窗口方法可以帮助回答以下问题:
在过去 1 小时内温度升高超过 10 度* 或在过去 10 分钟内未检测到运动或在过去 30 分钟内检测到高/低/未检测到运动
我愚蠢的方法是运行一些半 cron python 线程,它一个接一个地执行规则,并每 N 秒检查一次规则输出,例如每 30 秒。一些规则包括状态机并处理从一种状态到另一种状态的转换。但这太糟糕了,想象一下系统规模扩大,突然系统将每 N 秒检查数百条规则。
我知道需要一些通用的方法。 我该如何处理这个案子?什么是正确的方法?在 uC 世界中,我将其称为如何正确生成将检查规则的系统时钟,但又不是一次全部以一种可配置的方式。
我会感谢这些提示,也许已经有一些 python 库来解决它。我使用 pandas 进行分析,使用机器状态进行状态转换,事件规则在 SQL 数据库中定义,并根据规则类型转换为多态 python 类。
解决方案
使用 Pandas rolling Window 可能是一种解决方案(来源:pandas.pydata.org: Window,How 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()
推荐阅读
- prolog - prolog MAZE 中没有实现
- google-sheets - 根据谷歌电子表格中单列的值对整行进行颜色编码(条件格式)
- python - 从(叠加)分布创建不等间距的值
- discord.js - 从 Discord 中的特定频道检索所有成员
- xamarin - 标签在 Xamarin.iOS 中不可见
- .net - 在 CentOS 8 上安装 dotnet/core/aspnet:3.1 时出错 - 文件夹 [/usr/share/dotnet/host/fxr] 不包含任何版本编号的子文件夹
- c# - 为什么我不能在 Aerospike 中创建一个新集合?
- python - 在给定的日期时间运行函数
- python - 在 seaborn 中为子图设置不同的轴限制
- java - 不处理 429 错误代码的 javax.ws.rs 包的替代方案