1
0

3 Ревизии b9b9fcd18c ... 25b151528b

Автор SHA1 Съобщение Дата
  18922397810 25b151528b 新增润滑油压力和振动模型详细报告 преди 2 седмици
  18922397810 e70428b3bf 文档:记录压力去掉0点、测试100%版本的规则、结果和程序改动 преди 3 седмици
  18922397810 4d6df6b3f3 新增数字世界模型系统介绍PPT规划、素材与输出 преди 3 седмици
променени са 21 файла, в които са добавени 3251 реда и са изтрити 0 реда
  1. 606 0
      build_model_detail_report.py
  2. 223 0
      models/markdown/压力_去掉0点_100版本说明.md
  3. BIN
      总结文档/润滑油压力和振动模型详细报告.docx
  4. BIN
      数字世界模型驱动的压缩机生命周期感知系统/PPT参考模版.pptx
  5. BIN
      数字世界模型驱动的压缩机生命周期感知系统/三维感知呈现系统界面图片.png
  6. BIN
      数字世界模型驱动的压缩机生命周期感知系统/三维感知呈现系统界面(实时功图).png
  7. BIN
      数字世界模型驱动的压缩机生命周期感知系统/压缩机机器图片.png
  8. BIN
      数字世界模型驱动的压缩机生命周期感知系统/实时波形与功图预览对比.png
  9. BIN
      数字世界模型驱动的压缩机生命周期感知系统/故障信息图.png
  10. BIN
      数字世界模型驱动的压缩机生命周期感知系统/故障区模型精准抓取.png
  11. 928 0
      数字世界模型驱动的压缩机生命周期感知系统/数字世界模型系统介绍PPT规划.md
  12. BIN
      数字世界模型驱动的压缩机生命周期感知系统/数字孪生驱动的设备全生命周期评估与预防性维护项目阶段审查PPT材料模板.pptx
  13. BIN
      数字世界模型驱动的压缩机生命周期感知系统/数据查询时间轴.png
  14. 254 0
      数字世界模型驱动的压缩机生命周期感知系统/新版36页逐页脚本.md
  15. BIN
      数字世界模型驱动的压缩机生命周期感知系统/输出/压缩机全貌_透明背景.png
  16. BIN
      数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统.pptx
  17. BIN
      数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_36页系统介绍.pptx
  18. BIN
      数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_修订版.pptx
  19. BIN
      数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_正式版.pptx
  20. BIN
      数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_科技工业风预览.pptx
  21. 1240 0
      数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_科技工业风预览.pptx.inspect.ndjson

+ 606 - 0
build_model_detail_report.py

@@ -0,0 +1,606 @@
+#!/usr/bin/env python3
+"""Generate the detailed pressure/vibration model report from current artifacts."""
+from __future__ import annotations
+
+import csv
+import json
+from datetime import date
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+import pandas as pd
+from docx import Document
+from docx.enum.section import WD_ORIENT
+from docx.enum.table import WD_ALIGN_VERTICAL, WD_TABLE_ALIGNMENT
+from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
+from docx.oxml import OxmlElement
+from docx.oxml.ns import qn
+from docx.shared import Cm, Pt, RGBColor
+
+from models.common import modeling, paths
+from models.generalized import features_pressure
+from models.vibration import features_vibration
+
+OUT = paths.MODELS.parent / "总结文档" / "润滑油压力和振动模型详细报告.docx"
+BODY_FONT = "宋体"
+HEAD_FONT = "黑体"
+BODY_SIZE = 12.0
+TABLE_SIZE = 12.0
+SMALL_SIZE = 9.0
+BLACK = RGBColor(0, 0, 0)
+
+KINDS = {
+    "pressure": {
+        "label": "润滑油压力",
+        "stage_col": "压力阶段",
+        "label_file": paths.REFERENCE / "润滑油压力小时阶段段.csv",
+        "features": features_pressure,
+        "feature_count": 22,
+    },
+    "vibration": {
+        "label": "振动",
+        "stage_col": "振动阶段",
+        "label_file": paths.REFERENCE / "振动异常段.csv",
+        "features": features_vibration,
+        "feature_count": 25,
+    },
+}
+
+
+def set_run_font(run, name=BODY_FONT, size=BODY_SIZE, bold=False) -> None:
+    run.font.name = name
+    run.font.size = Pt(size)
+    run.font.bold = bold
+    run.font.color.rgb = BLACK
+    run._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), name)
+
+
+def set_style_font(style, name: str, size: float, bold: bool) -> None:
+    style.font.name = name
+    style.font.size = Pt(size)
+    style.font.bold = bold
+    style.font.color.rgb = BLACK
+    style.element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), name)
+
+
+def configure_document(doc: Document) -> None:
+    section = doc.sections[0]
+    section.orientation = WD_ORIENT.PORTRAIT
+    section.page_width = Cm(21.0)
+    section.page_height = Cm(29.7)
+    section.top_margin = Cm(2.2)
+    section.bottom_margin = Cm(2.2)
+    section.left_margin = Cm(2.2)
+    section.right_margin = Cm(2.2)
+
+    normal = doc.styles["Normal"]
+    set_style_font(normal, BODY_FONT, BODY_SIZE, False)
+    normal.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
+    normal.paragraph_format.space_before = Pt(0)
+    normal.paragraph_format.space_after = Pt(0)
+
+    for name, size in (("Heading 1", 16), ("Heading 2", 14), ("Heading 3", 12)):
+        style = doc.styles[name]
+        set_style_font(style, HEAD_FONT, size, True)
+        style.paragraph_format.space_before = Pt(14 if name == "Heading 1" else 10)
+        style.paragraph_format.space_after = Pt(8)
+        style.paragraph_format.line_spacing_rule = WD_LINE_SPACING.SINGLE
+        style.paragraph_format.keep_with_next = True
+
+    header = section.header.paragraphs[0]
+    header.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = header.add_run("润滑油压力和振动模型详细报告")
+    set_run_font(run, BODY_FONT, 9)
+
+    footer = section.footer.paragraphs[0]
+    footer.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = footer.add_run("第 ")
+    set_run_font(run, BODY_FONT, 9)
+    field = OxmlElement("w:fldSimple")
+    field.set(qn("w:instr"), "PAGE")
+    footer._p.append(field)
+    run = footer.add_run(" 页")
+    set_run_font(run, BODY_FONT, 9)
+
+
+def body(doc: Document, text: str, bold_prefix: str = "") -> None:
+    paragraph = doc.add_paragraph()
+    paragraph.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
+    paragraph.paragraph_format.space_after = Pt(6)
+    if bold_prefix and text.startswith(bold_prefix):
+        run = paragraph.add_run(bold_prefix)
+        set_run_font(run, BODY_FONT, BODY_SIZE, True)
+        run = paragraph.add_run(text[len(bold_prefix):])
+        set_run_font(run, BODY_FONT, BODY_SIZE)
+    else:
+        run = paragraph.add_run(text)
+        set_run_font(run, BODY_FONT, BODY_SIZE)
+
+
+def source(doc: Document, text: str) -> None:
+    paragraph = doc.add_paragraph()
+    paragraph.paragraph_format.space_after = Pt(8)
+    run = paragraph.add_run("数据来源:" + text)
+    set_run_font(run, BODY_FONT, SMALL_SIZE)
+
+
+def fix_table(table, widths: list[float]) -> None:
+    table.alignment = WD_TABLE_ALIGNMENT.CENTER
+    table.autofit = False
+    tbl_pr = table._tbl.tblPr
+    layout = OxmlElement("w:tblLayout")
+    layout.set(qn("w:type"), "fixed")
+    tbl_pr.append(layout)
+    tbl_w = tbl_pr.find(qn("w:tblW"))
+    if tbl_w is None:
+        tbl_w = OxmlElement("w:tblW")
+        tbl_pr.append(tbl_w)
+    tbl_w.set(qn("w:w"), str(int(sum(widths) * 567)))
+    tbl_w.set(qn("w:type"), "dxa")
+    for index, column in enumerate(table._tbl.tblGrid.gridCol_lst):
+        column.set(qn("w:w"), str(int(widths[index] * 567)))
+
+
+def cell_margins(cell) -> None:
+    tc_pr = cell._tc.get_or_add_tcPr()
+    mar = tc_pr.first_child_found_in("w:tcMar")
+    if mar is None:
+        mar = OxmlElement("w:tcMar")
+        tc_pr.append(mar)
+    for key, value in (("w:left", 60), ("w:right", 60), ("w:top", 30), ("w:bottom", 30)):
+        node = mar.find(qn(key))
+        if node is None:
+            node = OxmlElement(key)
+            mar.append(node)
+        node.set(qn("w:w"), str(value))
+        node.set(qn("w:type"), "dxa")
+
+
+def add_table(doc: Document, headers: list[str], rows: list[list[Any]], widths: list[float], size=TABLE_SIZE, center=True) -> None:
+    table = doc.add_table(rows=1, cols=len(headers))
+    table.style = "Table Grid"
+    fix_table(table, widths)
+    header_row = table.rows[0]
+    tr_pr = header_row._tr.get_or_add_trPr()
+    tr_pr.append(OxmlElement("w:tblHeader"))
+    for index, text in enumerate(headers):
+        cell = header_row.cells[index]
+        cell.width = Cm(widths[index])
+        cell_margins(cell)
+        cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
+        paragraph = cell.paragraphs[0]
+        paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+        paragraph.paragraph_format.line_spacing_rule = WD_LINE_SPACING.SINGLE
+        run = paragraph.add_run(str(text))
+        set_run_font(run, BODY_FONT, size, True)
+    for values in rows:
+        row = table.add_row()
+        row._tr.get_or_add_trPr().append(OxmlElement("w:cantSplit"))
+        for index, text in enumerate(values):
+            cell = row.cells[index]
+            cell.width = Cm(widths[index])
+            cell_margins(cell)
+            cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
+            paragraph = cell.paragraphs[0]
+            paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER if center else WD_ALIGN_PARAGRAPH.LEFT
+            paragraph.paragraph_format.line_spacing_rule = WD_LINE_SPACING.SINGLE
+            run = paragraph.add_run("" if text is None else str(text))
+            set_run_font(run, BODY_FONT, size)
+    doc.add_paragraph()
+
+
+def pct(value: Any, digits: int = 2) -> str:
+    if value is None:
+        return "—"
+    return f"{float(value) * 100:.{digits}f}%"
+
+
+def num(value: Any, digits: int = 4) -> str:
+    if value is None:
+        return "—"
+    return f"{float(value):.{digits}f}"
+
+
+def load_json(path: Path) -> dict:
+    return json.loads(Path(path).read_text(encoding="utf-8"))
+
+
+def load_model(kind: str):
+    bundle = __import__("joblib").load(paths.MODEL_ARTIFACTS / kind / f"{kind}_model.joblib")
+    metadata = load_json(paths.MODEL_ARTIFACTS / kind / f"{kind}_metadata.json")
+    return bundle, metadata
+
+
+def predict(samples: list[dict], bundle: dict, kind: str) -> np.ndarray:
+    feature_module = KINDS[kind]["features"]
+    names = bundle["feature_names"]
+    x = modeling.matrix(feature_module.feature_matrix(samples, bundle["unit_baselines"]), names)
+    x = bundle["imputer"].transform(x)
+    return bundle["model"].predict_proba(x)[:, 1]
+
+
+def metrics_block(samples: list[dict], probabilities: np.ndarray, threshold: float) -> tuple[dict, dict]:
+    labels = np.asarray([sample["label"] for sample in samples])
+    predicted = (probabilities >= threshold).astype(int)
+    return modeling.metrics(labels, predicted, probabilities), modeling.event_metrics(samples, predicted)
+
+
+def class_rows(metrics: dict, threshold: float) -> list[list[str]]:
+    normal = metrics["class_metrics"]["normal"]
+    anomaly = metrics["class_metrics"]["anomaly"]
+    return [
+        ["正常", normal["support"], pct(normal["precision"]), pct(normal["recall"]), pct(normal["f1"]), pct(metrics["specificity"]), "—"],
+        ["异常", anomaly["support"], pct(anomaly["precision"]), pct(anomaly["recall"]), pct(anomaly["f1"]), "—", pct(metrics["pr_auc"])],
+    ]
+
+
+def overall_rows(metrics: dict) -> list[list[str]]:
+    c = metrics["confusion_matrix_counts"]
+    return [[
+        metrics["samples"], metrics["normal_samples"], metrics["anomaly_samples"],
+        c["tp"], c["fp"], c["fn"], c["tn"], pct(metrics["accuracy"]), pct(metrics["balanced_accuracy"]),
+        pct(metrics["macro_f1"]), pct(metrics["pr_auc"]),
+    ]]
+
+
+def event_rows(events: dict) -> list[list[str]]:
+    return [[
+        events["anomaly_events"], events["detected_anomaly_events"], events["missed_anomaly_events"],
+        events["normal_events"], events["false_positive_normal_events"], pct(events["event_recall"]),
+    ]]
+
+
+def add_class_tables(doc: Document, metrics: dict, threshold: float, title: str, source_text: str) -> None:
+    doc.add_heading(title, level=3)
+    add_table(
+        doc, ["类别", "样本数", "查准率", "召回率", "F1", "特异度", "PR-AUC"],
+        class_rows(metrics, threshold), [2.2, 2.2, 2.4, 2.4, 2.2, 2.2, 2.4], size=12.0,
+    )
+    add_table(
+        doc, ["样本数", "正常", "异常", "TP", "FP", "FN", "TN"],
+        [overall_rows(metrics)[0][:7]], [2.4, 2.2, 2.2, 2.2, 2.2, 2.2, 2.2], size=12.0,
+    )
+    add_table(
+        doc, ["准确率", "平衡准确率", "macro-F1", "PR-AUC"],
+        [overall_rows(metrics)[0][7:]], [4.0, 4.0, 4.0, 4.0], size=12.0,
+    )
+    source(doc, source_text)
+
+
+def add_event_table(doc: Document, events: dict, title: str, source_text: str) -> None:
+    doc.add_heading(title, level=3)
+    add_table(
+        doc, ["异常事件", "检出", "漏报", "正常事件", "正常事件误报", "事件召回"],
+        event_rows(events), [2.6, 2.2, 2.2, 2.6, 3.2, 2.6], size=12.0,
+    )
+    source(doc, source_text)
+
+
+def add_unit_table(doc: Document, evaluation: dict, title: str, source_text: str) -> None:
+    doc.add_heading(title, level=3)
+    rows = []
+    for unit, data in evaluation["by_unit"].items():
+        normal = data["class_metrics"]["normal"]
+        anomaly = data["class_metrics"]["anomaly"]
+        rows.append([
+            unit, data["normal_samples"], data["anomaly_samples"],
+            pct(normal["precision"]), pct(normal["recall"]), pct(normal["f1"]),
+            pct(anomaly["precision"]), pct(anomaly["recall"]), pct(anomaly["f1"]),
+            pct(data["specificity"]), pct(data["pr_auc"]),
+        ])
+    add_table(
+        doc, ["机组", "正常窗口", "正常查准", "正常召回", "正常F1", "特异度"],
+        [[row[0], row[1], row[3], row[4], row[5], row[9]] for row in rows],
+        [2.6, 2.6, 2.6, 2.6, 2.6, 2.6], size=12.0,
+    )
+    add_table(
+        doc, ["机组", "异常窗口", "异常查准", "异常召回", "异常F1", "PR-AUC"],
+        [[row[0], row[2], row[6], row[7], row[8], row[10]] for row in rows],
+        [2.6, 2.6, 2.6, 2.6, 2.6, 2.6], size=12.0,
+    )
+    source(doc, source_text)
+
+
+def add_stage_table(doc: Document, labels: pd.DataFrame, stage_col: str, title: str, source_text: str) -> None:
+    doc.add_heading(title, level=3)
+    rows = []
+    for unit in ("7号机", "8号机", "9号机"):
+        subset = labels[labels["机组"] == unit]
+        counts = subset[stage_col].value_counts().to_dict()
+        rows.append([
+            unit, counts.get("轻微", 0), counts.get("异常", 0), counts.get("严重异常", 0), len(subset),
+        ])
+    counts = labels[stage_col].value_counts().to_dict()
+    rows.append(["合计", counts.get("轻微", 0), counts.get("异常", 0), counts.get("严重异常", 0), len(labels)])
+    add_table(doc, ["机组", "轻微", "异常", "严重异常", "合计"], rows, [4.0, 3.0, 3.0, 3.2, 3.0], size=12.0)
+    source(doc, source_text)
+
+
+def error_tables(doc: Document, kind: str, threshold: float, evaluation: dict) -> None:
+    frame = pd.read_csv(paths.RESULTS / kind / f"{kind}_test_predictions.csv")
+    frame = frame.rename(columns={"anomaly_probability": "probability", "true_label": "label", "predicted_label": "predicted"})
+    fp = frame[(frame["label"] == 0) & (frame["predicted"] == 1)].sort_values("probability", ascending=False).head(5)
+    fn = frame[(frame["label"] == 1) & (frame["predicted"] == 0)].sort_values("probability").head(5)
+    c = evaluation["window_metrics"]["confusion_matrix_counts"]
+
+    body(
+        doc,
+        f"测试集错判 {c['fp']} 个、漏判 {c['fn']} 个,真正例 {c['tp']} 个、真负例 {c['tn']} 个。"
+        f"错判是正常窗口被判为异常,漏判是异常窗口被判为正常;同时给出事件级结果,避免只看窗口。",
+    )
+    add_table(
+        doc, ["类型", "机组", "窗口开始", "窗口结束", "概率", "事件编号"],
+        [["错判", r["unit"], r["start_hour"][:16], r["end_hour"][:16], num(r["probability"], 4), r["event_group_id"]]
+         for _, r in fp.iterrows()] or [["错判", "无", "—", "—", "—", "—"]],
+        [1.4, 1.6, 3.2, 3.2, 1.8, 4.8], size=12.0,
+    )
+    add_table(
+        doc, ["类型", "机组", "窗口开始", "窗口结束", "概率", "事件编号"],
+        [["漏判", r["unit"], r["start_hour"][:16], r["end_hour"][:16], num(r["probability"], 4), r["event_group_id"]]
+         for _, r in fn.iterrows()] or [["漏判", "无", "—", "—", "—", "—"]],
+        [1.4, 1.6, 3.2, 3.2, 1.8, 4.8], size=12.0,
+    )
+    source(doc, f"models/results/{kind}/{kind}_test_predictions.csv;按阈值 {threshold:.6f} 判定")
+
+
+def feature_table(doc: Document, bundle: dict, metadata: dict, title: str, source_text: str) -> None:
+    doc.add_heading(title, level=3)
+    names = bundle["feature_names"]
+    values = bundle["model"].feature_importances_
+    items = sorted(zip(names, values), key=lambda item: item[1], reverse=True)
+    top = items[:10]
+    rest = sum(value for _, value in items[10:])
+    rows = [[name, pct(value)] for name, value in top]
+    rows.append(["其余特征合计", pct(rest)])
+    add_table(doc, ["特征", "重要度"], rows, [12.5, 4.0], size=12.0, center=False)
+    source(doc, source_text)
+
+
+def add_model_section(doc: Document, kind: str, labels: pd.DataFrame, evaluation: dict, bundle: dict, metadata: dict, train: list[dict], validation: list[dict], test: list[dict]) -> None:
+    info = KINDS[kind]
+    title = info["label"]
+    doc.add_heading(f"{'五' if kind == 'pressure' else '六'}、{title}模型详细", level=1)
+
+    doc.add_heading("模型与训练", level=2)
+    body(
+        doc,
+        f"模型为 XGBoost 二分类,输出窗口异常概率;特征版本为 {metadata.get('feature_version', '')},"
+        f"特征数 {info['feature_count']}。训练使用全部正常样本和异常样本,按验证集选择阈值。"
+    )
+    rows = [
+        ["窗口长度", "3 小时"],
+        ["训练轮数(请求/实际)", f"800 / {metadata.get('rounds_run', '—')}"],
+        ["早停轮数", "50"],
+        ["最佳轮次", str(metadata.get("best_iteration", "—"))],
+        ["最佳验证 logloss", num(metadata.get("best_score"), 5)],
+        ["正常/异常训练样本", f"{metadata.get('training_normal', '—')} / {metadata.get('training_anomaly', '—')}"],
+        ["scale_pos_weight", num(metadata.get("scale_pos_weight"), 3)],
+        ["分类阈值", num(metadata.get("threshold"), 6)],
+        ["阈值选择", "验证集最大 F1"],
+    ]
+    add_table(doc, ["项目", "值"], rows, [6.0, 9.5], size=12.0, center=False)
+    source(doc, f"models/datas/artifacts/{kind}/{kind}_metadata.json;models/common/modeling.py")
+
+    # Training set (reference only)
+    threshold = float(metadata["threshold"])
+    train_p = predict(train, bundle, kind)
+    train_metrics, train_events = metrics_block(train, train_p, threshold)
+    add_class_tables(
+        doc, train_metrics, threshold, "训练集(仅参考)",
+        f"models/datas/{kind}/train;使用保存模型重新打分,训练集指标偏乐观,不作为泛化结论",
+    )
+    add_event_table(doc, train_events, "训练集事件级", f"models/datas/{kind}/train;保存模型重新打分")
+
+    val_p = predict(validation, bundle, kind)
+    val_metrics, val_events = metrics_block(validation, val_p, threshold)
+    add_class_tables(
+        doc, val_metrics, threshold, "验证集",
+        f"models/datas/{kind}/validation;使用保存模型重新打分,阈值来自 metadata",
+    )
+    add_event_table(doc, val_events, "验证集事件级", f"models/datas/{kind}/validation;保存模型重新打分")
+
+    add_class_tables(
+        doc, evaluation["window_metrics"], threshold, "封存测试集",
+        f"models/results/{kind}/{kind}_test_evaluation.json 的 window_metrics",
+    )
+    add_event_table(doc, evaluation["event_metrics"], "测试集事件级", f"models/results/{kind}/{kind}_test_evaluation.json 的 event_metrics")
+    add_unit_table(doc, evaluation, "测试集分机组", f"models/results/{kind}/{kind}_test_evaluation.json 的 by_unit")
+    add_stage_table(doc, labels, info["stage_col"], "标签阶段分布", f"models/datas/reference/{info['label_file'].name}")
+
+    doc.add_heading("错判与漏判", level=2)
+    error_tables(doc, kind, threshold, evaluation)
+    if kind == "pressure":
+        body(
+            doc,
+            "从测试结果看,错判主要是正常窗口概率接近阈值,漏判主要是轻微、单小时或边界窗口;"
+            "7 号机测试异常窗口 10 个、9 号机没有异常窗口,因此分机组指标只能作为参考。事件级 10/10 检出。",
+        )
+    else:
+        body(
+            doc,
+            "从测试结果看,错判和漏判都集中在短阶段和峰值型阶段附近,概率接近阈值;"
+            "9 号机没有测试异常事件,7/8 号事件级 4/4 检出,但窗口级召回有限,需结合事件级结果看。",
+        )
+
+    feature_table(doc, bundle, metadata, "特征重要度(前 10)", f"{kind}_model.joblib 的 feature_importances_;特征名来自 metadata")
+
+
+def add_summary_section(doc: Document, data: dict[str, dict]) -> None:
+    doc.add_heading("七、两模型汇总", level=1)
+    rows = []
+    for kind, item in data.items():
+        for split_name, metrics in (("验证集", item["validation"]), ("测试集", item["test"])):
+            normal = metrics["class_metrics"]["normal"]
+            anomaly = metrics["class_metrics"]["anomaly"]
+            rows.append([
+                KINDS[kind]["label"], split_name, metrics["samples"],
+                pct(normal["precision"]), pct(normal["recall"]), pct(normal["f1"]),
+                pct(anomaly["precision"]), pct(anomaly["recall"]), pct(anomaly["f1"]),
+                pct(metrics["pr_auc"]),
+            ])
+    add_table(
+        doc, ["模型", "集合", "样本数", "正常查准", "正常召回", "正常F1"],
+        [row[:6] for row in rows], [3.2, 2.8, 2.6, 2.6, 2.6, 2.6], size=12.0,
+    )
+    add_table(
+        doc, ["模型", "集合", "样本数", "异常查准", "异常召回", "异常F1", "PR-AUC"],
+        [[row[0], row[1], row[2], *row[6:]] for row in rows],
+        [2.6, 2.4, 2.2, 2.4, 2.4, 2.4, 2.2], size=12.0,
+    )
+    source(doc, "压力/振动 validation 重新打分;test 来自各自 *_test_evaluation.json")
+    rows = []
+    for kind, item in data.items():
+        for split_name, events in (("验证集", item["validation_events"]), ("测试集", item["test_events"])):
+            rows.append([
+                KINDS[kind]["label"], split_name, events["anomaly_events"], events["detected_anomaly_events"],
+                events["missed_anomaly_events"], events["false_positive_normal_events"], pct(events["event_recall"]),
+            ])
+    add_table(doc, ["模型", "集合", "异常事件", "检出", "漏报", "正常事件误报", "事件召回"], rows, [2.2, 1.6, 2.0, 1.6, 1.6, 2.6, 2.2], size=12.0)
+    source(doc, "validation 事件级重新打分;test 事件级来自 evaluation event_metrics")
+
+
+def main() -> None:
+    doc = Document()
+    configure_document(doc)
+
+    # Cover
+    for _ in range(5):
+        doc.add_paragraph()
+    paragraph = doc.add_paragraph()
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run("润滑油压力和振动模型详细报告")
+    set_run_font(run, HEAD_FONT, 26, True)
+    paragraph = doc.add_paragraph()
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run("备份版本:压力 72 条 / 振动 25 条")
+    set_run_font(run, BODY_FONT, 14)
+    for _ in range(6):
+        doc.add_paragraph()
+    paragraph = doc.add_paragraph()
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run(f"{date.today().year} 年 {date.today().month} 月")
+    set_run_font(run, BODY_FONT, 12)
+    doc.add_page_break()
+
+    doc.add_heading("一、文档说明", level=1)
+    body(doc, "本报告对应当前已恢复的备份版本:润滑油压力 72 条标签、振动 25 条标签。报告不包含后续 64 条压力标签或振动调参实验。")
+    body(doc, "模型均为二分类“正常/异常”窗口模型,输出异常概率;标签中的轻微/异常/严重异常是样本来源阶段,不是模型的三分类输出。")
+    body(doc, "所有指标均由当前模型文件、验证样本和封存测试结果重新计算或读取;每张表下方标注数据来源。")
+
+    doc.add_heading("二、数据与标签来源", level=1)
+    rows = [
+        ["小时运行数据", "models/datas/hourly/pks_hourly_full.csv", "7/8/9 号机 5 秒数据按小时聚合"],
+        ["压力标签", "models/datas/reference/润滑油压力小时阶段段.csv", "72 条"],
+        ["振动标签", "models/datas/reference/振动异常段.csv", "25 条"],
+        ["压力训练样本", "models/datas/pressure/", "manifest、train、validation、test"],
+        ["振动训练样本", "models/datas/vibration/", "manifest、train、validation、test"],
+        ["压力模型", "models/datas/artifacts/pressure/", "XGBoost + 相似度索引"],
+        ["振动模型", "models/datas/artifacts/vibration/", "XGBoost + 相似度索引"],
+    ]
+    add_table(doc, ["类型", "路径", "说明"], rows, [3.2, 8.0, 5.0], size=12.0, center=False)
+    source(doc, "项目内实际文件;标签时间范围和数量由 reference CSV 统计")
+
+    pressure_labels = pd.read_csv(KINDS["pressure"]["label_file"])
+    vibration_labels = pd.read_csv(KINDS["vibration"]["label_file"])
+    rows = [
+        ["润滑油压力", len(pressure_labels), pressure_labels["开始小时"].min()[:10], pressure_labels["结束小时"].max()[:10]],
+        ["振动", len(vibration_labels), vibration_labels["开始小时"].min()[:10], vibration_labels["结束小时"].max()[:10]],
+    ]
+    add_table(doc, ["类型", "标签数", "最早开始", "最晚结束"], rows, [4.0, 3.0, 4.0, 4.0], size=12.0)
+    source(doc, "models/datas/reference/润滑油压力小时阶段段.csv、振动异常段.csv")
+
+    doc.add_heading("三、样本构建与划分", level=1)
+    body(doc, "压力与振动均使用 3 小时滑动窗口。窗口与任一异常阶段重叠即标为异常;训练样本使用全部正常窗口。")
+    body(doc, "切分比例为 6.5 / 2 / 1.5,随机种子 20260921,事件组不跨 train/validation/test。压力异常按样本分配,振动按事件组分配。")
+    rows = []
+    for kind in ("pressure", "vibration"):
+        report = load_json(paths.DATAS / kind / "split_report.json")[kind]
+        counts = report["sample_counts"]
+        for split_name in ("train", "validation", "test"):
+            item = counts[split_name]
+            rows.append([KINDS[kind]["label"], split_name, item["samples_normal"], item["samples_anomaly"]])
+    add_table(doc, ["模型", "划分", "正常", "异常"], rows, [4.0, 3.0, 4.0, 4.0], size=12.0)
+    body(doc, "排除样本:压力 750、振动 519;不计入正常/异常训练或测试指标。")
+    source(doc, "models/datas/pressure/split_report.json、models/datas/vibration/split_report.json")
+
+    rows = []
+    for kind in ("pressure", "vibration"):
+        manifest = pd.read_csv(paths.DATAS / kind / "manifest.csv")
+        for unit in ("7号机", "8号机", "9号机"):
+            for split_name in ("train", "validation", "test"):
+                subset = manifest[(manifest["unit"] == unit) & (manifest["split"] == split_name)]
+                if subset.empty:
+                    continue
+                rows.append([
+                    KINDS[kind]["label"], unit, split_name,
+                    int((subset["label_name"] == "normal").sum()),
+                    int((subset["label_name"] == "anomaly").sum()),
+                ])
+    add_table(doc, ["模型", "机组", "split", "正常", "异常"], rows, [3.0, 2.4, 2.6, 2.2, 2.2], size=12.0)
+    source(doc, "models/datas/pressure/manifest.csv、models/datas/vibration/manifest.csv")
+
+    doc.add_heading("四、指标定义与来源", level=1)
+    body(doc, "TP:异常检出;FP:正常误报;FN:异常漏报;TN:正常正确排除。")
+    body(doc, "查准率 = TP/(TP+FP);异常召回 = TP/(TP+FN);正常特异度 = TN/(TN+FP);正常召回等于特异度。")
+    body(doc, "F1 为查准率与召回率的调和平均;平衡准确率 =(正常召回 + 异常召回)/2;macro-F1 为两类 F1 的算术平均;PR-AUC 基于异常概率计算。")
+    body(doc, "事件级指标按事件组聚合:事件内任一窗口检出,该事件算检出;正常事件内任一窗口报警,算正常事件误报。")
+    rows = [
+        ["验证集/训练集分类指标", "保存模型对对应样本重新打分", "models/datas/{kind}/train、validation;models/datas/artifacts/{kind}"],
+        ["测试集分类指标", "封存测试评估 JSON", "models/results/{kind}/{kind}_test_evaluation.json"],
+        ["分机组指标", "by_unit", "同上"],
+        ["事件级指标", "event_metrics", "验证集重新计算;测试集读取 JSON"],
+        ["错判/漏判明细", "测试预测 CSV", "models/results/{kind}/{kind}_test_predictions.csv"],
+    ]
+    add_table(doc, ["指标", "计算方式", "来源"], rows, [4.6, 5.8, 6.0], size=12.0, center=False)
+    source(doc, "models/common/modeling.py 的 metrics / event_metrics / choose_threshold")
+
+    data: dict[str, dict] = {}
+    for kind in ("pressure", "vibration"):
+        bundle, metadata = load_model(kind)
+        train = modeling.load_samples(paths.DATAS / kind / "train")
+        validation = modeling.load_samples(paths.DATAS / kind / "validation")
+        test = modeling.load_samples(paths.DATAS / kind / "test")
+        evaluation = load_json(paths.RESULTS / kind / f"{kind}_test_evaluation.json")
+        labels = pd.read_csv(KINDS[kind]["label_file"])
+        add_model_section(doc, kind, labels, evaluation, bundle, metadata, train, validation, test)
+        threshold = float(metadata["threshold"])
+        val_p = predict(validation, bundle, kind)
+        val_metrics, val_events = metrics_block(validation, val_p, threshold)
+        data[kind] = {
+            "validation": val_metrics,
+            "validation_events": val_events,
+            "test": evaluation["window_metrics"],
+            "test_events": evaluation["event_metrics"],
+        }
+
+    add_summary_section(doc, data)
+
+    doc.add_heading("八、结论与限制", level=1)
+    body(doc, "压力模型在测试集上正常类 F1 99.74%、异常类 F1 96.59%,事件级 10/10;但 7 号机只有 10 个测试异常窗口、9 号机没有测试异常窗口,分机组指标只能作参考。")
+    body(doc, "振动模型在测试集上正常类 F1 99.72%、异常类 F1 71.43%,事件级 4/4;异常阶段短、测试事件少,窗口级指标波动较大。")
+    body(doc, "两个模型的测试集均为封存集,没有参与训练或阈值选择;验证集用于阈值选择。标签来自规则扫描阶段,未经人工确认,指标代表对规则标签的泛化一致性,不等同于物理故障诊断。")
+    body(doc, "错判和漏判主要出现在轻微、短阶段或边界窗口;实际使用时应结合事件级结果、连续窗口和现场维修记录复核。")
+
+    doc.add_heading("附录:文件路径", level=1)
+    rows = [
+        ["压力标签", "models/datas/reference/润滑油压力小时阶段段.csv"],
+        ["振动标签", "models/datas/reference/振动异常段.csv"],
+        ["压力样本", "models/datas/pressure/"],
+        ["振动样本", "models/datas/vibration/"],
+        ["压力模型", "models/datas/artifacts/pressure/pressure_model.joblib"],
+        ["振动模型", "models/datas/artifacts/vibration/vibration_model.joblib"],
+        ["压力评估", "models/results/pressure/pressure_test_evaluation.json"],
+        ["振动评估", "models/results/vibration/vibration_test_evaluation.json"],
+        ["压力预测明细", "models/results/pressure/pressure_test_predictions.csv"],
+        ["振动预测明细", "models/results/vibration/vibration_test_predictions.csv"],
+    ]
+    add_table(doc, ["对象", "路径"], rows, [4.0, 12.0], size=12.0, center=False)
+
+    OUT.parent.mkdir(parents=True, exist_ok=True)
+    doc.save(OUT)
+    print(f"已生成:{OUT}")
+
+
+if __name__ == "__main__":
+    main()

+ 223 - 0
models/markdown/压力_去掉0点_100版本说明.md

@@ -0,0 +1,223 @@
+# 压力模型“去掉 0 点、测试 100%”版本说明
+
+> 历史版本记录。该方案对应本地提交 `41fe49636`,当前仓库已回退到备份版本,本文件仅用于保留方案和程序改动。
+
+## 一、版本定位
+
+- 类型:润滑油压力标签 + 深度学习/树模型辅助确认
+- 标签:64 条
+- 模型:3 小时窗口,XGBoost
+- 测试结果:查准率 100%、召回率 100%、F1 100%、PR-AUC 100%
+- 事件召回:7/7
+- 特点:在 Stage 1 新标签基础上,进一步把“部分掉点小时”按无效处理
+
+## 二、和前后版本的区别
+
+| 版本 | 压力标签 | 7 号 | 8 号 | 9 号 | 测试 F1 | 测试 PR-AUC |
+|---|---:|---:|---:|---:|---:|---:|
+| 备份版本 | 72 | 7 | 63 | 2 | 96.59% | 99.61% |
+| Stage 1 新标签 | 68 | 4 | 63 | 1 | 93.43% | 99.27% |
+| **本版本:去掉 0 点** | **64** | **2** | **62** | **0** | **100%** | **100%** |
+
+本版本删除的 7 条单小时弱标签:
+
+- 7号机-P02 2025-04-30 19:00
+- 7号机-P10 2025-10-05 12:00
+- 8号机-P07 2025-07-09 12:00
+- 8号机-P16 2026-04-26 05:00
+- 8号机-P03 2026-07-27 05:00
+- 8号机-P03 2026-07-31 19:00
+- 9号机-P17 2026-01-30 05:00
+
+同时,掉点小时被剔除后,3 条长阶段发生拆分:
+
+- 8号机-P05 2025-02-10/11
+- 8号机-P09 2025-10-27/28
+- 8号机-P02 2026-06-14/15
+
+最终阶段分布:
+
+- 轻微:59
+- 异常:4
+- 严重异常:1
+
+## 三、标签规则
+
+### 1. 0 MPa 整小时无效
+
+```text
+oil_avg <= 0 → 该小时不参与周期、趋势、连续下降和阶段划分
+```
+
+### 2. 部分掉点小时无效
+
+新增小时级 0 值统计:
+
+```text
+oil_zero_ratio = 0 值运行样本数 / 运行样本数
+```
+
+判定规则:
+
+```text
+oil_zero_ratio >= 5%
+且相邻小时存在 oil_zero_ratio >= 50% 的小时
+→ 该小时判为无效
+```
+
+这样能去掉“均值被 0 值拉低、最大值仍正常”的部分掉点小时,同时避免把孤立少量 0 值误判为掉点。
+
+### 3. 斜率只用连续有效小时
+
+```text
+6 小时斜率只使用连续 1 小时步长的有效小时
+跨掉点、缺失、停机缺口不参与斜率
+```
+
+### 4. 前置下降并入轻微
+
+```text
+连续下降 >= 6 个有效小时
+且 6 小时斜率 < -0.001
+且相对周期基线下降不足 5%
+→ 该小时判为轻微
+```
+
+若与后面的轻微阶段间隔不超过 6 小时,则合并为同一段,阶段起点前移。
+
+### 5. 分级阈值
+
+- 轻微:相对周期基线下降 >= 5%,且处于下降趋势
+- 异常:相对周期基线下降 >= 10%,或低报警
+- 严重异常:相对周期基线下降 >= 20%,或低低报警
+
+## 四、程序改动
+
+对应提交:`41fe49636`
+
+### 1. `models/common/queries.py`
+
+- 小时聚合 SQL 增加:
+
+```sql
+SUM(CASE WHEN YSJ_41 > 0 AND YSJ_5 = 0 THEN 1 ELSE 0 END) AS oil_zero_count
+```
+
+- `NUMERIC_HOURLY_FIELDS` 增加 `oil_zero_count`,保证小时 CSV 读取时按数值解析。
+
+### 2. `models/generalized/pressure_algorithm.py`
+
+新增/修改:
+
+- `_zero_ratio(row)`:计算小时 0 值比例。
+- `_dropout_invalid_hours(rows)`:
+  - 先标记 `zero_ratio >= 50%` 的整小时;
+  - 再把 `zero_ratio >= 5%` 且前后 1 小时存在整小时掉点的小时标为无效。
+- `assign_hourly_cycles`:
+  - 过滤 `oil_avg <= 0`;
+  - 过滤 `_dropout_invalid_hours` 命中的小时。
+- `_contiguous_slope(history, current)`:
+  - 只使用连续 1 小时步长的有效小时计算斜率;
+  - 少于 3 个连续点返回 `None`。
+- `classify_oil_hourly_segments`:
+  - 趋势判断改用 `_contiguous_slope`。
+- `extend_oil_segments_with_precursor`:
+  - 对轻微阶段向前扩展;
+  - 条件:正常小时、相对基线下降 0%–5%、连续下降 >= 6、斜率 < -0.001;
+  - 重算阶段开始时间、有效小时数和触发依据。
+- `run`:
+  - 在阶段合并后调用 `extend_oil_segments_with_precursor`。
+
+### 3. `models/generalized/build_datasets.py`
+
+训练样本构建增加同样的无效小时过滤:
+
+```python
+scoped = [row for row in scoped if row.get("oil_avg") is not None and row["oil_avg"] > 0]
+invalid = pressure_algorithm._dropout_invalid_hours(scoped)
+scoped = [row for row in scoped if (row["批次"], row["_dt"]) not in invalid]
+```
+
+目的:0 值和部分掉点小时既不进入标签,也不作为正常样本进入模型训练。
+
+### 4. 小时中间表
+
+- `pks_hourly_full.csv` 增加两列:
+  - `oil_zero_count`
+  - `oil_zero_ratio`
+- 压力标签和训练样本都基于这份带 0 值统计的小时表生成。
+
+### 5. `models/common/verify.py`
+
+压力模型校验基线更新为本版本:
+
+- 候选:12,996 正常 / 956 异常
+- train:8,256 / 614
+- validation:2,886 / 193
+- test:1,854 / 149
+- 阈值:`0.8617269992828369`
+- 测试异常:查准率/召回率/F1 = 1.0
+- 事件召回:7/7
+
+## 五、训练与评估
+
+### 数据范围
+
+| 项目 | 正常 | 异常 | 合计 |
+|---|---:|---:|---:|
+| 候选窗口 | 12,996 | 956 | 13,952 |
+| train | 8,256 | 614 | 8,870 |
+| validation | 2,886 | 193 | 3,079 |
+| test | 1,854 | 149 | 2,003 |
+
+- 7 号机异常窗口:9 个
+- 9 号机异常窗口:0 个
+
+### 验证集
+
+| 阈值 | 查准率 | 召回率 | F1 | PR-AUC |
+|---:|---:|---:|---:|---:|
+| 0.861727 | 99.45% | 93.26% | 96.26% | 99.52% |
+
+### 封存测试集
+
+| 类别 | 查准率 | 召回率 | F1 | 样本数 |
+|---|---:|---:|---:|---:|
+| 正常 | 100% | 100% | 100% | 1,854 |
+| 异常 | 100% | 100% | 100% | 149 |
+
+- 事件召回:7/7
+- 正常事件误报:0
+
+## 六、必须说明的局限
+
+测试集 100% 不代表真实泛化能力完美,原因是:
+
+1. 149 个测试异常窗口全部来自 8 号机;
+2. 7 号机、9 号机测试集没有异常窗口;
+3. 7 号机只有 2 条压力标签、9 个异常窗口;
+4. 9 号机压力标签为 0;
+5. 标签仍来自规则演化阶段,不是人工确认的物理故障标签。
+
+因此这个版本更适合作为“掉点过滤和标签清洗”的方案记录,不适合直接作为跨机组泛化结论。
+
+## 七、复现命令
+
+该版本对应提交 `41fe49636`。在干净工作区中可使用:
+
+```bash
+# 1. 生成带 0 值统计的小时表(字段:oil_zero_count / oil_zero_ratio)
+# 2. 生成压力标签
+python3 models/generalized/pressure_algorithm.py \
+  --device 7# 8# 9# \
+  --hourly-csv models/datas/hourly/pks_hourly_full_zero.csv \
+  --output-dir models/datas/staging_v3/pressure
+
+# 3. 重建压力样本、切分、训练、评估
+python3 models/generalized/run_pipeline.py --window-hours 3
+
+# 4. 校验
+python3 models/common/verify.py
+```
+
+注意:当前仓库已回退到备份版本,上述命令需要先恢复到 `41fe49636` 的代码和数据状态。

BIN
总结文档/润滑油压力和振动模型详细报告.docx


BIN
数字世界模型驱动的压缩机生命周期感知系统/PPT参考模版.pptx


BIN
数字世界模型驱动的压缩机生命周期感知系统/三维感知呈现系统界面图片.png


BIN
数字世界模型驱动的压缩机生命周期感知系统/三维感知呈现系统界面(实时功图).png


BIN
数字世界模型驱动的压缩机生命周期感知系统/压缩机机器图片.png


BIN
数字世界模型驱动的压缩机生命周期感知系统/实时波形与功图预览对比.png


BIN
数字世界模型驱动的压缩机生命周期感知系统/故障信息图.png


BIN
数字世界模型驱动的压缩机生命周期感知系统/故障区模型精准抓取.png


+ 928 - 0
数字世界模型驱动的压缩机生命周期感知系统/数字世界模型系统介绍PPT规划.md

@@ -0,0 +1,928 @@
+# 数字世界模型驱动的压缩机生命周期感知系统
+## PPT 规划方案(概念版 / 介绍版)
+
+---
+
+## 一、文档说明
+
+本文档用于指导一份面向非技术受众的系统介绍 PPT,重点讲清“为什么做、做成什么、怎么运转、带来什么价值”,不展开具体技术实现。
+
+适用范围:
+
+- 对外介绍、方案汇报、项目路演、阶段沟通;
+- 面向管理人员、业务人员、评审专家;
+- 需要让普通听众听懂,同时保留足够的专业深度。
+
+全篇遵循三条原则:
+
+1. 只讲能力,不讲产品名。
+2. 只讲逻辑,不堆参数。
+3. 每页一个结论,一页只讲一件事。
+
+---
+
+### 制作约定(已确认)
+
+- 主题统一为“压缩机生命周期”,系统名称为“数字世界模型驱动的压缩机生命周期感知系统”。
+- `PPT参考模版.pptx` 仅用于参考配色、版式、样式和整体视觉风格,不参考或沿用其中的内容、数据及项目结论。
+- 功能架构允许采用五层结构。
+- 第 16 页可以出现成果指标,详细口径仍可放在附录。
+- 本版以概念介绍和宣传表达为主,成果表述可适度拔高,不将补充证据或开展核验作为制作前置条件;文档中的示例指标保留示例属性。
+
+---
+
+## 二、核心定位
+
+### 2.1 一句话定位
+
+> 用数字世界模型,为设备建立可持续进化的“数字分身”,把设备运维从“报警之后处置”推进到“故障之前感知”。
+
+### 2.2 四个转变
+
+| 从 | 到 |
+|---|---|
+| 事后维修 | 提前感知 |
+| 单点报警 | 演化判断 |
+| 二维曲线 | 三维定位 |
+| 人工经验 | 可复用知识 |
+
+### 2.3 全篇叙事主线
+
+> 看得见 → 算得准 → 定得位 → 学得会
+
+- 看得见:多源数据统一接入、统一理解;
+- 算得准:规则、趋势、波形、功图、综合判断共同工作;
+- 定得位:风险分级、部件定位、提前期呈现;
+- 学得会:人工确认结果反哺系统,越用越准。
+
+---
+
+## 三、全篇结构总览
+
+建议正文 19 页,另附可选附录 4 页。
+
+| 页 | 标题 | 核心作用 |
+|---|---|---|
+| 1 | 封面 | 建立主题与气质 |
+| 2 | 一页看懂 | 用四个能力概括全篇 |
+| 3 | 为什么需要这套系统 | 抛出问题:三个断层 |
+| 4 | 建设目标 | 明确从报警到感知 |
+| 5 | 总体理念 | 数字分身四环 |
+| 6 | 业务架构 | 一条完整业务链路 |
+| 7 | 功能架构 | 五层能力结构 |
+| 8 | 功能全景 | 一页脑图看全系统 |
+| 9 | 数据从哪里来 | 多源接入 |
+| 10 | 数据如何变成资产 | 治理流水线 |
+| 11 | 数据工具 | 查询与标注 |
+| 12 | 模型体系 | 五类模型各司其职 |
+| 13 | 模型能力 | 四张能力卡 |
+| 14 | 感知呈现 | 三维、分级、定位、提前期 |
+| 15 | 自学习闭环 | 越用越准 |
+| 16 | 成果展示 | 四类能力已闭环 |
+| 17 | 应用场景与价值 | 场景与价值落地 |
+| 18 | 创新与展望 | 创新点与路线图 |
+| 19 | 结束页 | 收束与记忆点 |
+
+---
+
+## 四、逐页详细脚本
+
+### 第 1 页:封面
+
+**主标题**
+
+数字世界模型驱动的压缩机生命周期感知系统
+
+**副标题**
+
+从报警之后处置,到故障之前感知
+
+**页面元素**
+
+- 设备三维渲染图或现场设备照片;
+- 一行项目/团队信息;
+- 一行汇报日期。
+
+**讲述要点**
+
+不急着讲技术,先用一句话建立印象:这套系统不是再做一个报警平台,而是给设备建立一个会学习、能进化的数字分身。
+
+---
+
+### 第 2 页:一页看懂
+
+**结论句**
+
+让设备会说话,让异常早出现,让故障看得见,让系统越用越准。
+
+**页面内容(四张卡片)**
+
+1. 让设备会说话
+   - 分散的数据统一接入、统一理解;
+   - 不同来源的数据放在同一张“设备健康档案”里。
+
+2. 让异常早出现
+   - 不只看是否越限,更看长期演化;
+   - 在故障形成之前识别趋势。
+
+3. 让故障看得见
+   - 三维模型上直接定位到部件;
+   - 同时给出类型、级别、时间。
+
+4. 让系统越用越准
+   - 专家确认一次,系统学习一次;
+   - 经验从个人能力变成系统能力。
+
+**视觉建议**
+
+四象限大图,每格一个图标 + 一句结论 + 一条说明。全页文字不超过 80 字。
+
+**讲述要点**
+
+这一页是全篇的“总纲”。后面每一章,都是对这四句话的展开。
+
+---
+
+### 第 3 页:为什么需要这套系统
+
+**结论句**
+
+设备运维的真正难点,不是没有数据,而是数据不会说话。
+
+**页面内容:三个断层**
+
+1. 数据断层
+   - 系统各管一段,协议各不相同;
+   - 数据存下来了,但无法联合使用。
+
+2. 认知断层
+   - 主要依赖固定阈值;
+   - 看不见故障如何一步步发展;
+   - 故障样本稀缺,经验难复制。
+
+3. 行动断层
+   - 知道异常,但不知道在哪;
+   - 知道在哪,但不知道多严重;
+   - 知道严重,但不知道下一步怎么办。
+
+**视觉建议**
+
+三层断裂的链路图:数据层断裂、认知层断裂、行动层断裂。用同一套视觉语言贯穿。
+
+**讲述要点**
+
+先把问题讲透:不是设备不够智能,而是数据、认知、行动三件事没有连起来。后面的系统设计,就是逐层把这三个断点接上。
+
+---
+
+### 第 4 页:建设目标
+
+**结论句**
+
+目标不是消灭报警,而是把处置窗口前移。
+
+**页面内容:时间轴对比**
+
+传统路径:
+
+> 故障发生 → 触发报警 → 非计划停机 → 事后维修
+
+目标路径:
+
+> 特征出现 → 趋势确认 → 提前预警 → 计划检修
+
+**三个目标**
+
+1. 更早:在故障形成前识别演化特征;
+2. 更准:减少无效报警,提升判断可信度;
+3. 更直观:从曲线判断升级为部件级定位。
+
+**视觉建议**
+
+上下两条时间轴对比,用颜色区分“被动”和“主动”。
+
+**讲述要点**
+
+强调“提前量”的价值:同样的故障,早几天和晚几小时,处置成本完全不同。
+
+---
+
+### 第 5 页:总体理念
+
+**结论句**
+
+为设备建立一个能感知、会判断、可进化的数字分身。
+
+**页面内容:四环**
+
+1. 感知
+   - 设备状态数字化;
+   - 多源数据持续汇入。
+
+2. 认知
+   - 从数据中识别特征、趋势和异常;
+   - 规则、统计、波形、功图共同参与。
+
+3. 决策
+   - 风险分级;
+   - 故障定位;
+   - 提前期判断。
+
+4. 学习
+   - 人工确认形成新样本;
+   - 模型持续更新。
+
+**视觉建议**
+
+四环闭环图,中心写“设备数字分身”。
+
+**讲述要点**
+
+数字世界模型不是一张静态的三维图,而是一套持续更新的设备认知系统。
+
+---
+
+### 第 6 页:业务架构
+
+**结论句**
+
+让数据从现场走到决策,形成一条完整链路。
+
+**页面内容:六段链路**
+
+> 数据源 → 统一接入 → 数据治理 → 模型评估 → 感知呈现 → 闭环反馈
+
+每段一句话:
+
+- 数据源:传感器、控制系统、监测系统、离线资料;
+- 统一接入:多协议、多系统、多形态;
+- 数据治理:统一语义、过滤无效、清洗去噪、周期识别;
+- 模型评估:趋势、波形、功图、综合判断;
+- 感知呈现:分级、定位、提前期;
+- 闭环反馈:人工确认、样本回写、模型迭代。
+
+**视觉建议**
+
+横向业务架构图,底部标注“数据流”,顶部标注“业务流”。
+
+**讲述要点**
+
+这一页只讲链路,不讲技术。听众只需要记住:数据从现场进来,最后变成可执行的判断。
+
+---
+
+### 第 7 页:功能架构
+
+**结论句**
+
+五层能力,支撑从“看到数据”到“看懂设备”。
+
+**页面内容:五层**
+
+1. 接入层
+   - 多源数据进得来;
+   - 协议差异被屏蔽。
+
+2. 数据层
+   - 数据可查、可算、可追溯;
+   - 原始、聚合、特征、结论分层存放。
+
+3. 模型层
+   - 规则、时序、表征、功图、综合判断;
+   - 不同模型解决不同问题。
+
+4. 应用层
+   - 提前预警、风险分级、部件定位、人工复核。
+
+5. 呈现层
+   - 三维状态、告警、曲线、报告。
+
+**视觉建议**
+
+自下而上的五层架构图,每层用一句动词短语命名。
+
+**讲述要点**
+
+强调分层的好处:接入变化不影响模型,模型升级不影响呈现,系统可以持续演进。
+
+---
+
+### 第 8 页:功能全景
+
+**结论句**
+
+一页看清系统能做什么、不能做什么。
+
+**页面内容:脑图**
+
+- 数据接入:多协议、多系统、多形态;
+- 数据治理:统一语义、运行态过滤、清洗去噪、周期识别、分层存储;
+- 模型能力:趋势判断、波形表征、功图评估、综合判断;
+- 感知呈现:三维定位、风险分级、提前期、告警联动;
+- 闭环学习:人工标注、样本回写、模型迭代。
+
+**视觉建议**
+
+中心主题 + 五个分支的脑图。分支不超过五条,每条不超过五个关键词。
+
+**讲述要点**
+
+这一页是“能力地图”,让听众建立整体感。不要逐条念,挑三条重点讲即可。
+
+---
+
+### 第 9 页:数据从哪里来
+
+**结论句**
+
+多源、多协议、多形态的数据,统一接入、统一理解。
+
+**页面内容:四类来源 + 三种能力**
+
+四类来源:
+
+1. 传感器:压力、温度、振动、转速、位移等;
+2. 控制系统:运行状态、工艺参数、报警信息;
+3. 状态监测系统:波形、周期、设备状态;
+4. 离线资料:图纸、维修记录、巡检记录。
+
+三种能力:
+
+1. 多协议适配:不同设备、不同接口都能接;
+2. 多系统读取:把“不可编程的数据”变成“可计算的数据”;
+3. 多形态导入:实时流、批量文件、历史数据都能处理。
+
+**视觉建议**
+
+四路数据汇入一个“统一数据层”的汇聚图。
+
+**讲述要点**
+
+可以讲一个通用故事:过去靠人工导出、手工整理;现在通过接口解析和自动批量获取,把数据孤岛变成可编程的数据源。这是整套系统能成立的前提。
+
+---
+
+### 第 10 页:数据如何变成资产
+
+**结论句**
+
+原始数据不等于可用数据,治理才是价值起点。
+
+**页面内容:五步流水线**
+
+1. 统一语言
+   - 不同系统的测点先对上号;
+   - 建立设备、部件、测点之间的语义关系。
+
+2. 只看运行
+   - 停机、启停过渡不参与判断;
+   - 避免把“停机”误判成“故障”。
+
+3. 清洗去噪
+   - 处理缺失、坏点、异常值;
+   - 识别长期无效的通道。
+
+4. 识别周期
+   - 把连续波形切成可比较的周期;
+   - 让不同时间的数据能够放在同一尺度上比较。
+
+5. 分层存储
+   - 原始层:保留证据;
+   - 聚合层:支持趋势分析;
+   - 特征层:支持模型训练;
+   - 结论层:支持业务查询。
+
+**视觉建议**
+
+从左到右的五段流水线,底部标注“数据形态变化”。
+
+**讲述要点**
+
+一句话总结:数据处理不是“洗干净”,而是把数据变成“可比较、可计算、可追溯”的资产。
+
+---
+
+### 第 11 页:数据工具
+
+**结论句**
+
+查得快、看得懂、标得准,让专家经验沉淀为系统能力。
+
+**页面内容:两个工具**
+
+1. 数据查询工作台
+   - 多测点、多时间尺度自由组合;
+   - 波形、趋势、功图一屏对比;
+   - 支持分图、归一化对比,快速发现异常。
+
+2. 智能标注工具
+   - 专家在波形上直接标注;
+   - 标注结果形成样本;
+   - 坏段、误报段可以被排除。
+
+**两个价值**
+
+- 降低使用门槛:业务人员也能快速定位问题;
+- 沉淀专家经验:把“老师傅看图”变成“系统可学习的标注”。
+
+**视觉建议**
+
+左右分栏,左侧查询界面示意,右侧标注界面示意。
+
+**讲述要点**
+
+这一页回答一个常见疑问:模型从哪里来?答案是,从专家标注和业务确认中来。
+
+---
+
+### 第 12 页:模型体系
+
+**结论句**
+
+不是用一个模型包打天下,而是让不同模型各干擅长的事。
+
+**页面内容:五层金字塔**
+
+1. 规则引擎
+   - 阈值、持续时长、运行状态;
+   - 可解释、可追溯。
+
+2. 时序统计
+   - 看基线、看趋势、看偏离;
+   - 识别缓慢演化。
+
+3. 表征学习
+   - 把波形变成“数学指纹”;
+   - 比较形态,而不是只比较数值。
+
+4. 功图评估
+   - 从机理看吸排气过程;
+   - 定位到具体角度和部位。
+
+5. 综合判断
+   - 多证据融合;
+   - 输出类型、级别、位置、时间。
+
+**视觉建议**
+
+五层金字塔,从下到上标注“可解释性”和“智能化程度”的变化。
+
+**讲述要点**
+
+强调组合思维:规则保底线,统计看趋势,表征看形态,功图看机理,综合判断给结论。任何单一模型都不够。
+
+---
+
+### 第 13 页:模型能力
+
+**结论句**
+
+会看趋势、会看波形、会看功图、会做判断。
+
+**页面内容:四张能力卡**
+
+1. 会看趋势
+   - 是否持续下降;
+   - 是否偏离自身历史基线;
+   - 是否具备连续性。
+
+2. 会看波形
+   - 是否相对自身异常;
+   - 是否出现冲击、峰值、波动扩大;
+   - 是否与运行状态相关。
+
+3. 会看功图
+   - 吸排气平台是否正常;
+   - 压比、相位是否异常;
+   - 异常出现在哪个角度区间。
+
+4. 会做判断
+   - 综合规则、趋势、波形、功图;
+   - 给出故障类型、风险级别、部件位置和时间范围。
+
+**视觉建议**
+
+2×2 四象限,每格一个能力卡。
+
+**讲述要点**
+
+用“医生看病”类比:验血看指标,影像看形态,问诊看历史,最后综合判断。系统也是一样,多种证据一起看。
+
+---
+
+### 第 14 页:感知呈现
+
+**结论句**
+
+一张图回答五个问题:哪台设备、哪个部件、什么故障、什么级别、从什么时候开始。
+
+**页面内容**
+
+1. 三维状态呈现
+   - 设备整体状态一屏可见;
+   - 部件按风险等级着色;
+   - 支持旋转、缩放、查看。
+
+2. 风险分级
+   - 正常;
+   - 关注;
+   - 异常;
+   - 严重异常。
+
+3. 故障定位
+   - 故障与部件、测点建立映射;
+   - 从整机逐级定位到具体部件。
+
+4. 提前期呈现
+   - 展示异常开始时间;
+   - 展示当前演化阶段;
+   - 展示预计的处置窗口。
+
+**视觉建议**
+
+左侧三维模型,右侧信息卡:设备、部件、类型、级别、时间。用一条时间轴表达“从何时开始”。
+
+**讲述要点**
+
+这一页是“感知呈现”的高潮。强调从“看曲线”升级为“看设备”,让非技术人员也能一眼看懂。
+
+---
+
+### 第 15 页:自学习闭环
+
+**结论句**
+
+人工确认一次,系统聪明一次。
+
+**页面内容:五步飞轮**
+
+> 系统提示 → 人工确认 → 样本回写 → 模型更新 → 效果评估 → 再提示
+
+三个关键机制:
+
+1. 可追溯
+   - 每条结论都有证据;
+   - 每次确认都有记录。
+
+2. 可排除
+   - 误报段、坏段不进入正常模型;
+   - 避免“越学越偏”。
+
+3. 可评估
+   - 新模型上线前先评估;
+   - 效果不达标不替换。
+
+**视觉建议**
+
+环形飞轮图,中心写“持续进化”。
+
+**讲述要点**
+
+系统的价值不只在第一次上线,而在于使用过程中不断变准。这是“数字世界模型”和“静态报表”的本质区别。
+
+---
+
+### 第 16 页:成果展示
+
+**结论句**
+
+油压、振动、功图、三维四类能力,已经形成闭环。
+
+**页面内容:四张成果卡**
+
+1. 润滑油压力下降
+   - 能识别持续恶化趋势;
+   - 可在故障前数周给出提示。
+
+2. 振动异常
+   - 能识别冲击和上升趋势;
+   - 可在故障前数天给出提示。
+
+3. 功图与气阀
+   - 从整周期到局部角度分析;
+   - 支持气阀类故障的早期识别。
+
+4. 三维呈现
+   - 故障与部件、测点、告警联动;
+   - 支持部件级定位和分级展示。
+
+**可选补充**
+
+如面向评审,可增加一行“示例识别准确率约 95% / 70%”,不展开口径。
+
+**视觉建议**
+
+四张等宽卡片,每张一个关键词 + 一句结论 + 一个小图标。
+
+**讲述要点**
+
+不堆指标,重点讲“这些能力解决什么问题”。指标放在附录或答疑时使用。
+
+---
+
+### 第 17 页:应用场景与价值
+
+**结论句**
+
+从日常巡检到检修决策,系统嵌入设备管理的每个环节。
+
+**页面内容:四个场景**
+
+1. 日常巡检
+   - 从“逐点看”变成“看结论”;
+   - 减少无效巡检。
+
+2. 异常复核
+   - 从“翻曲线”变成“看证据链”;
+   - 缩短判断时间。
+
+3. 检修决策
+   - 从“坏了再修”变成“计划检修”;
+   - 减少非计划停机。
+
+4. 知识沉淀
+   - 从“个人经验”变成“系统能力”;
+   - 经验可复制、可传承。
+
+**四类价值**
+
+- 安全:更早发现风险;
+- 效率:减少人工分析;
+- 成本:减少非计划停机;
+- 知识:沉淀可复用的诊断能力。
+
+**视觉建议**
+
+场景矩阵:横轴“日常—异常—检修—复盘”,纵轴“业务价值”。
+
+**讲述要点**
+
+把技术能力翻译成管理语言:系统最终要落到“少停机、少用人、少出错、可传承”。
+
+---
+
+### 第 18 页:创新与展望
+
+**结论句**
+
+四个创新点,支撑系统从“能用”走向“可复制”。
+
+**页面内容:四个创新**
+
+1. 数据破壁
+   - 把多系统数据变成可计算资产;
+   - 为后续扩展提供通用方法。
+
+2. 机理融合
+   - 规则、统计、波形、功图共同判断;
+   - 既保留可解释性,又提升识别能力。
+
+3. 跨设备泛化
+   - 换一台设备也能用;
+   - 降低复制成本。
+
+4. 三维语义绑定
+   - 模型、测点、故障、告警对得上;
+   - 让三维模型真正参与业务。
+
+**路线图三步**
+
+> 单设备 → 多设备 → 全厂区  
+> 报警 → 预警 → 寿命预测  
+> 人工辅助 → 证据链 → 智能体
+
+**视觉建议**
+
+左侧四个创新卡片,右侧三段路线图。
+
+**讲述要点**
+
+创新点不要讲成技术清单,要讲成“为什么这套系统可以复制到更多设备”。
+
+---
+
+### 第 19 页:结束页
+
+**主句**
+
+从“看见数据”到“看懂设备”。
+
+**辅助信息**
+
+- 系统名称;
+- 团队/联系方式;
+- 一页二维码或资料入口(可选)。
+
+**讲述要点**
+
+用一句话收束全篇:这套系统的终点不是更多报警,而是更少的意外停机。
+
+---
+
+## 五、三张通用架构图
+
+### 5.1 业务架构图
+
+```mermaid
+flowchart LR
+  A[现场数据] --> B[统一接入]
+  B --> C[数据治理]
+  C --> D[模型评估]
+  D --> E[感知呈现]
+  E --> F[人工确认]
+  F --> G[样本与知识]
+  G --> D
+```
+
+### 5.2 功能架构图
+
+```mermaid
+flowchart TB
+  subgraph 呈现层
+    V[三维状态 / 告警 / 曲线 / 报告]
+  end
+  subgraph 应用层
+    U[提前预警 / 风险分级 / 部件定位 / 复核]
+  end
+  subgraph 模型层
+    M[规则 / 时序 / 表征 / 功图 / 综合判断]
+  end
+  subgraph 数据层
+    D[原始数据 / 聚合数据 / 特征样本 / 结论]
+  end
+  subgraph 接入层
+    I[传感器 / 控制系统 / 监测系统 / 离线资料]
+  end
+  I --> D --> M --> U --> V
+```
+
+### 5.3 功能脑图
+
+```mermaid
+mindmap
+  root((设备数字世界模型))
+    数据接入
+      多协议
+      多系统
+      多形态
+    数据治理
+      统一语义
+      运行态过滤
+      清洗去噪
+      周期识别
+      分层存储
+    模型能力
+      趋势判断
+      波形表征
+      功图评估
+      综合判断
+    感知呈现
+      三维定位
+      风险分级
+      提前期
+      告警联动
+    闭环学习
+      人工标注
+      样本回写
+      模型迭代
+```
+
+---
+
+## 六、统一话术替换表
+
+| 不要写 | 改成 |
+|---|---|
+| 具体机组编号 | 试点设备 / 多台设备 |
+| 具体点位编码 | 关键测点 |
+| 具体数据表、字段数量 | 多类型、长周期、海量数据 |
+| 具体框架、数据库、引擎名称 | 数据接入组件 / 数据服务 / 模型服务 / 三维引擎 |
+| 具体算法产品名 | 自监督表征 / 时序基线 / 机理特征 |
+| 具体窗口小时数、特征维数 | 多时间尺度 / 多维特征 |
+| 过细的指标口径 | 事件级召回、识别准确率、提前期 |
+
+补充规则:
+
+- 不出现内部系统名、内部表名、内部编号;
+- 不出现只有项目组才懂的缩写;
+- 同一页不出现超过三个专业术语;
+- 首次出现的术语,用一句人话解释。
+
+---
+
+## 七、视觉与版式规范
+
+### 7.1 页面结构
+
+每页统一为:
+
+1. 顶部:页面标题;
+2. 中部:一句结论;
+3. 主体:一张主图或三张卡片;
+4. 底部:不超过三条说明。
+
+### 7.2 文字规范
+
+- 每页正文不超过 120 字;
+- 每行不超过 20 字;
+- 标题不超过 14 字;
+- 不使用长段落;
+- 不使用连续三个以上专业术语。
+
+### 7.3 图形规范
+
+- 全篇统一一套图标;
+- 架构图允许采用五层结构,功能架构按接入层、数据层、模型层、应用层、呈现层展开;
+- 流程图不超过七步;
+- 脑图不超过五个分支;
+- 颜色统一为四级风险色 + 一个主色。
+
+### 7.4 截图规范
+
+优先使用真实界面截图,其次使用示意图:
+
+- 三维状态;
+- 数据查询与波形对比;
+- 智能标注;
+- 告警与曲线联动。
+
+截图统一加圆角、阴影和统一边框,避免直接贴原始窗口。
+
+---
+
+## 八、可选附录
+
+主汇报不展开,答疑时备用。
+
+### 附录 A:指标口径说明
+
+- 识别准确率、召回率、事件级召回的定义;
+- 指标对应的数据范围和评估方式;
+- 明确“标签来自规则与人工确认,不等同于物理故障结论”。
+
+### 附录 B:算法细节
+
+- 油压趋势判断的基本思路;
+- 振动相对基线的判断思路;
+- 功图整周期与局部分析思路;
+- 表征学习的基本原理。
+
+### 附录 C:部署形态
+
+- 本地化部署;
+- 浏览器访问;
+- 权限与审计;
+- 与现有系统并存、逐步替换。
+
+### 附录 D:典型故障说明
+
+- 气阀故障;
+- 活塞故障;
+- 十字头故障;
+- 润滑油压力低。
+
+每类故障只讲“看什么特征、对应什么部位、如何确认”,不讲算法参数。
+
+---
+
+## 九、制作清单
+
+### 9.1 内容检查
+
+- [ ] 全篇没有出现具体机组编号;
+- [ ] 全篇没有出现内部点位编码;
+- [ ] 全篇没有出现具体技术产品名;
+- [ ] 全篇没有出现具体数据量、字段数;
+- [ ] 每页只有一个结论;
+- [ ] 专业术语首次出现都有解释;
+- [ ] 正文第 16 页允许出现示例识别准确率等指标,其余详细指标及口径放在附录。
+
+### 9.2 视觉检查
+
+- [ ] 三级标题字号统一;
+- [ ] 四级风险色统一;
+- [ ] 架构图风格统一;
+- [ ] 截图尺寸与边框统一;
+- [ ] 页脚页码统一。
+
+### 9.3 讲述检查
+
+- [ ] 3 分钟能讲完前 5 页;
+- [ ] 10 分钟能讲完主线;
+- [ ] 每个案例都有“现象—证据—判断—验证”四段;
+- [ ] 结尾能回到“更少意外停机”这一句。
+
+---
+
+## 十、下一步
+
+按本方案可直接进入 PPTX 制作,建议顺序:
+
+1. 先出 19 页文字骨架;
+2. 再补三张架构图和一张脑图;
+3. 再替换真实界面截图;
+4. 最后统一配色、字号和页脚。
+
+制作时始终记住一句话:
+
+> 听众不需要知道系统用了什么技术,只需要知道系统能帮他解决什么问题。

BIN
数字世界模型驱动的压缩机生命周期感知系统/数字孪生驱动的设备全生命周期评估与预防性维护项目阶段审查PPT材料模板.pptx


BIN
数字世界模型驱动的压缩机生命周期感知系统/数据查询时间轴.png


+ 254 - 0
数字世界模型驱动的压缩机生命周期感知系统/新版36页逐页脚本.md

@@ -0,0 +1,254 @@
+# 数字世界模型驱动的压缩机生命周期感知系统
+## 新版36页逐页脚本与素材分配
+
+### 第1页:数字世界模型驱动的压缩机生命周期感知系统
+从报警之后处置,到故障之前感知
+
+以真实设备数字模型建立系统认知,覆盖数据、模型、呈现与持续学习。设备图片来自用户提供素材,移除黄色场景背景,保留原设备。
+
+素材与依据:压缩机机器图片.png
+
+### 第2页:目录
+五个章节,完整介绍系统价值、技术路径与应用成果
+
+
+
+
+
+### 第3页:研发背景与现状
+压缩机运维需要从状态监测走向演化感知
+
+连续运行需求;多系统监测现状;诊断与处置难点
+
+
+
+### 第4页:研发背景:关键设备的连续运行需求
+设备状态每天都在变化,运维需要理解变化的方向与原因
+
+从压缩机连续运行和多部件耦合出发,说明数据价值及状态感知需求。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第5页:监测现状:有数据,缺少贯通的判断链
+数据采集、异常解释和检修行动之间仍存在断点
+
+结合组态与监测系统读取难点、样本稀缺、部件映射与人工复核现状展开。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第6页:解决的问题与系统特性
+把运维难题转化为可落地的系统能力
+
+解决哪些问题;系统有哪些特性;能力如何形成闭环
+
+
+
+### 第7页:问题与能力:让每项建设对应业务难题
+从数据获取到处置反馈,建立一一对应的解决路径
+
+能力映射避免仅罗列技术名称。扩展能力与当前已落地能力在后续各页说明。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第8页:系统特性:组合能力支撑持续感知
+多源融合、机理与学习协同,最终落到设备级判断
+
+世界模型是一套持续维护设备状态、机理约束、特征和历史经验的认知体系。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第9页:整体解决方案
+数据、模型与业务协同运行,构建设备认知闭环
+
+总体设计与数据体系;世界模型与实时评估;Agent 与三维感知
+
+
+
+### 第10页:业务工作流:现场数据如何进入运维决策
+数据处理、模型分析与人工处置各有职责,并通过反馈闭环连接
+
+读取和判断为主,Agent建议由人员复核,不自动触发设备控制。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第11页:技术架构:从数据源到应用服务的七层支撑
+底层稳定接入,中层沉淀资产,上层输出可解释的业务服务
+
+技术类别为方案设计,协议适配按现场系统开放能力实施。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第12页:功能全景:系统能力脑图
+六个主分支,向外展开操作与服务能力
+
+主分支及二级节点均为可编辑文本和连接线,与技术分层图区分。
+
+
+
+### 第13页:多源接入:打通传感器、组态与监测系统
+标准协议适配与既有系统读取并行,兼容实时数据和历史数据
+
+协议类别属于整体接入设计;已有组态历史数据获取与波形读取作为实现基础。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第14页:数据治理:从原始记录到可复用资产
+治理既处理数据质量,也建立设备、部件、测点之间的关系
+
+展示处理步骤和数据分层用途,避免停机、坏点污染正常基线。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第15页:数据查询工作台:沿时间轴定位分析区间
+多测点在同一时间轴上对齐,快速识别运行状态与故障事件
+
+截图真实界面,测点编码局部脱敏,保留故障标记、时间轴与运行状态。
+
+素材与依据:数据查询时间轴.png
+
+### 第16页:标注与联合分析:把专家判断沉淀为样本
+同屏比较波形与功图,在真实业务上下文中确认异常
+
+当前截图展示功图预览及标注入口,不伪造已标注区间。标签保存、专家确认与样本回流见项目工作台说明。
+
+素材与依据:实时波形与功图预览对比.png;README.md
+
+### 第17页:数字世界模型:设备状态、机理与经验共同构建
+以设备为对象,将观测数据转化为可更新的状态描述
+
+此页为体系设计。当前落地包括规则与时序、特征工程、功图分析、训练评估、实时服务与三维映射;深度表征、完整记忆检索与Agent编排为扩展能力。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第18页:故障诊断算法群:按问题组织多种分析方法
+不同故障采用不同特征,再由证据融合形成统一判断
+
+具体能力分别来自压力/振动算法和功图特征研究,活塞等对象作为可扩展研究方向,不声称已完成全部故障识别。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第19页:时序与记忆:先认识本机,再比较当前变化
+历史基线描述正常状态,事件记忆帮助解释相似异常
+
+近期与周期基线已应用于压力/振动。相似事件库与检索式辅助判断依据跨机组泛化方案展开,作为扩展设计。
+
+素材与依据:models/markdown/跨机组泛化与样本扩充方案.md;models/markdown/压力模型结果.md;models/markdown/振动模型结果.md
+
+### 第20页:深度学习:从波形形态提取可迁移的表征
+扩展能力设计:利用大量正常数据,降低对故障标签数量的依赖
+
+深度学习为拟扩展方案,不将当前树模型结果描述为深度学习结果。输入高频波形,通过自监督任务学习表征,随后进行相似度判断、小样本识别与融合评估。
+
+
+
+### 第21页:功图机理评估:把波形放回压缩循环中理解
+结合键相与压力信息,分析整周期形态和局部角度特征
+
+图像来自气阀事件归档;纵轴为压力原始值,保留来源分段颜色,不将其当作校准后的绝对压力。功图与传感器质量需联合检查。
+
+素材与依据:故障分析包/4号机_20260610_气阀故障_一级2缸/03_功图;backend/indicator_features/README.md
+
+### 第22页:训练与评估:让模型在独立数据上接受检验
+样本构建、训练、验证与测试分工明确,避免未来信息进入模型
+
+当前压力和振动模型具备数据构建、划分、训练、评估、推理链路。按事件划分并避免跨集合泄漏。
+
+素材与依据:models/markdown/压力模型结果.md;models/markdown/振动模型结果.md
+
+### 第23页:实时评估:将新数据持续转化为风险事件
+滚动窗口评估与事件合并并行,减少重复告警
+
+当前实时服务定期扫描、以最新有效数据为边界、合并相邻同级事件。模型概率为参考,不改变规则阶段。
+
+素材与依据:models/README.md;models/markdown/全量与实时运行及告警落库.md
+
+### 第24页:Agent 协同分析:组织工具与证据形成建议
+扩展能力设计:把一次问题拆解为可核查的分析任务
+
+Agent负责调用数据、模型和历史知识,不替代底层评估算法,不直接闭环控制设备。建议由人员复核。
+
+
+
+### 第25页:感知呈现:故障、部件与证据同屏联动
+从告警列表进入设备部件,再查看对应曲线与判断依据
+
+用户提供真实三维感知系统截图,遮盖内部模型文件名与部件标识。
+
+素材与依据:三维感知呈现系统界面图片.png;viewer/README.md
+
+### 第26页:自学习优化:确认结果驱动下一轮改进
+以人工复核为入口,以独立评估为模型更新关口
+
+完整闭环为建设设计,已有标注、样本与训练链路作为基础。不能让误报自动污染正常样本。
+
+素材与依据:项目本地说明与已提供的阶段审查材料
+
+### 第27页:核心成果展示
+用真实模型输出与系统界面展示已形成的能力
+
+油压与振动评估;功图与气阀分析;三维数字展示
+
+
+
+### 第28页:润滑油压力模型:识别持续下降与阶段演化
+结合周期基线、近期变化与持续性,给出风险阶段和触发依据
+
+指标取压力3h模型封存测试集,标签来自规则扫描,衡量对规则标签的泛化一致性,不等同于物理故障诊断准确率。
+
+素材与依据:models/markdown/压力模型结果.md;models/results/pressure/润滑油压力小时阶段段.csv
+
+### 第29页:振动模型:从绝对幅值转向自身基线偏离
+同时观察平均水平、冲击峰值和两侧差异,减少跨设备幅值干扰
+
+指标取振动3h模型封存测试集。21个异常窗口、4个测试事件,标签来自规则扫描。不得将整体99.45%准确率作为异常识别效果宣传。
+
+素材与依据:models/markdown/振动模型结果.md;故障区模型精准抓取.png
+
+### 第30页:功图评估:建立整周期与局部特征分析能力
+由周期重建进入机理分析,再用多时间片和多测点交叉复核
+
+实际P-V图来自事件归档。展示计算与对比能力,不根据单图声称故障确诊或量化提前期。
+
+素材与依据:故障分析包/4号机_20260610_气阀故障_一级2缸/03_功图;backend/indicator_features/README.md
+
+### 第31页:三维数字展示:让模型真正参与业务
+整机视图、实时趋势与功图共同呈现设备当前状态
+
+用户提供真实三维实时功图界面;同屏呈现部件、曲线与功图。右侧为该截图功图区局部放大。
+
+素材与依据:三维感知呈现系统界面(实时功图).png;viewer/README.md
+
+### 第32页:成功案例与应用实践
+沿真实事件说明系统怎样发现、解释与支持复核
+
+油压下降演化;振动异常区段;气阀事件功图对照
+
+
+
+### 第33页:案例一:油压持续下降的阶段识别
+从轻微偏离到严重异常,系统记录完整阶段与触发依据
+
+事件来自8号机周期P09,2025-10-26到10-30。此页展示已发生异常的阶段回溯,不宣称已验证故障提前量或维修收益。
+
+素材与依据:models/results/pressure/润滑油压力小时阶段段.csv;故障信息图.png
+
+### 第34页:案例二:双侧振动对比识别异常区段
+同一时间段内,两侧相对基线表现不同,异常侧更容易辨认
+
+截图查询窗口为2025-11-03 23:00至11-04 11:00,着色区段约11-04 01:00至09:00。上侧联轴器端波动较小,下侧链轮端出现反复冲击。着色区段与分小时事件记录的端点口径不完全相同,不混称提前期。
+
+素材与依据:故障区模型精准抓取.png
+
+### 第35页:案例三:气阀事件的前后功图对照
+按相同测点与图形口径对照事件前、事件时和修复后数据
+
+案例包:2026-06-10气阀故障一级2缸。采用轴侧P-V图2026-06-08 03:30、2026-06-10 07:00、2026-06-11 20:30。修复后标签来自归档命名。不声称算法已经通过单一事件证明提前预警效果。
+
+素材与依据:故障分析包/4号机_20260610_气阀故障_一级2缸
+
+### 第36页:更有依据地管理压缩机
+数据连接现场,模型理解状态,经验持续沉淀
+
+以设备全生命周期的状态感知为主线,结合真实系统与应用案例说明价值。
+
+

BIN
数字世界模型驱动的压缩机生命周期感知系统/输出/压缩机全貌_透明背景.png


BIN
数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统.pptx


BIN
数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_36页系统介绍.pptx


BIN
数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_修订版.pptx


BIN
数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_正式版.pptx


BIN
数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_科技工业风预览.pptx


Файловите разлики са ограничени, защото са твърде много
+ 1240 - 0
数字世界模型驱动的压缩机生命周期感知系统/输出/数字世界模型驱动的压缩机生命周期感知系统_科技工业风预览.pptx.inspect.ndjson