Passed
Pull Request — dev (#1287)
by
unknown
04:58
created

data.datasets.etrago_setup.insert_carriers()   B

Complexity

Conditions 1

Size

Total Lines 75
Code Lines 57

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 57
dl 0
loc 75
rs 8.4072
c 0
b 0
f 0
cc 1
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
# coding: utf-8
2
import datetime
3
import json
4
5
from geoalchemy2.types import Geometry
6
from shapely.geometry import LineString
7
from sqlalchemy import (
8
    ARRAY,
9
    BigInteger,
10
    Boolean,
11
    Column,
12
    DateTime,
13
    Float,
14
    Integer,
15
    Numeric,
16
    String,
17
    Text,
18
    text,
19
)
20
from sqlalchemy.ext.declarative import declarative_base
21
import geopandas as gpd
22
import pandas as pd
23
import pypsa
24
25
from egon.data import db
26
from egon.data.datasets import Dataset
27
from egon.data.metadata import (
28
    context,
29
    contributors,
30
    license_egon_data_odbl,
31
    meta_metadata,
32
    sources
33
)
34
35
Base = declarative_base()
36
metadata = Base.metadata
37
38
network = pypsa.Network()
39
# add Storage key (called StorageUnit in PyPSA)
40
network.component_attrs["Storage"] = network.component_attrs["StorageUnit"]
41
42
43
def get_pypsa_field_descriptors(component, timeseries=False):
44
45
    ident = component.lower() + "_id"
46
47
    data = network.component_attrs[component].rename({"name": ident})
48
    data = data[data.status != "Output"]
49
50
    if timeseries:
51
        data = data[data["type"].str.contains("series")]
52
        data.loc["temp_id"] = [
53
            "integer",
54
            "n/a",
55
            "n/a",
56
            "Unique identifyier of temporal index",
57
            "Input",
58
        ]
59
60
    data.loc[ident, "type"] = "int"
61
    data.loc["scn_name"] = [
62
        "string",
63
        "n/a",
64
        "n/a",
65
        "Name of the eGon scenario",
66
        "Input",
67
    ]
68
    data.unit.fillna("none", inplace=True)
69
    data.default.fillna("n/a", inplace=True)
70
    return data
71
72
73
def get_meta(
74
    schema,
75
    component,
76
    description="TODO",
77
    source_list=[],
78
    contributor_list=[],
79
    timeseries=False,
80
):
81
82
    table = "egon_etrago_" + component.lower()
83
84
    if timeseries:
85
        table = table + "_timeseries"
86
    fields = (
87
        get_pypsa_field_descriptors(component, timeseries)
88
        .reset_index()
89
        .to_dict(orient="records")
90
    )
91
    # geometry column still missing
92
93
    meta = {
94
        "name": schema + "." + table,
95
        "title": component,
96
        "id": "WILL_BE_SET_AT_PUBLICATION",
97
        # no automatic description? PyPSA descriptions do not quite fit our
98
        # scope
99
        "description": description,
100
        "language": ["en-EN"],
101
        "publicationDate": datetime.date.today().isoformat(),
102
        "context": context(),
103
        "spatial": {
104
            "location": None,
105
            "extent": "Germany",
106
            "resolution": None,
107
        },
108
        "sources": source_list,
109
        "licenses": [license_egon_data_odbl()],
110
        "contributors": contributor_list,
111
        "resources": [
112
            {
113
                "profile": "tabular-data-resource",
114
                "name": schema + "." + table,
115
                "path": None,
116
                "format": "PostgreSQL",
117
                "encoding": "UTF-8",
118
                "schema": {
119
                    "fields": fields,
120
                    "primaryKey": ["scn_name", component.lower() + "_id"],
121
                    "foreignKeys": [],
122
                },
123
                "dialect": {
124
                    "delimiter": "",
125
                    "decimalSeparator": ""
126
                    },
127
            }
128
        ],
129
        "metaMetadata": meta_metadata(),
130
    }
131
132
    # Create json dump
133
    meta_json = "'" + json.dumps(meta, indent=4, ensure_ascii=False) + "'"
134
135
    return meta_json
136
137
138
class EtragoSetup(Dataset):
139
    def __init__(self, dependencies):
140
        super().__init__(
141
            name="EtragoSetup",
142
            version="0.0.12",
143
            dependencies=dependencies,
144
            tasks=(
145
                create_tables,
146
                create_etrago_id_sequences,
147
                {temp_resolution, insert_carriers},
148
            ),
149
        )
150
151
152
class EgonPfHvBus(Base):
153
154
    source_list = [
155
        sources()["egon-data"],
156
        sources()["openstreetmap"],
157
        sources()["peta"],
158
        sources()["SciGRID_gas"],
159
        sources()["bgr_inspeeds_data_bundle"],
160
    ]
161
162
    contributor_list = contributors(["ic", "cb", "ke", "an", "fw"])
163
    contributor_list[0]["comment"] = "Added electricity substations"
164
    contributor_list[1]["comment"] = "Added heat buses"
165
    contributor_list[2]["comment"] = "Added DSM buses"
166
    contributor_list[3]["comment"] = "Added CH4 sector buses"
167
    contributor_list[4]["comment"] = "Added H2 sector buses"
168
169
170
    __tablename__ = "egon_etrago_bus"
171
    __table_args__ = {
172
        "schema": "grid",
173
        "comment": get_meta(
174
            "grid",
175
            "Bus",
176
            source_list=source_list,
177
            contributor_list=contributor_list,
178
        ),
179
    }
180
181
    scn_name = Column(String, primary_key=True, nullable=False)
182
    bus_id = Column(BigInteger, primary_key=True, nullable=False)
183
    v_nom = Column(Float(53), server_default="1.")
184
    type = Column(Text)
185
    carrier = Column(Text)
186
    v_mag_pu_set = Column(Float(53))
187
    v_mag_pu_min = Column(Float(53), server_default="0.")
188
    v_mag_pu_max = Column(Float(53), server_default="inf")
189
    x = Column(Float(53), server_default="0.")
190
    y = Column(Float(53), server_default="0.")
191
    geom = Column(Geometry("POINT", 4326), index=True)
192
    country = Column(Text, server_default=text("'DE'::text"))
193
194
195 View Code Duplication
class EgonPfHvBusTimeseries(Base):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
196
197
    source_list = [
198
        sources()["egon-data"],
199
    ]
200
201
    contributor_list = contributors(["cb"])
202
    contributor_list[0]["comment"] = "Added metadata"
203
204
    __tablename__ = "egon_etrago_bus_timeseries"
205
    __table_args__ = {
206
        "schema": "grid",
207
        "comment": get_meta(
208
            "grid",
209
            "Bus",
210
            source_list=source_list,
211
            contributor_list=contributor_list,
212
            timeseries=True,
213
        ),
214
    }
215
216
    scn_name = Column(String, primary_key=True, nullable=False)
217
    bus_id = Column(BigInteger, primary_key=True, nullable=False)
218
    v_mag_pu_set = Column(ARRAY(Float(precision=53)))
219
220
221
class EgonPfHvGenerator(Base):
222
223
    source_list = [
224
        sources()["egon-data"],
225
        sources()["openstreetmap"],
226
        sources()["mastr"],
227
        sources()["nep2021"],
228
        sources()["tyndp"],
229
        sources()["SciGRID_gas"],
230
        sources()["Einspeiseatlas"],
231
        sources()["technology-data"],
232
        sources()["vg250"],
233
    ]
234
235
    contributor_list = contributors(["ic", "cb", "ce", "an", "ke"])
236
    contributor_list[0]["comment"] = "Added hydro and biomass plants"
237
    contributor_list[1]["comment"] = "Added solar and geothermal plants"
238
    contributor_list[2]["comment"] = "Added wind on- and offshore plants"
239
    contributor_list[3]["comment"] = "Added gas feedin generators"
240
    contributor_list[4]["comment"] = "Added pv ground mounted"
241
242
243
    __tablename__ = "egon_etrago_generator"
244
    __table_args__ = {
245
        "schema": "grid",
246
        "comment": get_meta(
247
            "grid",
248
            "Generator",
249
            source_list=source_list,
250
            contributor_list=contributor_list,
251
        ),
252
    }
253
254
    scn_name = Column(String, primary_key=True, nullable=False)
255
    generator_id = Column(BigInteger, primary_key=True, nullable=False)
256
    bus = Column(BigInteger)
257
    control = Column(Text)
258
    type = Column(Text)
259
    carrier = Column(Text)
260
    p_nom = Column(Float(53), server_default="0.")
261
    p_nom_extendable = Column(Boolean, server_default="False")
262
    p_nom_min = Column(Float(53), server_default="0.")
263
    p_nom_max = Column(Float(53), server_default="inf")
264
    p_min_pu = Column(Float(53), server_default="0.")
265
    p_max_pu = Column(Float(53), server_default="1.")
266
    p_set = Column(Float(53))
267
    q_set = Column(Float(53))
268
    sign = Column(Float(53), server_default="1.")
269
    marginal_cost = Column(Float(53), server_default="0.")
270
    build_year = Column(BigInteger, server_default="0")
271
    lifetime = Column(Float(53), server_default="inf")
272
    capital_cost = Column(Float(53), server_default="0.")
273
    efficiency = Column(Float(53), server_default="1.")
274
    committable = Column(Boolean, server_default="False")
275
    start_up_cost = Column(Float(53), server_default="0.")
276
    shut_down_cost = Column(Float(53), server_default="0.")
277
    min_up_time = Column(BigInteger, server_default="0")
278
    min_down_time = Column(BigInteger, server_default="0")
279
    up_time_before = Column(BigInteger, server_default="0")
280
    down_time_before = Column(BigInteger, server_default="0")
281
    ramp_limit_up = Column(Float(53), server_default="NaN")
282
    ramp_limit_down = Column(Float(53), server_default="NaN")
283
    ramp_limit_start_up = Column(Float(53), server_default="1.")
284
    ramp_limit_shut_down = Column(Float(53), server_default="1.")
285
    e_nom_max = Column(
286
        Float(53), server_default="inf"
287
    )  # [MWh(/y)] Value to be used in eTraGo to set constraint for the production over the year
288
289
290
class EgonPfHvGeneratorTimeseries(Base):
291
292
    source_list = [
293
        sources()["egon-data"],
294
        sources()["era5"],
295
    ]
296
297
    contributor_list = contributors(["cb"])
298
    contributor_list[0][
299
        "comment"
300
    ] = "Added p_max_pu timeseries for pv and wind"
301
302
303
    __tablename__ = "egon_etrago_generator_timeseries"
304
    __table_args__ = {
305
        "schema": "grid",
306
        "comment": get_meta(
307
            "grid",
308
            "Generator",
309
            source_list=source_list,
310
            contributor_list=contributor_list,
311
            timeseries=True,
312
        ),
313
    }
314
315
    scn_name = Column(String, primary_key=True, nullable=False)
316
    generator_id = Column(Integer, primary_key=True, nullable=False)
317
    temp_id = Column(Integer, primary_key=True, nullable=False)
318
    p_set = Column(ARRAY(Float(precision=53)))
319
    q_set = Column(ARRAY(Float(precision=53)))
320
    p_min_pu = Column(ARRAY(Float(precision=53)))
321
    p_max_pu = Column(ARRAY(Float(precision=53)))
322
    marginal_cost = Column(ARRAY(Float(precision=53)))
323
324
325 View Code Duplication
class EgonPfHvLine(Base):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
326
327
    source_list = [
328
        sources()["egon-data"],
329
        sources()["openstreetmap"],
330
    ]
331
332
    contributor_list = contributors(["ic", "cb"])
333
    contributor_list[0]["comment"] = "Added lines from osmTGmod tables"
334
    contributor_list[1]["comment"] = "Added meta data"
335
336
    __tablename__ = "egon_etrago_line"
337
    __table_args__ = {
338
        "schema": "grid",
339
        "comment": get_meta(
340
            "grid",
341
            "Line",
342
            source_list=source_list,
343
            contributor_list=contributor_list,
344
        ),
345
    }
346
347
    scn_name = Column(String, primary_key=True, nullable=False)
348
    line_id = Column(BigInteger, primary_key=True, nullable=False)
349
    bus0 = Column(BigInteger)
350
    bus1 = Column(BigInteger)
351
    type = Column(Text)
352
    carrier = Column(Text)
353
    x = Column(Numeric, server_default="0.")
354
    r = Column(Numeric, server_default="0.")
355
    g = Column(Numeric, server_default="0.")
356
    b = Column(Numeric, server_default="0.")
357
    s_nom = Column(Numeric, server_default="0.")
358
    s_nom_extendable = Column(Boolean, server_default="False")
359
    s_nom_min = Column(Float(53), server_default="0.")
360
    s_nom_max = Column(Float(53), server_default="inf")
361
    s_max_pu = Column(Float(53), server_default="1.")
362
    build_year = Column(BigInteger, server_default="0")
363
    lifetime = Column(Float(53), server_default="inf")
364
    capital_cost = Column(Float(53), server_default="0.")
365
    length = Column(Float(53), server_default="0.")
366
    cables = Column(Integer)
367
    terrain_factor = Column(Float(53), server_default="1.")
368
    num_parallel = Column(Float(53), server_default="1.")
369
    v_ang_min = Column(Float(53), server_default="-inf")
370
    v_ang_max = Column(Float(53), server_default="inf")
371
    v_nom = Column(Float(53))
372
    geom = Column(Geometry("MULTILINESTRING", 4326))
373
    topo = Column(Geometry("LINESTRING", 4326))
374
375
376
class EgonPfHvLineTimeseries(Base):
377
378
    source_list = [
379
        sources()["egon-data"],
380
        sources()["nep2021"],
381
        sources()["era5"],
382
    ]
383
384
    contributor_list = contributors(["ce", "cb"])
385
    contributor_list[0]["comment"] = "Added s_max_pu timeseries"
386
    contributor_list[1]["comment"] = "Added meta data"
387
388
    __tablename__ = "egon_etrago_line_timeseries"
389
    __table_args__ = {
390
        "schema": "grid",
391
        "comment": get_meta(
392
            "grid",
393
            "Line",
394
            source_list=source_list,
395
            contributor_list=contributor_list,
396
            timeseries=True,
397
        ),
398
    }
399
400
    scn_name = Column(String, primary_key=True, nullable=False)
401
    line_id = Column(BigInteger, primary_key=True, nullable=False)
402
    temp_id = Column(Integer, primary_key=True, nullable=False)
403
    s_max_pu = Column(ARRAY(Float(precision=53)))
404
405
406
class EgonPfHvLink(Base):
407
408
    source_list = [
409
        sources()["egon-data"],
410
        sources()["openstreetmap"],
411
        sources()["nep2021"],
412
        sources()["peta"],
413
        sources()["mastr"],
414
        sources()["SciGRID_gas"],
415
        sources()["pipeline_classification"],
416
        sources()["technology-data"],
417
        sources()["dsm-heitkoetter"],
418
        sources()["schmidt"],
419
        sources()["hotmaps_industrial_sites"],
420
        sources()["demandregio"],
421
    ]
422
423
    contributor_list = contributors(["ic", "cb", "ke", "ja", "fw", "an"])
424
    contributor_list[0]["comment"] = "Added DC lines from osmTGmod tables"
425
    contributor_list[1]["comment"] = "Added CHPs and heat links"
426
    contributor_list[2]["comment"] = "Added DSM links"
427
    contributor_list[3]["comment"] = "Added e-Mobility links"
428
    contributor_list[4]["comment"] = "Added H2 related links"
429
    contributor_list[5]["comment"] = "Added CH4 links"
430
431
432
    __tablename__ = "egon_etrago_link"
433
    __table_args__ = {
434
        "schema": "grid",
435
        "comment": get_meta(
436
            "grid",
437
            "Link",
438
            source_list=source_list,
439
            contributor_list=contributor_list,
440
        ),
441
    }
442
443
    __tablename__ = "egon_etrago_link"
444
    __table_args__ = {"schema": "grid", "comment": get_meta("grid", "Link")}
445
446
    scn_name = Column(String, primary_key=True, nullable=False)
447
    link_id = Column(BigInteger, primary_key=True, nullable=False)
448
    bus0 = Column(BigInteger)
449
    bus1 = Column(BigInteger)
450
    type = Column(Text)
451
    carrier = Column(Text)
452
    efficiency = Column(Float(53), server_default="1.")
453
    build_year = Column(BigInteger, server_default="0")
454
    lifetime = Column(Float(53), server_default="inf")
455
    p_nom = Column(Numeric, server_default="0.")
456
    p_nom_extendable = Column(Boolean, server_default="False")
457
    p_nom_min = Column(Float(53), server_default="0.")
458
    p_nom_max = Column(Float(53), server_default="inf")
459
    p_min_pu = Column(Float(53), server_default="0.")
460
    p_max_pu = Column(Float(53), server_default="1.")
461
    p_set = Column(Float(53))
462
    capital_cost = Column(Float(53), server_default="0.")
463
    marginal_cost = Column(Float(53), server_default="0.")
464
    length = Column(Float(53), server_default="0.")
465
    terrain_factor = Column(Float(53), server_default="1.")
466
    geom = Column(Geometry("MULTILINESTRING", 4326))
467
    topo = Column(Geometry("LINESTRING", 4326))
468
469
470
class EgonPfHvLinkTimeseries(Base):
471
    source_list = [
472
        sources()["egon-data"],
473
        sources()["era5"],
474
        sources()["dsm-heitkoetter"],
475
        sources()["schmidt"],
476
        sources()["hotmaps_industrial_sites"],
477
        sources()["openstreetmap"],
478
        sources()["demandregio"],
479
    ]
480
481
    contributor_list = contributors(["cb", "ke", "ja"])
482
    contributor_list[0][
483
        "comment"
484
    ] = "Added efficiency timeseries for heat pumps"
485
    contributor_list[1]["comment"] = "Added dsm link timeseries"
486
    contributor_list[2]["comment"] = "Added e mobility link timeseries"
487
488
    __tablename__ = "egon_etrago_link_timeseries"
489
    __table_args__ = {
490
        "schema": "grid",
491
        "comment": get_meta(
492
            "grid",
493
            "Link",
494
            source_list=source_list,
495
            contributor_list=contributor_list,
496
            timeseries=True,
497
        ),
498
    }
499
500
    scn_name = Column(String, primary_key=True, nullable=False)
501
    link_id = Column(BigInteger, primary_key=True, nullable=False)
502
    temp_id = Column(Integer, primary_key=True, nullable=False)
503
    p_set = Column(ARRAY(Float(precision=53)))
504
    p_min_pu = Column(ARRAY(Float(precision=53)))
505
    p_max_pu = Column(ARRAY(Float(precision=53)))
506
    efficiency = Column(ARRAY(Float(precision=53)))
507
    marginal_cost = Column(ARRAY(Float(precision=53)))
508
509
510
class EgonPfHvLoad(Base):
511
512
    source_list = [
513
        sources()["egon-data"],
514
        sources()["demandregio"],
515
        sources()["nep2021"],
516
        sources()["peta"],
517
        sources()["schmidt"],
518
        sources()["hotmaps_industrial_sites"],
519
        sources()["openstreetmap"],
520
        sources()["openffe_gas"],
521
        sources()["tyndp"],
522
    ]
523
524
    contributor_list = contributors(["ic", "cb", "an", "ja"])
525
    contributor_list[0]["comment"] = "Added electrical demands"
526
    contributor_list[1]["comment"] = "Added heat deands"
527
    contributor_list[2]["comment"] = "Added gas demands"
528
    contributor_list[3]["comment"] = "Added mobility demands"
529
530
531
    __tablename__ = "egon_etrago_load"
532
    __table_args__ = {
533
        "schema": "grid",
534
        "comment": get_meta(
535
            "grid",
536
            "Load",
537
            source_list=source_list,
538
            contributor_list=contributor_list,
539
        ),
540
    }
541
542
    scn_name = Column(String, primary_key=True, nullable=False)
543
    load_id = Column(BigInteger, primary_key=True, nullable=False)
544
    bus = Column(BigInteger)
545
    type = Column(Text)
546
    carrier = Column(Text)
547
    p_set = Column(Float(53))
548
    q_set = Column(Float(53))
549
    sign = Column(Float(53), server_default="-1.")
550
551
552
class EgonPfHvLoadTimeseries(Base):
553
    source_list = [
554
        sources()["egon-data"],
555
        sources()["demandregio"],
556
        sources()["nep2021"],
557
        sources()["peta"],
558
        sources()["openffe_gas"],
559
        sources()["tyndp"],
560
        sources()["era5"],
561
        sources()["schmidt"],
562
        sources()["hotmaps_industrial_sites"],
563
        sources()["openstreetmap"],
564
    ]
565
566
    contributor_list = contributors(["cb", "ic", "ja", "an"])
567
    contributor_list[0]["comment"] = "Added heat load timeseries"
568
    contributor_list[1]["comment"] = "Added electricity load timeseries"
569
    contributor_list[2]["comment"] = "Added e mobility load timeseries"
570
    contributor_list[3]["comment"] = "Added gas load timeseries"
571
572
573
    __tablename__ = "egon_etrago_load_timeseries"
574
    __table_args__ = {
575
        "schema": "grid",
576
        "comment": get_meta(
577
            "grid",
578
            "Load",
579
            source_list=source_list,
580
            contributor_list=contributor_list,
581
            timeseries=True,
582
        ),
583
    }
584
585
    scn_name = Column(String, primary_key=True, nullable=False)
586
    load_id = Column(BigInteger, primary_key=True, nullable=False)
587
    temp_id = Column(Integer, primary_key=True, nullable=False)
588
    p_set = Column(ARRAY(Float(precision=53)))
589
    q_set = Column(ARRAY(Float(precision=53)))
590
591
592
class EgonPfHvCarrier(Base):
593
    source_list = [
594
        sources()["egon-data"],
595
    ]
596
597
    contributor_list = contributors(["fw"])
598
    contributor_list[0]["comment"] = "Added list of carriers"
599
600
601
    __tablename__ = "egon_etrago_carrier"
602
    __table_args__ = {
603
        "schema": "grid",
604
        "comment": get_meta(
605
            "grid",
606
            "Carrier",
607
            source_list=source_list,
608
            contributor_list=contributor_list,
609
        ),
610
    }
611
612
    name = Column(Text, primary_key=True, nullable=False)
613
    co2_emissions = Column(Float(53), server_default="0.")
614
    color = Column(Text)
615
    nice_name = Column(Text)
616
    commentary = Column(Text)
617
618
619
class EgonPfHvStorage(Base):
620
621
    source_list = [
622
        sources()["egon-data"],
623
        sources()["nep2021"],
624
        sources()["mastr"],
625
        sources()["technology-data"],
626
    ]
627
628
    contributor_list = contributors(["ic"])
629
    contributor_list[0][
630
        "comment"
631
    ] = "Added battery and pumped hydro storage units"
632
633
634
    __tablename__ = "egon_etrago_storage"
635
    __table_args__ = {
636
        "schema": "grid",
637
        "comment": get_meta(
638
            "grid",
639
            "Storage",
640
            source_list=source_list,
641
            contributor_list=contributor_list,
642
        ),
643
    }
644
645
    scn_name = Column(String, primary_key=True, nullable=False)
646
    storage_id = Column(BigInteger, primary_key=True, nullable=False)
647
    bus = Column(BigInteger)
648
    control = Column(Text)
649
    type = Column(Text)
650
    carrier = Column(Text)
651
    p_nom = Column(Float(53), server_default="0.")
652
    p_nom_extendable = Column((Boolean), server_default="False")
653
    p_nom_min = Column(Float(53), server_default="0.")
654
    p_nom_max = Column(Float(53), server_default="inf")
655
    p_min_pu = Column(Float(53), server_default="-1.")
656
    p_max_pu = Column(Float(53), server_default="1.")
657
    p_set = Column(Float(53))
658
    q_set = Column(Float(53))
659
    sign = Column(Float(53), server_default="1")
660
    marginal_cost = Column(Float(53), server_default="0.")
661
    capital_cost = Column(Float(53), server_default="0.")
662
    build_year = Column(BigInteger, server_default="0")
663
    lifetime = Column(Float(53), server_default="inf")
664
    state_of_charge_initial = Column(Float(53), server_default="0")
665
    cyclic_state_of_charge = Column(Boolean, server_default="False")
666
    state_of_charge_set = Column(Float(53))
667
    max_hours = Column(Float(53), server_default="1")
668
    efficiency_store = Column(Float(53), server_default="1.")
669
    efficiency_dispatch = Column(Float(53), server_default="1.")
670
    standing_loss = Column(Float(53), server_default="0.")
671
    inflow = Column(Float(53), server_default="0.")
672
673
674
class EgonPfHvStorageTimeseries(Base):
675
    source_list = [
676
        sources()["egon-data"],
677
    ]
678
679
    contributor_list = contributors(["cb"])
680
    contributor_list[0]["comment"] = "Added metadata"
681
682
683
    __tablename__ = "egon_etrago_storage_timeseries"
684
    __table_args__ = {
685
        "schema": "grid",
686
        "comment": get_meta(
687
            "grid",
688
            "Storage",
689
            source_list=source_list,
690
            contributor_list=contributor_list,
691
            timeseries=True,
692
        ),
693
    }
694
695
    scn_name = Column(String, primary_key=True, nullable=False)
696
    storage_id = Column(BigInteger, primary_key=True, nullable=False)
697
    temp_id = Column(Integer, primary_key=True, nullable=False)
698
    p_set = Column(ARRAY(Float(precision=53)))
699
    q_set = Column(ARRAY(Float(precision=53)))
700
    p_min_pu = Column(ARRAY(Float(precision=53)))
701
    p_max_pu = Column(ARRAY(Float(precision=53)))
702
    state_of_charge_set = Column(ARRAY(Float(precision=53)))
703
    inflow = Column(ARRAY(Float(precision=53)))
704
    marginal_cost = Column(ARRAY(Float(precision=53)))
705
706
707
class EgonPfHvStore(Base):
708
    source_dict = sources()
709
710
    source_list = [
711
        source_dict["bgr_inspee"],
712
        source_dict["bgr_inspeeds"],
713
        source_dict["bgr_inspeeds_data_bundle"],
714
        source_dict["bgr_inspeeds_report"],
715
        source_dict["SciGRID_gas"],
716
        sources()["technology-data"],
717
        sources()["dsm-heitkoetter"],
718
        sources()["schmidt"],
719
        sources()["hotmaps_industrial_sites"],
720
        sources()["openstreetmap"],
721
        sources()["demandregio"],
722
    ]
723
    contributor_list = contributors(["an", "fw", "ke", "cb", "ja"])
724
    contributor_list[0]["comment"] = "Add H2 storage"
725
    contributor_list[1]["comment"] = "Add CH4 storage"
726
    contributor_list[2]["comment"] = "Add DSM storage"
727
    contributor_list[3]["comment"] = "Add heat storage"
728
    contributor_list[4]["comment"] = "Add e-mobility storage"
729
730
    __tablename__ = "egon_etrago_store"
731
    __table_args__ = {
732
        "schema": "grid",
733
        "comment": get_meta(
734
            "grid",
735
            "Store",
736
            source_list=source_list,
737
            contributor_list=contributor_list,
738
        ),
739
    }
740
741
    scn_name = Column(String, primary_key=True, nullable=False)
742
    store_id = Column(BigInteger, primary_key=True, nullable=False)
743
    bus = Column(BigInteger)
744
    type = Column(Text)
745
    carrier = Column(Text)
746
    e_nom = Column(Float(53), server_default="0.")
747
    e_nom_extendable = Column((Boolean), server_default="False")
748
    e_nom_min = Column(Float(53), server_default="0.")
749
    e_nom_max = Column(Float(53), server_default="inf")
750
    e_min_pu = Column(Float(53), server_default="0.")
751
    e_max_pu = Column(Float(53), server_default="1.")
752
    p_set = Column(Float(53))
753
    q_set = Column(Float(53))
754
    e_initial = Column(Float(53), server_default="0.")
755
    e_cyclic = Column(Boolean, server_default="False")
756
    sign = Column(Float(53), server_default="1")
757
    marginal_cost = Column(Float(53), server_default="0.")
758
    capital_cost = Column(Float(53), server_default="0.")
759
    standing_loss = Column(Float(53), server_default="0.")
760
    build_year = Column(BigInteger, server_default="0")
761
    lifetime = Column(Float(53), server_default="inf")
762
763
764
class EgonPfHvStoreTimeseries(Base):
765
    source_dict = sources()
766
    # TODO: Add other sources for dsm
767
    source_list = [
768
        sources()["technology-data"],
769
        sources()["dsm-heitkoetter"],
770
        sources()["schmidt"],
771
        sources()["hotmaps_industrial_sites"],
772
        sources()["openstreetmap"],
773
        sources()["demandregio"],
774
    ]
775
    contributor_list = contributors(["ke", "ja"])
776
    contributor_list[0]["comment"] = "Add DSM storage"
777
    contributor_list[1]["comment"] = "Add e-mobility storage"
778
779
    __tablename__ = "egon_etrago_store_timeseries"
780
    __table_args__ = {
781
        "schema": "grid",
782
        "comment": get_meta(
783
            "grid",
784
            "Store",
785
            source_list=source_list,
786
            contributor_list=contributor_list,
787
            timeseries=True,
788
        ),
789
    }
790
    scn_name = Column(String, primary_key=True, nullable=False)
791
    store_id = Column(BigInteger, primary_key=True, nullable=False)
792
    temp_id = Column(Integer, primary_key=True, nullable=False)
793
    p_set = Column(ARRAY(Float(precision=53)))
794
    q_set = Column(ARRAY(Float(precision=53)))
795
    e_min_pu = Column(ARRAY(Float(precision=53)))
796
    e_max_pu = Column(ARRAY(Float(precision=53)))
797
    marginal_cost = Column(ARRAY(Float(precision=53)))
798
799
800
class EgonPfHvTempResolution(Base):
801
    __tablename__ = "egon_etrago_temp_resolution"
802
    __table_args__ = {"schema": "grid"}
803
804
    temp_id = Column(BigInteger, primary_key=True, nullable=False)
805
    timesteps = Column(BigInteger, nullable=False)
806
    resolution = Column(Text)
807
    start_time = Column(DateTime)
808
809
810 View Code Duplication
class EgonPfHvTransformer(Base):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
811
812
    source_list = [
813
        sources()["egon-data"],
814
        sources()["openstreetmap"],
815
    ]
816
817
    contributor_list = contributors(["ic", "cb"])
818
    contributor_list[0]["comment"] = "Added transformes from osmTGmod tables"
819
    contributor_list[1]["comment"] = "Added meta data"
820
821
822
    __tablename__ = "egon_etrago_transformer"
823
    __table_args__ = {
824
        "schema": "grid",
825
        "comment": get_meta(
826
            "grid",
827
            "Transformer",
828
            source_list=source_list,
829
            contributor_list=contributor_list,
830
        ),
831
    }
832
833
    scn_name = Column(String, primary_key=True, nullable=False)
834
    trafo_id = Column(BigInteger, primary_key=True, nullable=False)
835
    bus0 = Column(BigInteger)
836
    bus1 = Column(BigInteger)
837
    type = Column(Text)
838
    model = Column((Text), server_default="t")
839
    x = Column((Numeric), server_default="0.")
840
    r = Column((Numeric), server_default="0.")
841
    g = Column((Numeric), server_default="0.")
842
    b = Column((Numeric), server_default="0.")
843
    s_nom = Column(Float(53), server_default="0.")
844
    s_nom_extendable = Column((Boolean), server_default="False")
845
    s_nom_min = Column(Float(53), server_default="0.")
846
    s_nom_max = Column(Float(53), server_default="inf")
847
    s_max_pu = Column(Float(53), server_default="1.")
848
    tap_ratio = Column(Float(53), server_default="1.")
849
    tap_side = Column((BigInteger), server_default="0")
850
    tap_position = Column((BigInteger), server_default="0")
851
    phase_shift = Column(Float(53), server_default="0.")
852
    build_year = Column(BigInteger, server_default="0")
853
    lifetime = Column(Float(53), server_default="inf")
854
    v_ang_min = Column(Float(53), server_default="-inf")
855
    v_ang_max = Column(Float(53), server_default="inf")
856
    capital_cost = Column(Float(53), server_default="0.")
857
    num_parallel = Column(Float(53), server_default="1.")
858
    geom = Column(Geometry("MULTILINESTRING", 4326))
859
    topo = Column(Geometry("LINESTRING", 4326))
860
861
862 View Code Duplication
class EgonPfHvTransformerTimeseries(Base):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
863
    source_list = [
864
        sources()["egon-data"],
865
    ]
866
867
    contributor_list = contributors(["cb"])
868
    contributor_list[0]["comment"] = "Added meta data"
869
870
    __tablename__ = "egon_etrago_transformer_timeseries"
871
    __table_args__ = {
872
        "schema": "grid",
873
        "comment": get_meta(
874
            "grid",
875
            "Transformer",
876
            source_list=source_list,
877
            contributor_list=contributor_list,
878
            timeseries=True,
879
        ),
880
    }
881
882
    scn_name = Column(String, primary_key=True, nullable=False)
883
    trafo_id = Column(BigInteger, primary_key=True, nullable=False)
884
    temp_id = Column(Integer, primary_key=True, nullable=False)
885
    s_max_pu = Column(ARRAY(Float(precision=53)))
886
887
888
class EgonPfHvBusmap(Base):
889
    __tablename__ = "egon_etrago_hv_busmap"
890
    __table_args__ = {"schema": "grid"}
891
892
    scn_name = Column(Text, primary_key=True, nullable=False)
893
    bus0 = Column(Text, primary_key=True, nullable=False)
894
    bus1 = Column(Text, primary_key=True, nullable=False)
895
    path_length = Column(Numeric)
896
    version = Column(Text, primary_key=True, nullable=False)
897
898
899
def create_tables():
900
    """Create tables for eTraGo input data.
901
    Returns
902
    -------
903
    None.
904
    """
905
    db.execute_sql("CREATE SCHEMA IF NOT EXISTS grid;")
906
    engine = db.engine()
907
908
    ##################### drop tables with old names #########################
909
    db.execute_sql(
910
        """
911
        DROP TABLE IF EXISTS grid.egon_pf_hv_bus;"""
912
    )
913
    db.execute_sql(
914
        """
915
        DROP TABLE IF EXISTS grid.egon_pf_hv_bus_timeseries;"""
916
    )
917
    db.execute_sql(
918
        """
919
        DROP TABLE IF EXISTS grid.egon_pf_hv_carrier;"""
920
    )
921
    db.execute_sql(
922
        """
923
        DROP TABLE IF EXISTS grid.egon_pf_hv_generator;"""
924
    )
925
    db.execute_sql(
926
        """
927
        DROP TABLE IF EXISTS grid.egon_pf_hv_generator_timeseries;"""
928
    )
929
    db.execute_sql(
930
        """
931
        DROP TABLE IF EXISTS grid.egon_pf_hv_line;"""
932
    )
933
    db.execute_sql(
934
        """
935
        DROP TABLE IF EXISTS grid.egon_pf_hv_line_timeseries;"""
936
    )
937
    db.execute_sql(
938
        """
939
        DROP TABLE IF EXISTS grid.egon_pf_hv_link;"""
940
    )
941
    db.execute_sql(
942
        """
943
        DROP TABLE IF EXISTS grid.egon_pf_hv_link_timeseries;"""
944
    )
945
    db.execute_sql(
946
        """
947
        DROP TABLE IF EXISTS grid.egon_pf_hv_load;"""
948
    )
949
    db.execute_sql(
950
        """
951
        DROP TABLE IF EXISTS grid.egon_pf_hv_load_timeseries;"""
952
    )
953
    db.execute_sql(
954
        """
955
        DROP TABLE IF EXISTS grid.egon_pf_hv_storage;"""
956
    )
957
    db.execute_sql(
958
        """
959
        DROP TABLE IF EXISTS grid.egon_pf_hv_storage_timeseries;"""
960
    )
961
    db.execute_sql(
962
        """
963
        DROP TABLE IF EXISTS grid.egon_pf_hv_store;"""
964
    )
965
    db.execute_sql(
966
        """
967
        DROP TABLE IF EXISTS grid.egon_pf_hv_store_timeseries;"""
968
    )
969
    db.execute_sql(
970
        """
971
        DROP TABLE IF EXISTS grid.egon_pf_hv_temp_resolution;"""
972
    )
973
    db.execute_sql(
974
        """
975
        DROP TABLE IF EXISTS grid.egon_pf_hv_transformer;"""
976
    )
977
    db.execute_sql(
978
        """
979
        DROP TABLE IF EXISTS grid.egon_pf_hv_transformer_timeseries;"""
980
    )
981
    ##########################################################################
982
983
    # Drop existing tables
984
    EgonPfHvBus.__table__.drop(bind=engine, checkfirst=True)
985
    EgonPfHvBusTimeseries.__table__.drop(bind=engine, checkfirst=True)
986
    EgonPfHvGenerator.__table__.drop(bind=engine, checkfirst=True)
987
    EgonPfHvGeneratorTimeseries.__table__.drop(bind=engine, checkfirst=True)
988
    EgonPfHvLine.__table__.drop(bind=engine, checkfirst=True)
989
    EgonPfHvLineTimeseries.__table__.drop(bind=engine, checkfirst=True)
990
    EgonPfHvLink.__table__.drop(bind=engine, checkfirst=True)
991
    EgonPfHvLinkTimeseries.__table__.drop(bind=engine, checkfirst=True)
992
    EgonPfHvLoad.__table__.drop(bind=engine, checkfirst=True)
993
    EgonPfHvLoadTimeseries.__table__.drop(bind=engine, checkfirst=True)
994
    EgonPfHvCarrier.__table__.drop(bind=engine, checkfirst=True)
995
    EgonPfHvStorage.__table__.drop(bind=engine, checkfirst=True)
996
    EgonPfHvStorageTimeseries.__table__.drop(bind=engine, checkfirst=True)
997
    EgonPfHvStore.__table__.drop(bind=engine, checkfirst=True)
998
    EgonPfHvStoreTimeseries.__table__.drop(bind=engine, checkfirst=True)
999
    EgonPfHvTempResolution.__table__.drop(bind=engine, checkfirst=True)
1000
    EgonPfHvTransformer.__table__.drop(bind=engine, checkfirst=True)
1001
    EgonPfHvTransformerTimeseries.__table__.drop(bind=engine, checkfirst=True)
1002
    EgonPfHvBusmap.__table__.drop(bind=engine, checkfirst=True)
1003
    # Create new tables
1004
    EgonPfHvBus.__table__.create(bind=engine, checkfirst=True)
1005
    EgonPfHvBusTimeseries.__table__.create(bind=engine, checkfirst=True)
1006
    EgonPfHvGenerator.__table__.create(bind=engine, checkfirst=True)
1007
    EgonPfHvGeneratorTimeseries.__table__.create(bind=engine, checkfirst=True)
1008
    EgonPfHvLine.__table__.create(bind=engine, checkfirst=True)
1009
    EgonPfHvLineTimeseries.__table__.create(bind=engine, checkfirst=True)
1010
    EgonPfHvLink.__table__.create(bind=engine, checkfirst=True)
1011
    EgonPfHvLinkTimeseries.__table__.create(bind=engine, checkfirst=True)
1012
    EgonPfHvLoad.__table__.create(bind=engine, checkfirst=True)
1013
    EgonPfHvLoadTimeseries.__table__.create(bind=engine, checkfirst=True)
1014
    EgonPfHvCarrier.__table__.create(bind=engine, checkfirst=True)
1015
    EgonPfHvStorage.__table__.create(bind=engine, checkfirst=True)
1016
    EgonPfHvStorageTimeseries.__table__.create(bind=engine, checkfirst=True)
1017
    EgonPfHvStore.__table__.create(bind=engine, checkfirst=True)
1018
    EgonPfHvStoreTimeseries.__table__.create(bind=engine, checkfirst=True)
1019
    EgonPfHvTempResolution.__table__.create(bind=engine, checkfirst=True)
1020
    EgonPfHvTransformer.__table__.create(bind=engine, checkfirst=True)
1021
    EgonPfHvTransformerTimeseries.__table__.create(
1022
        bind=engine, checkfirst=True
1023
    )
1024
    EgonPfHvBusmap.__table__.create(bind=engine, checkfirst=True)
1025
1026
1027
def create_etrago_id_sequences():
1028
    """
1029
    Forcefully recreate all required PostgreSQL sequences for etrago components.
1030
    Drops existing sequences and creates them fresh, starting from 1.
1031
1032
    This ensures that no stale or misaligned sequences remain from earlier states.
1033
1034
    Notes
1035
    -----
1036
    - All sequences are named grid.etrago_{component}_id_seq
1037
    - Existing sequences will be dropped with CASCADE
1038
    - New sequences will start from 1 (default PostgreSQL behavior)
1039
    """
1040
    components = [
1041
        "bus",
1042
        "line",
1043
        "transformer",
1044
        "load",
1045
        "storage",
1046
        "generator",
1047
        "link",
1048
        "store",
1049
    ]
1050
1051
    for component in components:
1052
        sequence_name = f"grid.etrago_{component}_id_seq"
1053
1054
        drop_query = f"DROP SEQUENCE IF EXISTS {sequence_name} CASCADE;"
1055
        create_query = f"CREATE SEQUENCE {sequence_name};"
1056
1057
        print(f"Recreating sequence: {sequence_name}")
1058
        db.execute_sql(drop_query)
1059
        db.execute_sql(create_query)
1060
1061
def temp_resolution():
1062
    """Insert temporal resolution for etrago
1063
1064
    Returns
1065
    -------
1066
    None.
1067
1068
    """
1069
1070
    db.execute_sql(
1071
        """
1072
        INSERT INTO grid.egon_etrago_temp_resolution
1073
        (temp_id, timesteps, resolution, start_time)
1074
        SELECT 1, 8760, 'h', TIMESTAMP '2011-01-01 00:00:00';
1075
        """
1076
    )
1077
1078
1079
def insert_carriers():
1080
    """Insert list of carriers into eTraGo table
1081
1082
    Returns
1083
    -------
1084
    None.
1085
1086
    """
1087
    # Delete existing entries
1088
    db.execute_sql(
1089
        """
1090
        DELETE FROM grid.egon_etrago_carrier
1091
        """
1092
    )
1093
1094
    # List carrier names from all components
1095
    df = pd.DataFrame(
1096
        data={
1097
            "name": [
1098
                "biogas",
1099
                "biogas_feedin",
1100
                "biogas_to_gas",
1101
                "biomass",
1102
                "pv",
1103
                "wind_offshore",
1104
                "wind_onshore",
1105
                "central_heat_pump",
1106
                "central_resistive_heater",
1107
                "CH4",
1108
                "CH4_for_industry",
1109
                "CH4_system_boundary",
1110
                "CH4_to_H2",
1111
                "dsm",
1112
                "H2",
1113
                "H2_feedin",
1114
                "H2_for_industry",
1115
                "H2_gridextension",
1116
                "H2_hgv_load",
1117
                "H2_overground",
1118
                "H2_retrofit",
1119
                "H2_saltcavern",
1120
                "H2_system_boundary",
1121
                "H2_to_CH4",
1122
                "H2_to_power",
1123
                "H2_underground",
1124
                "rural_heat_pump",
1125
                "industrial_biomass_CHP",
1126
                "industrial_gas_CHP",
1127
                "central_biomass_CHP_heat",
1128
                "central_biomass_CHP",
1129
                "central_gas_CHP",
1130
                "central_gas_CHP_heat",
1131
                "power_to_H2",
1132
                "rural_gas_boiler",
1133
                "central_gas_boiler",
1134
                "solar_thermal_collector",
1135
                "geo_thermal",
1136
                "AC",
1137
                "central_heat",
1138
                "rural_heat",
1139
                "natural_gas_feedin",
1140
                "pumped_hydro",
1141
                "battery",
1142
                "OCGT",
1143
            ]
1144
        }
1145
    )
1146
1147
    # Insert data into database
1148
    df.to_sql(
1149
        "egon_etrago_carrier",
1150
        schema="grid",
1151
        con=db.engine(),
1152
        if_exists="append",
1153
        index=False,
1154
    )
1155
1156
1157
def check_carriers():
1158
    """Check if any eTraGo table has carriers not included in the carrier table.
1159
1160
    Raises
1161
    ------
1162
    ValueError if carriers that are not defined in the carriers table are
1163
    used in any eTraGo table.
1164
    """
1165
    carriers = db.select_dataframe(
1166
        f"""
1167
        SELECT name FROM grid.egon_etrago_carrier
1168
        """
1169
    )
1170
    unknown_carriers = {}
1171
    tables = ["bus", "store", "storage", "link", "line", "generator", "load"]
1172
1173
    for table in tables:
1174
        # Delete existing entries
1175
        data = db.select_dataframe(
1176
            f"""
1177
            SELECT carrier FROM grid.egon_etrago_{table}
1178
            """
1179
        )
1180
        unknown_carriers[table] = data[~data["carrier"].isin(carriers)][
1181
            "carrier"
1182
        ].unique()
1183
1184
    if len(unknown_carriers) > 0:
1185
        msg = (
1186
            "The eTraGo tables contain carriers, that are not included in the "
1187
            "carrier table:\n"
1188
        )
1189
        for table, carriers in unknown_carriers.items():
1190
            carriers = [str(c) for c in carriers]
1191
            if len(carriers) > 0:
1192
                msg += table + ": '" + "', '".join(carriers) + "'\n"
1193
1194
        raise ValueError(msg)
1195
1196
1197
def link_geom_from_buses(df, scn_name):
1198
    """Add LineString geometry accoring to geometry of buses to links
1199
1200
    Parameters
1201
    ----------
1202
    df : pandas.DataFrame
1203
        List of eTraGo links with bus0 and bus1 but without topology
1204
    scn_name : str
1205
        Scenario name
1206
1207
    Returns
1208
    -------
1209
    gdf : geopandas.GeoDataFrame
1210
        List of eTraGo links with bus0 and bus1 but with topology
1211
1212
    """
1213
1214
    geom_buses = db.select_geodataframe(
1215
        f"""
1216
        SELECT bus_id, geom
1217
        FROM grid.egon_etrago_bus
1218
        WHERE scn_name = '{scn_name}'
1219
        """,
1220
        index_col="bus_id",
1221
        epsg=4326,
1222
    )
1223
1224
    # Create geometry columns for bus0 and bus1
1225
    df["geom_0"] = geom_buses.geom[df.bus0.values].values
1226
    df["geom_1"] = geom_buses.geom[df.bus1.values].values
1227
1228
    geometry = df.apply(
1229
        lambda x: LineString([x["geom_0"], x["geom_1"]]), axis=1
1230
    )
1231
    df = df.drop(["geom_0", "geom_1"], axis=1)
1232
1233
    gdf = gpd.GeoDataFrame(df, geometry=geometry, crs=4326).rename_geometry(
1234
        "topo"
1235
    )
1236
1237
    return gdf
1238