diff --git a/CaseStudy.py b/CaseStudy.py index ae0aa4f..2b6d460 100644 --- a/CaseStudy.py +++ b/CaseStudy.py @@ -45,7 +45,7 @@ def __init__(self, self.dGlobal_Scenarios = dGlobal_Scenarios else: self.global_scenarios_file = global_scenarios_file - self.dGlobal_Scenarios = ExcelReader.get_dGlobal_Scenarios(self.data_folder + self.global_scenarios_file) + self.dGlobal_Scenarios = ExcelReader.get_Global_Scenarios(self.data_folder + self.global_scenarios_file) if dPower_Parameters is not None: self.dPower_Parameters = dPower_Parameters @@ -57,37 +57,37 @@ def __init__(self, self.dPower_BusInfo = dPower_BusInfo else: self.power_businfo_file = power_businfo_file - self.dPower_BusInfo = ExcelReader.get_dPower_BusInfo(self.data_folder + self.power_businfo_file) + self.dPower_BusInfo = ExcelReader.get_Power_BusInfo(self.data_folder + self.power_businfo_file) if dPower_Network is not None: self.dPower_Network = dPower_Network else: self.power_network_file = power_network_file - self.dPower_Network = ExcelReader.get_dPower_Network(self.data_folder + self.power_network_file) + self.dPower_Network = ExcelReader.get_Power_Network(self.data_folder + self.power_network_file) if dPower_Demand is not None: self.dPower_Demand = dPower_Demand else: self.power_demand_file = power_demand_file - self.dPower_Demand = ExcelReader.get_dPower_Demand(self.data_folder + self.power_demand_file) + self.dPower_Demand = ExcelReader.get_Power_Demand(self.data_folder + self.power_demand_file) if dPower_WeightsRP is not None: self.dPower_WeightsRP = dPower_WeightsRP else: self.power_weightsrp_file = power_weightsrp_file - self.dPower_WeightsRP = ExcelReader.get_dPower_WeightsRP(self.data_folder + self.power_weightsrp_file) + self.dPower_WeightsRP = ExcelReader.get_Power_WeightsRP(self.data_folder + self.power_weightsrp_file) if dPower_WeightsK is not None: self.dPower_WeightsK = dPower_WeightsK else: self.power_weightsk_file = power_weightsk_file - self.dPower_WeightsK = ExcelReader.get_dPower_WeightsK(self.data_folder + self.power_weightsk_file) + self.dPower_WeightsK = ExcelReader.get_Power_WeightsK(self.data_folder + self.power_weightsk_file) if dPower_Hindex is not None: self.dPower_Hindex = dPower_Hindex else: self.power_hindex_file = power_hindex_file - self.dPower_Hindex = ExcelReader.get_dPower_Hindex(self.data_folder + self.power_hindex_file) + self.dPower_Hindex = ExcelReader.get_Power_Hindex(self.data_folder + self.power_hindex_file) self.rpTransitionMatrixAbsolute, self.rpTransitionMatrixRelativeTo, self.rpTransitionMatrixRelativeFrom = self.get_rpTransitionMatrices() @@ -96,34 +96,34 @@ def __init__(self, self.dPower_ThermalGen = dPower_ThermalGen else: self.power_thermalgen_file = power_thermalgen_file - self.dPower_ThermalGen = ExcelReader.get_dPower_ThermalGen(self.data_folder + self.power_thermalgen_file) + self.dPower_ThermalGen = ExcelReader.get_Power_ThermalGen(self.data_folder + self.power_thermalgen_file) if self.dPower_Parameters["pEnableVRES"]: if dPower_VRES is not None: self.dPower_VRES = dPower_VRES else: self.power_vres_file = power_vres_file - self.dPower_VRES = ExcelReader.get_dPower_VRES(self.data_folder + self.power_vres_file) + self.dPower_VRES = ExcelReader.get_Power_VRES(self.data_folder + self.power_vres_file) if dPower_VRESProfiles is not None: self.dPower_VRESProfiles = dPower_VRESProfiles elif os.path.isfile(self.data_folder + power_vresprofiles_file): self.power_vresprofiles_file = power_vresprofiles_file - self.dPower_VRESProfiles = ExcelReader.get_dPower_VRESProfiles(self.data_folder + self.power_vresprofiles_file) + self.dPower_VRESProfiles = ExcelReader.get_Power_VRESProfiles(self.data_folder + self.power_vresprofiles_file) if self.dPower_Parameters["pEnableStorage"]: if dPower_Storage is not None: self.dPower_Storage = dPower_Storage else: self.power_storage_file = power_storage_file - self.dPower_Storage = ExcelReader.get_dPower_Storage(self.data_folder + self.power_storage_file) + self.dPower_Storage = ExcelReader.get_Power_Storage(self.data_folder + self.power_storage_file) if self.dPower_Parameters["pEnableVRES"] or self.dPower_Parameters["pEnableStorage"]: if dPower_Inflows is not None: self.dPower_Inflows = dPower_Inflows elif os.path.isfile(self.data_folder + power_inflows_file): self.power_inflows_file = power_inflows_file - self.dPower_Inflows = ExcelReader.get_dPower_Inflows(self.data_folder + self.power_inflows_file) + self.dPower_Inflows = ExcelReader.get_Power_Inflows(self.data_folder + self.power_inflows_file) if self.dPower_Parameters["pEnablePowerImportExport"]: if dPower_ImpExpHubs is not None: diff --git a/ExcelReader.py b/ExcelReader.py index fa209b8..a44af0d 100644 --- a/ExcelReader.py +++ b/ExcelReader.py @@ -82,7 +82,7 @@ def __read_pivoted_file(excel_file_path: str, version_specifier: str, indices: l return df -def get_dData_Packages(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Data_Packages(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dData_Packages data from the Excel file. :param excel_file_path: Path to the Excel file @@ -98,7 +98,7 @@ def get_dData_Packages(excel_file_path: str, keep_excluded_entries: bool = False return dData_Packages -def get_dData_Sources(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Data_Sources(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dData_Sources data from the Excel file. :param excel_file_path: Path to the Excel file @@ -114,7 +114,7 @@ def get_dData_Sources(excel_file_path: str, keep_excluded_entries: bool = False, return dData_Sources -def get_dGlobal_Scenarios(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Global_Scenarios(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dGlobal_Scenarios data from the Excel file. :param excel_file_path: Path to the Excel file @@ -132,7 +132,7 @@ def get_dGlobal_Scenarios(excel_file_path: str, keep_excluded_entries: bool = Fa return dGlobal_Scenarios -def get_dPower_BusInfo(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_BusInfo(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_BusInfo data from the Excel file. :param excel_file_path: Path to the Excel file @@ -145,7 +145,7 @@ def get_dPower_BusInfo(excel_file_path: str, keep_excluded_entries: bool = False return dPower_BusInfo -def get_dPower_Demand(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_Demand(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_Demand data from the Excel file. :param excel_file_path: Path to the Excel file @@ -161,7 +161,7 @@ def get_dPower_Demand(excel_file_path: str, keep_excluded_entries: bool = False, return dPower_Demand -def get_dPower_Hindex(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_Hindex(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_Hindex data from the Excel file. :param excel_file_path: Path to the Excel file @@ -177,7 +177,7 @@ def get_dPower_Hindex(excel_file_path: str, keep_excluded_entries: bool = False, return dPower_Hindex -def get_dPower_Inflows(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_Inflows(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_Inflows data from the Excel file. :param excel_file_path: Path to the Excel file @@ -193,7 +193,7 @@ def get_dPower_Inflows(excel_file_path: str, keep_excluded_entries: bool = False return dPower_Inflows -def get_dPower_Network(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_Network(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_Network data from the Excel file. :param excel_file_path: Path to the Excel file @@ -206,7 +206,7 @@ def get_dPower_Network(excel_file_path: str, keep_excluded_entries: bool = False return dPower_Network -def get_dPower_Storage(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_Storage(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_Storage data from the Excel file. :param excel_file_path: Path to the Excel file @@ -219,7 +219,7 @@ def get_dPower_Storage(excel_file_path: str, keep_excluded_entries: bool = False return dPower_Storage -def get_dPower_ThermalGen(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_ThermalGen(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_ThermalGen data from the Excel file. :param excel_file_path: Path to the Excel file @@ -232,7 +232,7 @@ def get_dPower_ThermalGen(excel_file_path: str, keep_excluded_entries: bool = Fa return dPower_ThermalGen -def get_dPower_VRES(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_VRES(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_VRES data from the Excel file. :param excel_file_path: Path to the Excel file @@ -245,7 +245,7 @@ def get_dPower_VRES(excel_file_path: str, keep_excluded_entries: bool = False, f return dPower_VRES -def get_dPower_VRESProfiles(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_VRESProfiles(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_VRESProfiles data from the Excel file. :param excel_file_path: Path to the Excel file @@ -261,7 +261,7 @@ def get_dPower_VRESProfiles(excel_file_path: str, keep_excluded_entries: bool = return dPower_VRESProfiles -def get_dPower_WeightsK(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_WeightsK(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_WeightsK data from the Excel file. :param excel_file_path: Path to the Excel file @@ -277,7 +277,7 @@ def get_dPower_WeightsK(excel_file_path: str, keep_excluded_entries: bool = Fals return dPower_WeightsK -def get_dPower_WeightsRP(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: +def get_Power_WeightsRP(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: """ Read the dPower_WeightsRP data from the Excel file. :param excel_file_path: Path to the Excel file @@ -293,6 +293,19 @@ def get_dPower_WeightsRP(excel_file_path: str, keep_excluded_entries: bool = Fal return dPower_WeightsRP +def get_Power_Wind_TechnicalDetails(excel_file_path: str, keep_excluded_entries: bool = False, fail_on_wrong_version: bool = False) -> pd.DataFrame: + """ + Read the dPower_Wind_TechnicalDetails data from the Excel file. + :param excel_file_path: Path to the Excel file + :param keep_excluded_entries: Do not exclude any entries which are marked to be excluded in the Excel file + :param fail_on_wrong_version: If True, raise an error if the version of the Excel file does not match the expected version + :return: dPower_Wind_TechnicalDetails + """ + dPower_Wind_TechnicalDetails = __read_non_pivoted_file(excel_file_path, "v0.1.0", ["g"], True, keep_excluded_entries, fail_on_wrong_version) + + return dPower_Wind_TechnicalDetails + + def compare_Excels(source_path: str, target_path: str, dont_check_formatting: bool = False) -> bool: """ Compare two Excel files for differences in formatting and values. diff --git a/ExcelWriter.py b/ExcelWriter.py index 1c8f020..9b82a21 100644 --- a/ExcelWriter.py +++ b/ExcelWriter.py @@ -20,12 +20,18 @@ class ExcelWriter: - def __init__(self, excel_definitions_path: str = "TableDefinitions.xml"): + def __init__(self, excel_definitions_path: str = None): """ Initialize the ExcelWriter with the XML root element. :param excel_definitions_path: Path to the TableDefinitions.xml file. """ + if excel_definitions_path is None: + from pathlib import Path + excel_definitions_path = str(Path(__file__).parent / "TableDefinitions.xml") + + if not Path(excel_definitions_path).exists(): + raise FileNotFoundError(f"TableDefinitions.xml not found at {excel_definitions_path}") self.excel_definitions_path = excel_definitions_path self.xml_tree = ET.parse(excel_definitions_path) @@ -194,7 +200,7 @@ def _write_Excel_from_definition(self, data: pd.DataFrame, folder_path: str, exc wb.save(path) printer.information(f"Saved Excel file to '{path}' after {time.time() - start_time:.2f} seconds") - def write_dData_Packages(self, dData_Packages: pd.DataFrame, folder_path: str) -> None: + def write_Data_Packages(self, dData_Packages: pd.DataFrame, folder_path: str) -> None: """ Write the dData_Packages DataFrame to an Excel file in LEGO format. :param dData_Packages: DataFrame containing the dData_Packages data. @@ -203,7 +209,7 @@ def write_dData_Packages(self, dData_Packages: pd.DataFrame, folder_path: str) - """ self._write_Excel_from_definition(dData_Packages, folder_path, "Data_Packages") - def write_dData_Sources(self, dData_Sources: pd.DataFrame, folder_path: str) -> None: + def write_Data_Sources(self, dData_Sources: pd.DataFrame, folder_path: str) -> None: """ Write the dData_Sources DataFrame to an Excel file in LEGO format. :param dData_Sources: DataFrame containing the dData_Sources data. @@ -212,7 +218,7 @@ def write_dData_Sources(self, dData_Sources: pd.DataFrame, folder_path: str) -> """ self._write_Excel_from_definition(dData_Sources, folder_path, "Data_Sources") - def write_dPower_BusInfo(self, dPower_BusInfo: pd.DataFrame, folder_path: str) -> None: + def write_Power_BusInfo(self, dPower_BusInfo: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_BusInfo DataFrame to an Excel file in LEGO format. :param dPower_BusInfo: DataFrame containing the dPower_BusInfo data. @@ -221,7 +227,7 @@ def write_dPower_BusInfo(self, dPower_BusInfo: pd.DataFrame, folder_path: str) - """ self._write_Excel_from_definition(dPower_BusInfo, folder_path, "Power_BusInfo") - def write_dGlobal_Scenarios(self, dGlobal_Scenarios: pd.DataFrame, folder_path: str) -> None: + def write_Global_Scenarios(self, dGlobal_Scenarios: pd.DataFrame, folder_path: str) -> None: """ Write the dGlobal_Scenarios DataFrame to an Excel file in LEGO format. :param dGlobal_Scenarios: DataFrame containing the dGlobal_Scenarios data. @@ -230,7 +236,7 @@ def write_dGlobal_Scenarios(self, dGlobal_Scenarios: pd.DataFrame, folder_path: """ self._write_Excel_from_definition(dGlobal_Scenarios, folder_path, "Global_Scenarios") - def write_dPower_Demand(self, dPower_Demand: pd.DataFrame, folder_path: str) -> None: + def write_Power_Demand(self, dPower_Demand: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_Demand DataFrame to an Excel file in LEGO format. :param dPower_Demand: DataFrame containing the dPower_Demand data. @@ -240,7 +246,7 @@ def write_dPower_Demand(self, dPower_Demand: pd.DataFrame, folder_path: str) -> self._write_Excel_from_definition(dPower_Demand, folder_path, "Power_Demand") - def write_dPower_Hindex(self, dPower_Hindex: pd.DataFrame, folder_path: str) -> None: + def write_Power_Hindex(self, dPower_Hindex: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_Hindex DataFrame to an Excel file in LEGO format. :param dPower_Hindex: DataFrame containing the dPower_Hindex data. @@ -249,7 +255,7 @@ def write_dPower_Hindex(self, dPower_Hindex: pd.DataFrame, folder_path: str) -> """ self._write_Excel_from_definition(dPower_Hindex, folder_path, "Power_Hindex") - def write_dPower_Inflows(self, dPower_Inflows: pd.DataFrame, folder_path: str) -> None: + def write_Power_Inflows(self, dPower_Inflows: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_Inflows DataFrame to an Excel file in LEGO format. :param dPower_Inflows: DataFrame containing the dPower_Inflows data. @@ -258,7 +264,7 @@ def write_dPower_Inflows(self, dPower_Inflows: pd.DataFrame, folder_path: str) - """ self._write_Excel_from_definition(dPower_Inflows, folder_path, "Power_Inflows") - def write_dPower_Network(self, dPower_Network: pd.DataFrame, folder_path: str) -> None: + def write_Power_Network(self, dPower_Network: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_Network DataFrame to an Excel file in LEGO format. :param dPower_Network: DataFrame containing the dPower_Network data. @@ -267,7 +273,7 @@ def write_dPower_Network(self, dPower_Network: pd.DataFrame, folder_path: str) - """ self._write_Excel_from_definition(dPower_Network, folder_path, "Power_Network") - def write_dPower_Storage(self, dPower_Storage: pd.DataFrame, folder_path: str) -> None: + def write_Power_Storage(self, dPower_Storage: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_Storage DataFrame to an Excel file in LEGO format. :param dPower_Storage: DataFrame containing the dPower_Storage data. @@ -276,7 +282,7 @@ def write_dPower_Storage(self, dPower_Storage: pd.DataFrame, folder_path: str) - """ self._write_Excel_from_definition(dPower_Storage, folder_path, "Power_Storage") - def write_dPower_ThermalGen(self, dPower_ThermalGen: pd.DataFrame, folder_path: str) -> None: + def write_Power_ThermalGen(self, dPower_ThermalGen: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_ThermalGen DataFrame to an Excel file in LEGO format. :param dPower_ThermalGen: DataFrame containing the dPower_ThermalGen data. @@ -303,7 +309,7 @@ def write_VRESProfiles(self, dPower_VRESProfiles: pd.DataFrame, folder_path: str """ self._write_Excel_from_definition(dPower_VRESProfiles, folder_path, "Power_VRESProfiles") - def write_dPower_WeightsK(self, dPower_WeightsK: pd.DataFrame, folder_path: str) -> None: + def write_Power_WeightsK(self, dPower_WeightsK: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_WeightsK DataFrame to an Excel file in LEGO format. :param dPower_WeightsK: DataFrame containing the dPower_WeightsK data. @@ -312,7 +318,7 @@ def write_dPower_WeightsK(self, dPower_WeightsK: pd.DataFrame, folder_path: str) """ self._write_Excel_from_definition(dPower_WeightsK, folder_path, "Power_WeightsK") - def write_dPower_WeightsRP(self, dPower_WeightsRP: pd.DataFrame, folder_path: str) -> None: + def write_Power_WeightsRP(self, dPower_WeightsRP: pd.DataFrame, folder_path: str) -> None: """ Write the dPower_WeightsRP DataFrame to an Excel file in LEGO format. :param dPower_WeightsRP: DataFrame containing the dPower_WeightsRP data. @@ -321,6 +327,15 @@ def write_dPower_WeightsRP(self, dPower_WeightsRP: pd.DataFrame, folder_path: st """ self._write_Excel_from_definition(dPower_WeightsRP, folder_path, "Power_WeightsRP") + def write_Power_Wind_TechnicalDetails(self, dPower_Wind_TechnicalDetails: pd.DataFrame, folder_path: str) -> None: + """ + Write the dPower_Wind_TechnicalDetails DataFrame to an Excel file in LEGO format. + :param dPower_Wind_TechnicalDetails: DataFrame containing the dPower_Wind_TechnicalDetails data. + :param folder_path: Path to the folder where the Excel file will be saved. + :return: None + """ + self._write_Excel_from_definition(dPower_Wind_TechnicalDetails, folder_path, "Power_Wind_TechnicalDetails") + def model_to_excel(model: pyomo.core.Model, target_path: str) -> None: """ @@ -374,20 +389,21 @@ def model_to_excel(model: pyomo.core.Model, target_path: str) -> None: printer.separator() combinations = [ - ("Data_Packages", f"{args.caseStudyFolder}Data_Packages.xlsx", ExcelReader.get_dData_Packages, ew.write_dData_Packages), - ("Data_Sources", f"{args.caseStudyFolder}Data_Sources.xlsx", ExcelReader.get_dData_Sources, ew.write_dData_Sources), - ("Global_Scenarios", f"{args.caseStudyFolder}Global_Scenarios.xlsx", ExcelReader.get_dGlobal_Scenarios, ew.write_dGlobal_Scenarios), - ("Power_BusInfo", f"{args.caseStudyFolder}Power_BusInfo.xlsx", ExcelReader.get_dPower_BusInfo, ew.write_dPower_BusInfo), - ("Power_Demand", f"{args.caseStudyFolder}Power_Demand.xlsx", ExcelReader.get_dPower_Demand, ew.write_dPower_Demand), - ("Power_Hindex", f"{args.caseStudyFolder}Power_Hindex.xlsx", ExcelReader.get_dPower_Hindex, ew.write_dPower_Hindex), - ("Power_Inflows", f"{args.caseStudyFolder}Power_Inflows.xlsx", ExcelReader.get_dPower_Inflows, ew.write_dPower_Inflows), - ("Power_Network", f"{args.caseStudyFolder}Power_Network.xlsx", ExcelReader.get_dPower_Network, ew.write_dPower_Network), - ("Power_Storage", f"{args.caseStudyFolder}Power_Storage.xlsx", ExcelReader.get_dPower_Storage, ew.write_dPower_Storage), - ("Power_ThermalGen", f"{args.caseStudyFolder}Power_ThermalGen.xlsx", ExcelReader.get_dPower_ThermalGen, ew.write_dPower_ThermalGen), - ("Power_VRES", f"{args.caseStudyFolder}Power_VRES.xlsx", ExcelReader.get_dPower_VRES, ew.write_VRES), - ("Power_VRESProfiles", f"{args.caseStudyFolder}Power_VRESProfiles.xlsx", ExcelReader.get_dPower_VRESProfiles, ew.write_VRESProfiles), - ("Power_WeightsK", f"{args.caseStudyFolder}Power_WeightsK.xlsx", ExcelReader.get_dPower_WeightsK, ew.write_dPower_WeightsK), - ("Power_WeightsRP", f"{args.caseStudyFolder}Power_WeightsRP.xlsx", ExcelReader.get_dPower_WeightsRP, ew.write_dPower_WeightsRP), + ("Data_Packages", f"{args.caseStudyFolder}Data_Packages.xlsx", ExcelReader.get_Data_Packages, ew.write_Data_Packages), + ("Data_Sources", f"{args.caseStudyFolder}Data_Sources.xlsx", ExcelReader.get_Data_Sources, ew.write_Data_Sources), + ("Global_Scenarios", f"{args.caseStudyFolder}Global_Scenarios.xlsx", ExcelReader.get_Global_Scenarios, ew.write_Global_Scenarios), + ("Power_BusInfo", f"{args.caseStudyFolder}Power_BusInfo.xlsx", ExcelReader.get_Power_BusInfo, ew.write_Power_BusInfo), + ("Power_Demand", f"{args.caseStudyFolder}Power_Demand.xlsx", ExcelReader.get_Power_Demand, ew.write_Power_Demand), + ("Power_Hindex", f"{args.caseStudyFolder}Power_Hindex.xlsx", ExcelReader.get_Power_Hindex, ew.write_Power_Hindex), + ("Power_Inflows", f"{args.caseStudyFolder}Power_Inflows.xlsx", ExcelReader.get_Power_Inflows, ew.write_Power_Inflows), + ("Power_Network", f"{args.caseStudyFolder}Power_Network.xlsx", ExcelReader.get_Power_Network, ew.write_Power_Network), + ("Power_Storage", f"{args.caseStudyFolder}Power_Storage.xlsx", ExcelReader.get_Power_Storage, ew.write_Power_Storage), + ("Power_ThermalGen", f"{args.caseStudyFolder}Power_ThermalGen.xlsx", ExcelReader.get_Power_ThermalGen, ew.write_Power_ThermalGen), + ("Power_VRES", f"{args.caseStudyFolder}Power_VRES.xlsx", ExcelReader.get_Power_VRES, ew.write_VRES), + ("Power_VRESProfiles", f"{args.caseStudyFolder}Power_VRESProfiles.xlsx", ExcelReader.get_Power_VRESProfiles, ew.write_VRESProfiles), + ("Power_WeightsK", f"{args.caseStudyFolder}Power_WeightsK.xlsx", ExcelReader.get_Power_WeightsK, ew.write_Power_WeightsK), + ("Power_WeightsRP", f"{args.caseStudyFolder}Power_WeightsRP.xlsx", ExcelReader.get_Power_WeightsRP, ew.write_Power_WeightsRP), + ("Power_Wind_TechnicalDetails", f"{args.caseStudyFolder}Power_Wind_TechnicalDetails.xlsx", ExcelReader.get_Power_Wind_TechnicalDetails, ew.write_Power_Wind_TechnicalDetails) ] for excel_definition_id, file_path, read, write in combinations: diff --git a/TableDefinitions.xml b/TableDefinitions.xml index 487d494..81ee5ed 100644 --- a/TableDefinitions.xml +++ b/TableDefinitions.xml @@ -247,6 +247,41 @@ + + v0.1.0 + Power - Wind Technical Details + 60.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + v0.1.3 Power - Weights of representative hours @@ -395,6 +430,13 @@ 15.0 general + + Hub Height + Heigth of the turbine + [m] + 15.0 + general + Node Name of node @@ -647,6 +689,13 @@ 17.0 rightFloat1 + + Power Factor + Power Factor for this unit, correcting for maintenance, terrain specifics, etc. + [0, n] + 25.0 + rightInt + Pmax Maximum active power transfer @@ -773,6 +822,34 @@ 15.0 general + + Vmax + Cut-out wind speed + [m/s] + 15.0 + general + + + Vmin + Cut-in wind speed + [m/s] + 15.0 + general + + + Vrated + Rated wind speed + [m/s] + 15.0 + general + + + Year + Year of the Yearly Production that is given + [0, n] + 19.5 + general + Commission Year Year where it is commissioned (1.1.xxxx) @@ -787,6 +864,13 @@ 19.5 rightInt + + Yearly Production + Yearly production for calibration (i.e., used to calculate Power Factor if it's not specified yet) + [MW/h] + 28.0 + general + Zone Zone in which node lies diff --git a/data/example/Power_Wind_TechnicalDetails.xlsx b/data/example/Power_Wind_TechnicalDetails.xlsx new file mode 100644 index 0000000..af3736a Binary files /dev/null and b/data/example/Power_Wind_TechnicalDetails.xlsx differ diff --git a/environment.yml b/environment.yml index c6961a9..b62965a 100644 --- a/environment.yml +++ b/environment.yml @@ -4,13 +4,13 @@ channels: - conda-forge dependencies: - openpyxl=3.1.5 - - pandas=2.2.3 + - pandas=2.3.1 - pandas-stubs=2.3.0.250703 - - pip=24.0 - - pyomo=6.9.2 - - pytest=8.4.0 + - pip=25.1 + - pyomo=6.9.3 + - pytest=8.4.1 - python=3.12.2 - - rich=13.7.1 - - rich-argparse=1.6.0 + - rich=13.9.4 + - rich-argparse=1.7.1 - pip: - pulp==2.9.0 diff --git a/tests/test_ExcelReaderWriter.py b/tests/test_ExcelReaderWriter.py index cc0d7ac..396c084 100644 --- a/tests/test_ExcelReaderWriter.py +++ b/tests/test_ExcelReaderWriter.py @@ -9,20 +9,21 @@ case_study_folder = "data/example/" ew = ExcelWriter() combinations = [ - ("Data_Packages", f"{case_study_folder}Data_Packages.xlsx", ExcelReader.get_dData_Packages, ew.write_dData_Packages), - ("Data_Sources", f"{case_study_folder}Data_Sources.xlsx", ExcelReader.get_dData_Sources, ew.write_dData_Sources), - ("Global_Scenarios", f"{case_study_folder}Global_Scenarios.xlsx", ExcelReader.get_dGlobal_Scenarios, ew.write_dGlobal_Scenarios), - ("Power_BusInfo", f"{case_study_folder}Power_BusInfo.xlsx", ExcelReader.get_dPower_BusInfo, ew.write_dPower_BusInfo), - ("Power_Demand", f"{case_study_folder}Power_Demand.xlsx", ExcelReader.get_dPower_Demand, ew.write_dPower_Demand), - ("Power_Hindex", f"{case_study_folder}Power_Hindex.xlsx", ExcelReader.get_dPower_Hindex, ew.write_dPower_Hindex), - ("Power_Inflows", f"{case_study_folder}Power_Inflows.xlsx", ExcelReader.get_dPower_Inflows, ew.write_dPower_Inflows), - ("Power_Network", f"{case_study_folder}Power_Network.xlsx", ExcelReader.get_dPower_Network, ew.write_dPower_Network), - ("Power_Storage", f"{case_study_folder}Power_Storage.xlsx", ExcelReader.get_dPower_Storage, ew.write_dPower_Storage), - ("Power_ThermalGen", f"{case_study_folder}Power_ThermalGen.xlsx", ExcelReader.get_dPower_ThermalGen, ew.write_dPower_ThermalGen), - ("Power_VRES", f"{case_study_folder}Power_VRES.xlsx", ExcelReader.get_dPower_VRES, ew.write_VRES), - ("Power_VRESProfiles", f"{case_study_folder}Power_VRESProfiles.xlsx", ExcelReader.get_dPower_VRESProfiles, ew.write_VRESProfiles), - ("Power_WeightsK", f"{case_study_folder}Power_WeightsK.xlsx", ExcelReader.get_dPower_WeightsK, ew.write_dPower_WeightsK), - ("Power_WeightsRP", f"{case_study_folder}Power_WeightsRP.xlsx", ExcelReader.get_dPower_WeightsRP, ew.write_dPower_WeightsRP), + ("Data_Packages", f"{case_study_folder}Data_Packages.xlsx", ExcelReader.get_Data_Packages, ew.write_Data_Packages), + ("Data_Sources", f"{case_study_folder}Data_Sources.xlsx", ExcelReader.get_Data_Sources, ew.write_Data_Sources), + ("Global_Scenarios", f"{case_study_folder}Global_Scenarios.xlsx", ExcelReader.get_Global_Scenarios, ew.write_Global_Scenarios), + ("Power_BusInfo", f"{case_study_folder}Power_BusInfo.xlsx", ExcelReader.get_Power_BusInfo, ew.write_Power_BusInfo), + ("Power_Demand", f"{case_study_folder}Power_Demand.xlsx", ExcelReader.get_Power_Demand, ew.write_Power_Demand), + ("Power_Hindex", f"{case_study_folder}Power_Hindex.xlsx", ExcelReader.get_Power_Hindex, ew.write_Power_Hindex), + ("Power_Inflows", f"{case_study_folder}Power_Inflows.xlsx", ExcelReader.get_Power_Inflows, ew.write_Power_Inflows), + ("Power_Network", f"{case_study_folder}Power_Network.xlsx", ExcelReader.get_Power_Network, ew.write_Power_Network), + ("Power_Storage", f"{case_study_folder}Power_Storage.xlsx", ExcelReader.get_Power_Storage, ew.write_Power_Storage), + ("Power_ThermalGen", f"{case_study_folder}Power_ThermalGen.xlsx", ExcelReader.get_Power_ThermalGen, ew.write_Power_ThermalGen), + ("Power_VRES", f"{case_study_folder}Power_VRES.xlsx", ExcelReader.get_Power_VRES, ew.write_VRES), + ("Power_VRESProfiles", f"{case_study_folder}Power_VRESProfiles.xlsx", ExcelReader.get_Power_VRESProfiles, ew.write_VRESProfiles), + ("Power_WeightsK", f"{case_study_folder}Power_WeightsK.xlsx", ExcelReader.get_Power_WeightsK, ew.write_Power_WeightsK), + ("Power_WeightsRP", f"{case_study_folder}Power_WeightsRP.xlsx", ExcelReader.get_Power_WeightsRP, ew.write_Power_WeightsRP), + ("Power_Wind_TechnicalDetails", f"{case_study_folder}Power_Wind_TechnicalDetails.xlsx", ExcelReader.get_Power_Wind_TechnicalDetails, ew.write_Power_Wind_TechnicalDetails) ]