In [13]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
battery_dataset = pd.read_csv('./data0505.csv')
# preprocessing
# Assume degradation only during charging (Power > 0, SOC > 0, SOH > 0)
battery_dataset = battery_dataset[battery_dataset["Power"] > 0]
battery_dataset = battery_dataset[battery_dataset["SOC"] > 0]
battery_dataset = battery_dataset[battery_dataset["SOH"] > 0]
battery_dataset["SEI_delta"] = 1E-7*battery_dataset["SEI_delta"]
battery_dataset.tail()
print(battery_dataset["SEI_delta"].max())
print(battery_dataset["SEI_delta"].min())
##### Export the cleaned data
# battery_dataset.to_csv("./data0505_charging.csv")
In [ ]:
# Effect of Starting SOC on SEI Delta
import matplotlib.pyplot as plt
import seaborn as sns
# Possible Power
power_values = sorted(list(set(battery_dataset["Power"])))
sns.set_style('whitegrid')
reds_colors = sns.color_palette('Reds', 12)
fig = plt.figure(figsize=(10,10))
for color_index, state_of_charge in enumerate(range(20, 80, 5)):
soc_ds = battery_dataset[battery_dataset["SOC"] == state_of_charge]
plt.scatter(soc_ds["Power"], 1e6*soc_ds['SEI_delta'], color = reds_colors[color_index], label = "%s percent"%state_of_charge)
plt.tick_params(axis='both', which='major', labelsize=20)
plt.xlabel("Normalized Power", fontsize=24)
plt.ylabel("SEI Growth / $x 10^{-6}$ nm per 2 sec", fontsize=24)
plt.ylim([4,6])
plt.legend(bbox_to_anchor=(1.05, 1), fontsize=24, loc=2, borderaxespad=0.)
plt.show()
In [ ]:
# Effect of Starting Initial SEI Thickness on SEI Delta
sns.set_style('whitegrid')
reds_colors = sns.color_palette('Reds', 13)
plot_power_values = [power_values[0], power_values[3], power_values[6], power_values[-1]]
# Generates scatterplot for four power values showing degradation as a function of starting state of health
# and colors correlate with starting state of charge
for pwr_index, power_value in enumerate(plot_power_values):
fig = plt.figure(figsize=(10,10))
for color_index, state_of_charge in enumerate(range(20, 81, 5)):
soc_ds = battery_dataset[battery_dataset["SOC"] == state_of_charge]
pwr_ds = soc_ds[soc_ds["Power"] == power_value]
plt.scatter(pwr_ds["SOH"], 1e6*pwr_ds['SEI_delta'], color = reds_colors[color_index], label = "%s percent"%state_of_charge)
plt.title("%f Power"%power_value, fontsize=24)
plt.tick_params(axis='both', which='major', labelsize=20)
plt.xlabel("Initial SEI Thickness / nm", fontsize=24)
plt.ylabel("SEI Delta / $x 10^{-6}$ nm per 2 sec", fontsize=24)
plt.legend(bbox_to_anchor=(1.05, 1), fontsize=24, loc=2, borderaxespad=0.)
plt.show()
In [23]:
# Heatmap Generation
# Generates the list of all unique SOC values and lists them
SOC_values = sorted(list(set(battery_dataset["SOC"])))
# Iterates through all listed starting state of charge values
for index, current_SOC_value in enumerate(SOC_values):
# Formats dataset into the expected format for SNS heatmap
heatmap_generation = battery_dataset[battery_dataset['SOC'] == current_SOC_value]
heatmap_generation_scaled = heatmap_generation.copy()
heatmap_generation_scaled['SEI_delta'] = 1e6*heatmap_generation["SEI_delta"]
pwr_ds_pivot = heatmap_generation_scaled.pivot("Power", "SOH", "SEI_delta")
fig = plt.figure(figsize=(20,20))
ax = sns.heatmap(pwr_ds_pivot, vmin=4.2, vmax = 6.0, cmap="Blues")
ax.set_title("SEI Growth Rate: $x10^{-6}$ nm / 2 sec \n Starting State of Charge: %d percent"%current_SOC_value, fontsize=24)
ax.tick_params(axis='both', which='major', labelsize=20)
ax.set_xlabel("Starting SEI Thickness / nm", fontsize=24)
ax.set_ylabel("Normalized Charging Power", fontsize=24)
ax.set_ylim([0,10])
cax = plt.gcf().axes[-1]
cax.tick_params(labelsize=20)
# Export data
plt.savefig(os.path.join("figures", "output_%03d.png"%index), dpi=300)
plt.close(fig)
In [ ]: