From 106c05dbe9018e7da02e30ddd9e8d1c9d09c0e7e Mon Sep 17 00:00:00 2001 From: mpecchi Date: Tue, 19 Mar 2024 10:14:06 -0400 Subject: [PATCH] fixes on save_samples_info --- example/output/samples/samples_info.xlsx | Bin 0 -> 9969 bytes example/output/samples/samples_info_std.xlsx | Bin 0 -> 10132 bytes src/gcms_data_analysis/main.py | 30 ++++++++++++++----- 3 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 example/output/samples/samples_info.xlsx create mode 100644 example/output/samples/samples_info_std.xlsx diff --git a/example/output/samples/samples_info.xlsx b/example/output/samples/samples_info.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..43ad1acd55a41d1b427fdcf9489207ecbd22fe86 GIT binary patch literal 9969 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 literal 0 HcmV?d00001 diff --git a/example/output/samples/samples_info_std.xlsx b/example/output/samples/samples_info_std.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8e94231a1416690490a82b5439c5382fbafbce33 GIT binary patch literal 10132 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 literal 0 HcmV?d00001 diff --git a/src/gcms_data_analysis/main.py b/src/gcms_data_analysis/main.py index 4742ef0..5e1c6f2 100644 --- a/src/gcms_data_analysis/main.py +++ b/src/gcms_data_analysis/main.py @@ -1624,7 +1624,7 @@ class Project: } compounds_to_rename = {} - param_to_axis_label = { + param_to_axis_label: dict[str:str] = { "area": "Peak Area [-]", "area_if_undiluted": "Peak Area [-]", "conc_vial_mg_L": "conc. [mg/L] (ppm)", @@ -1632,6 +1632,7 @@ class Project: "fraction_of_sample_fr": "mass fraction [g/g$_{sample}$]", "fraction_of_feedstock_fr": "mass fraction [g/g$_{feedstock}$]", } + acceptable_params: list[str] = list(param_to_axis_label.keys()) string_in_deriv_names: list[str] = [ "deriv.", "derivative", @@ -2589,6 +2590,8 @@ def create_samples_info(self): self.samples_info = _samples_info.loc[:, non_numcol + numcol] self.samples_info_std = _samples_info_std.loc[:, non_numcol + numcol] self.samples_info_created = True + if Project.auto_save_to_excel: + self.save_samples_info() print("Info: create_samples_info: samples_info created") return self.samples_info, self.samples_info_std @@ -2616,7 +2619,9 @@ def create_samples_from_files(self): self.samples_created = True return self.samples, self.samples_std - def _create_sample_from_files(self, files_in_sample, samplename): + def _create_sample_from_files( + self, files_in_sample: list[pd.DataFrame], samplename: str + ): """Creates a sample dataframe and a standard deviation dataframe from files that are replicates of the same sample. This process includes aligning dataframes, filling missing values, calculating averages and standard deviations, @@ -2626,15 +2631,17 @@ def _create_sample_from_files(self, files_in_sample, samplename): non_num_columns = ["iupac_name", "compound_used_for_calibration"] else: non_num_columns = ["iupac_name"] - aligned_dfs = [ + aligned_dfs: list[pd.DataFrame] = [ df.align(files_in_sample[0], join="outer", axis=0)[0] for df in files_in_sample ] # Align indices # Keep non-numerical data separately and ensure no duplicates - non_num_data = pd.concat( + non_num_data: pd.DataFrame = pd.concat( [df[non_num_columns].drop_duplicates() for df in files_in_sample] ).drop_duplicates() - filled_dfs = [f.drop(columns=non_num_columns).fillna(0) for f in aligned_dfs] + filled_dfs: list[pd.DataFrame] = [ + f.drop(columns=non_num_columns).fillna(0) for f in aligned_dfs + ] # Calculating the average and std for numerical data sample = pd.concat(filled_dfs).groupby(level=0).mean().astype(float) sample_std = pd.concat(filled_dfs).groupby(level=0).std().astype(float) @@ -2711,7 +2718,8 @@ def create_files_param_report(self, param="conc_vial_mg_L"): This report aids in the analysis and comparison of compound concentrations across FILES.""" print("Info: create_files_param_report: ", param) - + if param not in Project.acceptable_params: + raise ValueError(f"{param = } is not an acceptable param") if not self.calibration_to_files_applied: self.apply_calibration_to_files() rep_columns = self.files_info.index.tolist() @@ -2746,8 +2754,11 @@ def create_files_param_aggrrep(self, param="conc_vial_mg_L"): group concentrations. This aggregation facilitates the understanding of functional group distribution across FILES.""" print("Info: create_param_aggrrep: ", param) + if param not in Project.acceptable_params: + raise ValueError(f"{param = } is not an acceptable param") if param not in self.list_of_files_param_reports: self.create_files_param_report(param) + # fg = functional groups, mf = mass fraction filenames = self.files_info.index.tolist() _all_comps = self.files_reports[param].index.tolist() @@ -2804,6 +2815,8 @@ def create_samples_param_report(self, param="conc_vial_mg_L"): This report aids in the analysis and comparison of compound concentrations across SAMPLES.""" print("Info: create_param_report: ", param) + if param not in Project.acceptable_params: + raise ValueError(f"{param = } is not an acceptable param") if not self.samples_created: self.create_samples_from_files() _all_comps = self.compounds_properties["iupac_name"].tolist() @@ -2853,6 +2866,8 @@ def create_samples_param_aggrrep(self, param="conc_vial_mg_L"): group concentrations. This aggregation facilitates the understanding of functional group distribution across SAMPLES.""" print("Info: create_param_aggrrep: ", param) + if param not in Project.acceptable_params: + raise ValueError(f"{param = } is not an acceptable param") if param not in self.list_of_samples_param_reports: self.create_samples_param_report(param) # fg = functional groups, mf = mass fraction @@ -2942,7 +2957,8 @@ def save_samples_info(self): self.add_stats_to_samples_info() out_path = plib.Path(Project.out_path, "samples") out_path.mkdir(parents=True, exist_ok=True) - self.files_info.to_excel(plib.Path(out_path, "samples_info.xlsx")) + self.samples_info.to_excel(plib.Path(out_path, "samples_info.xlsx")) + self.samples_info_std.to_excel(plib.Path(out_path, "samples_info_std.xlsx")) print("Info: save_samples_info: samples_info saved") def save_sample(self, sample, sample_std, samplename):