Add minimum historic prediction hours for prediction providers. (#346)

Prediction providers can now individually set the minimum historic prediction hours
to be kept in the data records. This setting supersedes any lower setting given by the
configuration `prediction_historic_hours`.

As a help for the future change of ElecPriceAkkudoktor, the minimum historic hours for
this provider is set to 5 * 7 * 24 hours.

Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
This commit is contained in:
Bobby Noelte 2025-01-06 23:05:08 +01:00 committed by GitHub
parent 10acc705ec
commit 0ac31348f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 5 deletions

View File

@ -100,6 +100,10 @@ class ElecPriceAkkudoktor(ElecPriceProvider):
raise ValueError(error_msg)
return akkudoktor_data
def historic_hours_min(self) -> int:
"""Return the minimum historic prediction hours for Akkudoktor electricity price data."""
return 5 * 7 * 24 # 5 weeks a 7 days a 24 hours
def _calculate_weighted_mean(self, day_of_week: int, hour: int) -> float:
"""Calculate the weighted mean price for given day_of_week and hour.

View File

@ -103,6 +103,13 @@ class PredictionStartEndKeepMixin(PredictionBase):
system. Predictions cannot be computed if this value is `None`.
"""
def historic_hours_min(self) -> int:
"""Return the minimum historic prediction hours for specific data.
To be implemented by derived classes if default 0 is not appropriate.
"""
return 0
# Computed field for end_datetime and keep_datetime
@computed_field # type: ignore[prop-decorator]
@property
@ -136,11 +143,15 @@ class PredictionStartEndKeepMixin(PredictionBase):
Returns:
Optional[DateTime]: The calculated retention cutoff datetime, or `None` if inputs are missing.
"""
if self.start_datetime and self.config.prediction_historic_hours:
return self.start_datetime - to_duration(
f"{int(self.config.prediction_historic_hours)} hours"
)
return None
if self.start_datetime is None:
return None
historic_hours = self.historic_hours_min()
if (
self.config.prediction_historic_hours
and self.config.prediction_historic_hours > historic_hours
):
historic_hours = int(self.config.prediction_historic_hours)
return self.start_datetime - to_duration(f"{historic_hours} hours")
@computed_field # type: ignore[prop-decorator]
@property