'Raw' Datasets#
Solaratlas Brandenburg - Photovoltaikanlagen auf Dachflächen (WFBB)#
Abschätzung der installierten Leistung und des Ertrags von PV-Aufdachanlagen in Brandenburg der Wirtschaftsförderung Berlin-Brandenburg.
Quelle: Solaratlas Brandenburg
Hinweise:
- Datensatzbeschreibung:
solaratlas_datensatzbeschreibung_eignung_dachflaechen_pv.xlsx - Das Attribut
dach_potenzial_ertrag_kwh_agibt den potenziellen Ertrag in MWh an, nicht wie in Datensatzbeschreibung angegeben in kWh - Referenzwert für die Eignung (100 %) sind 1065 Volllaststunden (berechnet aus
dach_potenzial_ertrag_kwh_a/dach_potenzial_leistung_kw* 1000 /dach_eignung_prozent* 100)
Beschreibung:
Mit dieser Analyse sind die verfügbaren Flächen für Photovoltaikanlagen das prinzipiell realisierungsfähige Potenzial im Land Brandenburg ermittelt worden. Dabei sind alle theoretischen Potenziale aufgezeigt, von großen Freiflächen bis hin auf die Ebene von einzelnen Gebäuden.
Die Solarpotenziale auf Dachflächen wurden mit Hilfe dieser Datensätze berechnet:
- Amtliches Liegenschaftskatasterinformationssystem (ALKIS): Enthält sämtliche Informationen zu den im Land befindlichen Liegenschaften (Gebäude und Flurstücke).
- LOD2: Informationen zur Beschaffenheit der Dachflächen aller Gebäude im Land Brandenburg. Hierbei handelt es sich um ein vereinfachtes 3D-Gebäudemodell, bei dem jedem Gebäude eine passende standardisierte Dachform zugeordnet ist. Etwaige Dachaufbauten wie Kamine, Antennen oder Dachfenster sind in dem Datensatz nicht enthalten.
- bDOM: Bildbasiertes digitales Oberflächenmodell des Landes Brandenburg, das für die Verschattungsanalyse genutzt wurde.
- Photovoltaic Geographical Information System (PVGIS): System der EU, mit dem zur Kalibrierung der Einstrahlungswerte einer Dachfläche für jede Neigungs- und Ausrichtungskombination ein Verlustfaktor errechnet wurde.
Die ermittelten potenziell geeigneten Dachflächen wurden anschließend dem ALKIS-Objektkatalog der Gebäudenutzung den Hauptkategorien Öffentliche Zwecke, Wohnen, Wirtschaft/Gewerbe und Sonstige zugeordnet.
Kleinstgebäude, die für die Errichtung netzgekoppelter Photovoltaikanlagen in der Regel nicht in Frage kommen, wurden ausgeschlossen (Dachfläche bei Schrägdächern < 3 m², bei Flachdächern < 6 m²). Zur Berechnung der möglichen Leistung und Energiemenge wurde ein Referenzmodul gesetzt (300 Wp-Solarmodul mit den Abmessungen 1,65 m x 1,0 m, Modulwirkungsgrad von 18 %).
Die geeigneten Dachflächen wurden in Eignungsklassen eingruppiert. Hat ein Gebäude mehrere geeignete Dachflächen, so richtet sich die Eignungsklasse des gesamten Gebäudes nach der Eignung der größten Fläche. Die Eignungsklassen unterscheiden sich nach der nutzbaren Jahreseinstrahlung, die sich aus Neigung, Ausrichtung und Verschattung ergibt:
- gut geeignet: 100 % - 80 %
- geeignet: 80 % - 60 %
- bedingt geeignet: 60 % - 40 %
- nicht geeignet: < 40%
Bautechnische Gegebenheiten wie der Zustand und die Statik der Gebäude- oder Denkmalschutzauflagen sowie Einschränkungen durch kommunale Satzungen sind bei der Analyse nicht betrachtet worden. Die Ergebnisse der Dachflächen sind somit als erste Einschätzung geeignet und ersetzen für die konkrete Anlage nicht die Beurteilung durch Fachunternehmen bzw. eine detaillierte Einzelfallprüfung.
Dataset: raw/wfbb_pv_roof_potential
Bevölkerungsprognose Deutschland#
Vorausberechneter Bevölkerungsstand: Bundesländer, Stichtag, Varianten der Bevölkerungsvorausberechnung.
Bevölkerung 2022-2070 basierend auf der 15. koordinierten Bevölkerungsvorausberechnung des Statistischen Bundesamtes.
Quelle: Genesis Online 12421-0003-DLAND.
Dataset: raw/destatis_pop_prog
Erzeugungsanlagen aus Marktstammdatenregister#
Ereugungsanlagen aus dem Markstammdatenregister, das mit dem Tool open-mastr erstellt und abgelegt wurde. Die Daten wurden folgendermaßen erstellt:
from open_mastr import Mastr
db = Mastr()
db.download("bulk")
db.to_csv()
Anschließend wurden die Dateien komprimiert.
Das Marktstammdatenregister (MaStR) ist ein deutsches Register, welches von der Bundesnetzagentur (BNetza) bereitgestellt wird und alle in Deutschland befindlichen Strom- und Gasanlagen erfasst.
Datenstand: 27.11.2024
Dataset: raw/bnetza_mastr
AGEB – Anwendungsbilanzen für die Endenergiesektoren 2012 bis 2022#
Detaillierte Anwendungsbilanzen der Endenergiesektoren für 2021 und 2022 sowie zusammenfassende Zeitreihen zum Endenergieverbrauch nach Energieträgern und Anwendungszwecken für Jahre von 2012 bis 2022 der AG Energiebilanzen.
Dataset: raw/ageb_energy_balance
sEEnergies Pan-European Thermal Atlas 5.2 (Peta5)#
Wärmebedarf für Europa 2015 in GJ (1ha Auflösung) für
- Haushalte: Raumwärme und Warmwasser
- GHD: Raumwärme, Warmwasser und Prozesswärme
Die Daten können auf der Projektseite eingesehen werden.
Haushalte#
Abgerufen mittels
wget -O Peta5_0_1_HD_res.zip https://arcgis.com/sharing/rest/content/items/d7d18b63250240a49eb81db972aa573e/data
GHD und Industrie#
Abgerufen mittels
wget -O Peta5_0_1_HD_ser.zip https://arcgis.com/sharing/rest/content/items/52ff5e02111142459ed5c2fe3d80b3a0/data
Dataset: raw/seenergies_peta5
Regionalplan Anhalt-Bitterfeld-Wittenberg#
Geodatensätze aus Teilplänen Wind 2018 und 2027 der Regionalen Planungsgemeinschaft Anhalt-Bitterfeld-Wittenberg.
Sachlicher Teilplan Wind 2018#
Geodaten aus rechtskräftigem Sachlichen Teilplan Wind 2018.
Im Sachlichen Teilplan "Nutzung der Windenergie in der Planungsregion Anhalt-Bitterfeld-Wittenberg" vom 30.05.2018 werden 22 Vorranggebiete für die Nutzung der Windenergie mit der Wirkung von Eignungsgebieten festgelegt. Sie dienen der raumordnerischen Steuerung der Errichtung von raumbedeutsamen Windenergieanlagen in Konzentrationszonen.
Die oberste Landesentwicklungsbehörde hat am 01.08.2018 die Genehmigung erteilt. Mit Bekanntmachung der Genehmigung tritt der Sachliche Teilplan in Kraft.
Dateien:
- Vorrang-/Eignungsgebiete:
stp_2018_vreg.gpkg(Quelle)
Sachlicher Teilplan Wind 2027#
Geodaten aus Planentwurf des Sachlichen Teilplan Wind 2027.
Die Regionalversammlung hat am 03.03.2023 beschlossen, den Sachlichen Teilplan "Windenergie 2027 in der Planungsregion Anhalt-Bitterfeld-Wittenberg" aufzustellen und mit der Bekanntgabe der Allgemeinen Planungsabsicht die beabsichtigten Auswahlkriterien und mögliche Gebietskulisse der Vorranggebiete für die Nutzung der Windenergie bzw. für Repowering von Windenergieanlagen vorzustellen.
Dateien:
- Suchräume:
stp_2027_suchraum.gpkg(Quelle: RPG ABW) - Planabsicht Vorranggebiete:
stp_2027_ideen_vr.gpkg(Quelle: RPG ABW) - Planabsicht Repoweringgebiete:
stp_2027_ideen_repower.gpkg(Quelle: RPG ABW)
Dataset: raw/rpg_abw_regional_plan
Agri-PV-Potenzialflächen#
Potenzialflächen für Agri-Photovoltaik des Öko-Institut.
GIS-Info#
Die drei TIFF-Dateien enthalten Informationen darüber, wie viel Potenzialfläche pro Pixel mit einer Größe von einem Hektar vorhanden ist (1 = 1 ha/ha). Dies wurde erreicht, indem die Positivflächen aus dem Landnutzungsdatensatz mit den Ausschlussflächen in QGIS überlagert wurden. Die Flächen wurden ursprünglich in einem Raster mit einer Größe von 20x20 Metern erfasst und dann zu 1 Hektar großen Flächen zusammengefasst.
Positivgebiete#
- Realisierbares Gesamtpotenzial:
- Preidl_Landuse (Landnutzungsklassifikation)
- Klassen: 1 - 19
- Erschließbares Potenzial an Synergieeffekten auf Dauerkulturen
- Preidl_Landuse
- Klassen: 9 (legumes) ,11 (leeks), 14 (berries), 15 (stonefruits)
- Erschließbares Potenzial an geringer Nutzungskonkurrenz auf Gebieten mit geringer und mittlerer Bodengüte
- SQR_Germany:
- Werte: 50-70
Update: Aus diesem Datensatz werden aufgrund der Datengüte keine Dauerkulturen ("Raster_besonders_geeignete_Kulturen") verwendet.
Ausschlusskritieren#
| Kategorie | Bezeichnung | Quelle / Begründung |
|---|---|---|
| Biosphärengebiete | Kernzonen | BNatSchG § 25: Nur Maßnahmen, die dem Schutz, der Pflege oder der Entwicklung dienen, sind erlaubt. |
| Biotope | Geschützte Biotope | BNatSchG § 30: Eingriffe, die die Funktion beeinträchtigen, sind verboten. |
| Flughäfen und Flugplätze | Flächen für Flugverkehr | Luftverkehrsgesetz (LuftVG) § 8: Anlagen dürfen den Flugverkehr nicht gefährden. |
| Geländeneigung | Hangneigung größer 20 % | Keine spezifischen gesetzlichen Beschränkungen, jedoch erhöhte technische Anforderungen und Risiken. |
| Gewässer | Fließgewässer und stehende Gewässer | Wasserhaushaltsgesetz (WHG) § 35: Anlagen dürfen Gewässer und deren Nutzung nicht beeinträchtigen. |
| Landschaftsschutzgebiete | BNatSchG § 26: Anlagen dürfen den besonderen Schutzzweck nicht beeinträchtigen. Aber prinzipiell möglich. | |
| Nationale Naturmonumente | BNatSchG § 22: Anlagen könnten verboten sein, wenn sie den Schutzzweck des Naturmonuments beeinträchtigen. | |
| Nationalpark | Nationalpark | BNatSchG § 24: Eingriffe, die die Ziele gefährden, sind verboten. |
| Natura 2000-Gebiete | FFH & Vogelschutzgebiete | Errichtung nach Baurecht im Einzelfall möglich, allerdings nach EEG § 37 Abs. 3. Aus der Förderkulisse ausgeschlossen. |
| Naturdenkmale | Flächenhafte Naturdenkmale | BNatSchG § 28: Eingriffe, die die Schutzzwecke beeinträchtigen, sind verboten. |
| Naturschutzgebiete | Naturschutzgebiete | Bundesnaturschutzgesetz (BNatSchG) § 23: Anlagen dürfen Erhaltungsziele oder den Schutzzweck nicht gefährden. |
| Schienenstrecken | Bahnstrecken | Eisenbahn-Bau- und Betriebsordnung (EBO) § 4: Anlagen dürfen den Bahnbetrieb nicht gefährden oder behindern. |
| Schienenstrecken | Bahnverkehrsanlagen | Siehe Bahnstrecken. |
| Siedlungsflächen | Wohngebäude | Laut Bundesimmissionsschutzgesetz (BImSchG) § 3 sind Schutzabstände zu Wohngebieten notwendig, um die Immissionen zu minimieren. |
| Siedlungsflächen | Industrie und Gewerbegebiete | Keine spezifischen gesetzlichen Beschränkungen, jedoch nicht vorrangige Gebietskulisse für APV. Außerdem nicht in Flächenkulisse enthalten. |
| Straßen | Bundesautobahnen | Beibehaltung des 15m-Korridors nach EEG 2021 § 37 Abs. 1 |
| Straßen | Weitere Straßen | Siehe Bundesautobahnen. |
| Straßen | Wege | Nicht in Gebietskulisse enthalten |
| Überschwemmungsgebiete | Überflutungsflächen HQ100 | WHG § 76: Anlagen dürfen das Hochwasserrisiko nicht erhöhen. |
| Wald- und Forstflächen | Wald | Bundeswaldgesetz (BWaldG) § 9: Umwandlung von Wald in andere Nutzungsarten ist für Photovoltaikanlagen verboten. |
| Wasserschutzgebietszonen | Zone I und II | WHG § 51: Anlagen dürfen die Wasserqualität nicht gefährden. |
Datenherkunft:
| Kategorie | Datenquelle |
|---|---|
| Biosphärengebiete | BfN |
| Biotope | BfN |
| Biotopverbund | BfN |
| Flächenhafte Naturdenkmale | BfN |
| Geländeneigung | EU-DGM |
| Gewässer | DLM250 |
| Landschaftsschutzgebiete | BfN |
| Landwirtschaftliche Schläge mit Nutzungskategorie | Preidl, Sebastian; Lange, Maximilian; Doktor, Daniel (2020): Land cover classification map of Germany's agricultural area based on Sentinel-2A data from 2016 |
| Nationale Naturmonumente | BfN |
| Nationalpark | BfN |
| Natura 2000-Gebiete | BfN |
| Naturparke | BfN |
| Naturschutzgebiete | BfN |
| Sentinel-2A Landnutzungsklassifikation | Preidl, Sebastian; Lange, Maximilian; Doktor, Daniel (2020): Land cover classification map of Germany's agricultural area based on Sentinel-2A data from 2016 |
| Siedlungsflächen | DLM250 |
| Soil Quality Rating | BGR |
Quelle#
Öko-Institut: Potenzialflächen für Agri-Photovoltaik
Dataset: raw/oei_agri_pv
Regionalplan Oderland-Spree#
Geodatensätze aus Regionalplan 2018 und Vorentwurf 2024 der Regionalen Planungsgemeinschaft Oderland-Spree.
Sachlicher Teilregionalplan "Windenergienutzung" 2018#
Geodaten aus Sachlichen Teilplan Wind 2018.
- Eignungsgebiete:
Windeignungsgebiete_Satzung_2018_OLS.gpkg(Quelle: Regionale Planungsgemeinschaft OLS)
1. Entwurf Sachlicher Teilregionalplan "Erneuerbare Energien" 2024 (in Aufstellung)#
Geodaten aus Planentwurf des Sachlichen Teilregionalplan EE 2024.
- Vorranggebiete:
VR_Windenergienutzung_2024_RPG_OLS.gpkg, Quelle: Regionale Planungsgemeinschaft OLS
Hinweis: Der 1. Entwurf wird derzeit überarbeitet, die im Tool verwendeten Vorranggebiete unterliegen Änderungen.
Freiflächen-Photovoltaikanlagen#
- PV-Anlagen in OLS in verschiedenen Genehmigungsstatus:
PV_FFA_OLS_10_2024.gpkg(Stand: Oktober 2024), Quelle: Regionale Planungsgemeinschaft OLS - Negativkriterien Freiflächen-PV aus
Kriteriengerüst Photovoltaik-Freiflächenanlagen:
Negativkriterien_PV_RPG_OLS_07032024.gpkg(Stand: März 2024), Quelle: Regionale Planungsgemeinschaft OLS
Windenergieanlagen#
- Windenergieanlagen in OLS in verschiedenen Genehmigungstatus (Stand: 08.10.2024), Quelle: Regionale Planungsgemeinschaft OLS
Windenergieanlagen_vor_Inbetriebnahme_OLS.gpkgWindenergieanlagen_im_Verfahren_OLS.gpkgWindenergieanlagen_in_Betrieb_OLS.gpkg
Dataset: raw/rpg_ols_regional_plan
Temperatur#
Stündliche Mittelwerte der Luft- und Erdbodentemperatur des Deutschen Wetterdienstes (Climate Data Center) für das Jahr 2011 je Gemeinde in der Region ABW, vorverarbeitet im Projekt WindNODE.
Werte:
temp_amb: Lufttemperatur in 2 m Höhetemp_soil: Erdbodentemperatur in 1 m Tiefe
Verwendete Stationen:
- Wittenberg
- Köthen
- Jessnitz
- Seehausen
- Holzdorf
Die Zuordnung der Stationsmesswerte zu Gemeinden erfolgte über die jeweils nächstgelegene Wetterstation.
Dataset: raw/dwd_temperature
Bevölkerung#
Einwohnerzahl nach Gemeinden des Statistischen Bundesamts.
Dataset: raw/destatis_gv
Technologiedaten#
Jahresvolllaststunden#
Anhand typischer heutiger und prognostizierter Werte werden folgende Jahresvolllaststunden angenommen:
| Technologie | Jahr | Volllaststunden | Quelle(n) für Annahme | Anmerkung |
|---|---|---|---|---|
| Windenergie | 2023 | 1500 | Energieportal Brandenburg | |
| 2045 | 2200 | PV- und Windflächenrechner | ||
| Freiflächen-PV | 2023 | 910 | Energieportal Brandenburg, ISE | |
| 2045 | 960 | PV- und Windflächenrechner, Ariadne Szenarienreport | ||
| Aufdach-PV | 2023 | 750 | Energieportal Brandenburg, ISE | |
| 2045 | 910 | Ariadne Szenarienreport | ||
| Laufwasserkraft | 2022 | 500 | Energieportal Brandenburg | |
| 2045 | 500 | Energieportal Brandenburg | Annahme: Keine Änderung | |
| Bioenergie | 2023 | 6000 | Energieportal Brandenburg, ISE | Bioenergie-Stromerzeugung (ohne biogenen Teil des Abfalls) |
Datei: technology_data.json → full_load_hours
TBD: Generalisieren - automatische Generierung anhand von Global Wind Atlas / Global Solar Atlas.
Leistungsdichte#
Installierbare Leistung pro Fläche / spezifischer Flächenbedarf:
- Windenergie: 24 MW/km² (Annahme auf Basis von Quelle1 Quelle2, Quelle3)
- PV-Freiflächenanlagen (flach aufgeständert): 100 MW/km² (Annahme auf Basis von Quelle1 Quelle2)
- Agri-PV-Anlagen (hoch aufgeständert): 74 MW/km² (Quelle)
- Agri-PV-Anlagen (vertikal bifazial): 29 MW/km² (Quelle)
- PV-Aufdachanlagen: 140 MW/km² (Quelle)
- Solarthermie: - MW/km²
Datei: technology_data.json → power_density
Nennleistung Windenergieanlage#
Als Zukunftsanlage für 2045 wird eine Enercon E126 6500 (6,5 MW) angenommen. Diese wird für die Berechnung der Anlagenanzahl in den Ergebnissen verwendet.
Datei: technology_data.json → nominal_power_per_unit
Batterien#
- Kleinbatterien/Heimspeicher: Nennkapazität je installierter PV-Peakleistung und Speichernennleistung je installierter Speichernennkapazität aus bnetza_mastr und HTW.
- Großbatterien: Speichernennleistung je installierter Speichernennkapazität aus bnetza_mastr.
Datei: technology_data.json → batteries
Warmwasserspeicher#
- Kleinwärmespeicher (dezentral): Speichernennleistung je installierter Speichernennkapazität aus DEA
- Großwärmespeicher (Fernwärme): Speichernennleistung je installierter Speichernennkapazität aus DEA
Datei: technology_data.json → hot_water_storages
Kosten und Wirkungsgrade#
Datei: raw_costs_efficiencies.csv
Allgemein#
Preise werden aus den Technologie Datenblättern der Danish Energy Agency ([1], [2], [3], [4]) entnommen. Abweichungen werden gesondert genannt.
alle Preise werden auf Euro im Jahr 2020 (dis-)kontiert und damit inflationsbereinigt.
Für Quellen 1, 2, 3, 4 ist das meist die Umrechnung von 2015 zu 2020. Dafür folgende Formel verwendet:
P_(2020) = P_(2015)*f_(infl)
f_(infl) = (1+i_(2015))*(1+i_(2016))...*(1+i_(2019))
f_(infl) = 1,005 * 1,005 * 1.015 * 1,018 * 1,014 = 1,0582
Werte für 2045 werden durch lineare Extrapolation ermittelt.
biogas_upgrading plant#
Quelle: [4] "82 Biogas, upgrading"
Aufbereitung von Biogas zu Bio-SNG
biogas bpchp_central#
Quelle: 1 "06 Gas engines, biogas"
Backpressure Combined heat and power (bpchp) modelliert BHKWs
thermal effiency = electrical_effiency / (c_b+c_v) ( laut 1 S. 390)
biogas bpchp_decentral#
Quelle: 1 "06 Gas engines, biogas"
Identische Werte zu biogas bpchp_central. Split fürs Energiesystem, aber eingesetzte Technologie identisch.
biogas_plant#
Quelle 4: "81 Biogas Plant, Basic conf."
Stellt Biogas bereit, welches in KWK (biogas bpchp_central, biogas bpchp_decentral) genutzt werden kann
boiler_central#
Quelle 1: "44 Natural Gas DH Only"
boiler_decentral#
Quelle 2: "202 Gas boiler, ex single", "202 Gas boiler, ex apart", "202 Gas boiler, new single", "202 Gas boiler, new apart"
Es werden für jedes Szenario jeder Wert aus 4 Komponenten zusammengesetzt.
Diese sind die Kombinationen aus:
- Altbau-Neubau
- Einfamilienhaus-Mehrfamilienhaus
Diese Kompnonten werden durch Faktoren gewichtet zusammengefasst.
Für 2020:
- Verhältnis von Altbau-Neubau aus 7
- Verhätnis von Einfamilienhaus-Mehrfamilienhaus im Neubau aus 6, verbaute Gasheizungen aggregiert
- Verhätnis von Einfamilienhaus-Mehrfamilienhaus im Altbau wird als 0.7 / 0.3 angenommen
Für 2045:
- Verhältnis von Altbau-Neubau aus 7
- Verhätnis von Einfamilienhaus-Mehrfamilienhaus im Neubau aus 6, verbaute Gasheizungen in 2020
- Verhätnis von Einfamilienhaus-Mehrfamilienhaus im Altbau wird als 0.7 / 0.3 angenommen
volle Berechnungen siehe "boiler_small_script.py" im Code Anhang
ch4 bpchp_central#
Quelle: 1 "06 Gas engines, natural gas"
Backpressure Combined heat and power (bpchp) modelliert BHKWs
thermal effiency = electrical_effiency / (c_b+c_v) ( laut 1 S. 390)
ch4 bpchp_decentral#
Quelle: [1](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and "06 Gas engines, natural gas"
Identische Werte zu ch4 bpchp_central. Split fürs Energiesystem, aber eingesetzte Technologie identisch.
ch4 extchp_central#
Quellen: [1](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and "05 Gas turb. CC, steam extract., Large", [14] S. 20-21
ch4 extchp_decentral#
Quelle: [1](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and "05 Gas turb. CC, steam extract., Large"
[14] S. 20-21
Identisch wie ch4 extchp_central
gt#
Quelle: [1](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and " 04 Gas turb. simple cycle, L"
gas turbine, offener Prozess
heatpump_central#
Quelle: [1](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and " 40 Comp. hp, airsource 10 MW"
Wärmepumpentechnologie (Luft-Wasser-WP) aus Langfristigkeitsszenarien
heatpump_decentral#
Quellen: 2)
Es werden für jedes Szenario jeder Wert aus 8 Komponenten zusammengesetzt. Diese sind die Kombinationen aus:
- Sole-Umwelt
- Einfamilienhaus-Mehrfamilienhaus (fast alle WP in Einfamilienhäsuern!)
- Altbau-Neubau
Es wird das gemittelte Verhätnis Deutschlandweit der letzten 20 Jahre angenommen (BBSR; Bundesamt für Bauwesen und Raumordnung)
Für 2020 wurden Annahmen für das allgemeine Verhältnis zwischen den Möglichkeiten angenommen:
- Sole-Umwelt sind die aggregierten Absatzzahlen aus [5]
- Einfamilienhaus-Mehrfamilienhaus aus 6
- Altbau-Neubau aus 7
Mit diesen wird für 2045 wurden Annahmen für das allgemeine Verhältnis zwischen den Möglichkeiten angenommen:
- Sole-Umwelt = 0.87/0.13 (Das sind die Absatzzahlen aus 2022 aus der Branchenstudie)
- Einfamilienhaus-Mehrfamilienhaus = 0.7 / 0.3 (Das ist eine freie Annahme, die eine fortschreitende Verbreitung in Mehrfamilienhäusern annimmt)
- Altbau-Neubau = 0.699 / 0.301 (das gemittelte Verhätnis Deutschlandweit der letzten 20 Jahre)
Die Faktoren in 2045 sind daher:
- Altbau_Umwelt_EFH = 0.4256
- Altbau_Umwelt_MFH = 0.1824
- Altbau_Sole_EFH = 0.0636
- Altbau_Sole_MFH = 0.0272
- Neubau_Umwelt_EFH = 0.1833
- Neubau_Umwelt_MFH = 0.0785
- Neubau_Sole_EFH = 0.0273
- Neubau_Sole_MFH = 0.0117
Berechnung siehe "heatpump_small_script.py" im Code Anhang
large_scale_battery#
Quellen: [1](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and " 180 Lithium Ion Battery", Cebulla [9] S. 181
storage_fixom_cost Berechnung aus UMAS/Oemof_B3 übernommen, ohne Quelle dieser Berechnung gefunden zu haben.
storage_fixom_cost = 0,005 * storage_capacity_cost_overnight
Große Differenzen zwischen Windnode und UMAS, UMAS Methodik übernommen
pth_central#
Quellen: [1](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and " 41 Electric Boilers, small", "41 Electric Boilers, large"
Es wurde ein Mittelwert aus den Electric Biolers small und large gebildet, um relevante Größen in ABW abzubilden.
pth_decentral#
Quellen: 2: " 216 Electric heating,new single", "216 Electric heating,new apart"
Annahmen zu Gebäudebestand siehe heatpump_decentral, nur ohne Kombination mit Altbau, da power to heat in Altbauten vernachlässigbar selten (und wenn in anderen Technologien wie Nachtspeicherheizungen) vorkommt.
Berechnungen siehe "pth_decentral_script" im Code Anhang
small_scale_battery#
Quelle: 15, [17] S. 3
- capacity_cost_overnight: [15] S. 41
- effiency, lost_rate, lifetime: [15] S.v91
storage heat_central#
Quelle 3: " 141 Large hot water tank"
- capacity_cost_overnight und fixom_cost ignoriert, da storage_capacity_cost_overnight, storage_fixom_cost einen Wert hat
- storage heat_decentral
Quelle 3: " 141 Large hot water tank"
capacity_cost_overnight und fixom_cost ignoriert, da storage_capacity_cost_overnight, storage_fixom_cost einen Wert hat
Große Differenzen zwischen UMAS und Windnode, UMAS Methodik übernommen
hydro ror#
Quellen: [16]
- fixom_cost: S. 78
- capacity_cost_overnight: S.75
- lifetime: S. 72
lignite oven#
Quellen: 1 " 206 Wood stove, single, ex tank"
Der Kohleofen ist eine Komponente, die für die Abbildung des Ist-Zusandes relevant ist. Die Kohleheizung wird durch gesetzliche Regulierung nicht mehr neu verbaut werden können, wodurch die Komponente für die Optimierung nicht relevant ist. Auch die Datenlage für die Kohleheizung sehr schlecht ist, die Daten werden daher approximiert.
Keine direkten Werte vorhanden, daher Modellierung anhand der wood stove Werte
efficiency:
Differenz der Energie zwischen Holz und Kohle liegt im Heizwert des Brennstoffs. Daher wird die Effizienz der wood stove mit Faktor des Verhältnisses der Heizwerte multipliziert. Daten für Heizwerte von BMWK 11 und 12 ergibt einen Faktor von 4/3
fixom_cost:
Bestehen großteils aus Brennstoffkosten. Änderung zu wood stove besteht aus Heizwert (gewonnene Energie pro kg) und Preisdiff pro Kilogramm
Preise aus brikett-rekord.com [13]
lifetime:
identisch wie wood stove
marginal-cost: identisch wie wood stove
Aus den Annahmen folgt, dass die Investkosten ignoriert werden können.
pv_ground#
Quelle 1: " 22 Utility-scale PV", Vergleich [10]
marginal_cost = 0, da in Quellen nicht vorhanden
Kosten aus 1 im Bereich von [10]
pv_rooftop#
Quelle 1: " 22 PV commercial&industrial rooftop", "22 PV residential", Vergleich [10]
gewichteter Mittelwert zwischen kommerziellen und Wohnhaus PV.
Gewichtung anhand openMaStR Daten aus Pipeline
import geopandas as gpd
import os.path
data_folder = os.path.join("/ROAD/TO/DATA")
data = "bnetza_mastr_pv_roof_region.gpkg"
df = gpd.read_file(os.path.join(data_folder, data))
sum = df[["usage_sector", "status"]].groupby("usage_sector").count().sum()
industrial = (df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Industrie"][0] + \
df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Sonstige"][0] + \
df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Landwirtschaft"][0] + \
df[["usage_sector", "status"]].groupby("usage_sector").count().loc[
"Gewerbe, Handel und Dienstleistungen"][0]) \
/ sum
residental = (df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Öffentliches Gebäude"][0] +
df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Haushalt"][0]) / sum
return [industrial, residental]
ergibt 25 % industrial und 75% Haushalte.
marginal_cost = 0, da in Quellen nicht vorhanden
Kosten aus 1 im Bereich von [10]
thermalcollector_central#
Quelle: [1](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and " 46 Solar District Heating"
thermalcollector_decentral#
Quelle: [2](https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-individual-heating-plants " 215 Solar heating,ex single", "215 Solar heating,ex apart", "215 Solar heating,new single", "215 Solar heating,new apart"
Annahmen zu Gebäudebestand siehe heatpump_decentral.
Berechnungen siehe "thermalcollector_decentral_script" im Code Anhang
wind onshore#
Quelle 1: " 20 Onshore turbines", Vergleich 10
EE Kosten durchweg kleiner als in Windnode in 2020
Windnode bezieht sich auf Frauenhofer ISE aus 2018, Vorgängerstudie zu 10
Frauenhofer (S.
11) 10 CAPEX-Range höher als DEA 1 in 2020
1400000-2000000 10 zu 1190000 1 €/MW
keine Aussagen in Frauenhofer 10 über 2045
wir wählen DEA als Quelle für die Vergleichbarkeit, da Vergleichbarkeit in der Optimierung der Modellierung Vorrang hat
wood extchp_central#
Quelle: 1 " 09a Wood Chips, Medium"
[14] S. 20-21
wood extchp_decentral#
Quelle: 1 " 09a Wood Chips, Medium"
[14] S. 20-21
identisch zu wood extchp_central
wood oven#
Quelle: 2, " 204 Biomass auto,ex single", "204 Biomass auto,new single", "204 Biomass auto,ex apart", "204 Biomass auto,new apart"
Annahmen zu Gebäudebestand siehe heatpump_decentral.
Berechnungen siehe "wood_oven_script" im Code Anhang
Quellen#
[1] Danish Energy Agency (2016): "Technology Data - Energy Plants for Electricity and District heating generation", Version 13, von https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-generation-electricity-and
[2] Danish Energy Agency (2016): "Technology Data for heating installations", Version 4, von https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-individual-heating-plants
[3] Danish Energy Agency (2018): "Technology Data – Energy storage", Version 7, von https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-energy-storage
[4] Danish Energy Agency (2017): "Technology Data – Renewable fuels", Versoin 9, von https://ens.dk/en/our-services/projections-and-models/technology-data/technology-data-renewable-fuels
[5] Karl-Heinz Backhaus (Vaillant), Dr. Hendrik Ehrhardt (Stiebel Eltron), Sven Kersten (NIBE), Steffen Moser (EnBW), Frank Richert (Wolf), Ingo Rieger (Bosch), Egbert Tippelt ( Viessmann), André Jacob (BWP), Johanna Otting (BWP), Björn Schreinermacher (BWP)(2023): "Branchenstudie 2023: Marktentwicklung – Prognose –Handlungsempfehlungen", Bundesverband Wärmepumpe (BWP) e. V.
[6] Statistisches Landesamt Sachsen-Anhalt: "GENESIS-Tabelle: 31121-0006, Statistik der Baufertigstellungen", von https://genesis.sachsen-anhalt.de/genesis//online?operation=table&code=31121-0006&bypass=true&levelindex=0&levelid=1682324189765#abreadcrumb, Stand: 11.04.2023
[7] Statista Research Department(2021): "Struktur des Wohnungsbaus nach Neubau und Sanierung in Deutschland in den Jahren 2001 bis 2020", von https://de.statista.com/statistik/daten/studie/202207/umfrage/struktur-des-wohnungsbaus-nach-art-der-bauleistung-in-deutschland/, Stand: 03.04.2023 12:26:20
[8] Statista: "Daten und Fakten zur Inflation und den Verbraucherpreisen" , von https://de.statista.com/themen/112/inflation/#topicOverview , Stand: 29.03.2023
[9] Cebulla, Felix (2017): "Storage demand in highly renewable energy scenarios for Europe", OPUS - Online Publikationen der Universität Stuttgart, von https://elib.uni-stuttgart.de/handle/11682/9778
[10] Frauenhofer ISE (2019): "Stromgestehungskosten erneuerbare Energien", von https://www.ise.fraunhofer.de/de/veroeffentlichungen/studien/studie-stromgestehungskosten-erneuerbare-energien.html
[11] BMWK (2021): "Energiedaten" von https://www.bmwk.de/Redaktion/DE/Artikel/Energie/energiedaten-gesamtausgabe.html
[12] Michael Herrmann, Jürgen Weber: Öfen und Kamine: Raumheizungen fachgerecht planen und bauen. Beuth Verlag, 201, von https://books.google.de/books?id=n0fVYjrHAlwC&pg=PA58#v=onepage&q&f=false
[13] www.brikett-rekord.com: "Energiekostenvergleich", von https://www.brikett-rekord.com/de/heizwertvergleich-rekord-briketts.html, letzter Abruf 8.5.2023
[14] WindNode: Modell, Methodik, Daten, ABW; von: RLI letzer Abruf 8.8.2023
[15] Fluri, Verena: "Wirtschaftlichkeit von zukunftsfähigen Geschäftsmodellen dezentraler Stromspeicher" von https://www.zhb-flensburg.de/fileadmin/content/spezial-einrichtungen/zhb/dokumente/dissertationen/fluri/fluri-2019-wirtschaftlichkeit-dez-stromspeicher.pdf, letzter Abruf 8.8.2023
[16] Schröder, Andreas; Kunz, Friedrich; Meiss, Jan; Mendelevitch, Roman; Hirschhausen, Christian von: "Current and Prospective Costs of Electricity Generation until 2050" von https://www.diw.de/documents/publikationen/73/diw_01.c.424566.de/diw_datadoc_2013-068.pdf, letzter Abruf 8.8.2023
[17] Prüggler, Wolfgang (2019): "HEIMSPEICHERSYSTEME UND ZENTRALE BATTERIESPEICHER – KRITISCHE FAKTOREN DER WIRTSCHAFTLICHKEIT" von https://ens.dk/sites/ens.dk/files/Analyser/technology_data_catalogue_for_energy_storage.pdf, letzter Abruf 8.8.2023
Code Anhang#
wood_oven_script.py
import pandas as pd
import os.path
def linear_interpolate_2045(wert_1, wert_2):
zeit_1 = 2040
zeit_2 = 2050
wert = wert_1 + (((wert_2 - wert_1) / (zeit_2 - zeit_1)) * (2045 - zeit_1))
return wert
def get_agg_price_2045(dic):
# Neubau und Sanierungen allg nach BMI f. Deutschland
neubau = (0.36 + 0.36 + 0.37 + 0.38 + 0.35 + 0.34 + 0.26 + 0.22 + 0.22 + 0.22 + 0.25 + 0.26 + 0.27 + 0.28 + 0.30 + 0.32 + 0.32 + 0.32 + 0.31 + 0.31) / 20
altbau = 1 - neubau
# Verhältnisse Einfamilienhaus-Mehrfamilienhaus nach destatis 2020
single_new = 693 / 763
multiple_new = (763 - 693) / 763
# Einfamilinehaus-Mehrfamilienhaus im Altbau Annahme:
single_faktor = 0.7
multiple_faktor = 0.3
single_new_faktor = neubau * single_new
multiple_new_faktor = neubau * multiple_new
single_old_faktor = altbau * single_faktor
multiple_old_faktor = altbau * multiple_faktor
single_old = single_old_faktor * dic["single_old_price"]
multiple_old = multiple_old_faktor * dic["multiple_old_price"]
single_new = single_new_faktor * dic["single_new_price"]
multiple_new = multiple_new_faktor * dic["multiple_new_price"]
preis = single_old + multiple_old + single_new + multiple_new
return preis
## Daten aus DEA:
## einlesen von Daten
data_folder = os.path.join("/YOUR/DATA/ROAD/TAKE/ME/HOME/TO/THE/PLACE")
data = os.path.join(data_folder, "technology_data_heating_installations_-_0003.xlsx")
##datensheets
single_old = pd.read_excel(data, "204 Biomass auto,ex single", skiprows=4, nrows=33)
multiple_old = pd.read_excel(data, "204 Biomass auto,ex apart", skiprows=4, nrows=33)
single_new = pd.read_excel(data, "204 Biomass auto,new single", skiprows=4, nrows=33)
multiple_new = pd.read_excel(data, "204 Biomass auto,new apart", skiprows=4, nrows=33)
dic_capacity_cost_overnight_2045 = {
"single_old_price": linear_interpolate_2045((single_old.iat[19,5]*1000)/(single_old.iat[0,5]/1000), (single_old.iat[19,6]*1000)/(single_old.iat[0,6]/1000)),
"multiple_old_price": linear_interpolate_2045((multiple_old.iat[19,5]*1000)/(multiple_old.iat[0,5]/1000), (multiple_old.iat[19,6]*1000)/(multiple_old.iat[0,6]/1000)),
"single_new_price": linear_interpolate_2045((single_new.iat[19,5]*1000)/(single_new.iat[0,5]/1000), (single_new.iat[19,6]*1000)/(single_new.iat[0,6]/1000)),
"multiple_new_price": linear_interpolate_2045((multiple_new.iat[19,5]*1000)/(multiple_new.iat[0,5]/1000), (multiple_new.iat[19,6]*1000)/(multiple_new.iat[0,6]/1000)),
}
dic_effiency_2045 = {
"single_old_price": linear_interpolate_2045(single_old.iat[3,5], single_old.iat[3,6]),
"multiple_old_price": linear_interpolate_2045(multiple_old.iat[3,5], multiple_old.iat[3,6]) ,
"single_new_price": linear_interpolate_2045(single_new.iat[3,5], single_new.iat[3,6]),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[3,5], multiple_new.iat[3,6])
}
dic_fixom_cost_2045 = {
"single_old_price": linear_interpolate_2045((single_old.iat[24,5])/(single_old.iat[0,5]/1000), (single_old.iat[24,6])/(single_old.iat[0,6]/1000)),
"multiple_old_price": linear_interpolate_2045((multiple_old.iat[24,5])/(multiple_old.iat[0,5]/1000), (multiple_old.iat[24,6])/(multiple_old.iat[0,6]/1000)),
"single_new_price": linear_interpolate_2045((single_new.iat[24,5])/(single_new.iat[0,5]/1000), (single_new.iat[24,5])/(single_new.iat[0,5]/1000)),
"multiple_new_price": linear_interpolate_2045((multiple_new.iat[24,5])/(multiple_new.iat[0,5]/1000), (multiple_new.iat[24,6])/(multiple_new.iat[0,6]/1000)),
}
dic_lifetime_2045 = {
"single_old_price": linear_interpolate_2045(single_old.iat[5,5], single_old.iat[5,6]),
"multiple_old_price": linear_interpolate_2045(multiple_old.iat[5,5], multiple_old.iat[5,6]),
"single_new_price": linear_interpolate_2045(single_new.iat[5,5], single_new.iat[5,6]),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[5,5], multiple_new.iat[5,6]),
}
dic_marginal_cost_2045 = {
"single_old_price": linear_interpolate_2045(single_old.iat[23,2] / 1000, single_old.iat[23,2] / 1000),
"multiple_old_price": linear_interpolate_2045(multiple_old.iat[23,2] / 1000, multiple_old.iat[23,2] / 1000),
"single_new_price": linear_interpolate_2045(single_new.iat[23,2] / 1000,single_new.iat[23,2] ),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[23,2] / 1000, multiple_new.iat[23,2] / 1000),
}
dic_2045 = [dic_capacity_cost_overnight_2045,dic_effiency_2045, dic_fixom_cost_2045, dic_lifetime_2045, dic_marginal_cost_2045]
val_2045 = []
## Berechnungen
for dic in dic_2045:
val_2045.append(get_agg_price_2045(dic))
print(val_2045)
thermal_collector_small_script.py
import pandas as pd
import os.path
def linear_interpolate_2045(wert_1, wert_2):
zeit_1 = 2040
zeit_2 = 2050
wert = wert_1 + (((wert_2 - wert_1) / (zeit_2 - zeit_1)) * (2045 - zeit_1))
return wert
def get_agg_price_2045(dic):
# Neubau und Sanierungen allg nach BMI f. Deutschland
neubau = (0.36 + 0.36 + 0.37 + 0.38 + 0.35 + 0.34 + 0.26 + 0.22 + 0.22 + 0.22 + 0.25 + 0.26 + 0.27 + 0.28 + 0.30 + 0.32 + 0.32 + 0.32 + 0.31 + 0.31) / 20
altbau = 1 - neubau
# Verhältnisse Einfamilienhaus-Mehrfamilienhaus nach destatis 2020
single_new = 693 / 763
multiple_new = (763 - 693) / 763
# Einfamilinehaus-Mehrfamilienhaus im Altbau Annahme:
single_faktor = 0.7
multiple_faktor = 0.3
single_new_faktor = neubau * single_new
multiple_new_faktor = neubau * multiple_new
single_old_faktor = altbau * single_faktor
multiple_old_faktor = altbau * multiple_faktor
single_old = single_old_faktor * dic["single_old_price"]
multiple_old = multiple_old_faktor * dic["multiple_old_price"]
single_new = single_new_faktor * dic["single_new_price"]
multiple_new = multiple_new_faktor * dic["multiple_new_price"]
preis = single_old + multiple_old + single_new + multiple_new
return preis
## Daten aus DEA:
## einlesen von Daten
data_folder = os.path.join("/YOUR/DATA/ROAD/TAKE/ME/HOME/TO/THE/PLACE")
data = os.path.join(data_folder, "technology_data_heating_installations_-_0003.xlsx")
##datensheets
single_old = pd.read_excel(data, "215 Solar heating,ex single", skiprows=4, nrows=33)
multiple_old = pd.read_excel(data, "215 Solar heating,ex apart", skiprows=4, nrows=33)
single_new = pd.read_excel(data, "215 Solar heating,new single", skiprows=4, nrows=33)
multiple_new = pd.read_excel(data, "215 Solar heating,new apart", skiprows=4, nrows=33)
dic_capacity_cost_overnight_2045 = {
"single_old_price": linear_interpolate_2045((single_old.iat[19,5]*1000)/(single_old.iat[0,5]/1000), (single_old.iat[19,6]*1000)/(single_old.iat[0,6]/1000)),
"multiple_old_price": linear_interpolate_2045((multiple_old.iat[19,5]*1000)/(multiple_old.iat[0,5]/1000), (multiple_old.iat[19,6]*1000)/(multiple_old.iat[0,6]/1000)),
"single_new_price": linear_interpolate_2045((single_new.iat[19,5]*1000)/(single_new.iat[0,5]/1000), (single_new.iat[19,6]*1000)/(single_new.iat[0,6]/1000)),
"multiple_new_price": linear_interpolate_2045((multiple_new.iat[19,5]*1000)/(multiple_new.iat[0,5]/1000), (multiple_new.iat[19,6]*1000)/(multiple_new.iat[0,6]/1000)),
}
dic_fixom_cost_2045 = {
"single_old_price": linear_interpolate_2045((single_old.iat[24,5])/(single_old.iat[0,5]/1000), (single_old.iat[24,6])/(single_old.iat[0,6]/1000)),
"multiple_old_price": linear_interpolate_2045((multiple_old.iat[24,5])/(multiple_old.iat[0,5]/1000), (multiple_old.iat[24,6])/(multiple_old.iat[0,6]/1000)),
"single_new_price": linear_interpolate_2045((single_new.iat[24,5])/(single_new.iat[0,5]/1000), (single_new.iat[24,5])/(single_new.iat[0,5]/1000)),
"multiple_new_price": linear_interpolate_2045((multiple_new.iat[24,5])/(multiple_new.iat[0,5]/1000), (multiple_new.iat[24,6])/(multiple_new.iat[0,6]/1000)),
}
dic_lifetime_2045 = {
"single_old_price": linear_interpolate_2045(single_old.iat[5,5], single_old.iat[5,6]),
"multiple_old_price": linear_interpolate_2045(multiple_old.iat[5,5], multiple_old.iat[5,6]),
"single_new_price": linear_interpolate_2045(single_new.iat[5,5], single_new.iat[5,6]),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[5,5], multiple_new.iat[5,6]),
}
dic_2045 = [dic_capacity_cost_overnight_2045, dic_fixom_cost_2045, dic_lifetime_2045]
val_2045 = []
## Berechnungen
for dic in dic_2045:
val_2045.append(get_agg_price_2045(dic))
print(val_2045)
pv_rooftop_script.py:
import pandas as pd
import geopandas as gpd
import os.path
##trennt residential and industrial rooftop PV nach Nennleistung
def get_proprtion_residential_industrtial(df):
sum = df[["usage_sector", "status"]].groupby("usage_sector").count().sum()
industrial = (df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Industrie"][0] + \
df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Sonstige"][0] + \
df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Landwirtschaft"][0] + \
df[["usage_sector", "status"]].groupby("usage_sector").count().loc[
"Gewerbe, Handel und Dienstleistungen"][0]) \
/ sum
residental = (df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Öffentliches Gebäude"][0] +
df[["usage_sector", "status"]].groupby("usage_sector").count().loc["Haushalt"][0]) / sum
return [industrial, residental]
def get_qgis_df(GeoDataFrame):
gdf = gpd.read_file(GeoDataFrame, where="geometry_approximated='0'")
gdf.where(gdf["status"] == "In Betrieb").to_file("bnetza_mastr_pv_roof_region_filtered.gpkg")
def linear_interpolate_2045(wert_1, wert_2):
zeit_1 = 2040
zeit_2 = 2050
wert = wert_1 + (((wert_2 - wert_1) / (zeit_2 - zeit_1)) * (2045 - zeit_1))
return wert
def get_agg_price_2045(dic, proportion):
# getting faktoren
industrial_factor = proportion[0][0]
residential_factor = proportion[1][0]
residential = residential_factor * dic["residential_price"]
industrial = industrial_factor * dic["industrial_price"]
preis = residential + industrial
return preis
data_folder = os.path.join("/YOUR/DATA/ROAD/TAKE/ME/HOME/TO/THE/PLACE")
data = ["bnetza_mastr_pv_ground_region.gpkg", "bnetza_mastr_pv_roof_region.gpkg"]
df = gpd.read_file(os.path.join(data_folder, data[1]))
## Daten aus DEA:
## einlesen von Daten
data_folder_sheets = os.path.join("/YOUR/DATA/ROAD/TAKE/ME/HOME/TO/THE/PLACE")
data_sheets = os.path.join(data_folder_sheets, "technology_data_for_el_and_dh.xlsx")
##datensheets
residential = pd.read_excel(data_sheets, "22 Rooftop PV residential", skiprows=4, nrows=42)
industrial = pd.read_excel(data_sheets, "22 Rooftop PV comm.&industrial", skiprows=4, nrows=42)
proportion = get_proprtion_residential_industrtial(df)
dic_capacity_cost_overnight_2045 = {
"residential_price": linear_interpolate_2045(residential.iat[10,5], residential.iat[10,6])*1000000,
"industrial_price": linear_interpolate_2045(industrial.iat[10,5], industrial.iat[10,6])*1000000
}
dic_fixom_cost_2045 = {
"residential_price": linear_interpolate_2045(residential.iat[18,5], residential.iat[18,6]),
"industrial_price": linear_interpolate_2045(industrial.iat[18,5], industrial.iat[18,6]),
}
dic_lifetime_2045 = {
"residential_price": linear_interpolate_2045(residential.iat[3,5], residential.iat[3,6]),
"industrial_price": linear_interpolate_2045(industrial.iat[3,5], industrial.iat[3,6]),
}
dic_2045 = [dic_capacity_cost_overnight_2045, dic_fixom_cost_2045, dic_lifetime_2045]
val_2045 = []
## Berechnungen
for dic in dic_2045:
val_2045.append(get_agg_price_2045(dic, proportion))
print(dic_capacity_cost_overnight_2045, dic_fixom_cost_2045, dic_lifetime_2045)
print(proportion[0][0])
print(val_2045)
Pth_decentral_sc0irpt.py
import pandas as pd
import os.path
def linear_interpolate_2045(wert_1, wert_2):
zeit_1 = 2040
zeit_2 = 2050
wert = wert_1 + (((wert_2 - wert_1) / (zeit_2 - zeit_1)) * (2045 - zeit_1))
return wert
def get_agg_price_2045(dic):
# Neubau und Sanierungen allg nach BMI f. Deutschland
neubau = (0.36 + 0.36 + 0.37 + 0.38 + 0.35 + 0.34 + 0.26 + 0.22 + 0.22 + 0.22 + 0.25 + 0.26 + 0.27 + 0.28 + 0.30 + 0.32 + 0.32 + 0.32 + 0.31 + 0.31) / 20
# Verhältnisse Einfamilienhaus-Mehrfamilienhaus nach destatis 2020
single_new = 693 / 763
multiple_new = (763 - 693) / 763
single_new_faktor = single_new
multiple_new_faktor = multiple_new
single_new = single_new_faktor * dic["single_new_price"]
multiple_new = multiple_new_faktor * dic["multiple_new_price"]
preis = single_new + multiple_new
return preis
## Daten aus DEA:
## einlesen von Daten
data_folder = os.path.join("/YOUR/DATA/ROAD/TAKE/ME/HOME/TO/THE/PLACE")
data = os.path.join(data_folder, "technology_data_heating_installations_-_0003.xlsx")
##datensheets
single_new = pd.read_excel(data, "216 Electric heating,new single", skiprows=4, nrows=33)
multiple_new = pd.read_excel(data, "216 Electric heating,new apart", skiprows=4, nrows=33)
dic_capacity_cost_overnight_2045 = {
"single_new_price": linear_interpolate_2045((single_new.iat[19,5]*1000)/(single_new.iat[0,5]/1000), (single_new.iat[19,6]*1000)/(single_new.iat[0,6]/1000)),
"multiple_new_price": linear_interpolate_2045((multiple_new.iat[19,5]*1000)/(multiple_new.iat[0,5]/1000), (multiple_new.iat[19,6]*1000)/(multiple_new.iat[0,6]/1000)),
}
dic_effiency_2045 = {
"single_new_price": linear_interpolate_2045(single_new.iat[3,5], single_new.iat[3,6]),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[3,5], multiple_new.iat[3,6])
}
dic_fixom_cost_2045 = {
"single_new_price": linear_interpolate_2045((single_new.iat[24,5])/(single_new.iat[0,5]/1000), (single_new.iat[24,5])/(single_new.iat[0,5]/1000)),
"multiple_new_price": linear_interpolate_2045((multiple_new.iat[24,5])/(multiple_new.iat[0,5]/1000), (multiple_new.iat[24,6])/(multiple_new.iat[0,6]/1000)),
}
dic_lifetime_2045 = {
"single_new_price": linear_interpolate_2045(single_new.iat[5,5], single_new.iat[5,6]),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[5,5], multiple_new.iat[5,6]),
}
dic_marginal_cost_2045 = {
"single_new_price": linear_interpolate_2045(single_new.iat[23,2] / 1000,single_new.iat[23,2] ),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[23,2] / 1000, multiple_new.iat[23,2] / 1000),
}
dic_2045 = [dic_capacity_cost_overnight_2045, dic_effiency_2045 , dic_fixom_cost_2045, dic_lifetime_2045, dic_marginal_cost_2045]
val_2045 = []
print(dic_fixom_cost_2045)
## Berechnungen
for dic in dic_2045:
val_2045.append(get_agg_price_2045(dic))
print(val_2045)
heatpump_small_script.py:
import pandas as pd
import os.path
def get_faktoren_new(df):
hp_agg = {"single_erdwaerme": 0, "multiple_erdwaerme": 0, "single_umweltwaerme": 0, "multiple_umweltwaerme": 0,}
for row in df.itertuples():
bereich = row[1].split(",")[2]
energie = row[1].split(",")[3]
try:
count_insg = int(row[1].split(",")[4])
count_single = int(row[1].split(",")[5])
except:
ValueError
if bereich == "Sachsen-Anhalt":
if energie == "Geothermie":
hp_agg["single_erdwaerme"] += count_single
hp_agg["multiple_erdwaerme"] += (count_insg - count_single)
elif energie == "Umweltthermie (Luft / Wasser)":
hp_agg["single_umweltwaerme"] += count_single
hp_agg["multiple_umweltwaerme"] += (count_insg - count_single)
else:
continue
else:
continue
hp_agg_sum = sum(hp_agg.values())
air_single_new = hp_agg["single_umweltwaerme"] / hp_agg_sum
air_multiple_new = hp_agg["multiple_umweltwaerme"] / hp_agg_sum
ground_single_new = hp_agg["single_erdwaerme"] / hp_agg_sum
ground_multiple_new = hp_agg["multiple_erdwaerme"] / hp_agg_sum
return air_single_new, air_multiple_new, ground_single_new, ground_multiple_new
def linear_interpolate_2045(wert_1, wert_2):
zeit_1 = 2040
zeit_2 = 2050
wert = wert_1 + (((wert_2 - wert_1) / (zeit_2 - zeit_1)) * (2045 - zeit_1))
return wert
def get_agg_price_2020(dic):
# nach BWP: Absatz von 2010-2020 -> bildet Bestand mit Kosten von Neubau ab
wp_neubau_abs = 52500+52500+45000+45000+37500+37500+37500+37500+30000+30000+30000
wp_altbau_abs = 67500+37500+37500+37500+30000+22500+22500+22500+30000+30000+22500
wp_gesamt_abs = wp_altbau_abs + wp_neubau_abs
wp_neubau = wp_neubau_abs / wp_gesamt_abs
wp_geo = 333333 / (333333+750000)
wp_umwelt = 750000 / (333333+750000) #Umwelt = Luft und Wasser
# Verhältnisse WP Alt und Neubau in ST nach destatis
# Daten einlesen
data_folder = os.path.join("/YOUR/DATA/ROAD/TAKE/ME/HOME/TO/THE/PLACE")
hp = os.path.join(data_folder, "2023_04_11_ST_thermische_Primärenergie_neubau_2010-2020.csv")
df = pd.read_csv(hp, encoding="ISO8859-1", delimiter=";", skiprows=range(0, 10), nrows=2150)
faktoren_new = get_faktoren_new(df)
air_water_single_new_faktor = wp_neubau * faktoren_new[0]
air_water_multiple_new_faktor = wp_neubau * faktoren_new[1]
ground_water_single_new_fakotr = wp_neubau * faktoren_new[2]
ground_water_multiple_new_faktor = wp_neubau * faktoren_new[3]
# wp altbau:
altbau_air = wp_umwelt - (air_water_single_new_faktor + air_water_multiple_new_faktor)
altbau_ground = wp_geo - (ground_water_single_new_fakotr + ground_water_multiple_new_faktor)
# keine Daten, daher wie neubau angenommen (es gibt keinen Grund zu glauben, dass im Mehrfamilien-Altbau mehr WP verbaut werden)
single_faktor = faktoren_new[0] + faktoren_new[2] # ca 0.95
multiple_faktor = faktoren_new[1] + faktoren_new[3] # ca 0.05
air_water_single_old_faktor = altbau_air * single_faktor
air_water_multiple_old_faktor = altbau_air * multiple_faktor
ground_water_single_old_fakotr = altbau_ground * single_faktor
ground_water_multiple_old_faktor = altbau_ground * multiple_faktor
air_water_single_old = air_water_single_old_faktor * dic["air_water_single_old_price"]
air_water_multiple_old = air_water_multiple_old_faktor * dic["air_water_multiple_old_price"]
ground_water_single_old = ground_water_single_old_fakotr * dic["ground_water_single_old_price"]
ground_water_multiple_old = ground_water_multiple_old_faktor * dic["ground_water_multiple_old_price"]
air_water_single_new = air_water_single_new_faktor * dic["air_water_single_new_price"]
air_water_multiple_new = air_water_multiple_new_faktor * dic["air_water_multiple_new_price"]
ground_water_single_new = ground_water_single_new_fakotr * dic["ground_water_single_new_price"]
ground_water_multiple_new = ground_water_multiple_new_faktor * dic["ground_water_multiple_new_price"]
altbau_kosten = air_water_single_old + air_water_multiple_old + ground_water_single_old + ground_water_multiple_old
neubau_kosten = air_water_single_new + air_water_multiple_new + ground_water_single_new + ground_water_multiple_new
preis = altbau_kosten + neubau_kosten
faktoren = [air_water_single_old_faktor,
air_water_multiple_old_faktor,
ground_water_single_old_fakotr,
ground_water_multiple_old_faktor,
air_water_single_new_faktor,
air_water_multiple_new_faktor,
ground_water_single_new_fakotr,
ground_water_multiple_new_faktor,
]
return preis, faktoren
def get_agg_price_2045(dic):
# Neubau und Sanierungen allg nach BMI f. Deutschland
neubau_allg_prozent = (0.36 + 0.36 + 0.37 + 0.38 + 0.35 + 0.34 + 0.26 + 0.22 + 0.22 + 0.22 + 0.25 + 0.26 + 0.27 + 0.28 + 0.30 + 0.32 + 0.32 + 0.32 + 0.31 + 0.31) / 20
altbau_allg_prozent = 1 - neubau_allg_prozent
# Sole/Luft nach Absatz 2022 laut BWP
ground = 0.13
air = 0.87
# Einfamilienhaus/Mehrfamilienhaus
single = 0.7
multiple = 0.3
# Faktoren
air_water_single_old_faktor = altbau_allg_prozent * air * single
air_water_multiple_old_faktor = altbau_allg_prozent * air * multiple
ground_water_single_old_fakotr = altbau_allg_prozent * ground * single
ground_water_multiple_old_faktor = altbau_allg_prozent * ground * multiple
air_water_single_new_faktor = neubau_allg_prozent * air * single
air_water_multiple_new_faktor = neubau_allg_prozent * air * multiple
ground_water_single_new_fakotr = neubau_allg_prozent * ground * single
ground_water_multiple_new_faktor = neubau_allg_prozent * ground * multiple
air_water_single_old = air_water_single_old_faktor * dic["air_water_single_old_price"]
air_water_multiple_old = air_water_multiple_old_faktor * dic["air_water_multiple_old_price"]
ground_water_single_old = ground_water_single_old_fakotr * dic["ground_water_single_old_price"]
ground_water_multiple_old = ground_water_multiple_old_faktor * dic["ground_water_multiple_old_price"]
air_water_single_new = air_water_single_new_faktor * dic["air_water_single_new_price"]
air_water_multiple_new = air_water_multiple_new_faktor * dic["air_water_multiple_new_price"]
ground_water_single_new = ground_water_single_new_fakotr * dic["ground_water_single_new_price"]
ground_water_multiple_new = ground_water_multiple_new_faktor * dic["ground_water_multiple_new_price"]
altbau_kosten = air_water_single_old + air_water_multiple_old + ground_water_single_old + ground_water_multiple_old
neubau_kosten = air_water_single_new + air_water_multiple_new + ground_water_single_new + ground_water_multiple_new
preis = altbau_kosten + neubau_kosten
faktoren = [air_water_single_old_faktor,
air_water_multiple_old_faktor,
ground_water_single_old_fakotr,
ground_water_multiple_old_faktor,
air_water_single_new_faktor,
air_water_multiple_new_faktor,
ground_water_single_new_fakotr,
ground_water_multiple_new_faktor,
]
return preis, faktoren
## Daten aus DEA:
## einlesen von Daten
data_folder = os.path.join("/home/local/RL-INSTITUT/aaron.schilling/Dokumente/Projekte/Digipipe")
data = os.path.join(data_folder, "technology_data_heating_installations_-_0003.xlsx")
##datensheets
air_water_single_old = pd.read_excel(data, "207 HP air-water,ex single", skiprows=4, nrows=33)
air_water_multiple_old = pd.read_excel(data, "207 HP air-water,ex apart", skiprows=4, nrows=33)
ground_water_single_old = pd.read_excel(data, "207 HP air-water,new single", skiprows=4, nrows=33)
ground_water_multiple_old = pd.read_excel(data, "207 HP air-water,new apart", skiprows=4, nrows=33)
air_water_single_new = pd.read_excel(data, "207 HP ground-water,ex single", skiprows=4, nrows=33)
air_water_multiple_new = pd.read_excel(data, "207 HP ground-water,ex apart", skiprows=4, nrows=33)
ground_water_single_new = pd.read_excel(data, "207 HP ground-water,new single", skiprows=4, nrows=33)
ground_water_multiple_new = pd.read_excel(data, "207 HP ground-water,new apart", skiprows=4, nrows=33)
dic_capacity_cost_overnight_2020 = {
"air_water_single_old_price": air_water_single_old.iat[19,2]*1000/(air_water_single_old.iat[0,2]/1000),
"air_water_multiple_old_price": air_water_multiple_old.iat[19,2]*1000/(air_water_multiple_old.iat[0,2]/1000),
"ground_water_single_old_price": ground_water_single_old.iat[19,2]*1000/(ground_water_single_old.iat[0,2]/1000),
"ground_water_multiple_old_price": ground_water_multiple_old.iat[19,2]*1000/(ground_water_multiple_old.iat[0,2]/1000),
"air_water_single_new_price": air_water_single_new.iat[19,2]*1000/(air_water_single_new.iat[0,2]/1000),
"air_water_multiple_new_price": air_water_multiple_new.iat[19,2]*1000/(air_water_multiple_new.iat[0,2]/1000),
"ground_water_single_new_price": ground_water_single_new.iat[19,2]*1000/(ground_water_single_new.iat[0,2]/1000),
"ground_water_multiple_new_price": ground_water_multiple_new.iat[19,2]*1000/(ground_water_multiple_new.iat[0,2]/1000),
}
dic_fixom_cost_2020 = {
"air_water_single_old_price": air_water_single_old.iat[24,2]/(air_water_single_old.iat[0,2]/1000),
"air_water_multiple_old_price": air_water_multiple_old.iat[24,2]/(air_water_multiple_old.iat[0,2]/1000),
"ground_water_single_old_price": ground_water_single_old.iat[24,2]/(ground_water_single_old.iat[0,2]/1000),
"ground_water_multiple_old_price": ground_water_multiple_old.iat[24,2]/(ground_water_multiple_old.iat[0,2]/1000),
"air_water_single_new_price": air_water_single_new.iat[24,2]/(air_water_single_new.iat[0,2]/1000),
"air_water_multiple_new_price": air_water_multiple_new.iat[24,2]/(air_water_multiple_new.iat[0,2]/1000),
"ground_water_single_new_price": ground_water_single_new.iat[24,2]/(ground_water_single_new.iat[0,2]/1000),
"ground_water_multiple_new_price": ground_water_multiple_new.iat[24,2]/(ground_water_multiple_new.iat[0,2]/1000),
}
dic_lifetime_2020 = {
"air_water_single_old_price": air_water_single_old.iat[5,2],
"air_water_multiple_old_price": air_water_multiple_old.iat[5,2],
"ground_water_single_old_price": ground_water_single_old.iat[5,2],
"ground_water_multiple_old_price": ground_water_multiple_old.iat[5,2],
"air_water_single_new_price": air_water_single_new.iat[5,2],
"air_water_multiple_new_price": air_water_multiple_new.iat[5,2],
"ground_water_single_new_price": ground_water_single_new.iat[5,2],
"ground_water_multiple_new_price": ground_water_multiple_new.iat[5,2],
}
dic_marginal_cost_2020 = {
"air_water_single_old_price": air_water_single_old.iat[23,2] / 1000,
"air_water_multiple_old_price": air_water_multiple_old.iat[23,2] / 1000,
"ground_water_single_old_price": ground_water_single_old.iat[23,2] / 1000,
"ground_water_multiple_old_price": ground_water_multiple_old.iat[23,2] / 1000,
"air_water_single_new_price": air_water_single_new.iat[23,2] / 1000,
"air_water_multiple_new_price": air_water_multiple_new.iat[23,2] / 1000,
"ground_water_single_new_price": ground_water_single_new.iat[23,2] / 1000,
"ground_water_multiple_new_price": ground_water_multiple_new.iat[23,2] / 1000,
}
dic_capacity_cost_overnight_2045 = {
"air_water_single_old_price": linear_interpolate_2045(air_water_single_old.iat[19,5]*1000/(air_water_single_old.iat[0,5]/1000), air_water_single_old.iat[19,6]*1000/(air_water_single_old.iat[0,6]/1000)),
"air_water_multiple_old_price": linear_interpolate_2045(air_water_multiple_old.iat[19,5]*1000/(air_water_multiple_old.iat[0,5]/1000), air_water_multiple_old.iat[19,6]*1000/(air_water_multiple_old.iat[0,6]/1000)),
"ground_water_single_old_price": linear_interpolate_2045(ground_water_single_old.iat[19,5]*1000/(ground_water_single_old.iat[0,5]/1000),ground_water_single_old.iat[19,6]*1000/(ground_water_single_old.iat[0,6]/1000)),
"ground_water_multiple_old_price": linear_interpolate_2045(ground_water_multiple_old.iat[19,5]*1000/(ground_water_multiple_old.iat[0,5]/1000), ground_water_multiple_old.iat[19,6]*1000/(ground_water_multiple_old.iat[0,6]/1000)),
"air_water_single_new_price": linear_interpolate_2045(air_water_single_new.iat[19,5]*1000/(air_water_single_new.iat[0,5]/1000), air_water_single_new.iat[19,6]*1000/(air_water_single_new.iat[0,6]/1000)),
"air_water_multiple_new_price": linear_interpolate_2045(air_water_multiple_new.iat[19,5]*1000/(air_water_multiple_new.iat[0,5]/1000),air_water_multiple_new.iat[19,6]*1000/(air_water_multiple_new.iat[0,6]/1000)),
"ground_water_single_new_price": linear_interpolate_2045(ground_water_single_new.iat[19,5]*1000/(ground_water_single_new.iat[0,5]/1000), ground_water_single_new.iat[19,6]*1000/(ground_water_single_new.iat[0,6]/1000)),
"ground_water_multiple_new_price": linear_interpolate_2045(ground_water_multiple_new.iat[19,5]*1000/(ground_water_multiple_new.iat[0,5]/1000), ground_water_multiple_new.iat[19,6]*1000/(ground_water_multiple_new.iat[0,6]/1000)),
}
dic_fixom_cost_2045 = {
"air_water_single_old_price": linear_interpolate_2045(air_water_single_old.iat[24,5]/(air_water_single_old.iat[0,5]/1000), air_water_single_old.iat[24,6]/(air_water_single_old.iat[0,6]/1000)),
"air_water_multiple_old_price": linear_interpolate_2045(air_water_multiple_old.iat[24,5]/(air_water_multiple_old.iat[0,5]/1000), air_water_multiple_old.iat[24,6]/(air_water_multiple_old.iat[0,6]/1000)),
"ground_water_single_old_price": linear_interpolate_2045(ground_water_single_old.iat[24,5]/(ground_water_single_old.iat[0,5]/1000), ground_water_single_old.iat[24,6]/(ground_water_single_old.iat[0,6]/1000)),
"ground_water_multiple_old_price": linear_interpolate_2045(ground_water_multiple_old.iat[24,5]/(ground_water_multiple_old.iat[0,5]/1000), ground_water_multiple_old.iat[24,6]/(ground_water_multiple_old.iat[0,6]/1000)),
"air_water_single_new_price": linear_interpolate_2045(air_water_single_new.iat[24,5]/(air_water_single_new.iat[0,5]/1000), air_water_single_new.iat[24,6]/(air_water_single_new.iat[0,6]/1000)),
"air_water_multiple_new_price": linear_interpolate_2045(air_water_multiple_new.iat[24,5]/(air_water_multiple_new.iat[0,5]/1000), air_water_multiple_new.iat[24,6]/(air_water_multiple_new.iat[0,6]/1000)),
"ground_water_single_new_price": linear_interpolate_2045(ground_water_single_new.iat[24,5]/(ground_water_single_new.iat[0,5]/1000), ground_water_single_new.iat[24,6]/(ground_water_single_new.iat[0,6]/1000)),
"ground_water_multiple_new_price": linear_interpolate_2045(ground_water_multiple_new.iat[24,5]/(ground_water_multiple_new.iat[0,5]/1000), ground_water_multiple_new.iat[24,6]/(ground_water_multiple_new.iat[0,6]/1000)),
}
dic_lifetime_2045 = {
"air_water_single_old_price": linear_interpolate_2045(air_water_single_old.iat[5,5], air_water_single_old.iat[5,6]),
"air_water_multiple_old_price": linear_interpolate_2045(air_water_multiple_old.iat[5,5], air_water_multiple_old.iat[5,6]),
"ground_water_single_old_price": linear_interpolate_2045(ground_water_single_old.iat[5,5], ground_water_single_old.iat[5,6]),
"ground_water_multiple_old_price": linear_interpolate_2045(ground_water_multiple_old.iat[5,5], ground_water_multiple_old.iat[5,6]),
"air_water_single_new_price": linear_interpolate_2045(air_water_single_new.iat[5,5], air_water_single_new.iat[5,6]),
"air_water_multiple_new_price": linear_interpolate_2045(air_water_multiple_new.iat[5,5], air_water_multiple_new.iat[5,6]),
"ground_water_single_new_price": linear_interpolate_2045(ground_water_single_new.iat[5,5], ground_water_single_new.iat[5,6]),
"ground_water_multiple_new_price": linear_interpolate_2045(ground_water_multiple_new.iat[5,5], ground_water_multiple_new.iat[5,6]),
}
dic_marginal_cost_2045 = {
"air_water_single_old_price": linear_interpolate_2045(air_water_single_old.iat[23,5] / 1000, air_water_single_old.iat[23,6] / 1000),
"air_water_multiple_old_price": linear_interpolate_2045(air_water_multiple_old.iat[23,5] / 1000, air_water_multiple_old.iat[23,6] / 1000),
"ground_water_single_old_price": linear_interpolate_2045(ground_water_single_old.iat[23,5] / 1000, ground_water_single_old.iat[23,6] / 1000),
"ground_water_multiple_old_price": linear_interpolate_2045(ground_water_multiple_old.iat[23,5] / 1000, ground_water_multiple_old.iat[23,6] / 1000),
"air_water_single_new_price": linear_interpolate_2045(air_water_single_new.iat[23,5] / 1000, air_water_single_new.iat[23,6] / 1000),
"air_water_multiple_new_price": linear_interpolate_2045(air_water_multiple_new.iat[23,5] / 1000, air_water_multiple_new.iat[23,6] / 1000),
"ground_water_single_new_price": linear_interpolate_2045(ground_water_single_new.iat[23,5] / 1000, ground_water_single_new.iat[23,6] / 1000),
"ground_water_multiple_new_price": linear_interpolate_2045(ground_water_multiple_new.iat[23,5] / 1000, ground_water_multiple_new.iat[23,6] / 1000),
}
dic_2020 = [dic_capacity_cost_overnight_2020, dic_fixom_cost_2020, dic_lifetime_2020, dic_marginal_cost_2020]
dic_2045 = [dic_capacity_cost_overnight_2045, dic_fixom_cost_2045, dic_lifetime_2045, dic_marginal_cost_2045]
val_2020 = []
val_2045 = []
faktoren_2020 = get_agg_price_2020(dic_fixom_cost_2045)[1]
faktoren_2045 = get_agg_price_2045(dic_fixom_cost_2045)[1]
## Berechnungen
for dic in dic_2020:
val_2020.append(get_agg_price_2020(dic)[0])
for dic in dic_2045:
val_2045.append(get_agg_price_2045(dic)[0])
print(val_2020, val_2045)
print(faktoren_2020, faktoren_2045)
boiler_small_script.py:
import pandas as pd
import os.path
def get_faktoren_new(df):
gas_agg = {"single": 0, "multiple": 0}
for row in df.itertuples():
bereich = row[1].split(",")[2]
energie = row[1].split(",")[3]
try:
count_insg = int(row[1].split(",")[4])
count_single = int(row[1].split(",")[5])
except:
ValueError
if bereich == "Sachsen-Anhalt":
if energie == "Gas":
gas_agg["single"] += count_single
gas_agg["multiple"] += (count_insg - count_single)
else:
continue
else:
continue
gas_agg_sum = sum(gas_agg.values())
single_new = gas_agg["single"] / gas_agg_sum
multiple_new = gas_agg["multiple"] / gas_agg_sum
return single_new, multiple_new,
def linear_interpolate_2045(wert_1, wert_2):
zeit_1 = 2040
zeit_2 = 2050
wert = wert_1 + (((wert_2 - wert_1) / (zeit_2 - zeit_1)) * (2045 - zeit_1))
return wert
def get_agg_price_2020(dic):
# Neubau und Sanierungen allg nach BMI f. Deutschland
neubau = (0.36 + 0.36 + 0.37 + 0.38 + 0.35 + 0.34 + 0.26 + 0.22 + 0.22 + 0.22 + 0.25 + 0.26 + 0.27 + 0.28 + 0.30 + 0.32 + 0.32 + 0.32 + 0.31 + 0.31) / 20
altbau = 1 - neubau
# Verhältnisse Einfamilienhaus-Mehrfamilienhaus nach destatis
# Daten einlesen
data_folder = os.path.join("/YOUR/DATA/ROAD/TAKE/ME/HOME/TO/THE/PLACE")
hp = os.path.join(data_folder, "2023_04_11_ST_thermische_Primärenergie_neubau_2010-2020.csv")
df = pd.read_csv(hp, encoding="ISO8859-1", delimiter=";", skiprows=range(0, 10), nrows=2150)
faktoren_new = get_faktoren_new(df)
# Einfamilinehaus-Mehrfamilienhaus im Altbau Annahme:
single_faktor = 0.7
multiple_faktor = 0.3
single_new_faktor = neubau * faktoren_new[0]
multiple_new_faktor = neubau * faktoren_new[1]
single_old_faktor = altbau * single_faktor
multiple_old_faktor = altbau * multiple_faktor
single_old = single_old_faktor * dic["single_old_price"]
multiple_old = multiple_old_faktor * dic["multiple_old_price"]
single_new = single_new_faktor * dic["single_new_price"]
multiple_new = multiple_new_faktor * dic["multiple_new_price"]
preis = single_old + multiple_old + single_new + multiple_new
return preis
def get_agg_price_2045(dic):
# Neubau und Sanierungen allg nach BMI f. Deutschland
neubau = (0.36 + 0.36 + 0.37 + 0.38 + 0.35 + 0.34 + 0.26 + 0.22 + 0.22 + 0.22 + 0.25 + 0.26 + 0.27 + 0.28 + 0.30 + 0.32 + 0.32 + 0.32 + 0.31 + 0.31) / 20
altbau = 1 - neubau
# Verhältnisse Einfamilienhaus-Mehrfamilienhaus nach destatis 2020
gas_single_new = 693 / 763
gas_multiple_new = (763 - 693) / 763
# Einfamilinehaus-Mehrfamilienhaus im Altbau Annahme:
single_faktor = 0.7
multiple_faktor = 0.3
single_new_faktor = neubau * gas_single_new
multiple_new_faktor = neubau * gas_multiple_new
single_old_faktor = altbau * single_faktor
multiple_old_faktor = altbau * multiple_faktor
single_old = single_old_faktor * dic["single_old_price"]
multiple_old = multiple_old_faktor * dic["multiple_old_price"]
single_new = single_new_faktor * dic["single_new_price"]
multiple_new = multiple_new_faktor * dic["multiple_new_price"]
preis = single_old + multiple_old + single_new + multiple_new
return preis
## Daten aus DEA:
## einlesen von Daten
data_folder = os.path.join("/ROAD/TO/DATA")
data = os.path.join(data_folder, "technology_data_heating_installations_-_0003.xlsx")
##datensheets
single_old = pd.read_excel(data, "202 Gas boiler, ex single", skiprows=4, nrows=33)
multiple_old = pd.read_excel(data, "202 Gas boiler, ex apart", skiprows=4, nrows=33)
single_new = pd.read_excel(data, "202 Gas boiler, new single", skiprows=4, nrows=33)
multiple_new = pd.read_excel(data, "202 Gas boiler, new apart", skiprows=4, nrows=33)
dic_capacity_cost_overnight_2020 = {
"single_old_price": (single_old.iat[19,2]*1000)/(single_old.iat[0,2]/1000),
"multiple_old_price": (multiple_old.iat[19,2]*100)/(multiple_old.iat[0,2]/1000),
"single_new_price": (single_new.iat[19,2]*1000)/(single_new.iat[0,2]/1000),
"multiple_new_price": (multiple_new.iat[19,2]*1000)/(multiple_new.iat[0,2]/1000),
}
dic_effiency_2020 = {
"single_old_price": single_old.iat[3,2],
"multiple_old_price": multiple_old.iat[3,2],
"single_new_price": single_new.iat[3,2],
"multiple_new_price": multiple_new.iat[3,2],
}
dic_fixom_cost_2020 = {
"single_old_price": single_old.iat[24,2]/(single_old.iat[0,2]/1000),
"multiple_old_price": multiple_old.iat[24,2]/(multiple_old.iat[0,2]/1000),
"single_new_price": single_new.iat[24,2]/(single_new.iat[0,2]/1000),
"multiple_new_price": multiple_new.iat[24,2]/(multiple_new.iat[0,2]/1000),
}
dic_lifetime_2020 = {
"single_old_price": single_old.iat[5,2],
"multiple_old_price": multiple_old.iat[5,2],
"single_new_price": single_new.iat[5,2],
"multiple_new_price": multiple_new.iat[5,2],
}
dic_marginal_cost_2020 = {
"single_old_price": single_old.iat[23,2] / 1000,
"multiple_old_price": multiple_old.iat[23,2] / 1000,
"single_new_price": single_new.iat[23,2] / 1000,
"multiple_new_price": multiple_new.iat[23,2] / 1000,
}
dic_capacity_cost_overnight_2045 = {
"single_old_price": linear_interpolate_2045((single_old.iat[19,5]*1000)/(single_old.iat[0,5]/1000), (single_old.iat[19,6]*1000)/(single_old.iat[0,6]/1000)),
"multiple_old_price": linear_interpolate_2045((multiple_old.iat[19,5]*1000)/(multiple_old.iat[0,5]/1000), (multiple_old.iat[19,6]*1000)/(multiple_old.iat[0,6]/1000)),
"single_new_price": linear_interpolate_2045((single_new.iat[19,5]*1000)/(single_new.iat[0,5]/1000), (single_new.iat[19,6]*1000)/(single_new.iat[0,6]/1000)),
"multiple_new_price": linear_interpolate_2045((multiple_new.iat[19,5]*1000)/(multiple_new.iat[0,5]/1000), (multiple_new.iat[19,6]*1000)/(multiple_new.iat[0,6]/1000)),
}
dic_effiency_2045 = {
"single_old_price": linear_interpolate_2045(single_old.iat[3,5], single_old.iat[3,6]),
"multiple_old_price": linear_interpolate_2045(multiple_old.iat[3,5], multiple_old.iat[3,6]) ,
"single_new_price": linear_interpolate_2045(single_new.iat[3,5], single_new.iat[3,6]),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[3,5], multiple_new.iat[3,6])
}
dic_fixom_cost_2045 = {
"single_old_price": linear_interpolate_2045((single_old.iat[24,5])/(single_old.iat[0,5]/1000), (single_old.iat[24,6])/(single_old.iat[0,6]/1000)),
"multiple_old_price": linear_interpolate_2045((multiple_old.iat[24,5])/(multiple_old.iat[0,5]/1000), (multiple_old.iat[24,6])/(multiple_old.iat[0,6]/1000)),
"single_new_price": linear_interpolate_2045((single_new.iat[24,5])/(single_new.iat[0,5]/1000), (single_new.iat[24,5])/(single_new.iat[0,5]/1000)),
"multiple_new_price": linear_interpolate_2045((multiple_new.iat[24,5])/(multiple_new.iat[0,5]/1000), (multiple_new.iat[24,6])/(multiple_new.iat[0,6]/1000)),
}
dic_lifetime_2045 = {
"single_old_price": linear_interpolate_2045(single_old.iat[5,5], single_old.iat[5,6]),
"multiple_old_price": linear_interpolate_2045(multiple_old.iat[5,5], multiple_old.iat[5,6]),
"single_new_price": linear_interpolate_2045(single_new.iat[5,5], single_new.iat[5,6]),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[5,5], multiple_new.iat[5,6]),
}
dic_marginal_cost_2045 = {
"single_old_price": linear_interpolate_2045(single_old.iat[23,2] / 1000, single_old.iat[23,2] / 1000),
"multiple_old_price": linear_interpolate_2045(multiple_old.iat[23,2] / 1000, multiple_old.iat[23,2] / 1000),
"single_new_price": linear_interpolate_2045(single_new.iat[23,2] / 1000,single_new.iat[23,2] ),
"multiple_new_price": linear_interpolate_2045(multiple_new.iat[23,2] / 1000, multiple_new.iat[23,2] / 1000),
}
dic_2020 = [dic_capacity_cost_overnight_2020, dic_effiency_2020, dic_fixom_cost_2020, dic_lifetime_2020, dic_marginal_cost_2020]
dic_2045 = [dic_capacity_cost_overnight_2045,dic_effiency_2045, dic_fixom_cost_2045, dic_lifetime_2045, dic_marginal_cost_2045]
val_2020 = []
val_2045 = []
## Berechnungen
for dic in dic_2020:
val_2020.append(get_agg_price_2020(dic))
for dic in dic_2045:
val_2045.append(get_agg_price_2045(dic))
print(val_2020, val_2045)
Dataset: raw/technology_data
Marktstammdatenregister Datenkorrektur PV#
Überprüfung und manuelle Datenkorrektur der Photovoltaikanlagen aus dem prozessierten Marktstammdatenregister (Datensatz: bnetza_mastr).
Plausibiltätsprüfung#
Um grobe Fehler herauszufiltern wird überprüft, ob
- Anlage in Betrieb ist (status = "In Betrieb"),
- Anlage Strom produziert,
- Brutto- und Nettokapazität plausibel sind und
- die Kategorisierung, d.h. Zuordnung eine PV-Anlage zu Freifläche oder Dach, plausibel ist (manuelle, visuelle Prüfung von geolokalisierten PV-Aufdachanlagen anhand von Orthofotos)
Dateien#
- Korrektur Freiflächenanlagen
bnetza_mastr_pv_ground_region_correction.ods - Korrektur Aufdachanlagen
bnetza_mastr_pv_roof_region_correction.ods
mit Spalten:
- mastr_id: ID aus dem MaStR
- reason: Fehler (wrong_type, wrong_position)
- wrong_attr: Fehlerhaftes Attribut
- correction: Korrigierter Attributwert (None, wenn Korrektur nicht möglich). Korrigierte Geometrien liegen in EPSG:3035 vor.
Dataset: raw/bnetza_mastr_correction_region
BMWK Langfristszenarien#
Langfristszenarien des Bundesministerium für Wirtschaft und Klimaschutz, Daten auf Deutschlandebene.
Die Daten wurden über den Szenario Explorer abgerufen.
Verwendete Szenarien#
- T45-Strom: Stromfokussiertes Szenario aus den T45-Szenarien aus 2023, die Wege zur Treibhausgasneutralität bis 2045 unter Einhaltung aktueller politischer Vorgaben erreichen. Die Daten dieses Szenarios werden als Grundlage für das Zielszenario in der Region verwendet.
- TN-Strom: Stromfokussiertes Szenario aus den TN-Szenarien aus 2021, die unterschiedliche Pfade für Deutschland mit dem Ziel treibhausgasneutral bis 2050 zu werden. Die Daten dieses Szenarios werden als Grundlage für den Status quo verwendet (Ausnahme: Erzeugung Wärmenetze, hier wurden manuell Daten für 2021 ergänzt).
Daten#
T45-Strom#
| Datensatz | Quelle | Datei |
|---|---|---|
| Gebäude: Haushalte und GHD Energiebedarf | Link | T45-Strom_buildings_heating_demand_by_carrier.csv |
| Gebäude: Anzahl der Heizungen nach Technologie | Link | T45-Strom_buildings_heating_structure_by_technology.csv |
| GHD Energieträger | Link | T45-Strom_cts_demand.csv |
| Haushalte Energieträger | Link | T45-Strom_hh_demand.csv |
| Industrie Energiebedarf | Link | T45-Strom_ind_demand.csv |
| Stromsystem Deutschland Leistung | Link | T45-Strom_electricity_installed_power.csv |
| Erzeugung Wärmenetze Deutschland | Link, Link2 (S. 37) | T45-Strom_Generation_Heatgrids_Germany.csv |
TN-Strom#
| Datensatz | Quelle | Datei |
|---|---|---|
| Gebäude: Haushalte und GHD Energiebedarf | Link | TN-Strom_buildings_heating_demand_by_carrier.csv |
| Gebäude: Anzahl der Heizungen nach Technologie | Link | TN-Strom_buildings_heating_structure_by_technology.csv |
| GHD Energieträger | Link | TN-Strom_cts_demand.csv |
| Haushalte Energieträger | Link | TN-Strom_hh_demand.csv |
| Industrie Energiebedarf | Link | TN-Strom_ind_demand.csv |
Dataset: raw/bmwk_long_term_scenarios
Installierte Leistungen von Biomasse-Konversionstechnologien#
Die installierten Leistungen in MW wird im Szenario 80 % Transformationspfad und 2,6 Mio. ha Anbauflächen im Jahr 2020 und 2050 der Tabelle 13 im Dokument "Technoökonomische Analyse und Transformationspfade des energetischen Biomassepotentials (TATBIO)" für die folgenden Konversionsanlagen von Biomasse entnommen:
- Biomethan-Blockheizkraftwerk
- Holzhackschnitzelkessel Sektor Industrie
- Pelletkessel Sektor GHD
- Holzhackschnitzelkessel Sektor GHD
- Scheitholzvergaserkessel
- Pelletkessel Sektor Gebäude
- Biogasanlage + Blockheizkraftwerk
- Biomethan Gas- und Dampfkombikraftwerk
- Klärschlammfaulung + Blockheizkraftwerk
- Papier-Zellstoff-KWK
- Holzvergaser + Blockheizkraftwerk
- Mikro-Holzgas-Blockheizkraftwerk
Die Konversionstechnologien sind in der Spalte "technology" gelistet, während sich ihre installierten Leistungen für die beiden Projektionsjahre in den Spalten "capacity_[MW]2020" und "capacity[MW]_2050" befinden.
In den Spalten "decentral" und "central" wird mit "x" angegeben, ob jeweils ein dezentraler und zentraler Einsatz der Konversionsanlage Stand der Technik ist.
In der Spalte "carrier" wird analog zur Konvention der Namensgebung im Energiesystem (siehe esys.md) der jeweilige in die Konversionsanlage eintretende Energieträger notiert. Diese werden Abbildung 3 des Dokuments entommen. Der Energieträger Schwarzlauge wird vereinfachend dem Energieträger feste Biomasse bzw. Holz zugeordnet. Klärgas und Holzgas werden vereinfachend Biogas zugeordnet.
In der Spalte "tech" findet die Zuordnung zu der Technologie anhand der im Energiesystem verwendeten Komponenten (siehe esys.md) statt.
Dataset: raw/dbfz_biomass_heat_capacities
Schutzgebiete (Bundesamt für Naturschutz)#
Die harmonisierten Datensaetze der Schutzgebiete werden vom Bundesamt fuer Naturschutz einmal jaehrlich aus den Datensaetzen der Bundeslaender und des Bundes zusammengefuehrt. Dabei werden die Gebietsgrenzen, soweit erforderlich, an den Verlauf der Bundeslandgrenzen des Datenbestandes Verwaltungsgrenzen 1: 25.000 (VG 25, BKG) angepasst.
Datenbezug via WFS: https://geodienste.bfn.de/ogc/wfs/schutzgebiet
Stand der Daten:
- FFH-Gebiete (2019),
- Vogelschutzgebiete (2019),
- Nationalparke (2023),
- Naturschutzgebiete (2021),
- Nationale Naturmonumente (2023),
- Biosphärenreservate (2023),
- Naturparke (2023),
- Landschaftsschutzgebiete (2021).
Weitere Informationen: https://metadaten.bfn.de/BfN-MetaCat/?lang=de#/datasets/iso/bec888f9-ba0c-42dc-846e-177b8265dafa
Dataset: raw/bfn_protected_areas
Ackerbauliches Ertragspotential der Böden in Deutschland#
- Müncheberger Soil Quality Rating (SQR): Entwickelt vom Leibniz-Zentrum für Agrarlandschaftsforschung (ZALF).
- Zweck des SQR: Bewertung der Eignung von Standorten für landwirtschaftliche Nutzung; Abschätzung des Ertragspotentials global.
- Anwendung & Modifikation: Modifiziert für Bodenkarten von der BGR; Teil der Methodendokumentation der Ad-hoc-AG Boden.
- Deutsche Ackerböden: Anwendung des SQR auf Basis der nutzungsdifferenzierten Bodenübersichtskarte (Maßstab 1:1.000.000).
- Eingangsdaten: Klimadaten (DWD), Relief (BKG), Landnutzung (CLC2006).
- Basisindikatoren: Acht Indikatoren (z.B. Bodensubstrat, effektive Durchwurzelungstiefe); Punktzahlen mit Wichtungsfaktoren zu Summenwert zusammengefasst.
- Gefährdungsindikatoren: Bewertung von ertragslimitierenden Faktoren (z.B. Durchwurzelungstiefe, Trockenheitsgefährdung); Einbezug des höchsten Gefährdungsindikators in Berechnung.
- Bewertungsskala: 0 bis 102 Punkte, höherer Wert = höheres Ertragspotential.
Quellen
- Müller, L., et al. (2008). Das Müncheberger Soil Quality Rating (SQR). Berichte der DBG. The Muencheberg Soil Quality Rating (SQR).
- BGR (2023). Nutzungsdifferenzierte Bodenübersichtskarte von Deutschland 1: 1.000.000. BGR Bodenübersichtskarte. Ackerbauliches Ertragspotential der Böden in Deutschland 1:1.000.000
Dataset: raw/bgr_sqr
Sozialversicherungspflichtig Beschäftigte und Betriebe#
Gemeindedaten der sozialversicherungspflichtig Beschäftigten am 30.06.2022 nach Wohn- und Arbeitsort - Deutschland, Länder, Kreise und Gemeinden (Jahreszahlen) der Bundesagentur für Arbeit.
Dataset: raw/ba_employment
Dachflächenpotenzial PV-Aufdachanlagen in ABW#
Abschätzung der installierten Leistung und des Ertrags von PV-Aufdachanlagen in Anhalt-Bitterfeld-Wittenberg der Regionalen Planungsgemeinschaft.
Dafür wurden auf Basis des Digitalen Oberflächenmodells (DOM2) Schattenberechnungen durchgeführt. Anhand des LoD2 3D-Gebäudemodells wurden für verschiedene Dachausrichtungen (nord, ost, süd, west, flach) die installierbare Leistung bestimmt und mittels der Globalstrahlung und typischer technischer Parameter für jedes Gebäude und jede Dachflächenorientierung potenzielle Erträge berechnet.
Quellen:
Dataset: raw/rpg_abw_pv_roof_potential
Bevölkerungsprognose Sachsen-Anhalt#
Bevölkerungsprognose je Gemeinde bis 2035 des Statistischen Landesamtes Sachsen-Anhalt. Stand: 2021
Dataset: raw/stala_st_pop_prog
Verwaltungsgebiete Deutschlands#
Verwaltungsgebiete Deutschlands (Verwaltungsgebiete 1:250 000).
Dataset: raw/bkg_vg250
Energiedaten Sachsen-Anhalt#
Datensätze zur Energie- und Wasserversorgung des Statistischen Landesamtes Sachsen-Anhalt.
Daten#
Stromverbrauch der Industriebetriebe nach Kreisen 2003-2021 in MWh
Dataset: raw/stala_st_energy
DemandRegio#
Regionalisierte Bevölkerungsprognose, Haushalte sowie Strom- und Gasbedarfe inkl. Zeitreihen auf Landkreisebene.
Die Daten wurden abgerufen mit einer modifizierten Version des DemandRegio disaggregators, in der softwareseitige, jedoch keine methodischen Änderungen vorgenommen wurden.
Der disaggregator basiert auf Daten bis 2017, anschließende Jahre werden fortgeschrieben.
Weitere Informationen zum Projekt DemandRegio:
Die erzeugten Rohdaten wie unten beschrieben wurden mittels API abgerufen. Diese können alternativ direkt vom OpenData-Portal der FfE bezogen werden.
Verwendetes Wetterjahr für Gasbedarfszeitreihen: 2011
Installation (in separater venv):
pip install disaggregator@git+https://github.com/nesnoj/disaggregator.git#egg=disaggregator
Details zum Datenabruf#
Bevölkerung#
Bevölkerung (Summe) und Bevölkerung je Haushaltsgröße (1, 2, 3, 4, 5, >5) je NUTS3.
Jahre:
- Bevölkerung bis 2017 historische Werte
- Bevölkerung ab 2018 prognostizierte Werte basierend auf der 14. koordinierten Bevölkerungsvorausberechnung der Statistischen Ämter von Bund und Ländern.
- Haushalte nur 2011
import pandas as pd
from disaggregator import data
## Population
dr_hh_population = pd.DataFrame()
for year in [2010, 2015, 2017, 2020, 2021, 2022, 2025, 2030, 2035, 2040, 2045]:
dr_hh_population[year] = round(data.population(year=year)).astype(int)
dr_hh_population.to_csv("dr_hh_population.csv")
## Households
data.households_per_size().to_csv("dr_hh_households_2011.csv")
Haushalte: Strom#
Bedarfe und SLP-Zeitreihen je NUTS3 mit Bottom-Up-Methode nach Haushaltsgröße.
Jahre:
- 2017: Letzte verfügbare Daten
- 2022: Status quo, Fortschreibung mit Berücksichtigung Demografie und Wanderung
- 2035: Fortschreibungsjahr mit Berücksichtigung Demografie und Wanderung
- 2045: Fortschreibungsjahr
from disaggregator import spatial, temporal
## Consumption
spatial.disagg_households_power(
by="households",
weight_by_income=True,
year=2022,
scale_by_pop=True,
).to_csv(f"dr_hh_power_demand_2022.csv")
## Timeseries
temporal.disagg_temporal_power_housholds_slp(
use_nuts3code=True,
by="households",
weight_by_income=True,
year=2022,
scale_by_pop=True,
).to_csv(f"dr_hh_power_timeseries_2022.csv")
Haushalte: Gas#
Zeitreihen je NUTS3
from disaggregator import temporal
## Timeseries
temporal.disagg_temporal_gas_households(
use_nuts3code=True,
how='top-down',
year=2011,
).to_csv(f"dr_hh_gas_timeseries_2011.csv")
GHD und Industrie: Strom#
Bedarfe und Zeitreihen je NUTS3:
- Bedarfe: Je Wirtschaftszweig (WZ), abzüglich Eigenerzeugung
- Zeitreihen: Für alle WZ bedarfsgewichtet aggregiert, Einzelprofile basieren je nach WZ auf gemessenen oder SLP inkl. Wanderung
- Letzte verfügbare Daten aus 2017, Fortschreibung für 2022 mit Berücksichtigung Beschäftigte und Effizienzgewinne
from disaggregator import spatial, temporal
########
## CTS #
########
## Consumption
spatial.disagg_CTS_industry(
sector='CTS',
source='power',
use_nuts3code=True,
year=2022,
).to_csv("dr_cts_power_demand_2022.csv")
## Timeseries
temporal.disagg_temporal_power_CTS(
detailed=False,
use_nuts3code=True,
year=2022,
).to_csv("dr_cts_power_timeseries_2022.csv")
#############
## Industry #
#############
## Consumption
spatial.disagg_CTS_industry(
sector='industry',
source='power',
use_nuts3code=True,
year=2022,
).to_csv("dr_ind_power_demand_2022.csv")
## Timeseries
temporal.disagg_temporal_industry(
source="power",
detailed=False,
use_nuts3code=True,
no_self_gen=False,
year=2022,
).to_csv("dr_ind_power_timeseries_2022.csv")
GHD: Gas#
Zeitreihen je NUTS3 für alle WZ bedarfsgewichtet aggregiert, Einzelprofile basieren je nach WZ auf gemessenen oder SLP inkl. Wanderung. Letzte verfügbare Daten aus 2017, Fortschreibung für 2022 mit Berücksichtigung Beschäftigte und Effizienzgewinne.
from disaggregator import spatial, temporal
## Timeseries
x=temporal.disagg_temporal_gas_CTS(
detailed=False,
use_nuts3code=True,
year=2011,
).to_csv("dr_cts_gas_timeseries_2011.csv")
Industrie: Gas#
Bedarfe und Zeitreihen je NUTS3:
- Bedarfe: Je Wirtschaftszweig (WZ), abzüglich Eigenerzeugung
- Zeitreihen: Für alle WZ bedarfsgewichtet aggregiert, Einzelprofile basieren je nach WZ auf gemessenen oder SLP inkl. Wanderung
- Letzte verfügbare Daten aus 2017, Fortschreibung für 2022 mit Berücksichtigung Beschäftigte und Effizienzgewinne
from disaggregator import spatial, temporal
## Consumption
spatial.disagg_CTS_industry(
sector='industry',
source='gas',
use_nuts3code=True,
year=2022,
).to_csv("dr_ind_gas_demand_2022.csv")
## Timeseries
x=temporal.disagg_temporal_industry(
source="gas",
detailed=False,
use_nuts3code=True,
no_self_gen=False,
year=2011,
).to_csv("dr_ind_gas_timeseries_2011.csv")
Dataset: raw/demandregio
Geodaten PV- und Windflächenrechner#
Geodaten aus dem PV- und Windflächenrechner.
Mehr Informationen:
Enthält:
- Geodaten
- Metadaten
- App-Datapackage
Dataset: raw/rli_pv_wfr
Regionalstatistik (GENESIS)#
Enthält folgende Datensätze der statistischen Ämter des Bundes und der Länder:
Energieverwendung der Betriebe im Verarbeitenden Gewerbe (43531-01-02-4)#
Jahreserhebung ü. die Energieverwendung der Betriebe im verarbeitendem Gewerbe.
Der Datensatz umfasst:
- Betriebe des Verarbeitenden Gewerbes sowie des Bergbaus und der Gewinnung von Steinen und Erden von Unternehmen des Produzierenden Gewerbes mit im Allgemeinen 20 und mehr Beschäftigten.
-
Betriebe des Verarbeitenden Gewerbes sowie des Bergbaus und der Gewinnung von Steinen und Erden mit im Allgemeinen 20 und mehr Beschäftigten von Unternehmen der übrigen Wirtschaftsbereiche. Die Berichterstattung schließt Verarbeitende Betriebe des Handwerks ein. Bei 7 Wirtschaftszweigen gilt eine Abschneidegrenze von 10 Beschäftigten. Die Merkmalswerte beziehen sich auf den gesamten Betrieb, schließen damit die nicht produzierenden Betriebsteile mit ein. Maßgebend für die Zuordnung ist ab 2008 die „Klassifikation der Wirtschaftszweige, Ausgabe 2008 (WZ 2008)“, und zwar die Abschnitte B und C.
-
Datei:
43531-01-02-4.xlsx - Stand: 31.12.2022
Betriebe, tätige Personen, Bruttoentgelte (42111-01-04-5)#
Jahreserhebung ü. Betriebe, tätige Personen und Bruttoentgelte der Betriebe im verarbeitendem Gewerbe.
Der Datensatz umfasst:
- Sämtliche Betriebe des Wirtschaftsbereiches Verarbeitendes Gewerbe sowie Bergbau und Gewinnung von Steinen und Erden, wenn diese Betriebe zu Unternehmen des Bereiches Verarbeitendes Gewerbe sowie Bergbau und Gewinnung von Steinen und Erden gehören und in diesen Unternehmen mindestens 20 Personen tätig sind;
-
die Betriebe des Wirtschaftsbereiches Verarbeitendes Gewerbe sowie Bergbau und Gewinnung von Steinen und Erden mit mindestens 20 tätigen Personen, sofern diese Betriebe zu Unternehmen gehören, deren wirtschaftlicher Schwerpunkt außerhalb des Bereiches Verarbeitendes Gewerbe sowie Bergbau und Gewinnung von Steinen und Erden liegt. Bei 7 kleinbetrieblich strukturierten Branchen gilt eine untere Erfassungsgrenze von 10 tätigen Personen. Die Auswahl erfolgt jeweils nach dem Beschäftigtenstand Ende September des Vorjahres. Die ausgewiesene Beschäftigtenzahl betrifft dagegen die von Ende September des Berichtsjahres. Die Merkmalswerte beziehen sich auf den gesamten Betrieb, schließen damit die nicht produzierenden Betriebsteile mit ein. Maßgebend für die Zuordnung ist ab 2009 die „Klassifikation der Wirtschaftszweige, Ausgabe 2008 (WZ 2008)“, und zwar die Abschnitte B und C.
-
Datei:
42111-01-04-5.xlsx - Stand: 31.12.2022
Gebäude mit Wohnraum nach Heizungsart (31211-04-01-5-B)#
Zensus 2011: Gebäude mit Wohnraum nach Heizungsart
- Datei:
31211-04-01-5-B.xlsx - Stand: 09.05.2011
Gebäude mit Wohnraum nach Heizungsart (31231-02-01-5)#
Bestand an Wohngebäuden und Wohnungen in Wohn- und Nichtwohngebäuden - Fortschreibung auf Basis der endgültigen Ergebnisse der Gebäude- und Wohnungszählung 2011 (Zensus 2011).
- Datei:
31231-02-01-5.xlsx - Stand: 31.12.2021
Dataset: raw/regiostat
EE-Einspeisezeitreihen#
Einspeisezeitreihen für Erneuerbare Energien, normiert auf 1 MW bzw. 1 p.u. Als Wetterjahr wird 2011 verwendet, siehe Szenarien.
Windenergie#
Stündlich aufgelöste Zeitreihe der Windenergie Einspeisung über 1 Jahr auf Basis von MaStR und renewables.ninja. Auf einen Auflösung auf Gemeindeebene wird verzichtet, da die Differenz der Produktion der Gemeinden nach renewables.ninja <5 % beträgt.
Windenergieanlage (2022)#
Für renewables.ninja sind Position (lat, lon), Nennleistung (capacity), Nabenhöhe und Turbinentyp erforderlich.
Position#
Hierfür wird aus den Zentroiden der Gemeinden ein räumlicher Mittelwert
anhand des Datensatzes
bkg_vg250_muns_region
(bkg_vg250_muns_region.gpkg) gebildet:
import geopandas as gpd
import os.path
def get_position(gdf):
df = gpd.read_file(gdf)
points_of_muns = df["geometry"].centroid
points_of_muns_crs = points_of_muns.to_crs(4326)
point_df = [
points_of_muns_crs.y.sum()/len(points_of_muns),
points_of_muns_crs.x.sum()/len(points_of_muns)
]
return point_df
data_folder = os.path.join("your_data_folder")
muns_gpkg = os.path.join(data_folder, "bkg_vg250_muns_region.gpkg")
center_position = get_position(muns_gpkg)
Nennleistung#
Wird auf 1 MW gesetzt/normiert.
Nabenhöhe#
Aus dem Datensatz
bnetza_mastr_wind_region
(bnetza_mastr_wind_agg_abw.gpkg) wird ein Mittelwer von 100 m abgeleitet.
import geopandas as gpd
df = gpd.read_file("bnetza_mastr_wind_agg_abw.gpkg")
height = df[["hub_height"]].mean()
Turbinentyp#
Annahme: Innerhalb eines Herstellers sind Leistungskurven sehr ähnlich. Daher werden zwei größten Hersteller mit jeweiligen häufigsten Turbinentyp ausgewählt - diese sind Enercon und Vestas mit ca. 70 % und ca. 30%.
import geopandas as gpd
df = gpd.read_file("bnetza_mastr_wind_agg_abw.gpkg")
manufacturers = df[
["manufacturer_name", "status"]
].groupby("manufacturer_name").count().sort_values(
by="status", ascending=False
)
Häufigste Turbinentypen sind Enercon E-70 und Vestas V80. Daher werden Enercon E70 2000 und Vestas V80 2000 in renewables.ninja ausgewählt.
man_1 = manufacturers.index[0]
man_2 = manufacturers.index[1]
type_1 = df[
["manufacturer_name", "type_name", "status"]
].where(df["manufacturer_name"] == man_1).groupby(
"type_name").count().sort_values(by="status", ascending=False)
type_2 = df[
["manufacturer_name", "type_name", "status"]
].where(df["manufacturer_name"] == man_2).groupby(
"type_name").count().sort_values(by="status", ascending=False)
Raw Data von renewables.ninja API#
Es werden zwei Zeitreihen für oben beschriebenen Vergleichsanlagen berechnet:
import json
import requests
import pandas as pd
import geopandas as gpd
def change_wpt(position, capacity, height, turbine):
args = {
'lat': 51.8000, # 51.5000-52.0000
'lon': 12.2000, # 11.8000-13.1500
'date_from': '2011-01-01',
'date_to': '2011-12-31',
'capacity': 1000.0,
'height': 100,
'turbine': 'Vestas V164 7000',
'format': 'json',
'local_time': 'true',
'raw': 'false',
}
args['capacity'] = capacity
args['height'] = height
args['lat'] = position[0]
args['lon'] = position[1]
args['turbine'] = turbine
return args
def get_df(args):
token = 'Please get your own'
api_base = 'https://www.renewables.ninja/api/'
s = requests.session()
# Send token header with each request
s.headers = {'Authorization': 'Token ' + token}
url = api_base + 'data/wind'
r = s.get(url, params=args)
parsed_response = json.loads(r.text)
df = pd.read_json(
json.dumps(parsed_response['data']),orient='index')
metadata = parsed_response['metadata']
return df
enercon_production = get_df(change_wpt(
position,
capacity=1,
height=df[["hub_height"]].mean(),
turbine=enercon)
)
vestas_production = get_df(change_wpt(
position,
capacity=1000,
height=df[["hub_height"]].mean(),
turbine=vestas)
)
Gewichtung und Skalierung der Zeitreihen#
Um die Charakteristika der beiden o.g. Anlagentypen zu berücksichtigen, erfolgt eine gewichtete Summierung der Zeitreihen anhand der berechneten Häufigkeit.
Zukunftsszenarien#
Analog zu dem oben beschriebenen Vorgehen wird eine separate Zeitreihe für zukünftige WEA berechnet. Hierbei wird eine Enercon E126 6500 mit einer Nabenhöhe von 159 m angenommen (PV- und Windflächenrechner).
Da die Zeitreihe sich nur marginal von der obigen Status-quo-Zeitreihe unterscheidet, wird letztere sowohl für den Status quo als auch die Zukunftsszenarien verwendet.
- Einspeisezeitreihe:
wind_feedin_timeseries.csv
Freiflächen-Photovoltaik#
PV-Anlage (2022)#
Stündlich aufgelöste Zeitreihe der Photovoltaikeinspeisung über 1 Jahr auf Basis von MaStR und renewables.ninja. Wie bei der Windeinspeisung wird auf eine Auflsöung auf Gemeindeebene aufgrund geringer regionaler Abweichungen verzichtet.
Für die Generierung der Zeitreihe über renewables.ninja wird eine Position(lat, lon), Nennleistung (capacity), Verluste (system_loss) Nachführung (tracking), Neigung (tilt) und der Azimutwinkel (azim) benötigt.
Als Position wird analog zur Windenergieanlage der räumlicher Mittelwert verwendet. Laut MaStR werden lediglich 13 Anlagen nachgeführt (0,01 % der Kapazität), die Nachführung wird daher vernachlässigt. Die Neigung ist aus MaStR nicht bekannt, es dominieren jedoch Anlagen auf Freiflächen sowie Flachdächern im landwirtschaftlichen Kontext. Nach Ariadne Szenarienreport wird diese mit 30° angenommen. Die Nennleistung Wird auf 1 MW gesetzt/normiert.
Zukunftsszenarien#
Die Status-quo-Zeitreihe wird sowohl für den Status quo als auch die Zukunftsszenarien verwendet.
- Einspeisezeitreihe:
pv_feedin_timeseries.csv
Solarthermie#
- Einspeisezeitreihe:
st_feedin_timeseries.csv(Kopie von PV-Einspeisezeitreihe)
Laufwasserkraft#
Hier wird eine konstante Einspeisung angenommen.
- Einspeisezeitreihe:
ror_feedin_timeseries.csv
Dataset: raw/renewables.ninja_feedin
Lokale Verwaltungseinheiten#
Lokale Verwaltungseinheiten (LAUs) von Eurostat, mit NUTS kompatibel. Diese LAU sind die Bausteine der NUTS und umfassen die Gemeinden und Kommunen der Europäischen Union.
Dataset: raw/eurostat_lau
Energiestrategie Brandenburg 2040 (MWAE)#
Ziele aus der Energiestrategie Brandenburg 2040 des Ministeriums für Wirtschaft, Arbeit und Energie.
Dateien:
- Ziele aus der Energiestrategie:
mwae_bb_energy_strategy.json
Quellen:
Dataset: raw/mwae_bb_energy_strategy
Digitales Feldblock-Kataster (MLUK)#
Digitales Feldblock-Kataster des Ministerium für Landwirtschaft, Umwelt und Klimaschutz des Landes Brandenburg.
Stand: 23.10.2023
Quellen:
Das Digitale Feldblockkataster (DFBK) ist ein landwirtschaftliches Flächenkataster. Es enthält alle landwirtschaftlich genutzten und förderfähigen Flächen der Länder Brandenburg und Berlin mit ihrer Lage, Größe und weiteren Informationen. Das DFBK dient als Referenzsystem zur Kontrolle von flächenbezogenen Agrarförderanträgen und besteht aus Feldblöcken und Landschaftselementen. Ein Feldblock (FB) kann von einem oder mehreren landwirtschaftlichen Betrieben genutzt werden und bildet eine von dauerhaften Grenzen umgebene zusammenhängende landwirtschaftliche Fläche mit überwiegend einheitlicher Hauptbodennutzung ab. Landschaftselemente (LE) sind Landschaftsmerkmale wie z.B. Hecken, Baumreihen, Feldgehölze, Lesesteinhaufen, die sich im oder am Feldblock befinden. Enthält ein Feldblock Flächen, die nicht landwirtschaftlich nutzbar und kein förderfähiges Landschaftselement sind, so werden diese als nicht-beihilfefähige-Flächen (NBF) gekennzeichnet. Die Digitalisierung der Feldblöcke, Landschaftselemente und NBF-Flächen erfolgt auf der Grundlage von Luftbildern (Digitalen Orthophotos) in den Ämtern für Landwirtschaft der Kreise und kreisfreien Städte im Rahmen des EU-InVeKoS-Verfahrens (Integriertes Verwaltungs- und Kontrollsystem). Die hier in Form der FB und LE bereitgestellten Daten enthalten zusätzlich numerische Angaben zu Flächenanteilen in förderrelevanten Gebietskulissen (z.B. Naturschutzgebiete, NATURA2000-Gebiete und andere).
Dataset: raw/mluk_bb_field_block_cadastre
OpenStreetMap#
OpenStreetMap Datenauszug Deutschland.
Quelle: https://download.geofabrik.de/europe/germany-240101.osm.pbf
Ist nicht Teil des Eingangsdaten-Packages - manueller Download erforderlich.
Dataset: raw/osm