sta_stacs.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import pandas as pd
  2. import numpy as np
  3. import time, datetime
  4. class cell_statistic:
  5. def __init__(self, df_algo_pack_param, df_bms): #参数初始化
  6. self.sn = df_bms['sn'].iloc[0]
  7. self.df_bms=pd.DataFrame(df_bms)
  8. self.bmstime= pd.to_datetime(df_bms['time'], format='%Y-%m-%d %H:%M:%S')
  9. self.CellVoltNums = int(df_algo_pack_param['CellVoltTotalCount'])
  10. self.CellTempNums = int(df_algo_pack_param['CellTempTotalCount'])
  11. self.cellvolt_list=['cell_voltage'+str(x) for x in range(1,self.CellVoltNums+1)]
  12. self.celltemp_name=['cell_temp'+str(x) for x in range(1,self.CellTempNums+1)]
  13. self.capty = 2*float(int(df_algo_pack_param['capacity']))
  14. #.............................................静置行为统计............................................................................
  15. def rest_sta(self):
  16. def clean_dead_value(series, num_dead_thresh):
  17. slide_list = [series.index[0]]
  18. slide_list_all = []
  19. for i in range(series.index[0],series.index[-1]):
  20. j = i + 1
  21. diff = series[j] - series[i]
  22. if diff == 0:
  23. slide_list.append(j)
  24. else:
  25. slide_list.clear()
  26. slide_list.append(j)
  27. if len(slide_list) >= num_dead_thresh:
  28. target_list = slide_list.copy()
  29. slide_list_all.append(target_list)
  30. index= [] # 将找到的满足条件的index合并
  31. for i in range(len(slide_list_all) - 1):
  32. if set(slide_list_all[i]) < set(slide_list_all[i + 1]):
  33. index.append(i)
  34. m = {i: element for i, element in enumerate(slide_list_all)}
  35. [m.pop(i) for i in index]
  36. return list(m.values())
  37. df_data = self.df_bms.copy()
  38. df_data['crnt_flg'] = 0
  39. df_data.loc[df_data['pack_crnt'] > 0, 'crnt_flg'] = 1
  40. df_data.loc[df_data['pack_crnt'] < -15, 'crnt_flg'] = -1
  41. df_data['sts_flg'] = 2
  42. df_sts_chrg = pd.DataFrame(columns=list(df_data.columns))
  43. df_crnt_flg = df_data['crnt_flg']
  44. num_dead_thresh = 15#判断连续多少个数据为阈值
  45. indexs_to_delelte = clean_dead_value(df_crnt_flg, num_dead_thresh)#获得连续数据所在的行
  46. rest_num = len(indexs_to_delelte)
  47. if rest_num > 0:#仅有一个连续数据时
  48. for splice_item in range(0, rest_num):#rest_num
  49. df_data_temp = df_data.iloc[indexs_to_delelte[splice_item][0]:indexs_to_delelte[splice_item][-1]]#获得电流连续数据
  50. df_data_temp.reset_index(drop = True, inplace = True)
  51. df_soc_temp = df_data_temp['pack_soc']
  52. delta_soc = round((df_soc_temp.iloc[-1] - df_soc_temp.iloc[0]), 3)
  53. df_time_temp = pd.to_datetime(df_data_temp['time'])
  54. delta_time = (df_time_temp.iloc[-1] - df_time_temp.iloc[0])/pd.Timedelta(1, 'hours')
  55. if all(df_data_temp['crnt_flg'] == 0):#静置判断
  56. if delta_time > 0.17:
  57. df_data_temp['sts_flg'] = 0
  58. df_sts_chrg = df_sts_chrg.append(df_data_temp)
  59. df_sts_chrg.reset_index(drop = True, inplace = True)
  60. elif all(df_data_temp['crnt_flg'] == -1) and (delta_soc > 30) and (delta_soc < 100):#充电判断
  61. df_data_temp['sts_flg'] = 1
  62. df_sts_chrg = df_sts_chrg.append(df_data_temp)
  63. df_sts_chrg.reset_index(drop = True, inplace = True)
  64. elif all(df_data_temp['crnt_flg'] == 1) and (delta_soc > 30) and (delta_soc < 100):#充电判断
  65. df_data_temp['sts_flg'] = 1
  66. df_sts_chrg = df_sts_chrg.append(df_data_temp)
  67. df_sts_chrg.reset_index(drop = True, inplace = True)
  68. df_dschrg = pd.concat([df_data, df_sts_chrg, df_sts_chrg]).drop_duplicates(subset = ['time', 'pack_soc'], keep = False)
  69. data_temp = pd.concat([df_dschrg, df_sts_chrg])
  70. data_temp.sort_values(by = 'time', inplace = True)
  71. data_temp.reset_index(drop = True, inplace = True)
  72. start_time = time.time()
  73. chrgrststs_clumns = ['sn', 'time_st', 'time_end', 'delta_time','soc_st', 'soc_sp',
  74. 'delta_soc', 'odo_st', 'odo_sp', 'delta_odo','chrgah', 'equchrgah','gps_lon','gps_lat','meancrnt', 'sts_flg',
  75. 'full_chrg_flg', 'crnt_aray', 'soc_aray', 'celtemmax', 'celtemmin', 'celvltmax', 'timelst', 'chrgahlst', "packvlt"]
  76. df_sts_chrg_rlt = pd.DataFrame(columns = chrgrststs_clumns)#充电与静置
  77. if len(data_temp) > 30:
  78. #---------------------------------充电过程判断--------------------------------------
  79. df_chrg_temp = data_temp.loc[(data_temp['sts_flg'] == 1)]
  80. if not df_chrg_temp.empty:
  81. df_chrg_temp.reset_index(inplace = True, drop = True)
  82. chrgr_time = pd.to_datetime(df_chrg_temp['time'])
  83. delta_time = (np.diff(chrgr_time)/pd.Timedelta(1, 'min'))#计算时间差的分钟数
  84. pos = np.where(delta_time > 10)#充电数据分段,大于10min时,认为是两个充电过程
  85. splice_num = []
  86. if len(pos[0]) >= 1:
  87. pos_ful_tem = np.insert(pos, 0, 0)
  88. pos_len = len(pos_ful_tem)
  89. data_len = len(chrgr_time)
  90. pos_ful = np.insert(pos_ful_tem, pos_len, data_len-1)
  91. for item in range(0,len(pos_ful)-1):
  92. splice_num.extend(item*np.ones(pos_ful[item +1]-pos_ful[item]))
  93. splice_num = np.insert(splice_num, 0, 0)
  94. else:
  95. splice_num = np.zeros(len(chrgr_time))
  96. pos_ful = np.array([0])
  97. if len(splice_num) > 0:
  98. df_chrg_temp['chrgr_rest'] = splice_num
  99. chrgr_splice_num = np.unique(df_chrg_temp['chrgr_rest'])#判断有几段充电数据
  100. if len(chrgr_splice_num) > 0:
  101. for item_chrgr in chrgr_splice_num:
  102. df_chrgr_splice_temp_chs = df_chrg_temp.loc[df_chrg_temp['chrgr_rest'] == item_chrgr]
  103. df_chrgr_splice_temp_chs.reset_index(inplace = True, drop = True)
  104. df_chrgr_splice_temp = df_chrgr_splice_temp_chs[(df_chrgr_splice_temp_chs[self.cellvolt_list] > 2).all(axis = 1) &
  105. (df_chrgr_splice_temp_chs[self.cellvolt_list] < 5).all(axis = 1)]
  106. df_chrgr_splice_temp.reset_index(drop = True, inplace = True)
  107. if len(df_chrgr_splice_temp) > 10:
  108. df_tem = df_chrgr_splice_temp[self.celltemp_name]
  109. celltemmax = df_tem.max(axis = 1)#每一时刻内阻最大温度
  110. celltemmin = df_tem.min(axis = 1)#每一时刻内阻最大温度
  111. df_celvlt = df_chrgr_splice_temp[self.cellvolt_list]
  112. cellvltmax = df_celvlt.max(axis = 1)
  113. # df_clslst = df_celvlt.tail(1)
  114. # valueset = np.sort(df_clslst.iloc[0].unique())
  115. # valuesort = [i for i in valueset if (i > 2) and (i < 5)]
  116. # if len(valuesort) >= 3:
  117. # maxclt = valuesort[-1]
  118. # secmaxcle = valuesort[-2]
  119. # thrdmaxcle = valuesort[-3]
  120. # else:
  121. # maxclt = valuesort[-1]
  122. # secmaxcle = valuesort[-1]
  123. # thrdmaxcle = valuesort[-1]
  124. # maxcell = df_clslst.columns[df_clslst.loc[len(df_celvlt) - 1].isin([maxclt])]
  125. # seccell = df_clslst.columns[df_clslst.loc[len(df_celvlt) - 1].isin([secmaxcle])]
  126. # thrdcell = df_clslst.columns[df_clslst.loc[len(df_celvlt) - 1].isin([thrdmaxcle])]
  127. # df_cellvlt_max = df_celvlt[maxcell[0]]
  128. # df_cellvlt_secmax = df_celvlt[seccell[0]]
  129. # df_cellvlt_thrdmax = df_celvlt[thrdcell[0]]
  130. df_cellvlt = pd.concat([cellvltmax, celltemmax, celltemmin], axis = 1)
  131. df_cellvlt.columns = ['maxvlt', 'maxtem', 'mintem']
  132. df_data_tem = df_chrgr_splice_temp[['time','sn', 'pack_crnt','pack_volt','pack_soc',
  133. 'mileage','longitude', 'latitude']]
  134. df_chrgr_splice_data = pd.concat([df_data_tem, df_tem, df_cellvlt], axis = 1)
  135. df_time_temp = pd.to_datetime(df_chrgr_splice_data['time'])
  136. df_soc_temp = df_chrgr_splice_data['pack_soc']
  137. df_crnt = df_chrgr_splice_data['pack_crnt']
  138. df_odo = df_chrgr_splice_data['mileage']
  139. df_maxvlt = df_chrgr_splice_data['maxvlt']
  140. delta_soc = round((df_soc_temp.iloc[-1] - df_soc_temp.iloc[0]), 3)
  141. delta_odo = round((df_odo.iloc[-1] - df_odo.iloc[0]), 3)
  142. np_equah = round(delta_soc*self.capty/100, 3)
  143. delta_time = round((df_time_temp.iloc[-1] - df_time_temp.iloc[0])/pd.Timedelta(1, 'hours'), 3)
  144. if (delta_soc >= 3) and (df_soc_temp.iloc[0] < 45) and (df_soc_temp.iloc[-1] > 97) and (df_maxvlt.iloc[-1] > 3.5):
  145. socnum = df_soc_temp.value_counts() #统计电芯数量这一列每个元素出现的个数
  146. socmax = socnum.idxmax()
  147. df_datacal = df_chrgr_splice_data.loc[df_chrgr_splice_data['pack_soc'] == socmax]
  148. df_datacal.reset_index(drop = True, inplace = True)
  149. np_dff_timetp = np.diff(pd.to_datetime(df_datacal['time']))/pd.Timedelta(1, 'hours')
  150. np_dff_time_newtp = np.append(np_dff_timetp, 0)
  151. np_chrg_ahtp = np.multiply(np.array(np_dff_time_newtp),np.array(df_datacal['pack_crnt']))
  152. chrg_ahtp = np_chrg_ahtp.sum()
  153. chrgsoc = 100*chrg_ahtp/self.capty
  154. np_dffsoc = abs(np.diff(df_soc_temp))
  155. if all(np_dffsoc < 3) and (abs(chrgsoc)<2.5):
  156. rate_chrg = round(delta_soc/(100*delta_time), 2)
  157. np_dff_time = np.diff(df_time_temp)/pd.Timedelta(1, 'hours')
  158. np_dff_time_new = np.append(np_dff_time, 0)
  159. np_chrg_ah = np.multiply(np.array(np_dff_time_new),np.array(df_crnt))
  160. chrg_ah = np_chrg_ah.sum()
  161. chrg_ahlst = []
  162. for ah_k in range(1, len(np_chrg_ah)+1):
  163. chrg_ahlst.append(abs(round(np.sum(np_chrg_ah[:ah_k]), 3)))
  164. if rate_chrg > 0.001:
  165. stat_flg = 1#快充
  166. else:
  167. stat_flg = 2#慢充
  168. if df_soc_temp.iloc[-1] >= 98:
  169. full_chg_flg = 1#满充
  170. else:
  171. full_chg_flg = 0
  172. if stat_flg == 1:
  173. soc_st = int(df_soc_temp.iloc[0])
  174. soc_sp = int(df_soc_temp.iloc[-1])
  175. poslst = range(0, len(df_soc_temp), 1)
  176. df_chse_data = df_chrgr_splice_data.iloc[poslst]
  177. chrgahlst=chrg_ahlst[::1]
  178. crnt_ary=list(df_chse_data['pack_crnt'])
  179. soc_ary=list(df_chse_data['pack_soc'])
  180. cell_tem_max=list(df_chse_data['maxtem'])
  181. cell_tem_min=list(df_chse_data['mintem'])
  182. maxvlt=list(df_chse_data['maxvlt'])
  183. # secvlt=list(df_chse_data['secmaxvlt'])
  184. # thrdvlt=list(df_chse_data['thrdmaxvlt'])
  185. timearary=list(df_chse_data['time'].dt.strftime("%Y-%m-%d %H:%M:%S"))
  186. crntlst = [round(i,4) for i in crnt_ary]
  187. pack_vlt = list(df_chse_data['pack_volt'])
  188. df_sts_chrg_temp = pd.DataFrame({"sn":[self.sn],
  189. "time_st":[df_time_temp.iloc[0].strftime('%Y-%m-%d %H:%M:%S')], "time_end":[df_time_temp.iloc[-1]], "delta_time":[delta_time],
  190. "soc_st":[soc_st], "soc_sp":[soc_sp], "delta_soc":[delta_soc],
  191. "odo_st":[df_odo.iloc[0]], "odo_sp":[df_odo.iloc[-1]], "delta_odo":[delta_odo],
  192. "chrgah":[chrg_ah], "equchrgah":[np_equah],
  193. "gps_lon":[df_chrgr_splice_data.loc[0, 'longitude']], "gps_lat":[df_chrgr_splice_data.loc[0, 'latitude']],
  194. "meancrnt":[rate_chrg], "sts_flg":[stat_flg], "full_chrg_flg":[full_chg_flg],
  195. "crnt_aray":[str(crntlst)], "soc_aray":[str(soc_ary)],"celtemmax":[str(cell_tem_max)], "celtemmin":[str(cell_tem_min)],
  196. "celvltmax":[str(maxvlt)], "timelst":[str(timearary)], "chrgahlst":[str(chrgahlst)], "packvlt":[str(pack_vlt)]})
  197. df_sts_chrg_rlt = df_sts_chrg_rlt.append(df_sts_chrg_temp)
  198. df_sts_chrg_rlt.reset_index(drop = True, inplace = True)
  199. df_sts_chrg_rt = df_sts_chrg_rlt.copy()
  200. df_sts_chrg_rt.sort_values(by = ['time_st'], axis = 0, ascending=True, inplace=True)#对故障信息按照时间进行排序
  201. end_time = time.time()
  202. if not df_sts_chrg_rt.empty:
  203. return df_sts_chrg_rt
  204. else:
  205. return pd.DataFrame()