fix(burst-location): tolerate partial SCADA gaps

This commit is contained in:
2026-07-09 10:49:53 +08:00
parent e862e6c500
commit 6a16ea44b2
2 changed files with 146 additions and 3 deletions
+38 -3
View File
@@ -186,6 +186,14 @@ def run_burst_location_by_network(
normal_pressure_series = normal_pressure_from_payload
normal_pressure_samples = 1
observed_source = "scada_burst_payload_normal_timerange"
selected_pressure_ids, burst_pressure_series, normal_pressure_series = (
_align_observed_series_pair(
ids=selected_pressure_ids,
burst_series=burst_pressure_series,
normal_series=normal_pressure_series,
data_label="压力数据",
)
)
else:
if burst_pressure is None or normal_pressure is None:
raise ValueError(
@@ -269,6 +277,14 @@ def run_burst_location_by_network(
else:
normal_flow_series = normal_flow_from_payload
normal_flow_samples = 1
selected_flow_ids, burst_flow_series, normal_flow_series = (
_align_observed_series_pair(
ids=selected_flow_ids,
burst_series=burst_flow_series,
normal_series=normal_flow_series,
data_label="流量数据",
)
)
else:
if flow_scada_ids is not None:
selected_flow_ids = _dedupe_ids(flow_scada_ids)
@@ -439,6 +455,23 @@ def _validate_time_window(
return start_dt, end_dt
def _align_observed_series_pair(
*,
ids: list[str],
burst_series: pd.Series,
normal_series: pd.Series,
data_label: str,
) -> tuple[list[str], pd.Series, pd.Series]:
common_ids = [
sensor_id
for sensor_id in _dedupe_ids(ids)
if sensor_id in burst_series.index and sensor_id in normal_series.index
]
if not common_ids:
raise ValueError(f"{data_label}没有同时具备爆管时段和正常时段有效数据的点位。")
return common_ids, burst_series.loc[common_ids], normal_series.loc[common_ids]
def _build_observed_series_from_scada(
*,
network: str,
@@ -473,11 +506,13 @@ def _build_observed_series_from_scada(
float(item["value"]) for item in records if item.get("value") is not None
]
if not numeric_values:
raise ValueError(
f"{_series_display_name(series_name)} 在时间窗内无有效数据: {sensor_id}"
)
continue
values[sensor_id] = float(sum(numeric_values) / len(numeric_values))
sample_counts.append(len(numeric_values))
if not values:
raise ValueError(
f"{_series_display_name(series_name)} 在时间窗内无有效数据: {', '.join(sensor_ids[:10])}"
)
return pd.Series(values, dtype=float), min(sample_counts)