add api for data clean && sensor_placement

This commit is contained in:
xinzish
2025-10-30 00:39:29 +08:00
parent ae6510ac37
commit 1907e1d3cb
6 changed files with 671 additions and 0 deletions

View File

@@ -19,6 +19,7 @@ from sqlalchemy import create_engine
import ast
import sensitivity
import project_info
import api_ex.kmeans_sensor
############################################################
# burst analysis 01
@@ -1064,6 +1065,85 @@ def pressure_sensor_placement_sensitivity(name: str, scheme_name: str, sensor_nu
except Exception as e:
print(f"存储方案信息时出错:{e}")
#2025/08/21
# 基于kmeans聚类法进行压力监测点优化布置
def pressure_sensor_placement_kmeans(name: str, scheme_name: str, sensor_number: int,
min_diameter: int, username: str) -> None:
"""
基于聚类法进行压力监测点优化布置
:param name: 数据库名称注意此处数据库名称也是inp文件名称inp文件与pg库名要一样
:param scheme_name: 监测优化布置方案名称
:param sensor_number: 传感器数目
:param min_diameter: 最小管径
:param username: 用户名
:return:
"""
sensor_location = api_ex.kmeans_sensor.kmeans_sensor_placement(name=name, sensor_num=sensor_number, min_diameter=min_diameter)
try:
conn_string = f"dbname={name} host=127.0.0.1"
with psycopg.connect(conn_string) as conn:
with conn.cursor() as cur:
sql = """
INSERT INTO sensor_placement (scheme_name, sensor_number, min_diameter, username, sensor_location)
VALUES (%s, %s, %s, %s, %s)
"""
cur.execute(sql, (scheme_name, sensor_number, min_diameter, username, sensor_location))
conn.commit()
print("方案信息存储成功!")
except Exception as e:
print(f"存储方案信息时出错:{e}")
############################################################
# 流量监测数据清洗 ***卡尔曼滤波法***
############################################################
#2025/08/21 hxyan
def flow_data_clean(input_csv_file: str) -> str:
"""
读取 input_csv_path 中的每列时间序列,使用一维 Kalman 滤波平滑并用预测值替换基于 3σ 检测出的异常点。
保存输出为:<input_filename>_cleaned.xlsx与输入同目录并返回输出文件的绝对路径。如有同名文件存在则覆盖。
:param: input_csv_file: 输入的 CSV 文件明或路径
:return: 输出文件的绝对路径
"""
# 提供的 input_csv_path 绝对路径,以下为 默认脚本目录下同名 CSV 文件,构建绝对路径,可根据情况修改
script_dir = os.path.dirname(os.path.abspath(__file__))
input_csv_path= os.path.join(script_dir, input_csv_file)
# 检查文件是否存在
if not os.path.exists(input_csv_path):
raise FileNotFoundError(f"指定的文件不存在: {input_csv_path}")
# 调用 Fdataclean.clean_flow_data_kf 函数进行数据清洗
out_xlsx_path = api_ex.Fdataclean.clean_flow_data_kf(input_csv_path)
print("清洗后的数据已保存到:", out_xlsx_path )
############################################################
# 压力监测数据清洗 ***kmean++法***
############################################################
#2025/08/21 hxyan
def pressure_data_clean(input_csv_file: str) -> str:
"""
读取 input_csv_path 中的每列时间序列使用Kmean++清洗数据。
保存输出为:<input_filename>_cleaned.xlsx与输入同目录并返回输出文件的绝对路径。如有同名文件存在则覆盖。
原始数据在 sheet 'raw_pressure_data',处理后数据在 sheet 'cleaned_pressusre_data'
:param input_csv_path: 输入的 CSV 文件路径
:return: 输出文件的绝对路径
"""
# 提供的 input_csv_path 绝对路径,以下为 默认脚本目录下同名 CSV 文件,构建绝对路径,可根据情况修改
script_dir = os.path.dirname(os.path.abspath(__file__))
input_csv_path= os.path.join(script_dir, input_csv_file)
# 检查文件是否存在
if not os.path.exists(input_csv_path):
raise FileNotFoundError(f"指定的文件不存在: {input_csv_path}")
# 调用 Fdataclean.clean_flow_data_kf 函数进行数据清洗
out_xlsx_path = api_ex.Pdataclean.clean_pressure_data_km(input_csv_path)
print("清洗后的数据已保存到:", out_xlsx_path )
if __name__ == '__main__':
# contaminant_simulation('bb_model','2024-06-24T00:00:00Z','ZBBDTZDP009034',30,1800)
@@ -1120,3 +1200,5 @@ if __name__ == '__main__':
# 示例pressure_sensor_placement_sensitivity
pressure_sensor_placement_sensitivity(name=project_info.name, scheme_name='20250517', sensor_number=10, min_diameter=300, username='admin')
# 示例pressure_sensor_placement_kmeans
pressure_sensor_placement_kmeans(name=project_info.name, scheme_name='sensor_1027', sensor_number=35, min_diameter=300, username='admin')