新增tests;新增管道健康预测方法;更新复合查询函数输出格式

This commit is contained in:
JIANG
2025-12-15 18:31:29 +08:00
parent ea33fc270d
commit 9b5707841b
7 changed files with 261 additions and 36 deletions

View File

@@ -1,4 +1,4 @@
from typing import List, Optional, Any
from typing import List, Optional, Any, Dict
from datetime import datetime
from psycopg import AsyncConnection
import pandas as pd
@@ -23,7 +23,7 @@ class CompositeQueries:
device_ids: List[str],
start_time: datetime,
end_time: datetime,
) -> List[Optional[Any]]:
) -> Dict[str, List[Dict[str, Any]]]:
"""
获取 SCADA 关联的 link/node 模拟值
@@ -39,12 +39,12 @@ class CompositeQueries:
field: 要查询的字段名
Returns:
模拟数据值列表,如果没有找到则对应位置返回 None
模拟数据字典,以 device_id 为键,值为数据列表,每个数据包含 time, value 和 scada_id
Raises:
ValueError: 当 SCADA 设备未找到或字段无效时
"""
results = []
result = {}
# 1. 查询所有 SCADA 信息
scada_infos = await PostgreScadaRepository.get_scadas(postgres_conn)
@@ -75,8 +75,11 @@ class CompositeQueries:
)
else:
raise ValueError(f"Unknown SCADA type: {scada_type}")
results.append(res)
return results
# 添加 scada_id 到每个数据项
for item in res:
item["scada_id"] = device_id
result[device_id] = res
return result
@staticmethod
async def get_scada_associated_scheme_simulation_data(
@@ -87,7 +90,7 @@ class CompositeQueries:
end_time: datetime,
scheme_type: str,
scheme_name: str,
) -> List[Optional[Any]]:
) -> Dict[str, List[Dict[str, Any]]]:
"""
获取 SCADA 关联的 link/node 模拟值
@@ -103,12 +106,12 @@ class CompositeQueries:
field: 要查询的字段名
Returns:
模拟数据值列表,如果没有找到则对应位置返回 None
模拟数据字典,以 device_id 为键,值为数据列表,每个数据包含 time, value 和 scada_id
Raises:
ValueError: 当 SCADA 设备未找到或字段无效时
"""
results = []
result = {}
# 1. 查询所有 SCADA 信息
scada_infos = await PostgreScadaRepository.get_scadas(postgres_conn)
@@ -151,8 +154,11 @@ class CompositeQueries:
)
else:
raise ValueError(f"Unknown SCADA type: {scada_type}")
results.append(res)
return results
# 添加 scada_id 到每个数据项
for item in res:
item["scada_id"] = device_id
result[device_id] = res
return result
@staticmethod
async def get_element_associated_scada_data(
@@ -282,31 +288,31 @@ class CompositeQueries:
]
# 处理pressure数据
# if pressure_ids:
# pressure_df = df[pressure_ids]
# # 重置索引,将 time 变为普通列
# pressure_df = pressure_df.reset_index()
# # 移除 time 列,准备输入给清洗方法
# value_df = pressure_df.drop(columns=["time"])
# # 调用清洗方法
# cleaned_value_df = clean_pressure_data_df_km(value_df)
# # 添加 time 列到首列
# cleaned_df = pd.concat([pressure_df["time"], cleaned_value_df], axis=1)
# # 将清洗后的数据写回数据库
# for device_id in pressure_ids:
# if device_id in cleaned_df.columns:
# cleaned_values = cleaned_df[device_id].tolist()
# time_values = cleaned_df["time"].tolist()
# for i, time_str in enumerate(time_values):
# time_dt = datetime.fromisoformat(time_str)
# value = cleaned_values[i]
# await ScadaRepository.update_scada_field(
# timescale_conn,
# time_dt,
# device_id,
# "cleaned_value",
# value,
# )
if pressure_ids:
pressure_df = df[pressure_ids]
# 重置索引,将 time 变为普通列
pressure_df = pressure_df.reset_index()
# 移除 time 列,准备输入给清洗方法
value_df = pressure_df.drop(columns=["time"])
# 调用清洗方法
cleaned_value_df = clean_pressure_data_df_km(value_df)
# 添加 time 列到首列
cleaned_df = pd.concat([pressure_df["time"], cleaned_value_df], axis=1)
# 将清洗后的数据写回数据库
for device_id in pressure_ids:
if device_id in cleaned_df.columns:
cleaned_values = cleaned_df[device_id].tolist()
time_values = cleaned_df["time"].tolist()
for i, time_str in enumerate(time_values):
time_dt = datetime.fromisoformat(time_str)
value = cleaned_values[i]
await ScadaRepository.update_scada_field(
timescale_conn,
time_dt,
device_id,
"cleaned_value",
value,
)
# 处理flow数据
if flow_ids: