diff --git a/example_retrieve_battery_data.py b/example_retrieve_battery_data.py new file mode 100644 index 0000000000000000000000000000000000000000..27a4d2f07a244ccdc07cb74ca536071279bade37 --- /dev/null +++ b/example_retrieve_battery_data.py @@ -0,0 +1,32 @@ +import os +from glob import glob + +from extraction.retrieve_battery_data import extract_charge_discharge_impedance + + +def example_how_to_use_this_module(): + all_folders_containing_batteries_mat_files = [ + "./data/BatteryAgingARC_25_26_27_28_P1/", + "./data/BatteryAgingARC_25-44/", + "./data/BatteryAgingARC_45_46_47_48/", + "./data/BatteryAgingARC_49_50_51_52/", + "./data/BatteryAgingARC_53_54_55_56/", + "./data/BatteryAgingARC-FY08Q4/", + ] + + filepaths = [y for x in os.walk("./data/") for y in glob(os.path.join(x[0], '*.mat'))] + filepaths = sorted(filepaths) + + # TODO warning for for the [:1] + for filepath in filepaths[:]: + print(filepath) + charge_items, discharge_items, impedance_items = extract_charge_discharge_impedance(filepath) + print(len(charge_items[0]["voltage_measured"]) == len(charge_items[1]["voltage_measured"])) + print(len(charge_items[0]["voltage_measured"]) == len(discharge_items[0]["voltage_measured"])) + print(len(charge_items[0]["voltage_measured"])) + print(len(charge_items[1]["voltage_measured"])) + print(len(discharge_items[0]["voltage_measured"])) + + +if __name__ == "__main__": + example_how_to_use_this_module() diff --git a/explore_data.py b/explore_data.py index f89ecb5c9c057976db854da4e041032969ef74ed..2bc99c912199ca15df4830a0a2cf725cb0345405 100644 --- a/explore_data.py +++ b/explore_data.py @@ -116,7 +116,7 @@ def impedance_iteration(impedance_items, filename): sense_current = item[3][0][0][0][0] # Current in sense branch (Amps)| Complexes battery_current = item[3][0][0][1][0] # urrent in battery branch (Amps)| Complexes current_ratio = item[3][0][0][2][0] # Ratio of the above currents| Complexes - battery_impedance = item[3][0][0][3] # attery impedance (Ohms) computed from raw data| Complexes but multiple array of 1 complexe + battery_impedance = item[3][0][0][3] # Battery impedance (Ohms) computed from raw data| Complexes but multiple array of 1 complexe rectified_impedance = item[3][0][0][4] # alibrated and smoothed battery impedance (Ohms)| Complexes but multiple array of 1 complexe re = item[3][0][0][5][0][0] # Estimated electrolyte resistance (Ohms)| float_ rct = item[3][0][0][6][0][0] # Estimated charge transfer resistance (Ohms)| float_ diff --git a/extraction/__init__.py b/extraction/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/extraction/extract_item_into_dict.py b/extraction/extract_item_into_dict.py new file mode 100644 index 0000000000000000000000000000000000000000..1e3ad38a88a56d750daa00f440f2fb3e7c64dd74 --- /dev/null +++ b/extraction/extract_item_into_dict.py @@ -0,0 +1,79 @@ +"""This file tries to split one matlab item into a dictionnary""" + +def _convert_matlab_datetime_vector_to_utc(date_vector): + """Convert matlab datetime format into a UTC format""" + # f'{val:02}' TODO + string_time = str(int(date_vector[0])) + "-" + \ + f'{int(date_vector[1]):02}' + "-" + \ + f'{int(date_vector[2]):02}' + "T" + \ + f'{int(date_vector[3]):02}' + ":" + \ + f'{int(date_vector[4]):02}' + ":" + \ + f'{float(date_vector[5]):06.3f}' + + return string_time + + +def _format_temperature(temp): + """There are 3 main temparatures, if they are close we want to put them in the same category""" + # /!\Disclaimer/!\ This is completly related to the NASA battery dataset. + if temp < 6: + return 4 + elif temp < 26: + return 24 + else: + return 43 + + +def extract_charge_from_item(item): + dict_item = {} + + dict_item["test_type"] = item[0][0] # charge impedence discharge + dict_item["ambiant_temp"] = _format_temperature(item[1][0][0]) # temperature: 4 ~24 ~43 + dict_item["datetime"] = _convert_matlab_datetime_vector_to_utc(item[2][0]) + + dict_item["voltage_measured"] = item[3][0][0][0][0] # Battery terminal voltage (Volts) floats + dict_item["current_measured"] = item[3][0][0][1][0] # Battery output current (Amps) floats + dict_item["temperature_measured"] = item[3][0][0][2][0] # Battery temperature (degree C) floats + dict_item["current_charge"] = item[3][0][0][3][0] # Current measured at charger (Amps) floats + dict_item["voltage_charge"] = item[3][0][0][4][0] # Voltage measured at charger (Volts) floats + # MEH + dict_item["time"] = item[3][0][0][5] # Time vector for the cycle (secs) floats + + return dict_item + + +def extract_discharge_from_item(item): + dict_item = {} + + dict_item["test_type"] = item[0][0] # charge impedence discharge + dict_item["ambiant_temp"] = _format_temperature(item[1][0][0]) # temperature: 4 ~24 ~43 + dict_item["datetime"] = _convert_matlab_datetime_vector_to_utc(item[2][0]) + + dict_item["voltage_measured"] = item[3][0][0][0][0] # Battery terminal voltage (Volts) floats + dict_item["current_measured"] = item[3][0][0][1][0] # Battery output current (Amps) flaots + dict_item["temperature_measured"] = item[3][0][0][2][0] # Battery temperature (degree C) floats + dict_item["current_charge"] = item[3][0][0][3][0] # Current measured at charger (Amps) floats + dict_item["voltage_charge"] = item[3][0][0][4][0] # Voltage measured at charger (Volts) floats + # MEH + dict_item["time"] = item[3][0][0][5][0] # Time vector for the cycle (secs) floats + dict_item["capacity"] = item[3][0][0][6][0] # Battery capacity (Ahr) for discharge till 2.7V float_ + + return dict_item + + +def extract_impedance_from_item(item): + dict_item = {} + + dict_item["test_type"] = item[0][0] # charge impedence discharge + dict_item["ambiant_temp"] = _format_temperature(item[1][0][0]) # temperature: 4 ~24 ~43 + dict_item["datetime"] = _convert_matlab_datetime_vector_to_utc(item[2][0]) + + dict_item["sense_current"] = item[3][0][0][0][0] # Current in sense branch (Amps)| Complexes + dict_item["battery_current"] = item[3][0][0][1][0] # urrent in battery branch (Amps)| Complexes + dict_item["current_ratio"] = item[3][0][0][2][0] # Ratio of the above currents| Complexes + dict_item["battery_impedance"] = item[3][0][0][3] # Battery impedance (Ohms) computed from raw data| Complexes but multiple array of 1 complexe + dict_item["rectified_impedance"] = item[3][0][0][4] # alibrated and smoothed battery impedance (Ohms)| Complexes but multiple array of 1 complexe + dict_item["re"] = item[3][0][0][5][0][0] # Estimated electrolyte resistance (Ohms)| float_ + dict_item["rct"] = item[3][0][0][6][0][0] # Estimated charge transfer resistance (Ohms)| float_ + + return dict_item diff --git a/extraction/retrieve_battery_data.py b/extraction/retrieve_battery_data.py new file mode 100644 index 0000000000000000000000000000000000000000..329c0df9e039455535b6e4872109d657933ad622 --- /dev/null +++ b/extraction/retrieve_battery_data.py @@ -0,0 +1,42 @@ +import scipy.io +import os +import numpy as np + +from extraction.extract_item_into_dict import extract_impedance_from_item +from extraction.extract_item_into_dict import extract_charge_from_item +from extraction.extract_item_into_dict import extract_discharge_from_item + + +def _filter_mat(mat, test_type): + """Keep only one type (e.g. impedance) from the matlab file""" + return [x for x in mat if x[0][0] == test_type] + + +def _split_mat(mat): + """Split matlab file into charge/discharge/impedance""" + raw_charge_items = _filter_mat(mat, "charge") + raw_discharge_items = _filter_mat(mat, "discharge") + raw_impedance_items = _filter_mat(mat, "impedance") + + return raw_charge_items, raw_discharge_items, raw_impedance_items + + +def _load_mat_file(filepath): + """Load the matlab file""" + filename = filepath.split("/")[-1].split(".")[0] + raw_mat = scipy.io.loadmat(filepath) + mat = raw_mat[filename][0][0][0][0] + + return mat + + +def extract_charge_discharge_impedance(filepath): + mat = _load_mat_file(filepath) + + raw_charge_items, raw_discharge_items, raw_impedance_items = _split_mat(mat) + + charge_items = [extract_charge_from_item(raw_charge) for raw_charge in raw_charge_items] + discharge_items = [extract_discharge_from_item(raw_discharge) for raw_discharge in raw_discharge_items] + impedance_items = [extract_impedance_from_item(raw_impedance) for raw_impedance in raw_impedance_items] + + return charge_items, discharge_items, impedance_items