__init__.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from __future__ import annotations
  2. from copy import deepcopy
  3. from typing import List, Dict, Any
  4. from flexmeasures.data.models.data_sources import DataGenerator
  5. from flexmeasures.data.schemas.reporting import (
  6. ReporterParametersSchema,
  7. ReporterConfigSchema,
  8. )
  9. class Reporter(DataGenerator):
  10. """Superclass for all FlexMeasures Reporters."""
  11. __version__ = None
  12. __author__ = None
  13. __data_generator_base__ = "reporter"
  14. _parameters_schema = ReporterParametersSchema()
  15. _config_schema = ReporterConfigSchema()
  16. def _compute(self, check_output_resolution=True, **kwargs) -> List[Dict[str, Any]]:
  17. """This method triggers the creation of a new report.
  18. The same object can generate multiple reports with different start, end, resolution
  19. and belief_time values.
  20. check_output_resolution (default: True): set to False to skip the validation of the output event_resolution.
  21. """
  22. results: List[Dict[str, Any]] = self._compute_report(**kwargs)
  23. for result in results:
  24. # checking that the event_resolution of the output BeliefDataFrame is equal to the one of the output sensor
  25. assert not check_output_resolution or (
  26. result["sensor"].event_resolution == result["data"].event_resolution
  27. ), f"The resolution of the results ({result['data'].event_resolution}) should match that of the output sensor ({result['sensor'].event_resolution}, ID {result['sensor'].id})."
  28. # Assign sensor to BeliefDataFrame
  29. result["data"].sensor = result["sensor"]
  30. if not result["data"].empty:
  31. # update data source
  32. result["data"].index = result["data"].index.set_levels(
  33. [self.data_source] * len(result["data"]),
  34. level="source",
  35. verify_integrity=False,
  36. )
  37. return results
  38. def _compute_report(self, **kwargs) -> List[Dict[str, Any]]:
  39. """
  40. Overwrite with the actual computation of your report.
  41. :returns BeliefsDataFrame: report as a BeliefsDataFrame.
  42. """
  43. raise NotImplementedError()
  44. def _clean_parameters(self, parameters: dict) -> dict:
  45. _parameters = deepcopy(parameters)
  46. fields_to_remove = ["start", "end", "resolution", "belief_time"]
  47. for field in fields_to_remove:
  48. _parameters.pop(field, None)
  49. fields_to_remove_input = [
  50. "event_starts_after",
  51. "event_ends_before",
  52. "belief_time",
  53. "resolution",
  54. ]
  55. for _input in _parameters["input"]:
  56. for field in fields_to_remove_input:
  57. _input.pop(field, None)
  58. return _parameters