新增 SCADA 设备清洗 API;新增调试配置文件
This commit is contained in:
101
main.py
101
main.py
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user