Source code for egon.data.datasets.heat_etrago.hts_etrago

"""
The central module creating heat demand time series for the eTraGo tool
"""
from egon.data import config, db
from egon.data.db import next_etrago_id
from egon.data.datasets import Dataset
from egon.data.datasets.scenario_parameters import get_sector_parameters

import pandas as pd
import numpy as np


[docs]def hts_to_etrago(): sources = config.datasets()["etrago_heat"]["sources"] targets = config.datasets()["etrago_heat"]["targets"] scenario = "eGon2035" carriers = ["central_heat", "rural_heat", "rural_gas_boiler"] for carrier in carriers: if carrier == "central_heat": # Map heat buses to district heating id and area_id # interlinking bus_id and area_id bus_area = db.select_dataframe( f""" SELECT bus_id, area_id, id FROM {targets['heat_buses']['schema']}. {targets['heat_buses']['table']} JOIN {sources['district_heating_areas']['schema']}. {sources['district_heating_areas']['table']} ON ST_Transform(ST_Centroid(geom_polygon), 4326) = geom WHERE carrier = '{carrier}' AND scenario='{scenario}' AND scn_name = '{scenario}' """, index_col="id", ) # district heating time series time series disct_time_series = db.select_dataframe( f""" SELECT * FROM demand.egon_timeseries_district_heating WHERE scenario ='{scenario}' """ ) # bus_id connected to corresponding time series bus_ts = pd.merge( bus_area, disct_time_series, on="area_id", how="inner" ) elif carrier == "rural_heat": # interlinking heat_bus_id and mv_grid bus_id bus_sub = db.select_dataframe( f""" SELECT {targets['heat_buses']['schema']}. {targets['heat_buses']['table']}.bus_id as heat_bus_id, {sources['egon_mv_grid_district']['schema']}. {sources['egon_mv_grid_district']['table']}.bus_id as bus_id FROM {targets['heat_buses']['schema']}. {targets['heat_buses']['table']} JOIN {sources['egon_mv_grid_district']['schema']}. {sources['egon_mv_grid_district']['table']} ON ST_Transform(ST_Centroid({sources['egon_mv_grid_district']['schema']}. {sources['egon_mv_grid_district']['table']}.geom), 4326) = {targets['heat_buses']['schema']}. {targets['heat_buses']['table']}.geom WHERE carrier = '{carrier}' AND scn_name = '{scenario}' """ ) ##**scenario name still needs to be adjusted in bus_sub** # individual heating time series ind_time_series = db.select_dataframe( f""" SELECT scenario, bus_id, dist_aggregated_mw FROM demand.egon_etrago_timeseries_individual_heating WHERE scenario ='{scenario}' AND carrier = 'heat_pump' """ ) # bus_id connected to corresponding time series bus_ts = pd.merge( bus_sub, ind_time_series, on="bus_id", how="inner" ) # Connect heat loads to heat buses bus_ts.loc[:, "bus_id"] = bus_ts.loc[:, "heat_bus_id"] else: efficiency_gas_boiler = get_sector_parameters("heat", "eGon2035")[ "efficiency" ]["rural_gas_boiler"] # Select rural heat demand coverd by individual gas boilers ind_time_series = db.select_dataframe( f""" SELECT * FROM demand.egon_etrago_timeseries_individual_heating WHERE scenario ='{scenario}' AND carrier = 'CH4' """ ) # Select geoetry of medium voltage grid districts mvgd_geom = db.select_geodataframe( f""" SELECT bus_id, ST_CENTROID(geom) as geom FROM {sources['egon_mv_grid_district']['schema']}. {sources['egon_mv_grid_district']['table']} """ ) # Select geometry of gas (CH4) voronoi gas_voronoi = db.select_geodataframe( f""" SELECT bus_id, geom FROM grid.egon_gas_voronoi WHERE scn_name = '{scenario}' AND carrier = 'CH4' """ ) # Map centroid of mvgd to gas voronoi join = mvgd_geom.sjoin(gas_voronoi, lsuffix="AC", rsuffix="gas")[ ["bus_id_AC", "bus_id_gas"] ].set_index("bus_id_AC") # Assign gas bus to each rural heat demand coverd by gas boiler ind_time_series["gas_bus"] = join.loc[ ind_time_series.bus_id ].values # Initialize dataframe to store final heat demand per gas node gas_ts = pd.DataFrame( index=ind_time_series["gas_bus"].unique(), columns=range(8760) ) # Group heat demand per hour in the year for i in range(8760): gas_ts[i] = ( ind_time_series.set_index("gas_bus") .dist_aggregated_mw.str[i] .groupby("gas_bus") .sum() .div(efficiency_gas_boiler) ) # Prepare resulting DataFrame bus_ts = pd.DataFrame(columns=["dist_aggregated_mw", "bus_id"]) # Insert values to dataframe bus_ts.dist_aggregated_mw = gas_ts.values.tolist() bus_ts.bus_id = gas_ts.index # Delete existing data from database db.execute_sql( f""" DELETE FROM grid.egon_etrago_load WHERE scn_name = '{scenario}' AND carrier = '{carrier}' """ ) db.execute_sql( f""" DELETE FROM grid.egon_etrago_load_timeseries WHERE scn_name = '{scenario}' AND load_id NOT IN ( SELECT load_id FROM grid.egon_etrago_load WHERE scn_name = '{scenario}') """ ) next_id = next_etrago_id("load") bus_ts["load_id"] = np.arange(len(bus_ts)) + next_id etrago_load = pd.DataFrame(index=range(len(bus_ts))) etrago_load["scn_name"] = scenario etrago_load["load_id"] = bus_ts.load_id etrago_load["bus"] = bus_ts.bus_id etrago_load["carrier"] = carrier etrago_load["sign"] = -1 etrago_load.to_sql( "egon_etrago_load", schema="grid", con=db.engine(), if_exists="append", index=False, ) etrago_load_timeseries = pd.DataFrame(index=range(len(bus_ts))) etrago_load_timeseries["scn_name"] = scenario etrago_load_timeseries["load_id"] = bus_ts.load_id etrago_load_timeseries["temp_id"] = 1 etrago_load_timeseries["p_set"] = bus_ts.loc[:, "dist_aggregated_mw"] etrago_load_timeseries.to_sql( "egon_etrago_load_timeseries", schema="grid", con=db.engine(), if_exists="append", index=False, )
[docs]class HtsEtragoTable(Dataset): """ Collect heat demand time series for the eTraGo tool This dataset collects data for individual and district heating demands and writes that into the tables that can be read by the eTraGo tool. *Dependencies* * :py:class:`DistrictHeatingAreas <egon.data.datasets.district_heating_areas.DistrictHeatingAreas>` * :py:class:`HeatEtrago <egon.data.datasets.heat_etrago.HeatEtrago>` * :py:class:`MvGridDistricts <egon.data.datasets.mv_grid_districts.mv_grid_districts_setup>` * :py:class:`HeatPumps2035 <egon.data.datasets.heat_supply.individual_heating.HeatPumps2035>` * :py:class:`HeatTimeSeries <egon.data.datasets.heat_demand_timeseries.HeatTimeSeries>` *Resulting tables* * :py:class:`grid.egon_etrago_load <egon.data.datasets.etrago_setup.EgonPfHvLoad>` is extended * :py:class:`grid.egon_etrago_load_timeseries <egon.data.datasets.etrago_setup.EgonPfHvLoadTimeseries>` is extended """ #: name: str = "HtsEtragoTable" #: version: str = "0.0.6" def __init__(self, dependencies): super().__init__( name=self.name, version=self.version, dependencies=dependencies, tasks=(hts_to_etrago,), )