新增 SCADA 设备清洗 API;新增调试配置文件

This commit is contained in:
JIANG
2025-11-05 15:23:46 +08:00
parent 004e76572a
commit ac653fa2c1
3 changed files with 307 additions and 47 deletions

101
main.py
View File

@@ -4080,6 +4080,107 @@ async def fastapi_pressure_sensor_placement(
raise HTTPException(status_code=500, detail=f"执行失败: {str(e)}")
# 新增 SCADA 设备清洗接口
@app.post("/scadadevicedatacleaning/")
async def fastapi_scada_device_data_cleaning(
network: str = Query(...),
ids_list: List[str] = Query(...),
start_time: str = Query(...),
end_time: str = Query(...),
user_name: str = Query(...),
) -> str:
import pandas as pd # 假设可以使用 pandas 处理表格数据
item = {
"network": network,
"ids": ids_list,
"start_time": start_time,
"end_time": end_time,
"user_name": user_name,
}
query_ids_list = item["ids"][0].split(",")
# 先调用 query_SCADA_data_by_device_ID_and_timerange 获取原始数据
scada_data = influxdb_api.query_SCADA_data_by_device_ID_and_timerange(
query_ids_list=query_ids_list,
start_time=item["start_time"],
end_time=item["end_time"],
)
# 获取对应管网的所有 SCADA 设备信息
scada_device_info = influxdb_api.query_pg_scada_info(item["network"])
# 将列表转换为字典,以 device_id 为键
scada_device_info_dict = {info["id"]: info for info in scada_device_info}
# 按设备类型分组设备
type_groups = {}
for device_id in query_ids_list:
device_info = scada_device_info_dict.get(device_id, {})
device_type = device_info.get("type", "unknown")
if device_type not in type_groups:
type_groups[device_type] = []
type_groups[device_type].append(device_id)
# 批量处理每种类型的设备
for device_type, device_ids in type_groups.items():
if device_type not in ["pressure", "pipe_flow"]:
continue # 跳过未知类型
# 过滤该类型的设备数据
type_scada_data = {
device_id: scada_data[device_id]
for device_id in device_ids
if device_id in scada_data
}
if not type_scada_data:
continue
# 假设所有设备的时间点相同,提取 time 列表
time_list = [record["time"] for record in next(iter(type_scada_data.values()))]
# 创建 DataFrame第一列是 time然后是每个设备的 value 列
df = pd.DataFrame({"time": time_list})
for device_id in device_ids:
if device_id in type_scada_data:
values = [record["value"] for record in type_scada_data[device_id]]
df[device_id] = values
# 移除 time 列,准备输入给清洗方法(清洗方法期望 value 表格)
value_df = df.drop(columns=["time"])
# 调用清洗方法
if device_type == "pressure":
cleaned_value_df = api_ex.Pdataclean.clean_pressure_data_dict_km(value_df)
elif device_type == "pipe_flow":
cleaned_value_df = api_ex.Fdataclean.clean_flow_data_dict(value_df)
# 添加 time 列到首列
cleaned_value_df = pd.DataFrame(cleaned_value_df)
# 只选择以 '_cleaned' 结尾的清洗数据列
cleaned_columns = [
col for col in cleaned_value_df.columns if col.endswith("_cleaned")
]
cleaned_value_df = cleaned_value_df[cleaned_columns]
# 重命名列,移除 '_cleaned' 后缀
cleaned_value_df = cleaned_value_df.rename(
columns={
col: col.replace("_cleaned", "") for col in cleaned_value_df.columns
}
)
cleaned_df = pd.concat([df["time"], cleaned_value_df], axis=1)
# 调试输出,确认列名
print(f"清洗后的列名: {cleaned_df.columns.tolist()}")
# 将清洗后的数据写回数据库
influxdb_api.import_multicolumn_data_from_dict(
data_dict=cleaned_df.to_dict("list"), # 转换为 {column_name: [values]} 格式
raw=False,
)
return "success"
class Item(BaseModel):
str_info: str
dict_info: Optional[dict] = None