# 5 号机缸体振动标签算法说明 ## 1. 输入 - `wave_file` 中 5 号机 6 个缸体振动点位; - 每个文件读取 `wave_sample_one` 的**首周期**; - 仅保留 `rpm > 0` 的运行态文件; - 约 15 分钟一个文件; - 每个文件约 1544 个采样点、采样率 25.6 kHz、约 60ms。 ## 2. 首周期特征 每个文件、每个缸计算: - 时域:RMS、峰值、峰峰值、偏度、峭度、峰值因子、脉冲因子、裕度因子、波形因子、过零率; - 频域:频带能量、谱重心、谱熵、高频能量占比; - 包络:包络 RMS/峰值、1x/2x/3x 包络幅值、包络熵; - 跨缸残差:同缸 vs 同级其他缸的 `rms_log`、`kurt`、`hf_ratio`、`env_1x_log`、`env_2x_log`。 当前评分主要使用跨缸残差特征,避免全厂共同工况变化直接变成单缸标签。 ## 3. 动态局部基线 对每个 15 分钟点、每个缸: - 向前查看**最多 30 天**; - 至少需要 **96 个有效运行点(1 天)**; - 自动跳过停机和无数据区间; - 每次断档超过 2 小时后,新启动的前 1 小时不参与基线; - 基线位置使用中位数,尺度使用 `(Q75-Q25)/1.349`; - 局部基线不足 1 天时标记 `baseline_ok=False`,不直接确认标签。 与旧版全局基线相比,动态基线能避免把“全时段平均”当成近期正常状态。 ## 4. 评分和等级 对每个残差特征计算局部 z-score: ```text z = (feature - local_median) / local_scale ``` 分数取各残差特征 z-score 绝对值的最大值;最大贡献特征作为 `driver`。 等级阈值只由局部基线和稳健尺度决定: ```text 轻微 = max(3.5, 中位数 + 6 × MAD) 异常 = max(5.0, 中位数 + 10 × MAD) 严重异常 = max(7.0, 中位数 + 14 × MAD) ``` - 分数达到“轻微”才作为候选; - 等级由段内最大分数决定; - 不使用事件日期修改阈值; - 不使用 24 小时局部对比度门槛。 ## 5. 15 分钟段 - 点级命中后,按数据连续性聚成段; - 单点强异常允许保留; - 段属性包括起止、时长、最大分数、最大时间、driver、方向、等级、特异性; - 方向: - 高幅高冲击:RMS 和峭度都高于同级; - 低幅高冲击:RMS 不高,但峭度高于同级; - 高幅:只有 RMS 高; - 未确认:单特征或证据不足。 ## 6. 小时标签 - 每小时最多 4 个 15 分钟点; - 至少 2 个点落入异常段,该小时才形成标签; - 相邻小时且连续时合并; - 中间缺 1 小时不跨段合并; - 小时标签继承段的等级、方向、确认状态和最大分数。 ## 7. 状态标记,不做二次删除 不再用单独规则删除标签。以下信息只写入 `review_flags` / 字段: - `未确认`:多特征确认不足; - `低幅高冲击`:RMS 不高但峭度高; - `高幅`:只有幅值高; - `启动/过渡`:启动后前 1 小时占比高; - `局部基线不足`:前置 1 天基线不足; - `持续证据弱`:段内活跃点比例低。 所有标签都保留,HTML 通过筛选查看。 ## 8. 事件验证 事件只用于验证,不参与标签生成: | 事件 | 缸 | 当前结果 | 等级 | 提前量 | |---|---|---|---|---| | 2026-06-12 | 二缸 | 6/11 11:00~15:45 | 严重异常 | 0.54 天 | | 2026-06-21 | 五缸 | 6/18 09:45~11:15 | 轻微 | 2.59 天 | | 2026-07-11 | 二缸 | 7/05 01:15~03:00 | 轻微 | 5.95 天 | 当前 3/3 事件有振动标签;6/21 是低幅高冲击,不再是漏报。 ## 9. 已知限制 1. 首周期是快照,无法覆盖完整 15 分钟内的所有冲击; 2. 启动/停机瞬态可能提高峭度,需要结合 `review_flags` 复核; 3. 动态基线在早期数据不足 1 天时无法判断; 4. 6/21 的振动证据较弱,温度是主要参考; 5. 等级是规则分级,不是物理故障严重度的绝对标定。 ## 10. 后续合并 见 `合并方案.md`。当前不修改 `models/`。