# PKS models —— 压力/振动算法与模型重构 本目录把原先合并在一起的 PKS 故障算法与泛化模型拆开、规范化重排,是本项目 压力/振动算法与模型的唯一实现。原 `backend/model_assistant_generalized/` 已删除, 其逻辑与文档已全部迁入本目录;`backend/scan_pks_fault_evolution.py`(合并版扫描器) 保留作为历史参照。 ## 目录 | 目录 | 内容 | |---|---| | `common/` | 公共层:数据库连接、报警阈值、小时聚合、数据查询、稳健统计、CSV 输出、窗口切分、训练/评估/推理、自动校验 | | `generalized/` | **压力算法 + 压力模型**:`pressure_algorithm.py`、`features_pressure.py`、`build_datasets.py`、`split_datasets.py`、`train_model.py`、`evaluate_model.py`、`infer_and_combine.py`、`run_pipeline.py` | | `vibration/` | **振动算法 + 振动模型**:与 `generalized/` 对称 | | `datas/` | 中间数据与训练数据:`hourly/`(小时中间表)、`pressure/`、`vibration/`(窗口样本)、`artifacts/`(训练产物)、`reference/`(golden 基准) | | `results/` | 算法扫描结果与模型测试结果:`common/`、`pressure/`、`vibration/`、`verification/` | | `markdown/` | 文档:压力算法、压力模型、振动算法、振动模型、模型辅助确认方案 | | `service/` | 实时服务定时脚本:`mac/`(launchd)、`linux/`(systemd)、`windows/`(schtasks) | | `migrations/` | 数据库结构变更 SQL(如 `alarm_des` 扩到 4000) | | `scan_all.py` | 全量扫描(压力+振动),按设备号输入,结果可存本地或数据库 | | `realtime_service.py` | 实时扫描(`--once` / `--loop` / `--simulate`),结果合并写入 `compressor_alarm` | ## 设备号输入 算法与扫描统一使用 `--device 7# 8# 9#`(默认 `7# 8# 9#`),设备通过 `compressor_data_import.directory_path` 解析到 PKS 导入批次。`4#/5#/6#` 暂不纳入。 算法内部仍按 `批次` 分组,因此本地全量结果与历史 CSV 逐字节一致。 ## 全量运行 ```bash # 本地:自动查询起止时间(floor(最小)..floor(最大)+1h),先清理旧中间/结果再生成 python models/scan_all.py --device 7# 8# 9# --store local # 数据库:本地结果与中间文件照常生成,并额外把最终段写入 compressor_alarm python models/scan_all.py --device 7# 8# 9# --store db # 也可显式指定时间,或复用已缓存小时中间表 python models/scan_all.py --start "2025-01-01 00:00:00" --end "2026-09-01 00:00:00" python models/scan_all.py --hourly-csv models/datas/hourly/pks_hourly_full.csv ``` 数据库存储映射(表 `compressor_alarm`): | 结果 | device_code | device_part | device_point | alarm_type | alarm_level | |---|---|---|---|---|---| | 压力段 | `7#` | `润滑油压力` | `YSJ_5` | `润滑油压力故障` | 压力阶段 | | 振动段 | `7#` | 按 `最强异常侧` 取 `联轴器端振动` / `链轮端振动` | 对应 `YSJ_10` / `YSJ_11` | `振动故障` | 振动阶段 | `alarm_des=阶段触发依据`(≤4000)、`alarm_info_json`=对应 CSV 行 JSON、`status=1`。 全量写库会先删除所选设备的历史压力/振动告警再插入。 ## 实时运行 ```bash python models/realtime_service.py --once # 单次 python models/realtime_service.py --loop --interval 300 # 每 5 分钟(命令行定时) ``` - 窗口:`end = min(floor(now), floor(最新数据)+1h)`,`start = end - 45 天`。 - 合并:同 `(设备, 类型, 等级)` 且时间重叠或间隔 ≤6h 的段合并为一条, 同一等级连续段不会因跨小时或“最强侧”切换被拆开;等级变化保留为不同行, 合并时 `device_part/device_point` 更新为最新 `最强异常侧`。 - 定时服务安装/卸载见 `models/service/README.md`。 - 冒烟测试:`python models/realtime_service.py --simulate "2026-02-03 20:00:00,2026-02-04 00:00:00"`(默认结束后回滚)。 ## 复现(3 小时) ```bash # 1) 算法扫描结果 python models/scan_all.py --device 7# 8# 9# --store local # 2) 压力模型 3h:build -> split -> train -> evaluate -> infer python models/generalized/run_pipeline.py --window-hours 3 # 3) 振动模型 3h python models/vibration/run_pipeline.py --window-hours 3 # 4) 自动校验(含 compressor_alarm 对应关系) python models/common/verify.py --with-db ``` `--window-hours 6` 的参数化代码路径保留,但本轮不重新生成 6h 产物。 ## 校验基线 `python models/common/verify.py --with-db` 会比对: - 5 个扫描结果 CSV 与 `models/datas/reference/` 逐字节一致; - 数据库全量重跑与缓存一致; - 压力/振动 3h 模型指标与文档一致(阈值 `0.862553`/`0.916630`,异常 F1 `96.59%`/`71.43%`,事件召回 `10/10`、`4/4`); - `compressor_alarm` 行数与参考 CSV 对应(压力 72、振动 25,共 97)。 报告写入 `models/results/verification/verification_report.json`。 ## 标签来源 模型标签来自算法扫描结果(`润滑油压力小时阶段段.csv` / `振动异常段.csv`), 指标衡量的是对规则标签的泛化一致性,不等同于物理故障诊断。