|
@@ -53,7 +53,25 @@ def _window_index(win: str) -> pathlib.Path:
|
|
|
return m5 / 'windows' / win / 'index.parquet'
|
|
return m5 / 'windows' / win / 'index.parquet'
|
|
|
|
|
|
|
|
|
|
|
|
|
-def compute(win: str = 'w0127', min_n: int = 3):
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def latest_window() -> str:
|
|
|
|
|
+ """★2026-10-06:默认窗改为"已发现的最新窗"。
|
|
|
|
|
+
|
|
|
|
|
+ 原默认写死 `w0127`(首窗特例:索引在 m5 根)。清过产物、只从 data/raw 重算的机器上
|
|
|
|
|
+ `m5/tcm_index.parquet` 不存在 ⇒ 原写法必然 `[X] 窗索引不存在` 直接失败(实测)。
|
|
|
|
|
+ 这里改为按 `windows/w????/index.parquet` 选**字典序最后**的一个(窗名 = 起始日代号 ⇒ 字典序即时间序),
|
|
|
|
|
+ 并如实报告可得窗;**不碰**任何"振动线正本"产物。
|
|
|
|
|
+ """
|
|
|
|
|
+ m5 = m5_fn() if "m5_fn" in globals() else (pathlib.Path(__file__).resolve().parents[1] / "outputs/rudong/m5_cms_tcm")
|
|
|
|
|
+ ws = sorted(p.parent.name for p in (m5 / 'windows').glob('w[0-9][0-9][0-9][0-9]/index.parquet'))
|
|
|
|
|
+ if not ws:
|
|
|
|
|
+ return 'w0127'
|
|
|
|
|
+ return ws[-1]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def compute(win: str | None = None, min_n: int = 3):
|
|
|
|
|
+ win = win or latest_window()
|
|
|
"""→ 与样件同构的 DataFrame(sensor, meas, bin, turbine, val, fleet_med, z, n)。"""
|
|
"""→ 与样件同构的 DataFrame(sensor, meas, bin, turbine, val, fleet_med, z, n)。"""
|
|
|
import numpy as np
|
|
import numpy as np
|
|
|
import pandas as pd
|
|
import pandas as pd
|
|
@@ -83,7 +101,8 @@ def compute(win: str = 'w0127', min_n: int = 3):
|
|
|
['sensor', 'meas', 'bin', 'turbine']).reset_index(drop=True)
|
|
['sensor', 'meas', 'bin', 'turbine']).reset_index(drop=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
-def verify(win: str = 'w0127', sample: pathlib.Path | None = None) -> int:
|
|
|
|
|
|
|
+def verify(win: str | None = None, sample: pathlib.Path | None = None) -> int:
|
|
|
|
|
+ win = win or latest_window()
|
|
|
"""与盘上样件逐值对拍(严格: 同键同值, 容差 1e-4)。"""
|
|
"""与盘上样件逐值对拍(严格: 同键同值, 容差 1e-4)。"""
|
|
|
import pandas as pd
|
|
import pandas as pd
|
|
|
sp = pathlib.Path(sample) if sample else (P.m5() / 'fleet_scalar_z.parquet')
|
|
sp = pathlib.Path(sample) if sample else (P.m5() / 'fleet_scalar_z.parquet')
|
|
@@ -166,7 +185,8 @@ def _to_report_level(lv: str) -> str:
|
|
|
'参考': '参考', '正常': '正常', 'INSUFFICIENT': 'INSUFFICIENT'}.get(s, s)
|
|
'参考': '参考', '正常': '正常', 'INSUFFICIENT': 'INSUFFICIENT'}.get(s, s)
|
|
|
|
|
|
|
|
|
|
|
|
|
-def fusion_table(win: str = 'w0127'):
|
|
|
|
|
|
|
+def fusion_table(win: str | None = None):
|
|
|
|
|
+ win = win or latest_window()
|
|
|
"""`fusion_38.csv` —— 逐台融合(模型侧 L6 过闸线 × CMS 侧红黄告警)。
|
|
"""`fusion_38.csv` —— 逐台融合(模型侧 L6 过闸线 × CMS 侧红黄告警)。
|
|
|
|
|
|
|
|
列是**消费端硬契约** (`src/windcms/report.py:498` 与 `report_std.py:187`):
|
|
列是**消费端硬契约** (`src/windcms/report.py:498` 与 `report_std.py:187`):
|
|
@@ -226,7 +246,7 @@ def fusion_table(win: str = 'w0127'):
|
|
|
|
|
|
|
|
def main() -> int:
|
|
def main() -> int:
|
|
|
ap = argparse.ArgumentParser(description='六层链 fusion 步(逆向工程实现: fleet_scalar_z)')
|
|
ap = argparse.ArgumentParser(description='六层链 fusion 步(逆向工程实现: fleet_scalar_z)')
|
|
|
- ap.add_argument('--window', default='w0127', help='用哪个窗算(默认首窗 w0127,与样件同源)')
|
|
|
|
|
|
|
+ ap.add_argument('--window', default=None, help='用哪个窗算(默认 **已发现的最新窗**;w0127 首窗特例索引在 m5 根,缺则不选)')
|
|
|
ap.add_argument('--verify', action='store_true', help='与盘上样件逐值对拍,不写盘')
|
|
ap.add_argument('--verify', action='store_true', help='与盘上样件逐值对拍,不写盘')
|
|
|
ap.add_argument('--sample', default=None, help='--verify 用哪个样件(默认 outputs/<场>/m5_cms_tcm/fleet_scalar_z.parquet)')
|
|
ap.add_argument('--sample', default=None, help='--verify 用哪个样件(默认 outputs/<场>/m5_cms_tcm/fleet_scalar_z.parquet)')
|
|
|
ap.add_argument('--out', default=None, help='输出路径(默认写回 m5/fleet_scalar_z.parquet)')
|
|
ap.add_argument('--out', default=None, help='输出路径(默认写回 m5/fleet_scalar_z.parquet)')
|