Source code for scenariocompass.emissions_diagnostics

from nomenclature.processor import Processor

import pyam


[docs] class EmissionsDiagnostics(Processor): input_data: dict[str, list[str]] = dict( variable=[ "Emissions|CO2", "Emissions|Kyoto Gases", "Carbon Capture|Geological Storage", ], region=["World"], ) output_meta: list[str] = [ "Emissions Diagnostics|Cumulative CO2 [2020-2100, Gt CO2]", "Emissions Diagnostics|Cumulative Kyoto Gases [2020-2100, Gt CO2e]", "Emissions Diagnostics|Cumulative CCS [2020-2100, Gt CO2]", "Emissions Diagnostics|Year of Net Zero|Kyoto Gases", "Emissions Diagnostics|Year of Net Zero|CO2", ] def apply(self, df: pyam.IamDataFrame): _df = df.filter(**self.input_data, keep=True, inplace=False) if _df.empty: return df invalid_units = set(_df.unit).difference(["Mt CO2/yr", "Mt CO2-equiv/yr"]) if invalid_units: raise ValueError( "Invalid units for emissions diagnostics: " + ", ".join(invalid_units) ) # compute indicators for cumulative emissions and CCS for name, variable in { "Cumulative CO2 [2020-2100, Gt CO2]": "Emissions|CO2", "Cumulative Kyoto Gases [2020-2100, Gt CO2e]": "Emissions|Kyoto Gases", "Cumulative CCS [2020-2100, Gt CO2]": "Carbon Capture|Geological Storage", }.items(): df.set_meta( name="Emissions Diagnostics|" + name, meta=compute_cumulative_eoc(_df.filter(variable=variable)), ) # TODO Emissions Diagnostics|Cumulative Net-Negative CO2 [2020-2100, Gt CO2]", for species in ["Kyoto Gases", "CO2"]: df.set_meta( name=f"Emissions Diagnostics|Year of Net Zero|{species}", meta=_df.filter(variable=f"Emissions|{species}") .timeseries() .apply(year_of_netzero, raw=False, axis=1), ) return df
def compute_cumulative_eoc(df): if df.empty: return None return ( df.timeseries().apply( lambda x: pyam.timeseries.cumulative(x, 2020, 2100), raw=False, axis=1 ) / 1000 ) def year_of_netzero(x): net_zero = pyam.timeseries.cross_threshold(x) # this is special handling for scenarios that reach net-zero assymptotically if not net_zero: net_zero = pyam.timeseries.cross_threshold(x, threshold=1) if net_zero: return net_zero[0]