fix(burst-location): tolerate partial SCADA gaps
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user