重构位置:
models/generalized/pressure_algorithm.py(压力算法)+models/common/(公共查询、报警配置、稳健统计、CSV 输出)。 原合并脚本backend/scan_pks_fault_evolution.py保留不动,本文件只描述压力一侧。当前 v2:压力标签 61 条(7号 0、8号 61、9号 0)。在 100% 方案的 0 点/部分掉点过滤上, 新增“开机恢复瞬态”剔除规则;0 点、部分掉点和开机瞬态小时均不进入正常训练样本。
models/generalized/pressure_algorithm.pymodels/common/models/scan_all.pymodels/results/pressure/润滑油压力小时等级.csvmodels/results/pressure/润滑油压力小时阶段段.csvmodels/results/pressure/润滑油压力演化周期.csvmodels/results/pressure/压力开机恢复剔除标签.csvmodels/results/pressure/压力开机恢复剔除小时.csvmodels/results/common/报警阈值配置.csv| 点位 | 含义 | 用途 |
|---|---|---|
YSJ_5 |
润滑油压力 | 分析长期下降和低压风险 |
YSJ_10 |
联轴器端振动 | 分析振动峰值和均值异常 |
YSJ_11 |
链轮端振动 | 分析振动峰值和均值异常 |
YSJ_41 |
运行状态 | 判断设备是否运行 |
运行判断规则:
YSJ_41 > 0 表示设备运行
批次与机组的对应关系:
| 批次 | 机组 |
|---|---|
| 30 | 7号机 |
| 31 | 8号机 |
| 32 | 9号机 |
数据库端按小时聚合 5 秒采样数据,每个小时计算:
oil_zero_count 及 0 值比例 oil_zero_ratio;每小时理论样本数为:
720 个样本(5 秒一个样本)
运行覆盖率计算方式:
运行覆盖率 = 运行样本数 / 720
只有满足以下条件的小时,才参与长期趋势或振动基线分析:
运行覆盖率 >= 0.80
同时,以下小时不参与压力周期、趋势、标签和正常样本:
oil_avg <= 0 → 0 MPa 无效小时
oil_zero_ratio >= 5%
且相邻小时 oil_zero_ratio >= 50% → 部分掉点无效小时
这样可以排除停机、启动、停机过渡和采集不完整对结果的影响。
识别润滑油压力是否出现真实的长期恶化,而不是把单个采样点或短时掉点误判为长期故障。
核心思想:
周期基线 + 下降百分比 + 持续下降趋势 + 工程报警阈值 + 连续确认
对每台机组的有效运行小时建立油压周期:
oil_avg <= 0 和部分掉点小时先被剔除,再划分周期。周期基线取周期开始阶段前 24 个有效运行小时油压均值的中位数:
周期基线 = 前 24 个有效小时油压均值的中位数
同时计算近期 24 个有效小时基线,用于辅助判断当前油压是否偏离近期水平。
对最近 6 个连续 1 小时步长的有效运行小时计算油压线性斜率,并统计连续下降的有效小时数。 跨掉点、缺失或停机缺口的小时不能参与斜率,连续点少于 3 个时斜率为空。
认为油压处于下降趋势的条件为:
连续下降有效小时数 >= 3
或最近 6 个连续有效小时斜率 < -0.0005
相对周期基线变化计算方式:
相对变化 = (当前油压 - 周期基线) / 周期基线
例如结果为 -16.7%,表示当前油压比周期基线下降约 16.7%。
同时满足:
相对周期基线下降 >= 5%
且处于下降趋势
满足任一条件:
相对周期基线下降 >= 10%,且处于下降趋势
或油压 <= 低报警阈值
满足任一条件:
相对周期基线下降 >= 20%,且处于下降趋势
或油压 <= 低低报警阈值
当前实际阈值示例:
低报警阈值:0.34 MPa
低低报警阈值:0.31 MPa
报警阈值从数据库中的 site_point 和对应 AlarmType 配置读取,不固定写死某一个报警配置编号。
一个小时内,只有当达到报警阈值的运行样本占比至少达到 20% 时,才将该小时标记为对应的低报警小时:
报警样本比例 = 报警运行样本数 / 运行样本数
报警样本比例 >= 20%
为减少短时异常误报,油压阶段采用连续有效小时确认:
因此,短时间低压掉点不会直接形成长期严重故障阶段,但原始报警不会丢失。
前置下降:
连续下降 >= 6 个连续有效小时
且 6 小时斜率 < -0.001
且相对周期基线下降不足 5%
→ 该小时并入后面的轻微阶段,阶段起点前移
开机恢复瞬态(v2 新增):
该规则不使用“开机后固定剔除 N 小时”的方式;必须观察到稳定恢复才删除。
油压结果分为三层:
阶段合并时,同一机组、同一周期、同一等级且间隔不超过 6 小时的小时会合并。
典型演化结果:
轻微 -> 异常 -> 严重异常
v2 额外输出:
压力开机恢复剔除标签.csv:被删除的开机恢复瞬态标签、稳定恢复开始小时和连续稳定小时数;压力开机恢复剔除小时.csv:从开机到稳定恢复前被排除出正常训练的小时。压力算法不依赖振动代码,公共逻辑在 models/common/。设备号输入、全量/实时模式与告警
落库统一见 全量与实时运行及告警落库.md。
# 按设备号,自动查询起止时间,先清理旧中间/结果再生成,结果写本地
python models/scan_all.py --device 7# 8# 9# --store local
# 本地结果照常生成,并额外写入 compressor_alarm
python models/scan_all.py --device 7# 8# 9# --store db
# 同时写入模型异常概率参考(viewer 告警详情显示)
python models/scan_all.py --device 7# 8# 9# --store db --with-model
# 复用小时中间表
python models/generalized/pressure_algorithm.py \
--device 7# 8# 9# \
--hourly-csv models/datas/hourly/pks_hourly_full.csv \
--output-dir models/results/pressure
# 连库扫描
python models/generalized/pressure_algorithm.py --device 7# 8# 9#
python models/generalized/pressure_algorithm.py \
--device 8# \
--hourly-csv models/datas/hourly/pks_hourly_full.csv \
--output-dir models/results/pressure_8
参数含义与默认值:
| 参数 | 含义 | 默认值 |
|---|---|---|
--device |
压缩机编号,可多选,如 7# 8# 9# |
7# 8# 9# |
--start / --end |
扫描起止(连库模式) | 自动:floor(最小)..floor(最大)+1h |
--chunk-days |
每个查询块的天数 | 14 |
--hourly-csv |
复用小时中间表,不查库 | 无 |
--output-dir |
输出目录 | models/results/pressure |
说明:设备经 compressor_data_import.directory_path 解析到 PKS 批次;算法内部仍按批次
划分周期,因此本地结果的基础列与历史 CSV 对应;v2 以当前 reference 为准。
优先看以下字段:
相对周期基线变化;近6有效小时油压斜率;连续下降有效小时数;压力等级;是否形成确认等级;低报警小时数、低低报警小时数。判断重点:
是否在完整运行小时内持续下降,并且连续达到确认时长
运行样本数 / 720 一起查看,避免低覆盖率小时造成误判。