algos.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. import pandas as pd
  2. import time
  3. import datetime
  4. import traceback
  5. from ZlwlAlgos.PERIODIC.task_min_5.group_1.safetyalarm.V_1_0_0.CBMSSafetyAlarm import SafetyAlarm
  6. from ZlwlAlgos.PERIODIC.task_min_10.group_1.FaultWarning.V_1_0_0 import CBMSBatDiag, CBMSBatDiag_SOCCrntIsnV1, CBMSBatDiag_TempV4
  7. from ZlwlAlgos.PERIODIC.task_hour_1.group_2.safety_score.V1_0_0 import Safety_Score
  8. from ZlwlAlgos.PERIODIC.task_hour_6.group_1.intershort.V_1_0_0.CBMSBatInterShort import BatInterShort
  9. from ZlwlAlgos.PERIODIC.task_hour_6.group_1.uniform.V_1_0_0.CBMSBatUniform import CellUniform
  10. from ZlwlAlgos.PERIODIC.task_hour_6.group_1.safetywarning.V_1_0_0.CBMSSafetyWarning import SafetyWarning
  11. from ZlwlAlgos.PERIODIC.task_day_1.group_1.socdiag.V_1_0_0.SOCBatDiag import SocDiag
  12. from ZlwlAlgos.PERIODIC.task_day_1.group_1.LowSocAlarm.V1_0_0.low_soc_alarm import Low_soc_alarm
  13. from ZlwlAlgos.PERIODIC.task_day_1.group_1.SorCal.V_1_0_0.sorcal import sor_est
  14. from ZlwlAlgos.PERIODIC.task_day_1.group_1.DataSplit.V_1_0_0 import data_status as ds ##充电状态标准化程序
  15. from ZlwlAlgos.PERIODIC.task_day_1.group_1.DataSplit.V_1_0_0 import data_split as dt ##分段函数程序
  16. from ZlwlAlgos.PERIODIC.task_day_1.group_1.DataSplit.V_1_0_0 import data_drive_stat as ddt ##行驶数据按行驶段汇总统计
  17. from ZlwlAlgos.PERIODIC.task_day_1.group_1.DataSplit.V_1_0_0 import data_charge_stat as dct ##充电数据按充电段汇总
  18. from ZlwlAlgos.PERIODIC.task_day_1.group_1.DataSplit.V_1_0_0 import data_stand_stat as dst ##静置数据按静置段汇总
  19. from ZlwlAlgos.PERIODIC.task_day_1.group_1.DataSplit.V_1_0_0 import data_drive_stat_period as ddtp ##行驶数据按充电周期汇总统计
  20. from ZlwlAlgos.PERIODIC.task_day_1.group_1.DataSplit.V_1_0_0 import trans_day as trd ##解决跨天的问题
  21. from ZlwlAlgos.PERIODIC.task_day_1.group_1.DataSplit.V_1_0_0 import stand_status as ss
  22. from ZlwlAlgos.PERIODIC.task_day_7.group_1.soh.V_1_0_0.CBMSBatSoh import BatSoh
  23. import lib.glo as glo
  24. class AlgosInvoke():
  25. def __init__(self, logger, df_algo_param, df_table, cellvolt_name, celltemp_name, pack_code, df_snlist, df_algo_adjustable_param, df_algo_pack_param, cell_type):
  26. self.logger = logger
  27. self.df_algo_param = df_algo_param
  28. self.df_table = df_table
  29. self.cellvolt_name = cellvolt_name
  30. self.cellvolt_name = cellvolt_name
  31. self.celltemp_name = celltemp_name
  32. self.pack_code = pack_code
  33. self.df_snlist = df_snlist
  34. self.df_algo_adjustable_param = df_algo_adjustable_param
  35. self.df_algo_pack_param = df_algo_pack_param
  36. self.df_algo_pack_param_eval = {k: eval(v) if isinstance(v, str) else v for k, v in df_algo_pack_param.items()}
  37. self.cell_type = cell_type
  38. def _process_ing_done(self, df_all_fault_ing, df_all_fault_done, df_res_new, df_res_end, df_res_update=None, update_flag=False):
  39. # 处理新增
  40. df_all_fault_ing = pd.concat([df_all_fault_ing, df_res_new])
  41. df_all_fault_ing.reset_index(drop=True, inplace=True)
  42. # 处理update
  43. if update_flag:
  44. upd_list = df_res_update.to_dict("records")
  45. for u in upd_list:
  46. index1=df_all_fault_ing[(df_all_fault_ing['sn']==u['sn']) & (df_all_fault_ing['start_time']==u['start_time']) & (df_all_fault_ing['fault_code']==u['fault_code'])].index[0]
  47. df_all_fault_ing.drop(index1, inplace=True)
  48. index2=df_res_update[(df_res_update['sn']==u['sn']) & (df_res_update['start_time']==u['start_time']) & (df_res_update['fault_code']==u['fault_code'])].index[0]
  49. df_all_fault_ing = pd.concat([df_all_fault_ing, df_res_update.loc[index2:index2]])
  50. df_all_fault_ing.reset_index(drop=True, inplace=True)
  51. # 处理delete
  52. del_list = df_res_end.to_dict("records")
  53. for d in del_list:
  54. index1=df_all_fault_ing[(df_all_fault_ing['sn']==d['sn']) & (df_all_fault_ing['start_time']==d['start_time']) & (df_all_fault_ing['fault_code']==d['fault_code'])].index[0]
  55. df_all_fault_ing.drop(index1, inplace=True)
  56. index2=df_res_end[(df_res_end['sn']==d['sn']) & (df_res_end['start_time']==d['start_time']) & (df_res_end['fault_code']==d['fault_code'])].index[0]
  57. df_all_fault_done = pd.concat([df_all_fault_done, df_res_end.loc[index2:index2]])
  58. df_all_fault_ing.reset_index(drop=True, inplace=True)
  59. df_all_fault_done.reset_index(drop=True, inplace=True)
  60. return df_all_fault_ing, df_all_fault_done
  61. def safety_alarm(self, df_data, df_all_fault_ing, df_all_fault_done):
  62. try:
  63. algo_name = 'safety_alarm'
  64. self.logger.info(f"开始执行{algo_name}算法")
  65. # 变量定义
  66. df_bms_ram = pd.DataFrame(columns=['time', 'sn', 'packvolt', 'cellvolt', 'celltemp', 'packsoc','packcrnt'])
  67. df_alarm_ram = pd.DataFrame(columns=['time','sn','safetywarning1','safetywarning2'])
  68. df_diag_ram = pd.DataFrame(columns=['start_time','end_time','sn','imei','model','fault_level','fault_code','fault_info','fault_reason','fault_advice','fault_location','device_status','odo'])
  69. # 执行算法
  70. safety_alarm = SafetyAlarm(df_data, df_diag_ram, df_bms_ram, df_alarm_ram, self.df_algo_param, self.df_table, self.cellvolt_name, self.celltemp_name, self.pack_code, self.df_snlist)
  71. df_res_new, df_res_end, df_bms_ram, df_alarm_ram = safety_alarm.safety_alarm_diag()
  72. # 处理结果
  73. df_all_fault_ing, df_all_fault_done = self._process_ing_done(df_all_fault_ing, df_all_fault_done, df_res_new, df_res_end)
  74. self.logger.info(f"{algo_name}算法执行完成")
  75. except Exception as e:
  76. self.logger.error(str(e))
  77. self.logger.error(traceback.format_exc())
  78. return df_all_fault_ing, df_all_fault_done
  79. def fault_warning(self, df_data, df_all_fault_ing, df_all_fault_done):
  80. algo_name = 'fault_warning'
  81. self.logger.info(f"开始执行{algo_name}算法")
  82. #电芯电压温度故障诊断
  83. try:
  84. df_res_new_volt=pd.DataFrame()
  85. df_res_update_volt=pd.DataFrame()
  86. df_res_end_volt=pd.DataFrame()
  87. FaultDiagVolt = CBMSBatDiag.BatDiagVolt(df_data, self.df_table, self.cellvolt_name, self.celltemp_name, self.cell_type)
  88. df_res_new_volt, df_res_update_volt, df_res_end_volt = FaultDiagVolt.diag(df_all_fault_ing, self.df_algo_adjustable_param, self.df_algo_pack_param, self.df_algo_param, self.df_snlist)#df_soh,
  89. except Exception as e:
  90. self.logger.error(str(e))
  91. self.logger.error(traceback.format_exc())
  92. try:
  93. df_res_new_crnt=pd.DataFrame()
  94. df_res_update_crnt=pd.DataFrame()
  95. df_res_end_crnt=pd.DataFrame()
  96. FaultDiagTemp = CBMSBatDiag_SOCCrntIsnV1.BatDiag_SOCCrntIsn(df_data, self.df_table, self.cellvolt_name, self.celltemp_name)
  97. df_res_new_crnt, df_res_update_crnt, df_res_end_crnt = FaultDiagTemp.diag(df_all_fault_ing, self.df_algo_adjustable_param, self.df_algo_pack_param, self.df_algo_param, self.df_snlist)
  98. except Exception as e:
  99. self.logger.error(str(e))
  100. self.logger.error(traceback.format_exc())
  101. try:
  102. df_res_new_temp=pd.DataFrame()
  103. df_res_update_temp=pd.DataFrame()
  104. df_res_end_Temp=pd.DataFrame()
  105. FaultDiagTemp = CBMSBatDiag_TempV4.BatDiag(df_data, self.df_table, self.celltemp_name, self.cellvolt_name, self.pack_code)
  106. df_res_new_temp, df_res_update_temp, df_res_end_Temp = FaultDiagTemp.diag(df_all_fault_ing, self.df_algo_adjustable_param, self.df_algo_pack_param, self.df_algo_param, self.df_snlist)
  107. except Exception as e:
  108. self.logger.error(str(e))
  109. self.logger.error(traceback.format_exc())
  110. try:
  111. df_res_new = pd.concat([df_res_new_volt, df_res_new_crnt, df_res_new_temp]) #, res1
  112. df_res_update=pd.concat([df_res_update_volt,df_res_update_crnt, df_res_update_temp]) #, res1
  113. df_res_end = pd.concat([df_res_end_volt,df_res_end_crnt, df_res_end_Temp]) #, res2
  114. df_res_new.reset_index(drop=True, inplace=True)
  115. df_res_update.reset_index(drop=True, inplace=True)
  116. df_res_end.reset_index(drop=True, inplace=True)
  117. # 处理结果
  118. df_all_fault_ing, df_all_fault_done = self._process_ing_done(df_all_fault_ing, df_all_fault_done, df_res_new, df_res_end, df_res_update, update_flag=True)
  119. self.logger.info(f"{algo_name}算法执行完成")
  120. except Exception as e:
  121. self.logger.error(str(e))
  122. self.logger.error(traceback.format_exc())
  123. return df_all_fault_ing, df_all_fault_done
  124. def safety_score(self, df_r_risk_model, df_r_risk_list, df_dept, df_allfltinfoing, df_allfltinfodone, organ_code):
  125. try:
  126. algo_name = 'safety_score'
  127. self.logger.info(f"开始执行{algo_name}算法")
  128. df_safety_score_h = pd.DataFrame()
  129. df_safety_score_d = pd.DataFrame()
  130. df_safety_core_hour = pd.DataFrame(columns=["create_time", "sn", "score_h", "risk_index"])
  131. SafetyScole=Safety_Score.SafetyScore(self.df_snlist, df_allfltinfoing, df_allfltinfodone, df_safety_core_hour, self.df_algo_param, df_r_risk_model,
  132. df_r_risk_list, df_dept, organ_code)
  133. df_safety_score_h, df_safety_score_d=SafetyScole.safety_score()
  134. self.logger.info(f"{algo_name}算法执行完成")
  135. except Exception as e:
  136. self.logger.error(str(e))
  137. self.logger.error(traceback.format_exc())
  138. return df_safety_score_h, df_safety_score_d
  139. def bat_intershort_cell_uniform_safety_warning(self, df_data, df_all_fault_ing, df_all_fault_done, df_soh):
  140. try:
  141. algo_name = 'bat_intershort_cell_uniform_safety_warning'
  142. self.logger.info(f"开始执行{algo_name}算法")
  143. df_all_short = pd.DataFrame()
  144. df_all_uniform = pd.DataFrame()
  145. BatShort = BatInterShort(self.cell_type, self.df_algo_pack_param, self.celltemp_name, self.cellvolt_name)
  146. BatUniform = CellUniform(self.cell_type, self.df_algo_pack_param, self.celltemp_name, self.cellvolt_name)
  147. BatWarning = SafetyWarning(self.df_algo_adjustable_param, self.df_algo_param, self.cellvolt_name, self.pack_code, self.df_snlist)
  148. for sn, df in df_data.groupby('sn'):
  149. df_short, df_ram_res, df_ram_res1, df_ram_res2, df_ram_res3, df_lfp_ram, df_bal_ram=BatShort.intershort(
  150. sn, df, df_soh, pd.DataFrame(columns=['sn', 'time', 'deltsoc', 'cellsoc']), pd.DataFrame(columns=['sn', 'time1', 'deltsoc1']),
  151. pd.DataFrame(columns=['sn', 'time2', 'delt_volt', 'packcrnt_avg', 'temp_avg']), pd.DataFrame(columns=['sn','time3','standingtime','standingtime1','standingtime2','standingtime3']), [],
  152. pd.DataFrame(columns=['sn', 'time', 'bal_time', 'bal_time1', 'bal_time2']))
  153. df_uniform, df_ram_res3=BatUniform.batuniform(sn, df, df_ram_res3)
  154. df_new, df_update, df_end = BatWarning.warning_diag(sn, df, df_short, df_uniform, pd.DataFrame(columns=['start_time','end_time','sn','imei','model','fault_level','fault_code','fault_info','fault_reason','fault_advice','fault_location','device_status','odo']))
  155. df_all_short = pd.concat([df_all_short, df_short])
  156. df_all_uniform = pd.concat([df_all_uniform, df_uniform])
  157. # 处理结果
  158. df_all_fault_ing, df_all_fault_done = self._process_ing_done(df_all_fault_ing, df_all_fault_done, df_new, df_end, df_update, update_flag=True)
  159. self.logger.info(f"{algo_name}算法执行完成")
  160. except Exception as e:
  161. self.logger.error(str(e))
  162. self.logger.error(traceback.format_exc())
  163. return df_all_short, df_all_uniform, df_all_fault_ing, df_all_fault_done
  164. def soc_diag(self, df_data, df_all_fault_ing, df_all_fault_done):
  165. try:
  166. algo_name = 'soc_diag'
  167. self.logger.info(f"开始执行{algo_name}算法")
  168. df_diag_ram = df_all_fault_ing[df_all_fault_ing['sn'].isin(self.df_snlist['sn'].tolist())]
  169. period = 24*60 #算法周期min
  170. end_time = str(df_data['time'].tolist()[-1])
  171. soc_diag = SocDiag(self.cell_type, self.df_algo_pack_param_eval, self.df_algo_adjustable_param, self.df_algo_param, end_time, period, self.pack_code, self.df_snlist, df_data)
  172. df_res_new_C109, df_res_end_C109= soc_diag.soc_block(df_diag_ram)
  173. df_res_end_C107 = soc_diag.soc_jump()
  174. df_res_new_soc = df_res_new_C109
  175. df_res_end_soc = pd.concat([df_res_end_C107, df_res_end_C109])
  176. df_all_fault_ing, df_all_fault_done = self._process_ing_done(df_all_fault_ing, df_all_fault_done, df_res_new_soc, df_res_end_soc)
  177. except Exception as e:
  178. self.logger.error(str(e))
  179. self.logger.error(traceback.format_exc())
  180. return df_all_fault_ing, df_all_fault_done
  181. def low_soc(self, df_data, df_all_fault_ing, df_all_fault_done):
  182. try:
  183. algo_name = 'low_soc'
  184. self.logger.info(f"开始执行{algo_name}算法")
  185. df_diag_ram = df_all_fault_ing[df_all_fault_ing['sn'].isin(self.df_snlist['sn'].tolist())]
  186. low_soc_warning = Low_soc_alarm(df_data, self.cellvolt_name)
  187. df_res_new_lw_soc, df_res_update_lw_soc,df_res_end_lw_soc= low_soc_warning.diag(
  188. self.df_algo_pack_param_eval, self.df_algo_param, self.df_algo_adjustable_param, df_data, self.df_table, df_diag_ram, self.df_snlist)
  189. df_all_fault_ing, df_all_fault_done = self._process_ing_done(df_all_fault_ing, df_all_fault_done, df_res_new_lw_soc, df_res_end_lw_soc, df_res_update_lw_soc, True)
  190. except Exception as e:
  191. self.logger.error(str(e))
  192. self.logger.error(traceback.format_exc())
  193. return df_all_fault_ing, df_all_fault_done
  194. def sor(self, df_data):
  195. try:
  196. algo_name = 'sor'
  197. self.logger.info(f"开始执行{algo_name}算法")
  198. Diagsor_temp = sor_est(df_data, self.df_algo_pack_param)#计算内阻
  199. df_sor_add = Diagsor_temp.sor_cal()
  200. df_sor_add.reset_index(drop = True, inplace = True)
  201. except Exception as e:
  202. self.logger.error(str(e))
  203. self.logger.error(traceback.format_exc())
  204. return df_sor_add
  205. # def li_plted(self, df_data):
  206. # try:
  207. # algo_name = 'li_plted'
  208. # self.logger.info(f"开始执行{algo_name}算法")
  209. # Diagsor_temp = sor_est(df_data, self.df_algo_pack_param)#计算内阻
  210. # df_sor_add = Diagsor_temp.sor_cal()
  211. # except Exception as e:
  212. # self.logger.error(str(e))
  213. # self.logger.error(traceback.format_exc())
  214. def data_split(self, df_merge):
  215. try:
  216. algo_name = 'data_split'
  217. self.logger.info(f"开始执行{algo_name}算法")
  218. df_merge=ds.data_status(df_merge,c_soc_dif_p=0.05,s_soc_dif_p=0,c_order_delta=1200,s_order_delta=300)
  219. ##基于各个状态码,进行分段,分段函数
  220. df_drive,df_charge,df_stand,df_data_split_rlt=dt.split(df_merge, self.celltemp_name, self.cellvolt_name,
  221. drive_interval_time_min=1200,charge_interval_time_min=1200,stand_interval_time_min=1200,single_num_min=3,drive_sts=3,charge_sts=[21,22],stand_sts=0)
  222. df_data_split_rlt.reset_index(drop = True, inplace = True)
  223. except Exception as e:
  224. self.logger.error(str(e))
  225. self.logger.error(traceback.format_exc())
  226. return df_data_split_rlt
  227. def soh(self, df_data):
  228. try:
  229. algo_name = 'soh'
  230. self.logger.info(f"开始执行{algo_name}算法")
  231. df_ram_soh_result = pd.DataFrame(columns=['time_st','time_sp','sn','method','soh','soh_real','cellsoh_diff','cellsoh','odo'])
  232. bat_soh = BatSoh(self.cell_type, df_data, df_ram_soh_result, self.df_algo_pack_param_eval, self.cellvolt_name, self.celltemp_name, self.pack_code)
  233. df_soh_res = bat_soh.batsoh(self.df_snlist)
  234. df_soh_res.index = list(range(len(df_soh_res)))
  235. except Exception as e:
  236. self.logger.error(str(e))
  237. self.logger.error(traceback.format_exc())
  238. return df_soh_res