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)
]