statistics2..py 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. from sklearn.linear_model import LinearRegression
  5. plt.rcParams['font.sans-serif']=['SimHei']
  6. plt.rcParams['axes.unicode_minus']=False
  7. output_path = '/home/limingze/zlwl-algos/USER/limingze/Inconsistency/Data/'
  8. sta_file = '/home/limingze/zlwl-algos/USER/limingze/Inconsistency/Data/update.csv'
  9. t_device_path = '/home/limingze/zlwl-algos/USER/limingze/Inconsistency/t_device.csv'
  10. sta_data = pd.read_csv(sta_file)
  11. t_device = pd.read_csv(t_device_path)
  12. soh_cols = ['cell_soh'+str(x) for x in range(1, 21)]
  13. cell_chr_list = [f'cell_delta_energy_chr{i}' for i in range(1, 21)]
  14. cell_dis_list = [f'cell_delta_energy_dis{i}' for i in range(1, 21)]
  15. sta_data['cell_delta_energy_chr'] = sta_data[cell_chr_list].sum(axis=1)
  16. sta_data['cell_delta_energy_dis'] = sta_data[cell_dis_list].sum(axis=1)
  17. sta_data['pack_delta_energy_dis'] = -sta_data['pack_delta_energy_dis']
  18. sta_data['cell_pack_chr'] = sta_data['pack_delta_energy_chr']/sta_data['cell_delta_energy_chr']
  19. sta_data['cell_pack_dis'] = sta_data['pack_delta_energy_dis']/sta_data['cell_delta_energy_dis']
  20. sta_data['pack_code'] = pd.Series([])
  21. sta_data['cell_soh_variance'] = sta_data[soh_cols].var(axis=1)
  22. for i in range(len(sta_data)):
  23. sn = sta_data['sn'][i]
  24. sta_data['pack_code'][i] = t_device.loc[t_device['sn'] == sn, 'pack_model'].values[0]
  25. sta_data = sta_data.dropna(subset=['cell_delta_energy_chr1'])
  26. sn_counts = sta_data['pack_code'].value_counts()
  27. sn_list = sn_counts.index.tolist()
  28. GM02010_df = sta_data[sta_data['pack_code'] == sn_list[0]]
  29. KY01710_df = sta_data[sta_data['pack_code'] == sn_list[1]]
  30. GM02011_df = sta_data[sta_data['pack_code'] == sn_list[2]]
  31. KY01410_df = sta_data[sta_data['pack_code'] == sn_list[3]]
  32. soh_ranges = [(60,80),(80, 85), (85, 90), (90,95), (95,96)] # 可根据需求自定义范围区间
  33. soh_diff_range = [(0, 3), (3, 6), (6,9)]
  34. soh_var_range = [(0,0.5),(0.5,1),(1,2),(2,3),(3,4),(4,5),(5,10)]
  35. soc_begin_chr_range = [(0,8),(8,16),(16,24),(24,32),(32,40)]
  36. soc_begin_chr_diff_range = [(1, 5), (5,10),(10, 15), (15,20), (20,25)]
  37. dod_range = [(0, 20), (20,40),(40, 60), (60,80), (80,100)]
  38. soc_begin_dis_range = [(75,85),(85,90),(90,95),(95,96),(96,97),(97,98),(98,99),(99,100)]
  39. soc_begin_dis_diff_range = [(0,0.5),(0.5,1),(1, 1.5), (1.5,2),(2, 2.5),(2.5,3),(3, 3.5),(3.5,4),(4,20),(5,10),(10,15),(15,20),(20,25)]
  40. r_range = [(0,0.001),(0.001,0.002),(0.002,0.003),(0.003,0.01)]
  41. # degree = 1 # 拟合的多项式阶数
  42. # coefficients = np.polyfit(GM02010_df['cell_delta_energy_chr'], GM02010_df['pack_delta_energy_chr'], degree)
  43. # poly_func = np.poly1d(coefficients)
  44. # x_fit = np.linspace(GM02010_df['cell_delta_energy_chr'].min(), GM02010_df['cell_delta_energy_chr'].max(), 10000)
  45. # y_fit = poly_func(x_fit)
  46. slope_all = KY01710_df['cell_pack_dis'].mean()
  47. KY01710_df.to_csv(output_path + 'KY01710.csv', encoding="utf_8_sig", index=False)
  48. for start, end in r_range:
  49. # subset = pk_df[(pk_df['cell_soh_mean'] > start) & (pk_df['cell_soh_mean'] <= end)]
  50. # subset = mgmcln_df[(mgmcln_df['cell_soh_mean'] > start) & (mgmcln_df['cell_soh_mean'] <= end)]
  51. subset = KY01710_df[(KY01710_df['cell_res_mean'] > start) & (KY01710_df['cell_res_mean'] <= end)]
  52. slope = subset['cell_pack_dis'].mean()
  53. x = np.linspace(100, 4000, 10000)
  54. y = x
  55. y_fit = slope * x
  56. plt.plot(x, y, label='理想')
  57. plt.plot(x, y_fit, label='实际')
  58. plt.scatter(subset['cell_delta_energy_dis'], subset['pack_delta_energy_dis'], label=f'Range {start}-{end}', alpha=0.2, s=5)
  59. plt.xlabel('实际放出电量')
  60. plt.ylabel('理论放出电量')
  61. plt.title('不同内阻不一致性对电池性能的影响')
  62. plt.legend()
  63. plt.show()
  64. print(1/slope)
  65. print(1/slope_all)