Ver código fonte

功图可用性改以 wave_sample_one 计数为准,确认活塞事件前无数据

18922397810 3 semanas atrás
pai
commit
83d238d8eb

+ 11 - 8
backend/indicator_features/availability.py

@@ -54,7 +54,7 @@ def sample_per_day(rows, per_day):
 
 
 def spans(connection, file_ids):
-    """Median pressure span of wave_sample_one per file_id."""
+    """Return {file_id: (median_span, has_samples)} from wave_sample_one."""
     result = {}
     with connection.cursor() as cursor:
         for start in range(0, len(file_ids), 200):
@@ -67,7 +67,8 @@ def spans(connection, file_ids):
             )
             for row in cursor.fetchall():
                 mn, mx = row["mn"], row["mx"]
-                result[int(row["wave_file_id"])] = float(mx) - float(mn) if mn is not None and mx is not None else 0.0
+                span = float(mx) - float(mn) if mn is not None and mx is not None else 0.0
+                result[int(row["wave_file_id"])] = (span, True)
     return result
 
 
@@ -97,13 +98,15 @@ def main():
                 span_by_id = spans(connection, [int(r["id"]) for r in picked])
                 by_day = defaultdict(list)
                 for row in picked:
-                    by_day[row["sample_time"].date()].append(span_by_id.get(int(row["id"]), 0.0))
-                valid_days = [d for d, v in sorted(by_day.items()) if np.median(v) >= MIN_SPAN and len(span_by_id)]
+                    by_day[row["sample_time"].date()].append(span_by_id.get(int(row["id"])))
                 all_days = sorted(by_day)
-                print(f"{point}: 文件 {len(files)},抽样日 {len(all_days)},其中有效日 {len(valid_days)}")
-                if valid_days:
-                    print(f"   有效数据段: {valid_days[0]} ~ {valid_days[-1]}  共 {len(valid_days)} 天")
-                    print("   有效日:", ", ".join(str(d) for d in valid_days))
+                has_days = [d for d in all_days if any(v is not None for v in by_day[d])]
+                valid_days = [d for d in all_days
+                              if np.median([v[0] for v in by_day[d] if v is not None] or [0.0]) >= MIN_SPAN]
+                print(f"{point}: 文件 {len(files)},抽样日 {len(all_days)},"
+                      f"有 wave_sample_one 的日 {len(has_days)},其中有效周期日 {len(valid_days)}")
+                if has_days:
+                    print(f"   有样本数据段: {has_days[0]} ~ {has_days[-1]}  共 {len(has_days)} 天")
     finally:
         connection.close()
 

+ 20 - 14
backend/indicator_features/观察记录.md

@@ -10,24 +10,30 @@
 - 级配:**一级=2/4/6、二级=3/5、三级=1**。
 - **同一缸的“压力盖侧 / 压力轴侧”可互换替代**(同一缸两个腔的测点)。
 
-## 2. 可用性(往前找,直到有周期;盖/轴可互补)
+## 2. 可用性(以 `wave_sample_one` 计数为准)
 
-`availability.py` 不依赖 rpm,直接找有完整周期的日子:
+`wave_sample`(全量)基本为空;真正存数据的是 `wave_sample_one`(每文件一个首周期)。
+`availability.py` 现在**直接统计有多少文件存在 `wave_sample_one` 数据**,并区分“有样本”与“有效周期”:
 
-| 测点 | 有效段 |
-|---|---|
-| 8 号机 全缸(盖/轴) | 2025-03-13~05-03;2026-03-16~20、04-19~05-06、05-31~06-18 |
-| 7 号机 二缸等 | 2025-06-13、07-25~27、11-18~20、2026-02、03-13~04-04、05-07~21、06-01~06 |
-| 9 号机 二缸/三缸 | 2025-03、06、09、10 零散 |
-| 9 号机 全缸 | 2026-01-30~02-09、03-04~13、03-22~27、04-02~18、05-22~31、06-15~22 |
+```
+9号机一缸盖侧: 文件1489, 抽样日16, 有 wave_sample_one 的日11, 其中有效周期日11
+   有样本数据段: 2026-01-30 ~ 2026-02-09
+8号机三缸盖侧: 文件521,  抽样日7,  有 wave_sample_one 的日0,  其中有效周期日0   (2025-10~12)
+7号机三缸盖侧: 文件0                                                          (2024-12~2025-02)
+```
 
-**活塞事件的故障前功图情况**(用全缸、盖/轴互补核过):
+**活塞事件前无数据的直接计数证据**:
 
-| 事件 | 情况 |
-|---|---|
-| 7 号机 2025.1.10 活塞 | 全缸 2024-10~2025-04 **无有效周期** ❌ |
-| 8 号机 2025.12.6 活塞 | 全缸最后一段为 **2025-05-03**,其后长期停机到 2026-03 ❌ |
-| 9 号机 2026.1.18 活塞(三级=1缸) | 全缸有效数据**从 2026-01-30 起**(事件后)❌ |
+| 事件 | 测点 | 窗口内文件 | 有 wave_sample_one |
+|---|---|---:|---:|
+| 8 号机活塞 2025.12.6 | 三缸/二缸 | 521 | **0** |
+| 9 号机活塞 2026.1.18 | 一缸 | 1489 | 仅 2026-01-30 起 |
+| 7 号机活塞 2025.1.10 | 三缸/二缸 | 0 | 0 |
+| 对照:8 号机气阀 2026.3.29 | 三缸 | 3594 | 535 |
+
+结论:活塞事件前**确实没有功图周期**(不是抽样误判),气阀有、活塞没有是**数据采集期差异**。
+
+### 其它可用段
 
 ## 3. 特征与检测(已完成)