optimize.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import os
  2. from datetime import datetime,timedelta
  3. from pathlib import Path
  4. from pprint import pprint
  5. import pandas as pd
  6. from ...model.DHU.DHU_AB import DHU_AB
  7. from ...tools.config_reader import ConfigReader
  8. from ...tools.data_loader import DataLoader
  9. NOW = datetime.now().replace(second=0,microsecond=0)
  10. def optimize(*inputs,config=None):
  11. config = {} if config is None else config
  12. if '__LOCAL' in config.keys():
  13. config_reader_path = config['__LOCAL']
  14. data_URL = config['__URL']
  15. else:
  16. config_reader_path = '/mnt/workflow_data'
  17. data_URL = 'http://basedataportal-svc:8080/data/getpointsdata'
  18. config_reader = ConfigReader(path=f'{config_reader_path}/DHU_AB配置.xlsx')
  19. ALL_RESULT = {
  20. 'EXCEPTION':{
  21. 'Mod' : {},
  22. 'Data_Room': {},
  23. 'Data_ATD' : {},
  24. 'Opt' : {},
  25. 'Push' : {}
  26. },
  27. 'STATUS':{
  28. 'Mode_Steady': [],
  29. 'Mode_Low' : [],
  30. 'Mode_stop' : []
  31. }
  32. }
  33. for each_eaup_name in config_reader.all_equp_names:
  34. # 加载模型
  35. # 加载数据
  36. # 运行判断
  37. # 稳态判断:房间露点设定值与反馈值是否接近
  38. # 模型调整
  39. # 模型判断:模型精度是否满足要求
  40. # 模式判断:
  41. # 1. 基于当前露点优化模式:基于房间露点设定值减偏差
  42. # 2. 快速提升送风露点模式:约束送风露点保持不变
  43. equp_type = config_reader.get_equp_info(each_eaup_name,key='设备类型',info_type='str')
  44. # 加载模型
  45. try:
  46. if config_reader.get_app_info(
  47. each_eaup_name,
  48. app_type = '实时优化',
  49. key = '使用临时模型',
  50. info_type = 'bool'
  51. ):
  52. # 从文件夹中获取临时模型
  53. MODEL = DHU_AB.load(path=f'{config_reader_path}/model/{each_eaup_name}.pkl')
  54. else:
  55. MODEL = DHU_AB.load_from_platform(
  56. source = 'id',
  57. model_id = config_reader.get_equp_info(
  58. equp_name = each_eaup_name,
  59. key = '模型编号',
  60. info_type = 'str'
  61. )
  62. )
  63. except Exception as e:
  64. ALL_RESULT['EXCEPTION']['Mod'][each_eaup_name] = e
  65. continue
  66. # 加载房间数据
  67. try:
  68. room_steady_len = config_reader.get_app_info(each_eaup_name,'实时优化','房间稳态判断时长','float')
  69. room_data_loader = DataLoader(
  70. path = f'{config_reader_path}/data/optimize/data_cur/',
  71. start_time = NOW - timedelta(minutes=room_steady_len),
  72. end_time = NOW
  73. )
  74. room_data_loader.download_equp_data(
  75. equp_name = each_eaup_name,
  76. point = config_reader.get_equp_point(each_eaup_name,equp_class=['C']),
  77. url = data_URL,
  78. clean_cache = True
  79. )
  80. room_data = room_data_loader.get_equp_data(each_eaup_name)
  81. room_Dew_SP_adj = config_reader.get_app_info(each_eaup_name,'实时优化','房间露点设定值偏差','float')
  82. room_Dew_SP = room_data.room_DSP.mean() + room_Dew_SP_adj
  83. room_Dew_PV = room_data.room_DPV.mean()
  84. room_Dew_diff_dwlim = config_reader.get_app_info(each_eaup_name,'实时优化','房间露点过低阈值','float')
  85. # 模式判断
  86. is_room_Dew_steady = (room_Dew_PV < room_Dew_SP + 0.5) or (room_Dew_PV > room_Dew_SP - 0.5)
  87. is_room_Dew_low = room_Dew_PV - room_Dew_SP < room_Dew_diff_dwlim
  88. if is_room_Dew_steady:
  89. DewOut_constrain = 'coil_3_DoutA-[coil_3_DoutA]<0'
  90. ALL_RESULT['STATUS']['Mode_Steady'].append(each_eaup_name)
  91. elif is_room_Dew_low:
  92. DewOut_constrain = f'coil_3_DoutA-{room_Dew_SP-4}<0' #TODO 这个4度比较粗糙,待改进
  93. ALL_RESULT['STATUS']['Mode_Low'].append(each_eaup_name)
  94. else:
  95. ALL_RESULT['STATUS']['Mode_stop'].append(each_eaup_name)
  96. continue
  97. except Exception as e:
  98. ALL_RESULT['STATUS']['Data_Room'][each_eaup_name] = e
  99. continue
  100. # 加载除湿机数据
  101. try:
  102. dhu_steady_len = config_reader.get_app_info(each_eaup_name,'实时优化','除湿机工况均值时长','float')
  103. data_input_point = config_reader.get_equp_point(each_eaup_name,equp_class=['A','B'])
  104. data_cur = (
  105. DataLoader(
  106. path = f'{config_reader_path}/data/optimize/data_cur/',
  107. start_time = NOW - timedelta(minutes=dhu_steady_len),
  108. end_time = NOW
  109. )
  110. .download_equp_data(
  111. equp_name = each_eaup_name,
  112. point = data_input_point,
  113. url = data_URL,
  114. clean_cache = True
  115. )
  116. .get_equp_data(
  117. equp_name = each_eaup_name,
  118. )
  119. .mean(axis=0)
  120. .to_frame().T
  121. )
  122. except Exception as e:
  123. ALL_RESULT['EXCEPTION']['Data_ATD'][each_eaup_name] = e
  124. try:
  125. # 模型精度判断
  126. predict = MODEL.predict_system(input_data=data_cur)
  127. TVP_data = (
  128. predict.T.set_axis(['pred'],axis=1)
  129. .join(
  130. data_cur.T.set_axis(['real'],axis=1),
  131. how = 'left'
  132. )
  133. .dropna(axis=0)
  134. )
  135. print(TVP_data)
  136. # 实时优化
  137. constrains = [DewOut_constrain]
  138. opt_res = MODEL.optimize(
  139. cur_input_data = data_cur,
  140. wheel_1_TinR_ub = config_reader.get_app_info(each_eaup_name,'实时优化','前再生盘管温度上限','float'),
  141. wheel_1_TinR_lb = config_reader.get_app_info(each_eaup_name,'实时优化','前再生盘管温度下限','float'),
  142. wheel_2_TinR_ub = config_reader.get_app_info(each_eaup_name,'实时优化','后再生盘管温度上限','float'),
  143. wheel_2_TinR_lb = config_reader.get_app_info(each_eaup_name,'实时优化','后再生盘管温度下限','float'),
  144. constrains = constrains,
  145. logging = False
  146. )
  147. opt_summary = opt_res['opt_summary']
  148. opt_var = opt_res['opt_var']
  149. except Exception as e:
  150. ALL_RESULT['EXCEPTION']['Opt'][each_eaup_name] = e
  151. pprint(ALL_RESULT)