全生命周期劣化趋势.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import pandas as pd
  2. from tqdm import tqdm
  3. from pathlib import Path
  4. from scipy.interpolate import interp1d
  5. import warnings
  6. warnings.filterwarnings("ignore")
  7. df_soc_ocv= pd.read_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/OCV_SOC.csv')
  8. charge_ocv_v = df_soc_ocv['OCV']
  9. charge_ocv_soc = df_soc_ocv['SOC']
  10. charge_ocv_v_list = [float(n) for n in charge_ocv_v]
  11. charge_ocv_soc_list = [float(n) for n in charge_ocv_soc]
  12. interp_func = interp1d(charge_ocv_v_list, charge_ocv_soc_list)
  13. num_cell= 240
  14. num_pack = 20
  15. cell_capacity = 360
  16. filtered_data_all = pd.DataFrame()
  17. cellsoc_name = ['ALGO_SOC'+str(x+1) for x in range(num_cell)]
  18. cellvolt_name = ['V'+str(x+1) for x in range(num_cell)]
  19. p = Path("/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07")
  20. FileList = list(p.glob("*.csv"))
  21. for File in tqdm(FileList):
  22. # df_in_all = pd.read_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07/Bank08_20220806.csv', encoding='gbk')
  23. df_in_all = pd.read_csv(File, encoding='gbk')
  24. df_in_all = df_in_all[df_in_all['V1'] != '-']
  25. df_in_all[cellvolt_name] = df_in_all[cellvolt_name].astype(float)
  26. df_in_all[cellsoc_name] = None
  27. # df_in_all = pd.read_csv('/data/common/yc/S002B03B06.csv', encoding='gbk')
  28. df_in_all['时间'] = pd.to_datetime(df_in_all['时间'])
  29. unique_dates = df_in_all['时间'].dt.date.unique()
  30. df_in_all['sn'] = 'S002B07B0' + str(File)[66]
  31. if '单体电压' in df_in_all.columns:
  32. df_in_all[cellvolt_name] = None
  33. df_in_all[cellvolt_name] = df_in_all['单体电压'].str.split(',', expand=True).astype(float)
  34. for n in range(num_cell):
  35. mask1 = (df_in_all['V'+str(n+1)].values >= charge_ocv_v_list[0]) & (df_in_all['V'+str(n+1)].values <= charge_ocv_v_list[-1])
  36. mask2 = df_in_all['V'+str(n+1)].values < charge_ocv_v_list[0]
  37. mask3 = df_in_all['V'+str(n+1)].values > charge_ocv_v_list[-1]
  38. df_in_all.loc[mask1, 'ALGO_SOC'+str(n+1)] = interp_func(df_in_all['V'+str(n+1)].values[mask1])
  39. df_in_all.loc[mask2, 'ALGO_SOC'+str(n+1)] = charge_ocv_soc_list[0]
  40. df_in_all.loc[mask3, 'ALGO_SOC'+str(n+1)] = charge_ocv_soc_list[-1]
  41. for date in tqdm(unique_dates):
  42. df_in = df_in_all[df_in_all['时间'].dt.date == date]
  43. df_in = df_in.sort_values(by='时间')
  44. df_in.reset_index(inplace=True)
  45. df_in['充电状态'] = pd.np.where(df_in['簇电流'] > 15, 1, pd.np.where(df_in['簇电流'] < -15, 2, 0)) # 0:静置;1:放电;2:充电
  46. df_in['状态分组'] = (df_in['充电状态'] != df_in['充电状态'].shift()).cumsum()
  47. df_in['持续时间'] = df_in.groupby('状态分组')['时间'].transform(lambda x: x - x.min())
  48. # df_in.to_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07_result/劣化趋势/1.csv', encoding='utf-8-sig')
  49. # 筛选出充电状态持续为1的最后一条数据
  50. filtered_data = df_in[(df_in['充电状态'] == 1)].sort_values(by='时间').groupby('状态分组').last()
  51. # filtered_data = filtered_data[((filtered_data['时间'].dt.hour >= 16) & (filtered_data['时间'].dt.hour <= 24)) | ((filtered_data['时间'].dt.hour >= 0) & (filtered_data['时间'].dt.hour <= 2))]
  52. filtered_data = filtered_data.reset_index()
  53. filtered_data['放电量'] = None
  54. filtered_data['放电起始时间'] = None
  55. filtered_data['放电结束时间'] = None
  56. filtered_data['放电起始SOC'] = None
  57. filtered_data['放电结束SOC'] = None
  58. filtered_data['放电时长'] = None
  59. filtered_data['SOC极差'] = None
  60. filtered_data['SOC方差'] = None
  61. filtered_data['放电起始堆电压'] = None
  62. filtered_data['放电起始簇电压'] = None
  63. filtered_data['放电起始簇最低电压'] = None
  64. for f in range(len(filtered_data)):
  65. fragment_data = df_in[df_in['状态分组']==filtered_data['状态分组'].iloc[f]]
  66. fragment_data['tm_delta'] = fragment_data['时间'].diff().dt.total_seconds()
  67. fragment_data['tm_delta'].iloc[0] = 60
  68. fragment_data['charge'] = (fragment_data['簇电流'] * fragment_data['tm_delta']) / 3600
  69. fragment_data['ah'] = fragment_data['charge'].cumsum()
  70. filtered_data['放电量'].iloc[f] = fragment_data['ah'].iloc[-1]
  71. filtered_data['放电起始时间'].iloc[f] = fragment_data['时间'].iloc[0]
  72. filtered_data['放电结束时间'].iloc[f] = fragment_data['时间'].iloc[-1]
  73. filtered_data['放电起始SOC'].iloc[f] = fragment_data['簇SOC'].iloc[0]
  74. filtered_data['放电结束SOC'].iloc[f] = fragment_data['簇SOC'].iloc[-1]
  75. filtered_data['放电时长'].iloc[f] = fragment_data['时间'].iloc[-1] - fragment_data['时间'].iloc[0]
  76. filtered_data['SOC极差'].iloc[f] = fragment_data[cellsoc_name].iloc[-1].max(axis=0) - fragment_data[cellsoc_name].iloc[-1].min(axis=0)
  77. filtered_data['SOC方差'].iloc[f] = fragment_data[cellsoc_name].iloc[-1].var(axis=0)
  78. filtered_data['放电起始堆电压'] = fragment_data['堆电压'].iloc[0]
  79. filtered_data['放电起始簇电压'] = fragment_data['簇总电压(HV1-Vbatt)'].iloc[0]
  80. filtered_data['放电起始簇最低电压'] = fragment_data['簇最低电压'].iloc[0]
  81. drop_num = 0
  82. for g in range(1,len(filtered_data)):
  83. if ((filtered_data['状态分组'].loc[g] - filtered_data['状态分组'].loc[g-(drop_num+1)] <= 2) & (0 in df_in[(df_in['状态分组'] >= filtered_data['状态分组'].loc[g-(drop_num+1)]) & (df_in['状态分组'] <= filtered_data['状态分组'].loc[g])]['充电状态'].tolist())):
  84. filtered_data['放电量'].loc[g-(drop_num+1)] = filtered_data['放电量'].loc[g-(drop_num+1)] + filtered_data['放电量'].loc[g]
  85. filtered_data['放电结束时间'].loc[g-(drop_num+1)] = filtered_data['放电结束时间'].loc[g]
  86. filtered_data['放电结束SOC'].loc[g-(drop_num+1)] = filtered_data['放电结束SOC'].loc[g]
  87. filtered_data['放电时长'].loc[g-(drop_num+1)] = filtered_data['放电时长'].loc[g-(drop_num+1)] + filtered_data['放电时长'].loc[g]
  88. filtered_data['簇SOC'].loc[g-(drop_num+1)] = filtered_data['簇SOC'].loc[g]
  89. filtered_data['状态分组'].loc[g-(drop_num+1)] = filtered_data['状态分组'].loc[g]
  90. filtered_data['堆电压'].loc[g-(drop_num+1)] = filtered_data['堆电压'].loc[g]
  91. filtered_data['簇总电压(HV1-Vbatt)'].loc[g-(drop_num+1)] = filtered_data['簇总电压(HV1-Vbatt)'].loc[g]
  92. filtered_data['簇预充电压(HV2-Vpcs)'].loc[g-(drop_num+1)] = filtered_data['簇预充电压(HV2-Vpcs)'].loc[g]
  93. filtered_data['堆单体Vmin'].loc[g-(drop_num+1)] = filtered_data['堆单体Vmin'].loc[g]
  94. filtered_data['簇最低电压'].loc[g-(drop_num+1)] = filtered_data['簇最低电压'].loc[g]
  95. filtered_data['簇平均电压'].loc[g-(drop_num+1)] = filtered_data['簇平均电压'].loc[g]
  96. filtered_data.drop(g, inplace=True)
  97. drop_num += 1
  98. else:
  99. drop_num = 0
  100. filtered_data.reset_index()
  101. filtered_data_all = pd.concat([filtered_data_all, filtered_data], axis=0)
  102. filtered_data_all.to_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07_result/劣化趋势/result.csv', encoding='utf-8-sig')
  103. filtered_data_all.to_csv('/home/limingze/zlwl-algos/USER/limingze/jvnheng/life_all_b07_result/劣化趋势/result.csv', encoding='utf-8-sig')