#!/usr/bin/env python3 """英文键名 -> 中文名映射,供把最终结果表/报告中文化使用。""" from __future__ import annotations META_CN = { "unit": "机组", "cylinder": "缸", "stage": "级", "side": "腔", "point_name": "测点", "point": "测点", "label": "测点全名", "wave_file_id": "文件ID", "sample_time": "时间", "date": "事件日期", "kind": "故障类型", "rpm": "转速", "n_samples": "点数", "p_min": "最小压力", "p_max": "最大压力", "p_span": "压力幅度", "bin": "角箱号", "bin_start": "角箱起点", "n_raw": "箱内点数", "family": "类别", "type": "类型", "candidate": "是否候选", "scope": "范围", "pre": "停机前", "post": "开机后", "delta": "变化量", "mad": "MAD倍数", "rel": "相对变化", "score": "总分", "n_metrics": "指标数", "max_mad": "最大MAD", "gap_days": "相隔天数", "pre_span_days": "前跨度天数", "pre_start": "前段起", "pre_end": "前段止", "post_start": "后段起", "post_end": "后段止", "metrics": "指标明细", } BIN_CN = { "mean": "均值", "range": "极差", "std": "标准差", "mad": "中位绝对偏差", "slope": "斜率", "roughness": "粗糙度", "p10": "10分位", "p50": "50分位", "p90": "90分位", "iqr": "四分位距", "skew": "偏度", "kurt": "峰度", "d_abs_mean": "平均|导数|", "d_abs_max": "最大|导数|", "d_rms": "导数RMS", "d2_rms": "二阶导RMS", "zero_cross": "导数过零数", "n_extrema": "极值数", "d2_abs_max": "二阶导最大", "tv": "总变差", "mean_cross": "过均次数", "mobility": "移动度", "complexity": "复杂度", } CYCLE_CN = { "p_suction": "吸气压力", "p_discharge": "排气压力", "pressure_ratio": "压比", "suction_frac": "吸气占比", "discharge_frac": "排气占比", "angle_min": "最小压力角", "angle_max": "最大压力角", "cross_up": "上升穿越角", "cross_down": "下降穿越角", "max_rise": "最大上升斜率", "max_fall": "最大下降斜率", "max_rise_angle": "最大上升角", "max_fall_angle": "最大下降角", } FAMILY_CN = { "bin": "分箱", "cycle": "整周期", "bin_trend": "分箱趋势", "cycle_trend": "整周期趋势", "event_pressure": "事件-整周期", "event_pressure_bin": "事件-分箱", "event_vib": "事件-振动", "corr": "日度相关", } METRIC_CN = {**META_CN, **BIN_CN, **CYCLE_CN} # 表头里与指标同名的列需覆盖(mad 列是"MAD倍数",不是"中位绝对偏差"指标) HEADER_CN = { "metric": "指标", "mad": "MAD倍数", "raw_score": "原始分数", "split": "突变时间", "before": "突变前", "after": "突变后", "volatile": "波动类", "day": "日期", } def col(name: str) -> str: return HEADER_CN.get(name, METRIC_CN.get(name, name)) def metric_col(name: str) -> str: return METRIC_CN.get(name, name) def translate_headers(fieldnames: list[str]) -> list[str]: return [col(name) for name in fieldnames] import re as _re _METRIC_TOKEN = _re.compile(r"^(.*)(up|dn)(-?\d[0-9.eE+-]*)$") def translate_metrics_field(text: str) -> str: """把汇总里的 'd_rmsup23.1;stddn4.0;cross_updn4.3' 翻成 '导数RMS↑23.1;标准差↓4.0;上升穿越角↓4.3'。""" if not text: return text parts = [] for token in str(text).split(";"): match = _METRIC_TOKEN.match(token) if match: name, direction, value = match.groups() parts.append(f"{metric_col(name)}{'↑' if direction == 'up' else '↓'}{value}") else: parts.append(token) return ";".join(parts)