Passed
Pull Request — dev (#1197)
by
unknown
05:18
created

pipeline_status_quo   A

Complexity

Total Complexity 0

Size/Duplication

Total Lines 530
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 0
eloc 321
dl 0
loc 530
rs 10
c 0
b 0
f 0
1
import os
2
3
from airflow.utils.dates import days_ago
4
import airflow
5
6
from egon.data.config import set_numexpr_threads
7
from egon.data.datasets import database
8
from egon.data.datasets.ch4_prod import CH4Production
9
from egon.data.datasets.ch4_storages import CH4Storages
10
from egon.data.datasets.chp import Chp
11
from egon.data.datasets.chp_etrago import ChpEtrago
12
from egon.data.datasets.data_bundle import DataBundle
13
from egon.data.datasets.demandregio import DemandRegio
14
from egon.data.datasets.district_heating_areas import DistrictHeatingAreas
15
from egon.data.datasets.electrical_neighbours import ElectricalNeighbours
16
from egon.data.datasets.electricity_demand import (
17
    CtsElectricityDemand,
18
    HouseholdElectricityDemand,
19
)
20
from egon.data.datasets.electricity_demand_etrago import ElectricalLoadEtrago
21
from egon.data.datasets.electricity_demand_timeseries import (
22
    hh_buildings,
23
    hh_profiles,
24
)
25
from egon.data.datasets.electricity_demand_timeseries.cts_buildings import (
26
    CtsDemandBuildings,
27
)
28
from egon.data.datasets.emobility.motorized_individual_travel import (
29
    MotorizedIndividualTravel,
30
)
31
from egon.data.datasets.emobility.motorized_individual_travel_charging_infrastructure import (  # noqa: E501
32
    MITChargingInfrastructure,
33
)
34
from egon.data.datasets.era5 import WeatherData
35
from egon.data.datasets.etrago_setup import EtragoSetup
36
from egon.data.datasets.fill_etrago_gen import Egon_etrago_gen
37
from egon.data.datasets.fix_ehv_subnetworks import FixEhvSubnetworks
38
from egon.data.datasets.gas_areas import GasAreas
39
from egon.data.datasets.gas_grid import GasNodesAndPipes
40
from egon.data.datasets.gas_neighbours import GasNeighbours
41
from egon.data.datasets.heat_demand import HeatDemandImport
42
from egon.data.datasets.heat_demand_europe import HeatDemandEurope
43
from egon.data.datasets.heat_demand_timeseries import HeatTimeSeries
44
from egon.data.datasets.heat_etrago import HeatEtrago
45
from egon.data.datasets.heat_etrago.hts_etrago import HtsEtragoTable
46
from egon.data.datasets.heat_supply import HeatSupply
47
from egon.data.datasets.heat_supply.individual_heating import HeatPumpsStatusQuo
48
from egon.data.datasets.industrial_sites import MergeIndustrialSites
49
from egon.data.datasets.industry import IndustrialDemandCurves
50
from egon.data.datasets.loadarea import LoadArea, OsmLanduse
51
from egon.data.datasets.mastr import mastr_data_setup
52
from egon.data.datasets.mv_grid_districts import mv_grid_districts_setup
53
from egon.data.datasets.osm import OpenStreetMap
54
from egon.data.datasets.osm_buildings_streets import OsmBuildingsStreets
55
from egon.data.datasets.osmtgmod import Osmtgmod
56
from egon.data.datasets.power_etrago import OpenCycleGasTurbineEtrago
57
from egon.data.datasets.power_plants import PowerPlants
58
from egon.data.datasets.pypsaeur import PreparePypsaEur, RunPypsaEur
59
from egon.data.datasets.renewable_feedin import RenewableFeedin
60
from egon.data.datasets.scenario_capacities import ScenarioCapacities
61
from egon.data.datasets.scenario_parameters import ScenarioParameters
62
from egon.data.datasets.society_prognosis import SocietyPrognosis
63
from egon.data.datasets.storages import Storages
64
from egon.data.datasets.storages_etrago import StorageEtrago
65
from egon.data.datasets.substation import SubstationExtraction
66
from egon.data.datasets.substation_voronoi import SubstationVoronoi
67
from egon.data.datasets.tyndp import Tyndp
68
from egon.data.datasets.vg250 import Vg250
69
from egon.data.datasets.vg250_mv_grid_districts import Vg250MvGridDistricts
70
from egon.data.datasets.zensus import ZensusMiscellaneous, ZensusPopulation
71
from egon.data.datasets.zensus_mv_grid_districts import ZensusMvGridDistricts
72
from egon.data.datasets.zensus_vg250 import ZensusVg250
73
74
# Set number of threads used by numpy and pandas
75
set_numexpr_threads()
76
77
78
79
with airflow.DAG(
80
    "powerd-status-quo-processing-pipeline",
81
    description="The PoWerD Status Quo data processing DAG.",
82
    default_args={"start_date": days_ago(1),
83
                  "email_on_failure": False,
84
                  "email":"[email protected]"},
85
    template_searchpath=[
86
        os.path.abspath(
87
            os.path.join(
88
                os.path.dirname(__file__), "..", "..", "processing", "vg250"
89
            )
90
        )
91
    ],
92
    is_paused_upon_creation=False,
93
    schedule_interval=None,
94
) as pipeline:
95
96
    tasks = pipeline.task_dict
97
98
    setup = database.Setup()
99
100
    osm = OpenStreetMap(dependencies=[setup])
101
102
    data_bundle = DataBundle(dependencies=[setup])
103
104
    # Import VG250 (Verwaltungsgebiete 250) data
105
    vg250 = Vg250(dependencies=[setup])
106
107
    # Scenario table
108
    scenario_parameters = ScenarioParameters(dependencies=[setup])
109
110
    # Download TYNDP data
111
    tyndp_data = Tyndp(dependencies=[setup])  # TODO: kick out or adjust
112
113
    # Import zensus population
114
    zensus_population = ZensusPopulation(dependencies=[setup, vg250])
115
116
    # Combine zensus and VG250 data
117
    zensus_vg250 = ZensusVg250(dependencies=[vg250, zensus_population])
118
119
    # Download and import zensus data on households, buildings and apartments
120
    zensus_miscellaneous = ZensusMiscellaneous(
121
        dependencies=[zensus_population, zensus_vg250]
122
    )
123
124
    # Import DemandRegio data
125
    demandregio = DemandRegio(
126
        dependencies=[data_bundle, scenario_parameters, setup, vg250]
127
    )
128
129
    # Society prognosis
130
    society_prognosis = SocietyPrognosis(
131
        dependencies=[demandregio, zensus_miscellaneous]
132
    )
133
134
    # OSM (OpenStreetMap) buildings, streets and amenities
135
    osm_buildings_streets = OsmBuildingsStreets(
136
        dependencies=[osm, zensus_miscellaneous]
137
    )
138
139
    # Import weather data
140
    weather_data = WeatherData(
141
        dependencies=[scenario_parameters, setup, vg250]
142
    )
143
144
    # Future national heat demands for foreign countries based on Hotmaps
145
    # download only, processing in PyPSA-Eur-Sec fork
146
    hd_abroad = HeatDemandEurope(dependencies=[setup])
147
148
    # Set eTraGo input tables
149
    setup_etrago = EtragoSetup(dependencies=[setup])
150
151
    substation_extraction = SubstationExtraction(dependencies=[osm, vg250])
152
153
    # Generate the osmTGmod ehv/hv grid model
154
    osmtgmod = Osmtgmod(
155
        dependencies=[
156
            scenario_parameters,
157
            setup_etrago,
158
            substation_extraction,
159
            tasks["osm.download"],
160
        ]
161
    )
162
163
    # Fix eHV subnetworks in Germany manually
164
    fix_subnetworks = FixEhvSubnetworks(dependencies=[osmtgmod])
165
166
    # Retrieve MaStR (Marktstammdatenregister) data
167
    mastr_data = mastr_data_setup(dependencies=[setup])
168
169
    # Create Voronoi polygons
170
    substation_voronoi = SubstationVoronoi(
171
        dependencies=[tasks["osmtgmod.substation.extract"], vg250]
172
    )
173
174
    # MV (medium voltage) grid districts
175
    mv_grid_districts = mv_grid_districts_setup(
176
        dependencies=[substation_voronoi]
177
    )
178
179
    # Calculate future heat demand based on Peta5_0_1 data
180
    heat_demand_Germany = HeatDemandImport(
181
        dependencies=[scenario_parameters, vg250, zensus_vg250]
182
    )
183
184
    # Extract landuse areas from the `osm` dataset
185
    osm_landuse = OsmLanduse(dependencies=[osm, vg250])
186
187
    # Calculate feedin from renewables
188
    renewable_feedin = RenewableFeedin(
189
        dependencies=[vg250, zensus_vg250, weather_data]
190
    )
191
192
    # Demarcate district heating areas
193
    district_heating_areas = DistrictHeatingAreas(
194
        dependencies=[
195
            heat_demand_Germany,
196
            scenario_parameters,
197
            zensus_miscellaneous,
198
        ]
199
    )
200
201
    # TODO: What does "trans" stand for?
202
    # Calculate dynamic line rating for HV (high voltage) trans lines
203
    # dlr = Calculate_dlr(
204
    #    dependencies=[data_bundle, osmtgmod, weather_data] # , fix_subnetworks]
205
    #)
206
207
    # Map zensus grid districts
208
    zensus_mv_grid_districts = ZensusMvGridDistricts(
209
        dependencies=[mv_grid_districts, zensus_population]
210
    )
211
212
    # Map federal states to mv_grid_districts
213
    vg250_mv_grid_districts = Vg250MvGridDistricts(
214
        dependencies=[mv_grid_districts, vg250]
215
    )
216
217
    # Create household demand profiles on zensus level
218
    hh_demand_profiles_setup = hh_profiles.HouseholdDemands(
219
        dependencies=[
220
            demandregio,
221
            tasks[
222
                "osm_buildings_streets"
223
                ".create-buildings-residential-zensus-mapping"
224
            ],
225
            vg250,
226
            zensus_miscellaneous,
227
            zensus_mv_grid_districts,
228
            zensus_vg250,
229
        ]
230
    )
231
232
    # Household electricity demand buildings
233
    hh_demand_buildings_setup = hh_buildings.setup(
234
        dependencies=[
235
            tasks[
236
                "electricity_demand_timeseries"
237
                ".hh_profiles"
238
                ".houseprofiles-in-census-cells"
239
            ]
240
        ]
241
    )
242
243
    # Get household electrical demands for cencus cells
244
    household_electricity_demand_annual = HouseholdElectricityDemand(
245
        dependencies=[
246
            tasks[
247
                "electricity_demand_timeseries"
248
                ".hh_buildings"
249
                ".map-houseprofiles-to-buildings"
250
            ]
251
        ]
252
    )
253
254
    # Distribute electrical CTS demands to zensus grid
255
    cts_electricity_demand_annual = CtsElectricityDemand(
256
        dependencies=[
257
            demandregio,
258
            heat_demand_Germany,
259
            # household_electricity_demand_annual,
260
            tasks["electricity_demand.create-tables"],
261
            tasks["etrago_setup.create-tables"],
262
            zensus_mv_grid_districts,
263
            zensus_vg250,
264
        ]
265
    )
266
267
    # Industry
268
    industrial_sites = MergeIndustrialSites(
269
        dependencies=[data_bundle, setup, vg250]
270
    )
271
    demand_curves_industry = IndustrialDemandCurves(
272
        dependencies=[
273
            demandregio,
274
            industrial_sites,
275
            osm_landuse,
276
            mv_grid_districts,
277
            osm,
278
        ]
279
    )
280
281
    # Electrical loads to eTraGo
282
    electrical_load_etrago = ElectricalLoadEtrago(
283
        dependencies=[
284
            cts_electricity_demand_annual,
285
            demand_curves_industry,
286
            hh_demand_buildings_setup,
287
            household_electricity_demand_annual,
288
            hh_demand_profiles_setup,
289
        ]
290
    )
291
292
    # Heat time Series
293
    heat_time_series = HeatTimeSeries(
294
        dependencies=[
295
            data_bundle,
296
            demandregio,
297
            heat_demand_Germany,
298
            district_heating_areas,
299
            vg250,
300
            zensus_mv_grid_districts,
301
            hh_demand_buildings_setup,
302
            weather_data,
303
        ]
304
    )
305
306
    cts_demand_buildings = CtsDemandBuildings(
307
        dependencies=[
308
            osm_buildings_streets,
309
            cts_electricity_demand_annual,
310
            hh_demand_buildings_setup,
311
            tasks["heat_demand_timeseries.export-etrago-cts-heat-profiles"],
312
        ]
313
    )
314
315
    prepare_pypsa_eur = PreparePypsaEur(
316
        dependencies=[
317
            weather_data,
318
            data_bundle,
319
        ]
320
    )
321
322
    # run pypsa-eur-sec
323
    run_pypsaeur = RunPypsaEur(
324
        dependencies=[
325
            prepare_pypsa_eur,
326
            weather_data,
327
            hd_abroad,
328
            osmtgmod,
329
            setup_etrago,
330
            data_bundle,
331
            electrical_load_etrago,
332
            heat_time_series,
333
        ]
334
    )
335
336
    # Deal with electrical neighbours
337
    foreign_lines = ElectricalNeighbours(
338
        dependencies=[prepare_pypsa_eur, tyndp_data, osmtgmod, fix_subnetworks]
339
    )
340
341
    # Import NEP (Netzentwicklungsplan) data
342
    scenario_capacities = ScenarioCapacities(
343
        dependencies=[
344
            data_bundle,
345
            run_pypsaeur,
346
            setup,
347
            vg250,
348
            zensus_population,
349
        ]
350
    )
351
352
    # Import gas grid
353
    gas_grid_insert_data = GasNodesAndPipes(
354
        dependencies=[
355
            data_bundle,
356
            foreign_lines,
357
            osmtgmod,
358
            scenario_parameters,
359
            tasks["etrago_setup.create-tables"],
360
        ]
361
    )
362
    # Create gas voronoi status quo
363
    create_gas_polygons_statusquo = GasAreas(
364
        dependencies=[setup_etrago, vg250, gas_grid_insert_data, substation_voronoi]
365
    )
366
367
    # Gas abroad
368
    gas_abroad_insert_data = GasNeighbours(
369
        dependencies=[
370
            gas_grid_insert_data,
371
            run_pypsaeur,
372
            foreign_lines,
373
            create_gas_polygons_statusquo,
374
        ]
375
    )
376
377
    # Import gas production
378
    gas_production_insert_data = CH4Production(
379
        dependencies=[create_gas_polygons_statusquo]
380
    )
381
382
    # Import CH4 storages
383
    insert_data_ch4_storages = CH4Storages(
384
        dependencies=[create_gas_polygons_statusquo]
385
    )
386
387
    # CHP locations
388
    chp = Chp(
389
        dependencies=[
390
            create_gas_polygons_statusquo,
391
            demand_curves_industry,
392
            district_heating_areas,
393
            industrial_sites,
394
            osm_landuse,
395
            mastr_data,
396
            mv_grid_districts,
397
        ]
398
    )
399
400
    # Power plants
401
    power_plants = PowerPlants(
402
        dependencies=[
403
            chp,
404
            cts_electricity_demand_annual,
405
            household_electricity_demand_annual,
406
            mastr_data,
407
            mv_grid_districts,
408
            renewable_feedin,
409
            scenario_parameters,
410
            setup,
411
            substation_extraction,
412
            tasks["etrago_setup.create-tables"],
413
            vg250_mv_grid_districts,
414
            zensus_mv_grid_districts,
415
        ]
416
    )
417
418
    create_ocgt = OpenCycleGasTurbineEtrago(
419
        dependencies=[create_gas_polygons_statusquo, power_plants]
420
    )
421
422
    # Fill eTraGo generators tables
423
    fill_etrago_generators = Egon_etrago_gen(
424
        dependencies=[power_plants, weather_data]
425
    )
426
427
    # Heat supply
428
    heat_supply = HeatSupply(
429
        dependencies=[
430
            chp,
431
            data_bundle,
432
            district_heating_areas,
433
            zensus_mv_grid_districts,
434
            scenario_capacities,
435
        ]
436
    )
437
438
439
    # Pumped hydro and home storage units
440
    storage_units = Storages(
441
        dependencies=[
442
            mastr_data,
443
            mv_grid_districts,
444
            power_plants,
445
            scenario_parameters,
446
            setup,
447
            vg250_mv_grid_districts,
448
            fill_etrago_generators,
449
        ]
450
    )
451
452
    # Heat to eTraGo
453
    heat_etrago = HeatEtrago(
454
        dependencies=[
455
            heat_supply,
456
            mv_grid_districts,
457
            renewable_feedin,
458
            setup_etrago,
459
            heat_time_series,
460
        ]
461
    )
462
463
    # CHP to eTraGo
464
    chp_etrago = ChpEtrago(dependencies=[chp, heat_etrago])
465
466
    # Heat pump disaggregation for status quo
467
    heat_pumps_sq = HeatPumpsStatusQuo(
468
        dependencies=[
469
            cts_demand_buildings,
470
            DistrictHeatingAreas,
471
            heat_supply,
472
            heat_time_series,
473
            power_plants,
474
        ]
475
    )
476
477
    # HTS to eTraGo table
478
    hts_etrago_table = HtsEtragoTable(
479
        dependencies=[
480
            district_heating_areas,
481
            heat_etrago,
482
            heat_time_series,
483
            mv_grid_districts,
484
            heat_pumps_sq,
485
        ]
486
    )
487
488
    # Storages to eTraGo
489
    storage_etrago = StorageEtrago(
490
        dependencies=[storage_units, scenario_parameters, setup_etrago]
491
    )
492
493
    # eMobility: motorized individual travel TODO: adjust for SQ
494
    emobility_mit = MotorizedIndividualTravel(
495
        dependencies=[
496
            data_bundle,
497
            mv_grid_districts,
498
            scenario_parameters,
499
            setup_etrago,
500
            zensus_mv_grid_districts,
501
            zensus_vg250,
502
            storage_etrago,
503
            hts_etrago_table,
504
            chp_etrago,
505
            heat_etrago,
506
            fill_etrago_generators,
507
            create_ocgt,
508
            gas_production_insert_data,
509
            insert_data_ch4_storages,
510
        ]
511
    )
512
513
    mit_charging_infrastructure = MITChargingInfrastructure(
514
        dependencies=[mv_grid_districts, hh_demand_buildings_setup]
515
    )
516
517
    # Create load areas
518
    load_areas = LoadArea(
519
        dependencies=[
520
            osm_landuse,
521
            zensus_vg250,
522
            household_electricity_demand_annual,
523
            tasks[
524
                "electricity_demand_timeseries"
525
                ".hh_buildings"
526
                ".get-building-peak-loads"
527
            ],
528
            cts_demand_buildings,
529
            demand_curves_industry,
530
        ]
531
    )
532
533
534