Passed
Pull Request — dev (#568)
by
unknown
01:47
created

data.datasets.etrago_setup.insert_carriers()   B

Complexity

Conditions 1

Size

Total Lines 76
Code Lines 58

Duplication

Lines 0
Ratio 0 %

Importance

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