项目实战-基于大数据分析的暖通系统改造模型【感谢Akila公司以及学院的支持】
Akila企业那边给我们的课题是改良暖通系统的SCOP
一.机器学习
我的第一个想法就是通过大量数据进行机器学习,从而找到任意环境条件下的机器最优参数
简单来说就是:
通过 K 均值算法对数据进行聚类分析后,结合 Apriori 算法挖掘高 COP 相关
的操作参数,最后利用 DNN 模型模拟优化效果,实现了在任意天气状况和制冷
量条件下,理论上找到设备 COP 最优参数的目标。这种多算法结合的框架,为
复杂系统的参数优化提供了参考
然而企业那边更加偏向于数据清理、数据处理方向,于是我们将机器学习部分拟为附录中的建议。
二.数据处理
再次感谢Akila企业为我们提供了许多场景的数据。
场景1.无锡某商场
首先我们查询资料明确了我们需要优化的目标(kaggle是一个很好的资料查询、机器学习竞赛的网站)
那么我们就需要从企业的表格中提取我们所需要的数据
在这个案例中企业给我们了进出口的水温差、反馈频率、用电量等等数据
我基于python的pandas库,对照这些数据表的格式,写了一个数据处理脚本,源码如下
import pandas as pd
from datetime import timedeltachiller_temp_template = "{}号冷机冷冻水供回水温度和冷却水供回水温度和冷机功率百分比.xlsx"
pump_freq_file = "冷冻水二次泵频率.xlsx"
electricity_file = "2024逐日用电量_包含冷机_冷冻水一次泵_冷却水一次泵_冷冻水二次泵_冷却塔.xlsx"rated_flow = [950, 950, 950, 700, 700] #额定流量
rated_freq = 50 #额定频率
water_cp = 4.2 #比热
water_density = 1000 #密度pump_freq = pd.read_excel(pump_freq_file)
pump_freq["时间"] = pd.to_datetime(pump_freq["时间"])electricity = pd.read_excel(electricity_file)
electricity["Date"] = pd.to_datetime(electricity["Date"], format="%m/%d")
electricity["Date"] = electricity["Date"].apply(lambda x: x.replace(year=2024))k_total = 0 #初始化for i in range(1, 6):#遍历5台机器chiller_temp_file = chiller_temp_template.format(i)chiller_temp = pd.read_excel(chiller_temp_file)chiller_temp["时间"] = pd.to_datetime(chiller_temp["时间"])supply_temp_col = f"冷源系统.冷机{i}.冷冻水侧.温度.供水温度(℃)"return_temp_col = f"冷源系统.冷机{i}.冷冻水侧.温度.回水温度(℃)"freq_col = f"冷源系统.冷冻水二次泵{i}.流量.频率反馈(赫兹)"# 合并温度和频率表,按时间对齐merged_data = pd.merge_asof(chiller_temp.sort_values("时间"),pump_freq[["时间", freq_col]].sort_values("时间"),on="时间")merged_data["流量"] = (rated_flow[i - 1] * merged_data[freq_col] / rated_freq)merged_data["温差"] = (merged_data[return_temp_col] - merged_data[supply_temp_col])merged_data["用冷量"] = (merged_data["流量"] * merged_data["温差"])k_total += merged_data["用冷量"].sum()total_cooling_energy = water_cp * water_density * k_total # kWh 转 kJ
total_electricity = electricity["Consumption 2024"].sum() * 3600 # kWh -> kJscop = total_cooling_energy / total_electricityprint(f"总用冷量: {total_cooling_energy:.2f} kJ")
print(f"总用电量: {total_electricity:.2f} kJ")
print(f"COP: {scop:.2f}")
计算结果得到2024年该场景的COP是2.10
然后我们进行了硬件、软件上的优化(不太方便透露)
新COP约为3.4
场景2.上海市闵行区某研发中心
首先我们还是先确定目标的计算公式
Akila给了我们该场景的温湿度数据,以及各个房间的二氧化碳浓度
于是我们借助pandas和numpy库进行了数据清理和数据处理
import pandas as pd
import numpy as npvol_area=pd.read_excel('Vol_Area.xlsx')
enfin_df=pd.read_excel('enfin_df.xlsx')vol_area.drop(['area'], axis=1, inplace=True)
vol_arearho = 1.2 # 空气密度 (kg/m³)
Cp = 1005 # 空气比热容 (J/kg·K)
L = 2.5e6 # 水的汽化潜热 (J/kg)
k_concrete = 7.5 # 混凝土导热系数 (W/m·K)
k_glass = 90 # 玻璃导热系数 (W/m·K)
delta_t =3600 # 时间间隔 (s)def e_sat(T):"""计算给定温度 T (°C) 下的饱和蒸气压 e_sat(T)公式:e_sat(T) = 6.11 * 10^(7.5 * T / (237.7 + T))"""return 6.11 * np.power(10, (7.5 * T) / (237.7 + T))def e_act(T, RH):"""计算给定温度 T (°C) 和相对湿度 RH (%) 下的实际蒸气压 e_act公式:e_act = (RH / 100) * e_sat(T)"""return (RH / 100) * e_sat(T)# 3. 计算通风量 dot_V
def calc_dot_V(delta_CO2, V_room, delta_t):"""计算通风量 dot_V公式: dot_V = (delta_CO2 * V_room) / delta_t"""return (delta_CO2 * V_room) / delta_tQ_accumulated=0'''
for j in range(len(enfin_df)-1): #每个小时for i in range(23): #每个房间T_in=enfin_df.loc[[j],[f'inner_temp{i+1}']].values.item()T_out=enfin_df.loc[[j],['outer_temp']].values.item()RH_in=enfin_df.loc[[j],[f'inner_humidity{i+1}']].values.item()RH_out=enfin_df.loc[[j],['outer_humidity']].values.item()delta_CO2_pre=enfin_df.loc[[j],[f'inner_co2{i+1}']].values.item()delta_CO2_post=enfin_df.loc[[j],[f'inner_co2{i+2}']].valuesA_concrete=vol_area.loc[[i],['area_concrete']].values.item()A_glass=vol_area.loc[[i],['area_glass']].values.item()delta_CO2 = delta_CO2_post- delta_CO2_pre # 室内一小时前后二氧化碳浓度差 (ppm)V_room = vol_area.loc[[i], ['vol']].values.item() # 室内体积 (m³)# select 的时候,要注意最终得到1x1的df,和一个数值 是不一样的# 计算实际蒸气压e_act_in = e_act(T_in, RH_in)e_act_out = e_act(T_out, RH_out)# 计算通风量dot_V = calc_dot_V(delta_CO2, V_room, delta_t) # m³/s# 计算建筑外壳传热冷量损失(只与温差有关)K=k_concrete*A_concrete+k_glass*A_glassQ_heat = K * (T_in - T_out)# 计算蒸发冷却损失(基于蒸气压差)Q_evap = dot_V * rho * L * (e_act_in - e_act_out)# 计算通风冷量损失(只与温差有关)Q_vent = dot_V * rho * Cp * (T_in - T_out)# 计算总冷量损失Q = Q_heat + Q_evap + Q_ventQ_accumulated+=Q
'''for j in range(len(enfin_df)-1): #每个小时for i in range(23): #每个房间T_in = enfin_df.at[j,f'inner_temp{i+1}']T_out = enfin_df.at[j,'outer_temp']RH_in = enfin_df.at[j,f'inner_humidity{i+1}']RH_out = enfin_df.at[j,'outer_humidity']delta_CO2_pre = enfin_df.at[j,f'inner_co2{i+1}']delta_CO2_post = enfin_df.at[j,f'inner_co2{i+2}']A_concrete = vol_area.at[i,'area_concrete']A_glass = vol_area.at[i,'area_glass']delta_CO2 = delta_CO2_post - delta_CO2_pre # 室内一小时前后二氧化碳浓度差 (ppm)V_room = vol_area.at[i,'vol'] # 室内体积 (m³)'''# Debugging printsprint(f"Room {i+1}, Hour {j+1}")print(f"T_in: {T_in}, T_out: {T_out}")print(f"RH_in: {RH_in}, RH_out: {RH_out}")print(f"delta_CO2: {delta_CO2}, V_room: {V_room}")print(f"A_concrete: {A_concrete}, A_glass: {A_glass}")'''# 计算实际蒸气压e_act_in = e_act(T_in, RH_in)e_act_out = e_act(T_out, RH_out)# 计算通风量dot_V = calc_dot_V(delta_CO2, V_room, delta_t) # m³/s# 计算建筑外壳传热冷量损失(只与温差有关)K = k_concrete * A_concrete + k_glass * A_glassQ_heat = K * (T_in - T_out)# 计算蒸发冷却损失(基于蒸气压差)Q_evap = dot_V * rho * L * (e_act_in - e_act_out)# 计算通风冷量损失(只与温差有关)Q_vent = dot_V * rho * Cp * (T_in - T_out)# 计算总冷量损失Q = Q_heat + Q_evap + Q_ventQ_accumulated += Q# Debugging printsprint(f"Q_heat: {Q_heat}, Q_evap: {Q_evap}, Q_vent: {Q_vent}, Q: {Q}")print(Q_accumulated)
最终得到Q值为79474551923.88536 J
(在数据处理期间层一度没有输出结果,一开始我以为是代码错误,经过对数据的查找后发现有几处数据缺失,于是加上了特判后就可以跑了,所以耐心和细心是很重要滴)
三.心得
这次项目做下来最终的几点感受如下:
1.要学会团队沟通和协作。一个人猛干往往无法实现大规模项目的成功,需要及时地进行如腾讯会议等方式的周期性的研讨,交流各模块的需求和难点,才能“众志成城,金石为开”
2.资源收集+数据处理。在接触这个项目时我们完全没有这方面的知识储备,刚开始完全懵懵的,但是我们稳定军心,进行资源收集和数据处理后慢慢开始上道,后面也算是熟悉了这块领域的一些知识