Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -93,17 +93,54 @@ def __get_values_annual(self, area: str, year: int) -> pd.DataFrame:
"""Internal parser for annual values, using caching"""
return self.__if_none_then_parse_annual(area, year, "values-annual.txt")

def __get_values_hourly(self, area: str, year: int):
def __get_values_hourly(self, area: str, year: int) -> pd.DataFrame:
return self.__if_none_then_parse(result_type.VALUES, area.lower(), year, "values-hourly.txt")

def __get_values_hourly_for_specific_week(self, area: str, year: int, week: int):
df = self.__if_none_then_parse(result_type.VALUES, area.lower(), year, "values-hourly.txt")
return df[(df['hourly']['Unnamed: 1_level_1'] > (week - 1) * 168) & (
df['hourly']['Unnamed: 1_level_1'] <= week * 168)]
def __get_values_hourly_for_specific_hour(self, area: str, year: int, date: str) -> pd.DataFrame:
df = self.__get_values_hourly(area, year)
return df.loc[df['datetime'] == date]

def __get_values_hourly_for_specific_hour(self, area: str, year: int, datetime: str):
def __get_values_hourly_for_specific_week(self, area: str, year: int, week: int) -> pd.DataFrame:
df = self.__get_values_hourly(area, year)
day_col = df['Unnamed: 2_level_0']
if isinstance(day_col, pd.DataFrame):
day_col = day_col.iloc[:, 0]
week_calc = (day_col - 1) // 7 + 1
return df.loc[week_calc == week]

# common helper to get hourly series by header
def _get_hourly_series(self, area: str, year: int, header: str) -> pd.Series:
df = self.__get_values_hourly(area, year)
return df.loc[df['datetime'] == datetime]
return df.xs(header, axis=1, level=0).iloc[:, 0]

# common helper to get annual series by header
def _get_annual_series(self, area: str, year: int, header: str) -> pd.Series:
df = self.__get_values_annual(area, year)
return df.xs(header, axis=1, level=0).iloc[:, 0]

# common helper to get annual scalar by header
def _get_annual_scalar(self, area: str, year: int, header: str) -> float:
return float(self._get_annual_series(area, year, header).iloc[0])

def get_metric(self, area: str, year: int, header: str, period: str = 'hourly'):
"""
Return a metric by header name: hourly Series if period='hourly', annual scalar if period='annual'.
"""
if period == 'hourly':
return self._get_hourly_series(area, year, header)
if period == 'annual':
return self._get_annual_scalar(area, year, header)
raise ValueError(f"Unknown period '{period}', expected 'hourly' or 'annual'")

def get_load(self, area: str, year: int, period: str = 'hourly'):
"""
Return load for a given period ('hourly' returns a Series of hourly load,
'annual' returns the annual scalar load).
"""
header = 'LOAD'
if period == 'hourly':
return self._get_hourly_series(area, year, header)
return self._get_annual_scalar(area, year, header)

def __get_sts_details_hourly(self, area: str, year: int):
return self.__if_none_then_parse(result_type.DETAILS_STS, area.lower(), year, "details-STstorage-hourly.txt")
Expand Down Expand Up @@ -140,7 +177,7 @@ def get_loss_of_load_duration_h(self, area: str, year: int) -> int:
return self.__get_values_hourly(area, year)["LOLD"]["Hours"].sum()

def get_spilled_energy_mwh(self, area: str, year: int) -> int:
return self.__get_values_hourly(area, year)["SPIL. ENRG"]["MWh"].sum()
return int(self._get_hourly_series(area, year, 'SPIL. ENRG').sum())

def get_hydro_production_mwh(self, area: str, year: int) -> int:
return self.__get_values_hourly(area, year)["H. STOR"]["MWh"].sum()
Expand All @@ -149,7 +186,29 @@ def get_hydro_pumping_mwh(self, area: str, year: int) -> int:
return self.__get_values_hourly(area, year)["H. PUMP"]["MWh"].sum()

def get_balance_mwh(self, area: str, year: int) -> int:
return self.__get_values_hourly(area, year)["BALANCE"]["MWh"].sum()
return int(self._get_hourly_series(area, year, 'BALANCE').sum())

# Add hourly series getters corresponding to annual metrics
def get_hourly_margin_price(self, area: str, year: int) -> pd.Series:
return self.get_metric(area, year, 'MRG. PRICE', period='hourly')

def get_hourly_load(self, area: str, year: int) -> pd.Series:
return self.get_metric(area, year, 'LOAD', period='hourly')

def get_hourly_gas(self, area: str, year: int) -> pd.Series:
return self.get_metric(area, year, 'GAS', period='hourly')

def get_hourly_hard_coal(self, area: str, year: int) -> pd.Series:
return self.get_metric(area, year, 'OTHER FUEL', period='hourly')

def get_hourly_unsupplied_energy(self, area: str, year: int) -> pd.Series:
return self.get_metric(area, year, 'UNSP. ENRG', period='hourly')

def get_hourly_spilled_energy(self, area: str, year: int) -> pd.Series:
return self.get_metric(area, year, 'SPIL. ENRG', period='hourly')

def get_hourly_n_dispatched_units_total(self, area: str, year: int) -> pd.Series:
return self.get_metric(area, year, 'NODU', period='hourly')

def get_unsupplied_energy_mwh(self, area: str, year: int, date: str = None) -> float:
if date is None:
Expand Down Expand Up @@ -184,44 +243,22 @@ def get_values_annual(self, area: str, year: int) -> pd.DataFrame:

# Specific getters for annual variables
def get_annual_margin_price(self, area: str, year: int) -> float:
"""Return margin price for annual results"""
df = self.__get_values_annual(area, year)
# select by first-level column name and extract first scalar
sub = df.xs('MRG. PRICE', axis=1, level=0)
return float(sub.iloc[0, 0])
return self.get_metric(area, year, 'MRG. PRICE', period='annual')

def get_annual_load(self, area: str, year: int) -> float:
"""Return load for annual results"""
df = self.__get_values_annual(area, year)
sub = df.xs('LOAD', axis=1, level=0)
return float(sub.iloc[0, 0])
return self.get_metric(area, year, 'LOAD', period='annual')

def get_annual_gas(self, area: str, year: int) -> float:
"""Return gas energy for annual results"""
df = self.__get_values_annual(area, year)
sub = df.xs('GAS', axis=1, level=0)
return float(sub.iloc[0, 0])
return self.get_metric(area, year, 'GAS', period='annual')

def get_annual_hard_coal(self, area: str, year: int) -> float:
"""Return hard coal energy (other fuel) for annual results"""
df = self.__get_values_annual(area, year)
sub = df.xs('HARD COAL', axis=1, level=0)
return float(sub.iloc[0, 0])
return self.get_metric(area, year, 'HARD COAL', period='annual')

def get_annual_unsupplied_energy(self, area: str, year: int) -> float:
"""Return unsupplied energy for annual results"""
df = self.__get_values_annual(area, year)
sub = df.xs('UNSP. ENRG', axis=1, level=0)
return float(sub.iloc[0, 0])
return self.get_metric(area, year, 'UNSP. ENRG', period='annual')

def get_annual_spilled_energy(self, area: str, year: int) -> float:
"""Return spilled energy for annual results"""
df = self.__get_values_annual(area, year)
sub = df.xs('SPIL. ENRG', axis=1, level=0)
return float(sub.iloc[0, 0])
return self.get_metric(area, year, 'SPIL. ENRG', period='annual')

def get_annual_n_dispatched_units(self, area: str, year: int) -> int:
"""Return number of dispatched units for annual results"""
df = self.__get_values_annual(area, year)
sub = df.xs('NODU', axis=1, level=0)
return int(sub.iloc[0, 0])
return int(self.get_metric(area, year, 'NODU', period='annual'))
Loading