# Schienenverkehr (1A3c)

Bemerkung

This project and documentation is under active development!

Das Schienenverkehrsmodul in TREMOD berechnet Energieverbrauch, Treibhausgas- (THG) und Luftschadstoffemissionen des Schienenverkehrs in Deutschland für den Zeitraum 1960–2050. Es umfasst:

- Personenfern- und -nahverkehr (z. B. ICE, Regionalzüge, S-Bahnen, U-Bahnen)

- Güterverkehr (inkl. Rangierbetrieb)

- Verkehrsleistungen (Personen- und Tonnenkilometer)

- Betriebsleistungen (Zugkilometer)

- Energieverbrauch (Strom, Diesel, Biodiesel, Festbrennstoffe wie Kohle in historischen Daten)

- Direkte Abgasemissionen sowie Vorkettenemissionen für verschiedene Schadstoffe (z. B. NOₓ, CO₂, PM, SO₂).

## 1. Methodik

Die Berechnung basiert auf einem Bottom-up-Ansatz, bei dem Emissionen aus Verkehrsleistungen, Betriebsleistungen und spezifischen Emissionsfaktoren abgeleitet werden. Die Datenquellen umfassen Statistiken des Statistischen Bundesamts (DESTATIS), des Verbands Deutscher Verkehrsunternehmen (VDV) und der DB AG (u. a. Rail Environment Centre).

Die Eingangsdaten setzen sich zusammen aus:

- Verkehrs- und Betriebsleistungen (z. B. Personenkilometer, Tonnenkilometer, Zugkilometer), die jährlich von DB AG und VDV erhoben und für TREMOD aufbereitet werden.

- Energieverbrauch, differenziert nach Strom (für elektrifizierte Strecken) und Diesel (für Nicht-E-Strecken) sowie historischen Brennstoffen wie Kohle.

- Emissionsfaktoren:

  > - Für elektrischen Betrieb hängt der Faktor vom Jahresmittelwert des deutschen Strommix ab, inklusive Vorkettenemissionen (z. B. durch Stromerzeugung).

  > - Für Dieselzüge basieren die Faktoren auf spezifischen Werten der Bahn, die im ISO-F-Zyklus gemessen und vom DB-Umweltzentrum jährlich bereitgestellt werden.

Die Aktualisierung erfolgt jährlich durch Anpassung der Leistungsdaten (z. B. durch DB AG oder VDV-Erhebungen) sowie der Verbrauchs- und Emissionsfaktoren. Für die Prognose bis 2050 werden Trendszenarien verwendet, die technologische Fortschritte (z. B. strengere Abgasgrenzwerte, Remotorisierung) und die Entwicklung des Fahrzeugparks berücksichtigen.

Die Einzelschritte werden im folgenden beschrieben. Die verwendeten Rechengrößen sind in folgender Tabelle dargestellt:

Größen

Symbol | Spaltenvariable | Bedeutung
--- | --- | ---
\(E^{\text{dir}}\) | `e_direkt` | Direkter Energieverbrauch bzw. direkte Basisemission
\(E\) | `e_direkt` (Endwert) | Resultierende Emission je Schadstoff
\(\mathit{vl}\) | `vl` | Verkehrsleistung
\(\mathit{vlanteil}\) | `vlanteil` | Anteil der Verkehrsleistung
\(\mathit{baanteil}\) | `baanteil` | Anteil der Betriebsart
\(\mathit{alg}\) | `alg` | Auslastungsgrad
\(\mathit{bl}\) | `bl` / `bl1` / `bl2` | Betriebsleistung
\(\mathit{evspez}\) | `evspez` | spezifischer Energieverbrauch
\(\mathit{aendfaktor}\) | `aendfaktor` | Änderungsfaktor (Energieverbrauch)
\(\mathit{efa}\) | `efa` | Emissionsfaktor
\(\mathit{emaendfaktor}\) | `emaendfaktor` | Änderungsfaktor (Emissionsfaktor)
\(\alpha^{\mathrm{hc}}\) | `anteil` | HC-Speziesanteil (NMHC-Differenzierung)
\(\alpha^{\mathrm{bio}}\) | `anteil` (Biofuels) | Biokraftstoffanteil
\(\mathit{efaspez\_tj}\) | `efaspez_tj` | spezifischer treibstoffabgeleiteter Emissionsfaktor
\(\mathit{factor}\) | `factor` | THG-/CO₂-Äquivalenzfaktor
\(\mathit{bc\_share}\) | `bc_shares` | Black-Carbon-Anteil an PM (Default 0,65)

Bemerkung

- Für die Leistungsart-Fallunterscheidung gilt \(\mathit{vl}, \mathit{bl} = 0\), wenn \(l = 2\) (sonst die berechneten Werte).

- Komponenten/Betriebsarten mit Nullemission (DZE) setzen \(E = 0\) für die betroffenen Kombinationen aus \(s, b, n\).

- Die Skalierungen \(10^{6}\) und \(10^{3}\) ergeben sich aus der Einheitenumrechnung der jeweiligen Faktoren.

### 1.1 Betriebsleistung und Energieverbrauch

Zunächst werden Verkehrsleistung (vl) und Betriebsleistung (bl) auf Zugbetriebs- und Rangierebene berechnet, anschließend der direkte Energieverbrauch. Die Verkehrsleistung wird nach Zuggattungen (z. B. ICE, Regionalzug, Güterzug) und Betriebsarten (z. B. Zugbetrieb, Rangieren) differenziert. Die Betriebsleistung (z. B. Zugkilometer) ergibt sich aus der Verkehrsleistung, geteilt durch die mittlere Beladung (alg), d.h. Personen bzw. Tonnen pro Zug.

Zugbetrieb (Leistungsart 1)

Für den Zugbetrieb wird die Verkehrsleistung direkt aus den Eingangsdaten abgeleitet:

\[\begin{aligned} \mathit{vl1} &= \mathit{vl} \cdot \mathit{vlanteil} \cdot \mathit{baanteil}, &\qquad \mathit{bl1} &= \frac{\mathit{vl1}}{\mathit{alg}} \end{aligned}\]

Rangierbetrieb (Leistungsart 2)

Die Leistungen im Rangierbetrieb der DB AG (idunternehmen = 1) werden anteilig aus der Summe der Verkehrsleistungen im Zugbetrieb (\(\mathit{vl3}\)) abgeleitet:

\[\begin{split}\begin{aligned} \mathit{vl3} &= \sum \mathit{vl1}, &\qquad \mathit{bl3} &= \sum \mathit{bl1} \\[2pt] \mathit{vl1}_{\text{Rangier}} &= \mathit{vl3} \cdot \mathit{baanteil}_{\text{Rangier}}, &\qquad \mathit{bl1}_{\text{Rangier}} &= \mathit{bl3} \cdot \mathit{baanteil}_{\text{Rangier}} \end{aligned}\end{split}\]

Energieverbrauch

Der spezifische Energieverbrauch (evspez) ist abhängig von Zugtyp, Antrieb und Energieart. Er wird auf Basis der Betriebsleistung \(\mathit{bl1}\) berechnet. Der spezifische Energieverbrauch setzt sich aus einem Basisverbrauch und einem jährlichen Änderungsfaktor (Effizienzentwicklung) zusammen.

\[Ev_{\text{direkt}} = \frac{\mathit{evspez} \cdot \mathit{aendfaktor} \cdot \mathit{bl1}}{10^{6}}\]

Für die Berichterstattung wird zudem die Größe \(\mathit{vl2}\) und \(\mathit{bl2}\) ausgewiesen. Hierbei wird berücksichtigt, dass für Rangierbetrieb (Leistungsart = 2) keine Verkehrsleistung angesetzt wird, da Rangierfahrten keine Verkehrsleistung im klassischen Sinne erbringen.

\[\begin{split}\begin{aligned} \mathit{vl2} = \begin{cases} 0 & \text{wenn } \mathit{idleistungsart} = 2 \\[4pt] \mathit{vl1} & \text{sonst} \end{cases} \qquad \mathit{bl2} = \mathit{bl1} \end{aligned}\end{split}\]

Abhängige Variablen: vl, vlanteil, baanteil, alg, evspez (spezifischer Energieverbrauch), aendfaktor (Änderungsfaktor), differenziert nach den Parametern Szenario, Bezugsjahr, Unternehmen, Verkehrsart, Zuggattung, Betriebsart, Leistungsart und Energieträger.

### 1.2 Direkte Emissionen

Aus dem Energieverbrauch werden die direkten Emissionen für einzelne Schadstoffe (z. B. NOₓ, CO, HC, Partikel) über Emissionsfaktoren (efa) abgeleitet. CO₂ und SO₂ werden separat behandelt, da sie in erster Linie vom Energieträger und des Kraftstoffverbrauchs abhängen (siehe Abschnitt 1.3).

\[\begin{split}\begin{aligned} \mathit{efa}^{(1)} &= \mathit{efa} \cdot \mathit{emaendfaktor} \\[6pt] Em_{\text{direkt}}^{(1)} &= \begin{cases} 0 & \text{wenn } \mathit{efa}^{(1)} = \text{null} \\[4pt] \dfrac{Ev_{\text{direkt}} \cdot \mathit{efa}^{(1)}}{10^{3}} & \text{sonst} \end{cases} \end{aligned}\end{split}\]

Ferner werden die von HC abgeleiteten Schadstoffkomponenten über ihre jeweiligen Anteile an den Kohlenwasserstoff-Gesamtemissionen bestimmt.

\[Em_{\text{direkt}}^{(2)} = Em_{\text{direkt}}^{(1)} \cdot \mathit{anteil}\]

Für weitere Betriebsarten, z. B. elektrische Lokomotiven mit direkten Nullemissionen (DZE, idbetriebsart ∈ {11, 12, 13}), wird ein separater Datensatz mit Nullwerten erzeugt:

\[Em_{\text{direkt, DZE}}^{(1)} = 0\]

Die Teilergebnisse werden anschließend zu einer Tabelle vereinigt:

\[E_{\text{direkt}} = \bigl\{\, Ev_{\text{direkt}},\ Em_{\text{direkt}}^{(1)},\ Em_{\text{direkt}}^{(2)},\ Em_{\text{direkt, DZE}}^{(1)} \,\bigr\}\]

### 1.3 Nachgelagerte Ergänzungen

Nach der Berechnung der direkten Emissionen werden multiplikative Faktoren für spezifische Anpassungen angewendet. Dies betrifft:

> - Biokraftstoffanteile

> - Emissionen, die auf Basis des Kraftstoffverbrauchs abgeleitet werden

> - Treibhausgasäquivalente

> - Black Carbon Emissionen.

Die Berechnung erfolgt sequentiell:

Biokraftstoffanteile

Die Emissionen werden mit dem Biokraftstoffanteil multipliziert. Da die Berechnung auf Basis des ursprünglichen direkten Emissionswerts \(Em_{\text{direkt}} \in \{Em_{\text{direkt}}^{(1)}, Em_{\text{direkt}}^{(2)}, Em_{\text{direkt, DZE}}^{(1)}\}\) erfolgt, ergibt sich:

\[Em_{\text{direkt}}^{(3)} = Em_{\text{direkt}} \cdot \mathit{anteil}_{\text{bio}}\]

Kraftstoffverbrauchsabhängige Emissionen

Für Emissionen, die auf Basis des Kraftstoffverbrauchs berechnet werden, erfolgt eine Umrechnung ausgehend von den biokraftstoffbereinigten Werten:

\[Em_{\text{direkt}}^{(4)} = Em_{\text{direkt}}^{(3)} \cdot \mathit{efaspez\_tj}\]

Treibhausgase (THG-Äquivalente)

Die Berechnung der \(\text{CO}_2\)-Äquivalente erfolgt durch Multiplikation mit dem entsprechenden THG-Faktor und anschließender Aufsummierung der \(\text{CO}_2\)-Äquivalente je Schadstoff (z.B: CO2, CH4, N2O):

\[Em_{\text{direkt}}^{(5)} = Em_{\text{direkt}} \cdot \mathit{factor}\]

Black Carbon (BC)

Black Carbon Emissionen (\(\text{idss} = 6\)) werden als Anteil von den Partikelemissionen (\(Em_{\text{direkt}}\)) abgeleitet:

\[Em_{\text{BC}} = Em_{\text{direkt}} \cdot \mathit{bc\_shares}, \qquad \mathit{bc\_shares} = 0{,}65\]

Abhängige Variablen: anteil (Biokraftstoffanteil), efaspez_tj (spez. treibstoffabgeleiteter EF), factor (THG-/CO₂-Äquivalenzfaktor), bc_shares (Black Carbon-Anteil an PM).

### 1.4 Gesamtberechnung

Die zusammenfassenden Formeln für Energieverbrauch und Emissionen basieren auf den zuvor beschriebenen Schritten. Sie berücksichtigen alle relevanten Indizes bzw. Differenzierungen (z. B. Szenario, Unternehmen, Verkehrsart) und Größen (z. B. Verkehrsleistung, Emissionsfaktoren).

Energieverbrauch

\[E^{\text{dir}}_{\,z,u,v,j,g,b,l,n} = \frac{ \mathit{evspez}_{\,l,b,g}\cdot\mathit{aendfaktor}_{\,j,l,b,g,u,z}\cdot\mathit{bl}_{\,z,u,v,j,g,b,l} }{10^{6}}\]

mit der Betriebsleistung

\[\mathit{bl}_{\,z,u,v,j,g,b,l} = \frac{\mathit{vl}_{\,z,v,j}\cdot\mathit{vlanteil}_{\,z,v,j,u}\cdot\mathit{baanteil}_{\,z,u,j,g,b}} {\mathit{alg}_{\,z,u,j,g,b,l}}\]

Emissionen

\[E_{\,z,u,v,j,g,b,l,n,s} = E^{\text{dir}}_{\,z,u,v,j,g,b,l,n} \cdot \frac{\mathit{efa}_{\,s,l,b,g}\cdot\mathit{emaendfaktor}_{\,s,l,b,g}}{10^{3}} \cdot \alpha^{\mathrm{hc}}_{\,s,n} \cdot \alpha^{\mathrm{bio}}_{\,z,j,n} \cdot k^{\mathrm{nach}}_{\,s}\]

wobei der nachgelagerte Faktor je nach Schadstoffpfad nur einen der folgenden Terme annimmt:

\[\begin{split}k^{\mathrm{nach}}_{\,s} = \begin{cases} \mathit{efaspez\_tj}_{\,j,n,L} & \text{treibstoffabgeleitet}\ (s=5)\\ \mathit{factor}_{\,s} & \text{THG- / CO}_2\text{-Äquivalente}\\ \mathit{bc\_share}\ (=0{,}65) & \text{Black Carbon}\ (s=6)\\ 1 & \text{sonst} \end{cases}\end{split}\]

Indizes

Index | Spaltenvariable | Bedeutung
--- | --- | ---
\(z\) | `idszenario` / `idszenbahn` | Szenario / Bahnszenario
\(u\) | `idunternehmen` | Unternehmen
\(v\) | `idverkehrsart` | Verkehrsart
\(j\) | `bezugsjahr` | Bezugsjahr
\(g\) | `idzuggattung` | Zuggattung
\(b\) | `idbetriebsart` | Betriebsart (z. B. Zug-/Rangierbetrieb)
\(l\) | `idleistungsart` | Leistungsart
\(n\) | `idenergy` | Energieträger
\(s\) | `idss` | Schadstoff / Komponente
\(L\) | `idland` | Land (nur treibstoffabgeleitet)

### 1.5 Energiebilanzkorrektur

Berechnung des TREMOD-Energieverbrauchs: Der Traktionsenergieverbrauch wird in TREMOD bottom-up aus Verkehrsleistungen, Betriebsleistungen und spezifischen Verbräuchen abgeleitet.

Vergleich mit der Energiebilanz: Die Summe der TREMOD-Ergebnisse für DB AG, Nichtbundeseigene Eisenbahnen (NE)-Bahnen und Hafen-/Werkbahnen (HWB) wird mit dem Wert aus der Energiebilanz der Arbeitsgemeinschaft Energiebilanzen (kurz AGEB) verglichen und hieraus ein Energiebilanzkorrekturfaktor berechnet. Der Faktor ergibt sich aus dem Verhältnis von AGEB-Wert zur TREMOD-Summe:

\[k_n = \frac{E_{\text{AGEB},n}}{E_{\text{TREMOD,Summe},n}}\]

mit:

- \(E_{\text{AGEB},n}\): Energieverbrauch des Schienenverkehrs für Energieträger \(n\) laut AGEB.

- \(E_{\text{TREMOD,Summe},n}\): Summe der berechneten Verbrauchswerte für DB AG, NE-Bahnen und HWB in TREMOD.

Falls der AGEB-Wert niedriger ist als die TREMOD-Summe, wird der Korrekturfaktor < 1 (Reduktion der TREMOD-Werte). Wenn jedoch der AGEB-Wert höher ist, wird der Faktor > 1 (Erhöhung der TREMOD-Werte).

Anwendung des Faktors: Die berechneten Energieverbrauchswerte in TREMOD werden mit dem Korrekturfaktor multipliziert, um die Übereinstimmung mit der Energiebilanz herzustellen. Die korrigierten Energieverbrauchswerte \(E_{\text{korr},n}\) für den Schienenverkehr ergeben sich aus:

\[E_{\text{korr},n} = E_{\text{TREMOD},n} \cdot k_n\]

wobei:

- \(E_{\text{korr},n}\): Korrigierter Energieverbrauch des Schienenverkehrs für Energieträger \(n\) (Strom oder Diesel).

- \(E_{\text{TREMOD},n}\): Berechneter Energieverbrauch in TREMOD für Energieträger \(n\).

- \(k_n\): Korrekturfaktor für Energieträger \(n\).

Für die Ergebnisausgabe nach Energiebilanzprinzip und ZSE (siehe nächster Abschnitt) werden auch die Emissionen mit dem Korrekturfaktor multipliziert.

### 1.6 ZSE-Ausgabe

Die korrigierten Energieverbrauchsdaten bilden auch die Grundlage für die nationale Berichterstattung im zentralen System Emissionen (ZSE). TREMOD verfügt hierzu über eine eigene ZSE-Schnittstelle für den Verkehr.

Das ZSE unterscheidet im Schienenverkehr nach Kraftstoffart und Bezugsjahr. Dabei wird eine eigene Nomenklatur verwendet, welche in entsprechenden Zuordnungstabellen hinterlegt ist. Auch wird nur ein Teil der in TREMOD verfügbaren Schadstoffe für das ZSE berichtet.

Das ZSE beinhaltet folgende Kenngrößen:

  - Aktivitätsrate: für direkte Emissionen in Terajoule (TJ)

  - Emissionsfaktoren: für direkte Emissionen in kg/TJ

Die Emissionsfaktoren berechnen sich aus dem Quotient aus den Emissionen und dem Endenergieverbrauch je Bezugsjahr und ZSE-Kategorie. Die Ergebnisse nach Inlandsprinzip werden nicht korrigiert.

## 2. Implementierung

Sämtliche Abfragen und Berechnungen von TREMOD Rail (Schienenverkehr) sind in Python und der Bibliothek Polars umgesetzt. Die Datenhaltung in mehreren PostgreSQL-Datenbanken. Im folgenden werden die Datenschnittstellen, Eingangsdatenformate und Berechnungsschritte skizziert.

### 2.1 Datenschnittstellen

Alle Eingangsdaten und Definitionen sind als Tabellen in der SQL-Datenbank gespeichert und können dort verändert werden, z.B. für jährliche Updates. Sie werden über das Modul tableoperations aufgerufen und in die Berechnungen für TREMOD-Road integriert. Der Name der Datenbank setzt sich aus „tremod_rail“ + „Versionsnummer“ zusammen. Die Datentabellen können entweder aus einer lokalen SQLite-Datenbank oder über Remote-Zugriff (z.B. Postgres) abgerufen werden.

Alle für die Berechnungen des Schienenverkehrs verwendeten Tabellen werden über die Klasse `PersistanceLayer` im Modul `tableoperations.py` des Rechenmodells füe den Schienenverkehr definiert und vorgeladen.

Sie beinhaltet folgende Methoden, welche im folgenden kurz beschrieben werden:

Methoden der Klasse PersistanceLayer
Methode | Beschreibung
--- | ---
get_common | Verkehrsträgerübergreifende Daten, Definitionen und Emissionsfaktoren
get_base_data | Verkehrsleistungs- und Betriebsdaten im Schienenverkehr
get_emission_factors | Bahnspezifische Emissionsfaktoren
get_definitions | Definitionsdateien des Verkehrsträgers Schiene (z.B. Szenarien)

Die Hilfsmethoden get_results und write_to_db dienen dem Lesen und Schreiben der Ergebnisse zu Bestand, Fahr- und Verkehrsleistung sowie Emissionen in die Datenbank. convert_pol_dtypes dient zur Vereinheitlichung von Datentypen für die Berechnungen in Polars.

### 2.2 Eingangsdaten

Die Quellen zu den Eingangsdaten sind in den UBA-Berichten zur TREMOD-Aktualisierung dokumentiert. Daher wird hier nur auf die für die Emissionsberechnung wichtigsten Tabellen eingegangen, welche im Rahmen der jährlichen Updates angepasst werden.

#### Common data

Ergänzend siehe ggf. Tabellen, die bereits für den Straßenverkehr (1A3b) erläutert wurden.

Spezifische Emissionsfaktoren

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idland | integer | siehe tg_land
idvtr | integer | siehe tg_vtraeger
idss | integer | Schadstoff
jahr | bigint | Bezugsjahr
idenergy | integer | siehe tg_energie
efaspez | double precision | Emissionsfaktor g/kg
efaspez_tj | double precision | Emissionsfaktor kg/TJ
ppm | double precision | Schwefelanteil Kraftstoff in ppm
com | text | Kommentar

Biokraftstoffanteile

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idszenario | integer | siehe btg_szenario
bezugsjahr | integer | Bezugsjahr
idenergy | integer | siehe tg_energie
idenergy_bezug | integer | siehe tg_energie
anteil | real | Anteil in % (energetisch)
idvtr | integer | Verkehrsträger (Straße, Schiene, Binnenschiff, Luft)

#### Basisdaten (Aktivitätsdaten)

Verkehrsleistungsanteile

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idvlantvar | integer | Identifikationsnummer Variante Verkehrsleistungsanteil
idunternehmen | integer | Identifikationsnummer Unternehmen
idverkehrsart | integer | Identifikationsnummer Verkehrsart
bezugsjahr | integer | Bezugsjahr
idzuggattung | integer | Identifikationsnummer Zuggattung
vlanteil | double precision | Verkehrsleistungsanteil

Betriebsartanteile

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idbavar | integer | Identifikationsnummer Variante Betriebsart
idunternehmen | integer | Identifikationsnummer Unternehmen
bezugsjahr | integer | Bezugsjahr
idzuggattung | integer | Identifikationsnummer Zuggattung
idbetriebsart | integer | Identifikationsnummer Betriebsart
idleistungsart | integer | Identifikationsnummer Leistungsart
baanteil | double precision | Anteil Betriebsart

Auslastungsgrade

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idalgvar | integer | Identifikationsnummer Variante Auslastungsgrad
idunternehmen | integer | Identifikationsnummer Unternehmen
bezugsjahr | integer | Bezugsjahr
idzuggattung | integer | Identifikationsnummer Zuggattung
idbetriebsart | integer | Identifikationsnummer Betriebsart
idleistungsart | integer | Identifikationsnummer Leistungsart
alg | double precision | Auslastungsgrad

Verkehrsleistungen

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idvlvar | integer | Identifikationsnummer Variante Verkehrsleistung
idunternehmen | integer | Identifikationsnummer Unternehmen
idverkehrsart | integer | Identifikationsnummer Verkehrsart
bezugsjahr | integer | Bezugsjahr
vl | double precision | Verkehrsleistung
com | text | Anmerkung Verkehrsleistung

#### Emissionsfaktoren

Emissionsfaktoren

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idzugart | integer | Identifikationsnummer Zugart
idbetriebsart | integer | Identifikationsnummer Betriebsart
idleistungsart | integer | Identifikationsnummer Leistungsart
idss | integer | Identifaktionsnummer Schadstoff
efa | double precision | Emissionsfaktor
com_efa | text | Anmerkung Emissionsfaktor

Energieverbrauchsfaktoren

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idzuggattung | integer | Identifikationsnummer Zuggattung
idbetriebsart | integer | Identifikationsnummer Betriebsart
idleistungsart | integer | Identifikationsnummer Leistungsart
evspez | double precision | Spezifischer Energieverbrauch
com_evspez | text | Anmerkung zu spez. Energieverbrauch

Anpassungsfaktoren des Energieverbrauchs

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idenergievar | integer | Identifikationsnummer Variante Energieträger
idunternehmen | integer | Identifikationsnummer Unternehmen
idzuggattung | integer | Identifikationsnummer Zuggattung
idbetriebsart | integer | Identifikationsnummer Betriebsart
idleistungsart | integer | Identifikationsnummer Leistungsart
bezugsjahr | integer | Bezugsjahr
aendfaktor | double precision | Änderungsfaktor Energieverbrauch

Änderungsfaktoren der Emissionen

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idemvar | integer | Identifikationsnummer Variante Emission
idunternehmen | integer | Identifikationsnummer Unternehmen
idzugart | integer | Identifikationsnummer Zugart
idbetriebsart | integer | Identifikationsnummer Betriebsart
idleistungsart | integer | Identifikationsnummer Leistungsart
bezugsjahr | integer | Bezugsjahr
idss | integer | Identifikationsnummer Schadstoff
emaendfaktor | double precision | Änderungsfaktor Emission

#### Definitionen

Szenariendefinition

Spaltenname | Datentyp | Beschreibung
--- | --- | ---
idszenbahn | integer | Identifikationsnummer Szenario
idverkehrsart | integer | Identifikationsnummer Verkehrsart
bezugsjahr | integer | Bezugsjahr der Szenariendefinition
idunternehmen | integer | Identifikationsnummer Unternehmen
idvlvar | integer | Identifikationsnummer Variante Verkehrsleistung
idvlantvar | integer | Identifikationsnummer Variante Verkehrsleistungsanteil
idalgvar | integer | Identifikationsnummer Variante Auslastungsgrad
idbavar | integer | Identifikationsnummer Variante Betriebsart
idenergievar | integer | Identifikationsnummer Variante Energieträger
idemvar | integer | Identifikationsnummer Variante Emissionen
idenergieerzvar | integer | Identifikationsnummer Variante Energieerzeugung
idland | integer | Identifikationsnummer Land

### 2.3 Berechnungen

Die eigentliche Emissionsberechnung des Schienenverkehrs ist in der Klasse `RailEmissions` im Modul `rail.src.emissions` gebündelt. Sie lädt beim Initialisieren die benötigten Eingangsdaten (Basis- bzw. Aktivitätsdaten, Energieverbrauchs- und Emissionsfaktoren, Definitionen sowie verkehrsträgerübergreifende Daten) über die Klasse `PersistanceLayer` und stellt darauf aufbauend die einzelnen Berechnungsschritte als Methoden bereit.

Das folgende Ablaufdiagramm gibt einen Überblick über das Zusammenspiel dieser Methoden und den Datenfluss zwischen ihnen. Ausgehend von den Eingangsdaten werden in der Methode `calculate_tblsce_rail_sys_d_trend` zunächst die direkten Emissionen über die gesamte interne Kette (Verkehrs- und Betriebsleistung, Energieverbrauch, Emissionsfaktoren, HC-Differenzierung und Nullemissions-Komponenten) berechnet und in `direct_emissions` abgelegt. Die nachgelagerten Methoden (z. B. Biokraftstoffanteile, treibstoffabgeleitete Emissionen, Treibhausgas-Äquivalente und Black Carbon) bauen auf diesem Zwischenergebnis bzw. auf `merged_results` auf und ergänzen die Gesamtergebnisse schrittweise.

#### Ablaufdiagramm der Emissionsberechnung

#### Code-Beschreibung:

Die nachfolgende Übersicht wurde aus den Docstrings des Moduls `rail.src.emissions` erzeugt und dokumentiert die Klasse `RailEmissions` mit allen öffentlichen Methoden. Sie beschreibt für jede Methode kurz ihre Aufgabe, die verarbeiteten Eingangsdaten sowie die zurückgegebenen Ergebnisse und bildet damit die konkrete Implementierung der zuvor dargestellten Berechnungsschritte ab. Die einzelnen Methoden sind in der Reihenfolge ihres Aufrufs im Ablaufdiagramm zu lesen.

class rail.src.emissions.RailEmissions(local=False, trmd_version='701')

  Bases: `object`

  static add_dze_comp_modes(energy_consumption: DataFrame, res_dze_comp_modes: DataFrame) → DataFrame

    Adds modes with zero direct emissions (DZE) to the energy consumption DataFrame by performing a left join with the DZE DataFrame. The method filters rows based on specific criteria and adds additional columns for further processing.

    Parameter:

      - energy_consumption – A Polars DataFrame containing energy consumption data.

      - res_dze_comp_modes – A Polars DataFrame containing DZE modes.

    Rückgabe:

      A Polars DataFrame with the joined and processed data.

  bc_emissions(bc_shares=0.65)
    Calculates black carbon emissions based on predefined shares and

      applies necessary transformations to generate updated emission data.

    Verursacht:

      - KeyError – If expected, keys are missing in the self.definitions or bc_shares data structures.

      - ValueError – If data alignment issues occur during table join operations.

    Rückgabe:

      DataFrame containing the black carbon emissions, updated with weighted values based on specific shares and segments.

    Rückgabetyp:

      pd.DataFrame

  biofuelshares()

    Calculates and integrates the share of biofuels in the energy mix based on given parameters stored in the instance’s attributes. Filters only relevant biofuels data, performs merging, and adjusts energy values proportional to the biofuel shares.

    Verursacht:

      KeyError – If required keys are missing during filtering, joining, or renaming operations.

    Rückgabe:

      Updated DataFrame where the energy values are adjusted to include biofuel shares, and unnecessary intermediate columns are dropped.

    Rückgabetyp:

      pol.DataFrame

  static calc_em_excl_co2_so2(energy_consumption: DataFrame, ef_excl_co2_so2: DataFrame) → DataFrame

    Calculates emissions excluding CO2 and SO2 based on energy consumption and emission factors. This method joins the energy consumption DataFrame with the emission factors DataFrame based on specific keys, and computes adjusted emissions.

    Parameter:

      - energy_consumption – The DataFrame contains energy consumption data.

      - ef_excl_co2_so2 – The DataFrame contains emission factors excluding CO2 and SO2.

    Rückgabe:

      A DataFrame with enriched and computed emission data.

    Rückgabetyp:

      pol.DataFrame

  calc_em_hc_diff(em_excl_co2_so2: DataFrame) → DataFrame

    Calculates various hydrocarbon related emissions based on input emission data. Joins the em_excl_co2_so2 DataFrame with specific emission factor information and computes additional columns for the resulting dataset.

    Parameter:

      em_excl_co2_so2 – A Polars DataFrame containing emission data excluding CO2 and SO2. The input should include columns allowing an inner join with the emission factor DataFrame, such as idss and idenergy.

    Rückgabe:

      A Polars DataFrame containing the resulting dataset after processing, including relevant scenario, company, traffic type, and calculated emission data.

  calc_energy_consumption(ops_merged: DataFrame) → DataFrame

    Calculates energy consumption for the provided dataset by merging energy-related data from multiple dataframes and performing necessary transformations.

    Parameter:

      ops_merged (pol.DataFrame) – The input DataFrame containing operational data that needs to be processed and enhanced with energy consumption details.

    Rückgabe:

      A DataFrame with the calculated energy consumption and various additional attributes derived through the joining and transformation steps.

    Rückgabetyp:

      pol.DataFrame

  calculate_tblsce_rail_sys_d_trend() → DataFrame

    Calculates the rail system emissions trend data and prepares the resulting dataset.

    This method processes train and shunting operation performances, computes energy consumption, and applies emission factors to estimate emissions excluding CO2 and SO2. It incorporates differential results for hydrocarbon-related emissions and identifies compensatory modes. The method merges all partial results into a final dataset, computes direct emissions, and returns the complete DataFrame.

    Rückgabe:

      A DataFrame containing the computed rail system direct emissions trend data.

    Rückgabetyp:

      pol.DataFrame

  static compare_dtypes(df1, df2)

    Compare the data types of two DataFrame objects.

    This static method compares the data types of columns in two given DataFrame objects. It returns a dictionary indicating whether each column has matching data types across both DataFrames.

    Parameter:

      - df1 (DataFrame) – The first DataFrame object to compare.

      - df2 (DataFrame) – The second DataFrame object to compare.

    Rückgabe:

      A dictionary where keys are column names and values are boolean flags indicating if the columns have different data types in both DataFrames.

    Rückgabetyp:

      dict

  det_dze_comp_modes() → DataFrame

    Selection of components and operating modes with zero direct emissions.

    Rückgabe:

      A filtered and processed DataFrame containing operating modes with zero direct emissions.

    Rückgabetyp:

      pol.DataFrame

  fuel_derived_emissions()

    Calculates and retrieves fuel-derived emissions by applying specific emission factors to the corresponding fuel amounts. This function processes data by merging it with definitions, specific emission factors, and then calculates the resulting emission values. It updates the merged results with the processed data.

    Parameter:

      self – The instance of the class, used to access its attributes and other methods.

    Rückgabe:

      DataFrame containing the fuel-derived emissions after processing.

    Rückgabetyp:

      pandas.DataFrame

  static get_direct_emission_results(mrgd_part_res: DataFrame) → DataFrame

    Extracts and transforms specific columns from the provided DataFrame to generate direct emission results. The method filters and renames selected columns from the input DataFrame to meet internal processing needs.

    Parameter:

      mrgd_part_res – The input DataFrame containing emission data along with other related attributes. It is expected to have columns such as ‚idszenario‘, ‚idunternehmen‘, ‚idverkehrsart‘, ‚bezugsjahr‘, ‚idzuggattung‘, ‚idbetriebsart‘, ‚idleistungsart‘, ‚idss‘, ‚idenergy‘, ‚vl2‘, ‚bl2‘, and ‚e_direkt‘.

    Rückgabe:

      A transformed DataFrame containing the selected and renamed columns for further processing. The column e_gesamt is included with a static value of 0.

    Rückgabetyp:

      pol.DataFrame

  get_ef_excl_co2_so2() → DataFrame

    Computes and returns a filtered and joined dataset with emission factors for further analysis excluding CO2 and SO2. The function performs multiple joins on data tables, applies filters on specific columns, and computes a new column (efa1) as a product of existing columns.

    Rückgabe:

      A filtered dataset containing emission factors, excluding CO2 and SO2.

    Rückgabetyp:

      pol.DataFrame

  get_merged_results(df_result)

    Merges the direct emissions data with the provided result DataFrame.

    Parameter:

      df_result (pandas.DataFrame) – The DataFrame to merge with the direct emissions.

    Rückgabe:

      The merged DataFrame containing both direct emissions and the result data.

    Rückgabetyp:

      pandas.DataFrame

    This method first checks whether the direct emissions data is empty. If so, it attempts to calculate them. It then ensures that biofuel shares have already been calculated and compares the columns in common between the direct emissions DataFrame and the provided input DataFrame. Finally, it returns a horizontally merged and aligned DataFrame.

  ghg_emissions()

    Calculates CO2-equivalents from CO2 and other greenhouse gases. This function processes data by merging it with definitions, specific emission factors, and then calculates the resulting emission values.

    Parameter:

      self – The instance of the class, used to access its attributes and other methods.

    Rückgabe:

      DataFrame containing the ghg emissions after processing.

    Rückgabetyp:

      pandas.DataFrame

  static merge_ops(train_ops: DataFrame, shunt_ops: DataFrame) → DataFrame

    Merges train operations and shunt operations datasets into a single dataset by selecting specific columns and unifying them into a consistent structure. The method combines and deduplicates the data.

    Parameter:

      - train_ops – A DataFrame containing train operations data.

      - shunt_ops – A DataFrame containing shunt operations data.

    Rückgabe:

      A consolidated DataFrame containing merged and unique records from train and shunt operations datasets.

  merge_partial_results(energy_consumption: DataFrame, em_excl_co2_so2: DataFrame, res_em_hc_diff: DataFrame, mrgd_dze_comp_modes: DataFrame) → DataFrame

    Merges partial results from multiple dataframes into a single dataframe by selecting specific result columns and concatenating the data vertically while ensuring uniqueness of the resulting rows.

    Parameter:

      - energy_consumption – The input dataframe containing energy consumption data with a specific structure. It needs to be processed to extract relevant columns.

      - em_excl_co2_so2 – The input dataframe containing emission data excluding CO2 and SO2 with a specific structure. Relevant columns will be selected for merging.

      - res_em_hc_diff – The input dataframe containing results of emission hydrocarbon differences. A specific column will be extracted for further merging.

      - mrgd_dze_comp_modes – The input dataframe with merged direct zero emission data. modes. Relevant columns are extracted for inclusion in the final result.

    Rückgabe:

      A concatenated dataframe combining all the relevant data from the input dataframes, with duplicate rows removed.

    Rückgabetyp:

      pol.DataFrame

  static prep_shunt_ops_perf(train_ops: DataFrame) → DataFrame

    Prepares the operational shunting performance data by filtering, grouping, aggregating, and enriching the dataset for further analysis.

    Parameter:

      train_ops – A Polars DataFrame representing operational train data.

    Rückgabe:

      A Polars DataFrame containing the processed shunting performance dataset.

  shunt_ops_perf(shunt_ops_prep: DataFrame) → DataFrame

    Performs operations on the given shunting operations preparation DataFrame by joining it with additional reference data tables, filtering based on specific criteria, performing calculations, and returning a processed DataFrame with unique rows.

    Parameter:

      shunt_ops_prep – A Polars DataFrame containing prepared shunting operations data to be transformed and processed.

    Rückgabe:

      A Polars DataFrame containing the processed shunting operations data

  train_ops_perf() → DataFrame

    Computes operational performance statistics for train scenarios by joining and filtering multiple data sources and deriving new metrics.

    The function processes data tables related to train scenarios, transportation types, operational modes, and other parameters. It combines the tables with relevant keys, applies necessary filters, and calculates derived metrics based on performance indicators. The final dataset includes metrics such as scenario ID, transportation type, operational type, and performance indicators.

    Rückgabe:

      A DataFrame containing calculated train operational performance metrics.

    Rückgabetyp:

      pol.DataFrame

### 2.4 Ergebnisausgabe

Die Ergebnisausgabe ist im Wesentlichen nach folgenden differenziert:

- Szenario (z.B.: Realdaten Westdeutschland 1960-1993, Realdaten Ostdeutschland 1960-1993, Deutschland 1994-2050)

- Bezugsjahr (z.B.: 1960 bis 2050)

- Unternehmen (z.B.: Deutsche Bahn AG und Rechtsvorgänger, Nichtbundeseigene Eisenbahnen öffentlich, Kommunale Bahnen, Hafen- und Werksbahnen)

- Verkehrsart (z.B. Personenverkehr, Güterverkehr)

- Zuggattung (z.B. Personennahverkehrszug, Personenfernverkehrszug, Güterzug, Straßen-Stadt-U-Bahn, Hafen- Werksbahn, ICE, IC/EC, InterRegio)

- Betriebsart (z.B. Elektrisch (Bahnstrom), Elektrisch (EVU-Strom), Diesel, Dampf/Kohle)

- Leistungsart (z.B. Leistungen im Zugdienst, Rangierleistungen)

- Schadstoff (z.B. Kohlenwasserstoffe total, Kohlenmonoxid, Stickoxide, Partikelmasse)

- Energieträger (z.B. Strom, Diesel, Biodiesel u. Pflanzenöl)