diff --git a/requirements/base.in b/requirements/base.in index 86dc1551af..c8e4dd44d4 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -4,17 +4,17 @@ cached_property click click-default-group colorlog==4.7.2 -numpy +numpy==1.24.4 pendulum==2.1.2 plotly python-rex redis rq -pytz +pytz==2024.2 sortedcontainers sympy pony -psycopg2==2.9.9 -psycopg2-binary==2.9.9 +psycopg2==2.9.10 +psycopg2-binary==2.9.10 -e git+https://github.com/gridsingularity/gsy-framework@master#egg=gsy_framework diff --git a/requirements/base.txt b/requirements/base.txt index c302ec6c9f..f77a1de0db 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -6,8 +6,6 @@ # -e git+https://github.com/gridsingularity/gsy-framework@master#egg=gsy_framework # via -r requirements/base.in -async-timeout==4.0.3 - # via gsy-framework attrs==23.2.0 # via # -r requirements/base.in @@ -72,12 +70,6 @@ filelock==3.14.0 # gsy-framework # tox # virtualenv -flake8==4.0.1 - # via - # flake8-tuple - # gsy-framework -flake8-tuple==0.4.1 - # via gsy-framework geocoder==1.17.5 # via gsy-framework identify==2.5.36 @@ -88,8 +80,6 @@ idna==3.7 # via # gsy-framework # requests -importlib-resources==6.4.0 - # via gsy-framework jsonschema==4.22.0 # via gsy-framework jsonschema-specifications==2023.12.1 @@ -98,17 +88,13 @@ jsonschema-specifications==2023.12.1 # jsonschema kafka-python==2.0.2 # via gsy-framework -mccabe==0.6.1 - # via - # flake8 - # gsy-framework mpmath==1.3.0 # via sympy nodeenv==1.8.0 # via # gsy-framework # pre-commit -numpy==1.26.4 +numpy==1.24.4 # via -r requirements/base.in openpyxl==3.0.10 # via gsy-framework @@ -122,8 +108,6 @@ pendulum==2.1.2 # via # -r requirements/base.in # gsy-framework -pkgutil-resolve-name==1.3.10 - # via gsy-framework platformdirs==4.2.2 # via # gsy-framework @@ -139,18 +123,10 @@ pony==0.7.17 # via -r requirements/base.in pre-commit==3.5.0 # via gsy-framework -psycopg2==2.9.9 +psycopg2==2.9.10 # via -r requirements/base.in -psycopg2-binary==2.9.9 +psycopg2-binary==2.9.10 # via -r requirements/base.in -pycodestyle==2.8.0 - # via - # flake8 - # gsy-framework -pyflakes==2.4.0 - # via - # flake8 - # gsy-framework pyproject-api==1.6.1 # via # gsy-framework @@ -161,7 +137,7 @@ python-dateutil==2.9.0.post0 # pendulum python-rex==0.4 # via -r requirements/base.in -pytz==2024.1 +pytz==2024.2 # via -r requirements/base.in pytzdata==2020.1 # via @@ -200,7 +176,6 @@ rq==1.16.2 # via -r requirements/base.in six==1.16.0 # via - # flake8-tuple # geocoder # gsy-framework # python-dateutil @@ -213,8 +188,6 @@ tabulate==0.9.0 # via gsy-framework tenacity==8.3.0 # via plotly -tomli==2.0.1 - # via gsy-framework tox==4.15.0 # via gsy-framework unidecode==0.4.21 @@ -230,8 +203,6 @@ virtualenv==20.26.2 # tox websockets==12.0 # via gsy-framework -zipp==3.18.2 - # via gsy-framework # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/dev.txt b/requirements/dev.txt index 384585f13b..955360b5bb 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -8,10 +8,6 @@ # via -r requirements/base.txt astroid==3.2.1 # via pylint -async-timeout==4.0.3 - # via - # -r requirements/base.txt - # gsy-framework attrs==23.2.0 # via # -r requirements/base.txt @@ -103,15 +99,6 @@ filelock==3.14.0 # gsy-framework # tox # virtualenv -flake8==4.0.1 - # via - # -r requirements/base.txt - # flake8-tuple - # gsy-framework -flake8-tuple==0.4.1 - # via - # -r requirements/base.txt - # gsy-framework geocoder==1.17.5 # via # -r requirements/base.txt @@ -126,10 +113,6 @@ idna==3.7 # -r requirements/base.txt # gsy-framework # requests -importlib-resources==6.4.0 - # via - # -r requirements/base.txt - # gsy-framework invoke==2.2.0 # via fabric isort==5.13.2 @@ -148,11 +131,7 @@ kafka-python==2.0.2 # -r requirements/base.txt # gsy-framework mccabe==0.6.1 - # via - # -r requirements/base.txt - # flake8 - # gsy-framework - # pylint + # via pylint mpmath==1.3.0 # via # -r requirements/base.txt @@ -162,7 +141,7 @@ nodeenv==1.8.0 # -r requirements/base.txt # gsy-framework # pre-commit -numpy==1.26.4 +numpy==1.24.4 # via -r requirements/base.txt openpyxl==3.0.10 # via @@ -181,10 +160,6 @@ pendulum==2.1.2 # via # -r requirements/base.txt # gsy-framework -pkgutil-resolve-name==1.3.10 - # via - # -r requirements/base.txt - # gsy-framework platformdirs==4.2.2 # via # -r requirements/base.txt @@ -207,22 +182,12 @@ pre-commit==3.5.0 # gsy-framework psutil==5.9.8 # via -r requirements/dev.in -psycopg2==2.9.9 +psycopg2==2.9.10 # via -r requirements/base.txt -psycopg2-binary==2.9.9 +psycopg2-binary==2.9.10 # via -r requirements/base.txt -pycodestyle==2.8.0 - # via - # -r requirements/base.txt - # flake8 - # gsy-framework pycparser==2.22 # via cffi -pyflakes==2.4.0 - # via - # -r requirements/base.txt - # flake8 - # gsy-framework pylint==3.2.0 # via -r requirements/dev.in pynacl==1.5.0 @@ -239,7 +204,7 @@ python-dateutil==2.9.0.post0 # pendulum python-rex==0.4 # via -r requirements/base.txt -pytz==2024.1 +pytz==2024.2 # via -r requirements/base.txt pytzdata==2020.1 # via @@ -288,7 +253,6 @@ rq==1.16.2 six==1.16.0 # via # -r requirements/base.txt - # flake8-tuple # geocoder # gsy-framework # python-dateutil @@ -305,10 +269,6 @@ tenacity==8.3.0 # via # -r requirements/base.txt # plotly -tomli==2.0.1 - # via - # -r requirements/base.txt - # gsy-framework tomlkit==0.12.5 # via pylint tox==4.15.0 @@ -336,10 +296,6 @@ websockets==12.0 # gsy-framework wrapt==1.16.0 # via deprecated -zipp==3.18.2 - # via - # -r requirements/base.txt - # gsy-framework # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/tests.txt b/requirements/tests.txt index 3d8f202d86..36ef39edc4 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -10,10 +10,6 @@ astroid==3.2.1 # via # -r requirements/dev.txt # pylint -async-timeout==4.0.3 - # via - # -r requirements/dev.txt - # gsy-framework attrs==23.2.0 # via # -r requirements/dev.txt @@ -131,15 +127,6 @@ filelock==3.14.0 # gsy-framework # tox # virtualenv -flake8==4.0.1 - # via - # -r requirements/dev.txt - # flake8-tuple - # gsy-framework -flake8-tuple==0.4.1 - # via - # -r requirements/dev.txt - # gsy-framework geocoder==1.17.5 # via # -r requirements/dev.txt @@ -158,10 +145,6 @@ idna==3.7 # -r requirements/dev.txt # gsy-framework # requests -importlib-resources==6.4.0 - # via - # -r requirements/dev.txt - # gsy-framework iniconfig==2.0.0 # via pytest invoke==2.2.0 @@ -193,8 +176,6 @@ markupsafe==2.1.5 mccabe==0.6.1 # via # -r requirements/dev.txt - # flake8 - # gsy-framework # pylint mpmath==1.3.0 # via @@ -205,7 +186,7 @@ nodeenv==1.8.0 # -r requirements/dev.txt # gsy-framework # pre-commit -numpy==1.26.4 +numpy==1.24.4 # via -r requirements/dev.txt openpyxl==3.0.10 # via @@ -237,10 +218,6 @@ pendulum==2.1.2 # via # -r requirements/dev.txt # gsy-framework -pkgutil-resolve-name==1.3.10 - # via - # -r requirements/dev.txt - # gsy-framework platformdirs==4.2.2 # via # -r requirements/dev.txt @@ -264,24 +241,14 @@ pre-commit==3.5.0 # gsy-framework psutil==5.9.8 # via -r requirements/dev.txt -psycopg2==2.9.9 +psycopg2==2.9.10 # via -r requirements/dev.txt -psycopg2-binary==2.9.9 +psycopg2-binary==2.9.10 # via -r requirements/dev.txt -pycodestyle==2.8.0 - # via - # -r requirements/dev.txt - # flake8 - # gsy-framework pycparser==2.22 # via # -r requirements/dev.txt # cffi -pyflakes==2.4.0 - # via - # -r requirements/dev.txt - # flake8 - # gsy-framework pylint==3.2.0 # via -r requirements/dev.txt pynacl==1.5.0 @@ -312,7 +279,7 @@ python-dateutil==2.9.0.post0 # pendulum python-rex==0.4 # via -r requirements/dev.txt -pytz==2024.1 +pytz==2024.2 # via -r requirements/dev.txt pytzdata==2020.1 # via @@ -365,7 +332,6 @@ six==1.16.0 # -r requirements/dev.txt # behave # configobj - # flake8-tuple # geocoder # gsy-framework # parse-type @@ -383,10 +349,6 @@ tenacity==8.3.0 # via # -r requirements/dev.txt # plotly -tomli==2.0.1 - # via - # -r requirements/dev.txt - # gsy-framework tomlkit==0.12.5 # via # -r requirements/dev.txt @@ -418,10 +380,6 @@ wrapt==1.16.0 # via # -r requirements/dev.txt # deprecated -zipp==3.18.2 - # via - # -r requirements/dev.txt - # gsy-framework # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/src/gsy_e/gsy_e_core/cli.py b/src/gsy_e/gsy_e_core/cli.py index 85dfd67f63..b4b695e690 100644 --- a/src/gsy_e/gsy_e_core/cli.py +++ b/src/gsy_e/gsy_e_core/cli.py @@ -182,6 +182,13 @@ def main(log_level): help="Market type. 0 for no-market, 1 for one-sided market, 2 for two-sided market, " "3 for coefficient-based trading.", ) +@click.option( + "--country-code", + type=str, + default=None, + help="Country code according to ISO 3166-1 alpha-2. Only used for " + "calculating carbon emissions.", +) def run( setup_module_name, settings_file, diff --git a/src/gsy_e/gsy_e_core/export.py b/src/gsy_e/gsy_e_core/export.py index 81c765fb0c..9f87d8f5f0 100644 --- a/src/gsy_e/gsy_e_core/export.py +++ b/src/gsy_e/gsy_e_core/export.py @@ -35,6 +35,7 @@ ) from gsy_framework.enums import AvailableMarketTypes, BidOfferMatchAlgoEnum from gsy_framework.utils import mkdir_from_str +from gsy_framework.sim_results.carbon_emissions.results import CarbonEmissionsHandler from pendulum import DateTime import gsy_e.constants @@ -56,6 +57,7 @@ from gsy_e.gsy_e_core.util import constsettings_to_dict, is_two_sided_market_simulation from gsy_e.models.area import Area + if TYPE_CHECKING: from gsy_e.gsy_e_core.sim_results.endpoint_buffer import SimulationEndpointBuffer from gsy_e.models.area.scm_manager import SCMManager @@ -84,6 +86,7 @@ "trade_profile": "trade_profile", "imported_exported_energy": "imported_exported_energy", "hierarchy_self_consumption_percent": "hierarchy_self_consumption_percent", + "carbon_emissions": "carbon_emissions", } @@ -93,12 +96,18 @@ class ExportAndPlot: # pylint: disable=too-many-arguments def __init__( - self, root_area: Area, path: str, subdir: str, endpoint_buffer: "SimulationEndpointBuffer" + self, + root_area: Area, + path: str, + subdir: str, + endpoint_buffer: "SimulationEndpointBuffer", + country_code: str, ): self.area = root_area self.endpoint_buffer = endpoint_buffer self.file_stats_endpoint = file_export_endpoints_factory() self.raw_data_subdir = None + self.country_code = country_code try: if path is not None: path = os.path.abspath(path) @@ -126,6 +135,16 @@ def _export_json_data(self) -> None: json.dump(constsettings_to_dict(), outfile, indent=2) for in_key, value in self.endpoint_buffer.generate_json_report().items(): out_key = results_field_to_json_filename_mapping[in_key] + + if in_key == "imported_exported_energy" and self.country_code: + carbon_emissions_handler = CarbonEmissionsHandler( + entsoe_api_key=os.environ.get("ENTSOE_API_SECURITY_TOKEN", None) + ) + value = carbon_emissions_handler.calculate_from_gsy_imported_exported_energy( + country_code=self.country_code, imported_exported_energy=value + ) + out_key = "carbon_emissions" + json_file = os.path.join(json_dir, out_key + ".json") with open(json_file, "w", encoding="utf-8") as outfile: json.dump(value, outfile, indent=2) diff --git a/src/gsy_e/gsy_e_core/simulation/results_manager.py b/src/gsy_e/gsy_e_core/simulation/results_manager.py index b8fcb54ad6..e4a63b5978 100644 --- a/src/gsy_e/gsy_e_core/simulation/results_manager.py +++ b/src/gsy_e/gsy_e_core/simulation/results_manager.py @@ -50,6 +50,7 @@ def __init__( export_path: str, export_subdir: Optional[str], started_from_cli: bool, + country_code: str = None, ) -> None: self.export_results_on_finish = export_results_on_finish self.export_path = export_path @@ -63,6 +64,7 @@ def __init__( self._endpoint_buffer = None self._export = None self._scm_manager = None + self.country_code = country_code def init_results( self, redis_job_id: str, area: "AreaBase", config_params: "SimulationSetup" @@ -71,10 +73,13 @@ def init_results( self._endpoint_buffer = SimulationEndpointBuffer( redis_job_id, config_params.seed, area, self.export_results_on_finish ) - if self.export_results_on_finish: self._export = ExportAndPlot( - area, self.export_path, self.export_subdir, self._endpoint_buffer + area, + self.export_path, + self.export_subdir, + self._endpoint_buffer, + self.country_code, ) @property diff --git a/src/gsy_e/gsy_e_core/simulation/simulation.py b/src/gsy_e/gsy_e_core/simulation/simulation.py index 3bf4fb3a92..87e7344487 100644 --- a/src/gsy_e/gsy_e_core/simulation/simulation.py +++ b/src/gsy_e/gsy_e_core/simulation/simulation.py @@ -77,6 +77,7 @@ def __init__( enable_bc=False, slot_length_realtime: Duration = None, incremental: bool = False, + country_code: str = None, ): self.status = SimulationStatusManager( paused=paused, pause_after=pause_after, incremental=incremental @@ -100,6 +101,7 @@ def __init__( export_path=export_path, export_subdir=export_subdir, started_from_cli=redis_job_id is None, + country_code=country_code ) self.area = None diff --git a/tox.ini b/tox.ini index 35813dfebf..c30bf3dfb5 100644 --- a/tox.ini +++ b/tox.ini @@ -29,6 +29,7 @@ allowlist_externals = behavex rm ln + flake8 [testenv:setup] pass_env = {[pkgenv]pass_env}