Completed
Push — dev ( 85d654...312d71 )
by
unknown
21s queued 16s
created

data.datasets.emobility.heavy_duty_transport.create_h2_buses   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 191
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 8
eloc 95
dl 0
loc 191
rs 10
c 0
b 0
f 0

6 Functions

Rating   Name   Duplication   Size   Complexity  
A delete_old_entries() 0 24 1
A assign_h2_buses() 0 17 1
A kg_per_year_to_mega_watt() 0 25 1
A insert_new_entries() 0 38 1
A insert_hgv_h2_demand() 0 19 2
A read_hgv_h2_demand() 0 28 2
1
"""
2
Map demand to H2 buses and write to DB.
3
"""
4
from __future__ import annotations
5
6
from loguru import logger
7
import geopandas as gpd
8
import numpy as np
9
import pandas as pd
10
11
from egon.data import config, db
12
from egon.data.datasets.emobility.heavy_duty_transport.db_classes import (
13
    EgonHeavyDutyTransportVoronoi,
14
)
15
16
DATASET_CFG = config.datasets()["mobility_hgv"]
17
CARRIER = DATASET_CFG["constants"]["carrier"]
18
SCENARIOS = DATASET_CFG["constants"]["scenarios"]
19
ENERGY_VALUE = DATASET_CFG["constants"]["energy_value_h2"]
20
FAC = DATASET_CFG["constants"]["fac"]
21
HOURS_PER_YEAR = DATASET_CFG["constants"]["hours_per_year"]
22
23
24
def insert_hgv_h2_demand():
25
    """
26
    Insert list of hgv H2 demand (one per NUTS3) in database.
27
    """
28
    for scenario in SCENARIOS:
29
        delete_old_entries(scenario)
30
31
        hgv_gdf = assign_h2_buses(scenario=scenario)
32
33
        hgv_gdf = insert_new_entries(hgv_gdf)
34
35
        ts_df = kg_per_year_to_mega_watt(hgv_gdf)
36
37
        ts_df.to_sql(
38
            "egon_etrago_load_timeseries",
39
            schema="grid",
40
            con=db.engine(),
41
            if_exists="append",
42
            index=False,
43
        )
44
45
46
def kg_per_year_to_mega_watt(df: pd.DataFrame | gpd.GeoDataFrame):
47
    df = df.assign(
48
        p_set=df.hydrogen_consumption * ENERGY_VALUE * FAC / HOURS_PER_YEAR,
49
        q_set=np.nan,
50
        temp_id=1,
51
    )
52
53
    df.p_set = [[p_set] * HOURS_PER_YEAR for p_set in df.p_set]
54
55
    logger.debug(str(df.columns))
56
57
    df = (
58
        df.rename(columns={"scenario": "scn_name"})
59
        .drop(
60
            columns=[
61
                "hydrogen_consumption",
62
                "geometry",
63
                "bus",
64
                "carrier",
65
            ]
66
        )
67
        .reset_index(drop=True)
68
    )
69
70
    return pd.DataFrame(df)
71
72
73
def insert_new_entries(hgv_h2_demand_gdf: gpd.GeoDataFrame):
74
    """
75
    Insert loads.
76
77
    Parameters
78
    ----------
79
    hgv_h2_demand_gdf : geopandas.GeoDataFrame
80
        Load data to insert.
81
82
    """
83
    new_id = db.next_etrago_id("load")
84
    hgv_h2_demand_gdf["load_id"] = range(
85
        new_id, new_id + len(hgv_h2_demand_gdf)
86
    )
87
88
    # Add missing columns
89
    c = {"sign": -1, "type": np.nan, "p_set": np.nan, "q_set": np.nan}
90
    rename = {"scenario": "scn_name"}
91
    drop = ["hydrogen_consumption", "geometry"]
92
93
    hgv_h2_demand_df = pd.DataFrame(
94
        hgv_h2_demand_gdf.assign(**c)
95
        .rename(columns=rename)
96
        .drop(columns=drop)
97
        .reset_index(drop=True)
98
    )
99
100
    engine = db.engine()
101
    # Insert data to db
102
    hgv_h2_demand_df.to_sql(
103
        "egon_etrago_load",
104
        engine,
105
        schema="grid",
106
        index=False,
107
        if_exists="append",
108
    )
109
110
    return hgv_h2_demand_gdf
111
112
113
def delete_old_entries(scenario: str):
114
    """
115
    Delete loads and load timeseries.
116
117
    Parameters
118
    ----------
119
    scenario : str
120
        Name of the scenario.
121
122
    """
123
    # Clean tables
124
    db.execute_sql(
125
        f"""
126
        DELETE FROM grid.egon_etrago_load_timeseries
127
        WHERE "load_id" IN (
128
            SELECT load_id FROM grid.egon_etrago_load
129
            WHERE carrier = '{CARRIER}'
130
            AND scn_name = '{scenario}'
131
        )
132
        """
133
    )
134
135
    db.execute_sql(
136
        f"""
137
        DELETE FROM grid.egon_etrago_load
138
        WHERE carrier = '{CARRIER}'
139
        AND scn_name = '{scenario}'
140
        """
141
    )
142
143
144
def assign_h2_buses(scenario: str = "eGon2035"):
145
    hgv_h2_demand_gdf = read_hgv_h2_demand(scenario=scenario)
146
147
    hgv_h2_demand_gdf = db.assign_gas_bus_id(
148
        hgv_h2_demand_gdf, scenario, "H2_grid"
149
    )
150
151
    # Add carrier
152
    c = {"carrier": CARRIER}
153
    hgv_h2_demand_gdf = hgv_h2_demand_gdf.assign(**c)
154
155
    # Remove useless columns
156
    hgv_h2_demand_gdf = hgv_h2_demand_gdf.drop(
157
        columns=["geom", "NUTS0", "NUTS1", "bus_id"], errors="ignore"
158
    )
159
160
    return hgv_h2_demand_gdf
161
162
163
def read_hgv_h2_demand(scenario: str = "eGon2035"):
164
    with db.session_scope() as session:
165
        query = session.query(
166
            EgonHeavyDutyTransportVoronoi.nuts3,
167
            EgonHeavyDutyTransportVoronoi.scenario,
168
            EgonHeavyDutyTransportVoronoi.hydrogen_consumption,
169
        ).filter(EgonHeavyDutyTransportVoronoi.scenario == scenario)
170
171
    df = pd.read_sql(query.statement, query.session.bind, index_col="nuts3")
172
173
    sql_vg250 = """
174
                SELECT nuts as nuts3, geometry as geom
175
                FROM boundaries.vg250_krs
176
                WHERE gf = 4
177
                """
178
179
    srid = DATASET_CFG["tables"]["srid"]
180
181
    gdf_vg250 = db.select_geodataframe(sql_vg250, index_col="nuts3", epsg=srid)
182
183
    gdf_vg250["geometry"] = gdf_vg250.geom.centroid
184
185
    srid_buses = DATASET_CFG["tables"]["srid_buses"]
186
187
    return gpd.GeoDataFrame(
188
        df.merge(gdf_vg250[["geometry"]], left_index=True, right_index=True),
189
        crs=gdf_vg250.crs,
190
    ).to_crs(epsg=srid_buses)
191