cn_names.py 3.6 KB

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