Passed
Push — dev ( cdb453...6b0082 )
by
unknown
02:40 queued 01:00
created

heavy_duty_transport.create_h2_buses   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 187
Duplicated Lines 0 %

Importance

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

6 Functions

Rating   Name   Duplication   Size   Complexity  
A read_hgv_h2_demand() 0 28 2
A assign_h2_buses() 0 17 1
A kg_per_year_to_mega_watt() 0 25 1
A insert_new_entries() 0 36 1
A insert_hgv_h2_demand() 0 19 2
A delete_old_entries() 0 22 1
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
    Parameters
77
    ----------
78
    hgv_h2_demand_gdf : geopandas.GeoDataFrame
79
        Load data to insert.
80
    """
81
    new_id = db.next_etrago_id("load")
82
    hgv_h2_demand_gdf["load_id"] = range(
83
        new_id, new_id + len(hgv_h2_demand_gdf)
84
    )
85
86
    # Add missing columns
87
    c = {"sign": -1, "type": np.nan, "p_set": np.nan, "q_set": np.nan}
88
    rename = {"scenario": "scn_name"}
89
    drop = ["hydrogen_consumption", "geometry"]
90
91
    hgv_h2_demand_df = pd.DataFrame(
92
        hgv_h2_demand_gdf.assign(**c)
93
        .rename(columns=rename)
94
        .drop(columns=drop)
95
        .reset_index(drop=True)
96
    )
97
98
    engine = db.engine()
99
    # Insert data to db
100
    hgv_h2_demand_df.to_sql(
101
        "egon_etrago_load",
102
        engine,
103
        schema="grid",
104
        index=False,
105
        if_exists="append",
106
    )
107
108
    return hgv_h2_demand_gdf
109
110
111
def delete_old_entries(scenario: str):
112
    """
113
    Delete loads and load timeseries.
114
    Parameters
115
    ----------
116
    scenario : str
117
        Name of the scenario.
118
    """
119
    # Clean tables
120
    db.execute_sql(
121
        f"""
122
        DELETE FROM grid.egon_etrago_load_timeseries
123
        WHERE "load_id" IN (
124
            SELECT load_id FROM grid.egon_etrago_load
125
            WHERE carrier = '{CARRIER}'
126
            AND scn_name = '{scenario}'
127
        )
128
        """
129
    )
130
131
    db.execute_sql(
132
        f"""
133
        DELETE FROM grid.egon_etrago_load
134
        WHERE carrier = '{CARRIER}'
135
        AND scn_name = '{scenario}'
136
        """
137
    )
138
139
140
def assign_h2_buses(scenario: str = "eGon2035"):
141
    hgv_h2_demand_gdf = read_hgv_h2_demand(scenario=scenario)
142
143
    hgv_h2_demand_gdf = db.assign_gas_bus_id(
144
        hgv_h2_demand_gdf, scenario, "H2_grid"
145
    )
146
147
    # Add carrier
148
    c = {"carrier": CARRIER}
149
    hgv_h2_demand_gdf = hgv_h2_demand_gdf.assign(**c)
150
151
    # Remove useless columns
152
    hgv_h2_demand_gdf = hgv_h2_demand_gdf.drop(
153
        columns=["geom", "NUTS0", "NUTS1", "bus_id"], errors="ignore"
154
    )
155
156
    return hgv_h2_demand_gdf
157
158
159
def read_hgv_h2_demand(scenario: str = "eGon2035"):
160
    with db.session_scope() as session:
161
        query = session.query(
162
            EgonHeavyDutyTransportVoronoi.nuts3,
163
            EgonHeavyDutyTransportVoronoi.scenario,
164
            EgonHeavyDutyTransportVoronoi.hydrogen_consumption,
165
        ).filter(EgonHeavyDutyTransportVoronoi.scenario == scenario)
166
167
    df = pd.read_sql(query.statement, query.session.bind, index_col="nuts3")
168
169
    sql_vg250 = """
170
                SELECT nuts as nuts3, geometry as geom
171
                FROM boundaries.vg250_krs
172
                WHERE gf = 4
173
                """
174
175
    srid = DATASET_CFG["tables"]["srid"]
176
177
    gdf_vg250 = db.select_geodataframe(sql_vg250, index_col="nuts3", epsg=srid)
178
179
    gdf_vg250["geometry"] = gdf_vg250.geom.centroid
180
181
    srid_buses = DATASET_CFG["tables"]["srid_buses"]
182
183
    return gpd.GeoDataFrame(
184
        df.merge(gdf_vg250[["geometry"]], left_index=True, right_index=True),
185
        crs=gdf_vg250.crs,
186
    ).to_crs(epsg=srid_buses)
187