From 1eb0838c9947dbc83530ac026d32d00715f5b990 Mon Sep 17 00:00:00 2001 From: Marco Anarmo Date: Tue, 5 Aug 2025 16:34:52 +0200 Subject: [PATCH 1/2] Implement filtering timesteps and rps --- CaseStudy.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/CaseStudy.py b/CaseStudy.py index 3d57f26..863b6b2 100644 --- a/CaseStudy.py +++ b/CaseStudy.py @@ -702,3 +702,41 @@ def filter_scenario(self, scenario_name) -> Self: caseStudy._filter_dataframe("dPower_ImpExpProfiles", scenario_name) return caseStudy + + def filter_timesteps(self, start: str, end: str) -> Self: + case_study = self.copy() + + df_names = ["dPower_Demand", "dPower_VRESProfiles", "dPower_WeightsK", "dPower_Hindex"] + + for df_name in df_names: + df = getattr(case_study, df_name) + + index = df.index.names + df_reset = df.reset_index() + + filtered_df_reset = df_reset.loc[(df_reset['k'] >= start) & (df_reset['k'] <= end)] + + filtered_df = filtered_df_reset.set_index(index) + + setattr(case_study, df_name, filtered_df) + + return case_study + + def filter_representative_periods(self, rp: str) -> Self: + case_study = self.copy() + + df_names = ["dPower_Demand", "dPower_VRESProfiles", "dPower_WeightsRP", "dPower_Hindex"] + + for df_name in df_names: + df = getattr(case_study, df_name) + + index = df.index.names + df_reset = df.reset_index() + + filtered_df_reset = df_reset.loc[(df_reset['rp'] == rp)] + + filtered_df = filtered_df_reset.set_index(index) + + setattr(case_study, df_name, filtered_df) + + return case_study From 0c657c55286c33c0885272557f97fed86a4abeea Mon Sep 17 00:00:00 2001 From: Marco Anarmo Date: Wed, 13 Aug 2025 12:41:57 +0200 Subject: [PATCH 2/2] Enhance ExcelWriter for empty variables and indices --- CaseStudy.py | 1 + ExcelWriter.py | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/CaseStudy.py b/CaseStudy.py index 863b6b2..a9e85b6 100644 --- a/CaseStudy.py +++ b/CaseStudy.py @@ -438,6 +438,7 @@ def get_connected_buses(connection_matrix, bus: str): def merge_single_node_buses(self): # Create a connection matrix + # TODO check connectionMatrix = pd.DataFrame(index=self.dPower_BusInfo.index, columns=[self.dPower_BusInfo.index], data=False) for index, entry in self.dPower_Network.iterrows(): diff --git a/ExcelWriter.py b/ExcelWriter.py index 319fbe0..9c7ea57 100644 --- a/ExcelWriter.py +++ b/ExcelWriter.py @@ -322,14 +322,44 @@ def model_to_excel(model: pyomo.core.Model, target_path: str) -> None: else: # Create a sheet for each (other) variable ws = wb.create_sheet(title=str(var)) - # Prepare the data from the model and prepare the header + # Prepare the data from the model data = [(j, v.value if not v.stale else None) for j, v in var.items()] - col_number = len(data[0][0]) if not isinstance(data[0][0], str) else 1 - ws.append([f"index_{j}" for j in range(col_number)] + [str(var)]) - # Write data to the sheet - for j, v in data: - ws.append(([j_index for j_index in j] if not isinstance(j, str) else [j]) + [v]) + # Extract parameter names from the variable's index structure + param_names = [] + + if var.is_indexed(): + index_set = var.index_set() + + try: + # Get names from the index set + if hasattr(index_set, 'subsets') and index_set.subsets(): + for idx, subset in enumerate(index_set.subsets()): + if subset.domain.dimen is not None: + for i, domain in enumerate(subset.domain.subsets()): + param_names.append(f"{subset.name}[{i}]: {domain.name}") + else: + param_names.append(subset.name) + param_names.append(str(var)) + except (AttributeError, TypeError): + if len(data) > 0: + # Determine from actual data structure + col_number = len(data[0][0]) if not isinstance(data[0][0], str) else 1 + param_names = [f"index_{j}" for j in range(col_number)] + [str(var)] + else: + param_names = [] + + # Create header row with parameter names + ws.append(param_names) + + # Handle data writing + if len(data) == 0: + # Create a row showing "No entries" for each parameter + ws.append(["No entries"] * len(param_names)) + else: + # Write data to the sheet + for j, v in data: + ws.append(([j_index for j_index in j] if not isinstance(j, str) else [j]) + [v]) wb.save(target_path)