Browse Source

fix: diagnosis adapter 数据格式转换与插值补齐

data_provider 返回 DatetimeIndex 格式的 DataFrame,
转为 api_predict 期望的(time 列 + 传感器列)格式,
并用 reindex + interpolate 补齐数据间隙,
确保 40 分钟窗口降采样后够 120 行。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
wmy 1 tuần trước cách đây
mục cha
commit
7c4d99a8a3
1 tập tin đã thay đổi với 17 bổ sung0 xóa
  1. 17 0
      core/adapters/diagnosis_adapter.py

+ 17 - 0
core/adapters/diagnosis_adapter.py

@@ -8,6 +8,8 @@ import time
 from pathlib import Path
 from typing import Optional
 
+import pandas as pd
+
 from core.config import PipelineConfig
 from core.data_provider import DataProvider
 from core.shared_state import SharedState
@@ -84,6 +86,21 @@ class DiagnosisAdapter:
             duration_minutes=self.config.diagnosis_interval_minutes,
         )
 
+        # 转为 api_predict 期望的格式:第一列为 time,后续为传感器值
+        # 并用线性插值补齐缺失,确保降采样后有足够的数据行
+        df = df.reset_index().rename(columns={"index": "time"})
+        df["time"] = pd.to_datetime(df["time"], errors="coerce")
+        df = df.dropna(subset=["time"]).sort_values("time")
+
+        # 以 4s 间隔重建完整时间轴,插值填充间隙
+        if len(df) >= 2:
+            full_idx = pd.date_range(start=df["time"].min(), end=df["time"].max(), freq="4s")
+            df = df.set_index("time")
+            df = df.reindex(full_idx)
+            df = df.interpolate(method="time", limit_direction="both")
+            df = df.ffill().bfill()
+            df = df.reset_index().rename(columns={"index": "time"})
+
         # 执行诊断
         result = self._diagnoser.api_predict(df, mode="auto")