Sectoral indicators (Supplementary Material, Table 4.SM.1)

Notebook sr15_4.SM.1_supplementary_sectoral_indicators

This notebook is based on the Release 1.1 of the IAMC 1.5C Scenario Explorer and Data and refers to the published version of the IPCC Special Report on Global Warming of 1.5C (SR15).

The notebook is run with pyam release 0.5.0.

The source code of this notebook is available on GitHub (release 2.0.2).

sr15_4.SM.1_supplementary_sectoral_indicators

IPCC SR15 scenario assessment

Supplementary indicators of the pace of transformation
in 1.5°C pathways and selected sectoral studies

This notebook computes additional indicators of sectoral transformation for Table 4.SM.1 in the Special Report.

The scenario data used in this analysis can be accessed and downloaded at https://data.ene.iiasa.ac.at/iamc-1.5c-explorer.

Load pyam package and other dependencies

In [1]:
import yaml
import pyam
pyam - INFO: Running in a notebook, setting `pyam` logging level to `logging.INFO` and adding stderr handler

Import scenario data, categorization and specifications files

The metadata file with scenario categorisation and quantitative indicators can be downloaded at https://data.ene.iiasa.ac.at/iamc-1.5c-explorer. Alternatively, it can be re-created using the notebook sr15_2.0_categories_indicators.

The last cell of this section loads and assigns a number of auxiliary lists as defined in the categorization notebook.

In [2]:
sr1p5 = pyam.IamDataFrame(data='../data/iamc15_scenario_data_world_r2.0.xlsx')
pyam.utils - INFO: Reading `../data/iamc15_scenario_data_world_r2.0.xlsx`
In [3]:
sr1p5.load_meta('sr15_metadata_indicators.xlsx')
pyam.core - INFO: Importing metadata for 416 scenarios (for total of 416)
In [4]:
with open("sr15_specs.yaml", 'r') as stream:
    specs = yaml.load(stream, Loader=yaml.FullLoader)

rc = pyam.run_control()
for item in specs.pop('run_control').items():
    rc.update({item[0]: item[1]})
cats = specs.pop('cats')
cats_15_no_lo = specs.pop('cats_15_no_lo')
marker= specs.pop('marker')

Assign years of interest and downselect to scenarios of interest for this assessment

In [5]:
table_years = [2020, 2030, 2050]
compare_year = 2010
years = [compare_year] + table_years
In [6]:
cats.remove('Above 2C')
In [7]:
df = sr1p5.filter(category=cats + ['no-climate-assessment'], year=years)

Initialize a pyam.Statistics instance¶

In [8]:
filters = [
    (('IAM pathways', 'no & lo os 1.5'), {'category': cats_15_no_lo}),
    (('IAM pathways', 'lo os 1.5'), {'category': ['1.5C low overshoot']}),
    (('IAM pathways', 'hi os 1.5'), {'category': ['1.5C high overshoot']}),
    (('IAM pathways', 'S1'), {'marker': ['S1']}),
    (('IAM pathways', 'S2'), {'marker': ['S2']}),
    (('IAM pathways', 'S5'), {'marker': ['S5']}),
    (('IAM pathways', 'LED'), {'marker': ['LED']}),
    (('sectoral studies', 'Löffler et al. (2017)'), {'model': ['GENeSYS-MOD 1.0']}),
    (('sectoral studies', 'IEA ETP (2017)'), {'model': ['IEA Energy Technology Perspective Model 2017']}),
    (('sectoral studies', 'IEA WEM (2017)'), {'model': ['IEA World Energy Model 2017']})
]

stats = pyam.Statistics(df=df, filters=filters, rows=True)

Share of renewables in primary energy and electricity generation

In [9]:
def add_stats_share(var_list, header, total, total_name, df=df, years=table_years):

    _df = df.filter(variable=var_list)
    for v in var_list:
        _df.require_variable(v, exclude_on_fail=True)
    _df.filter(exclude=False, inplace=True)

    component = (
        _df.timeseries()
        .groupby(['model', 'scenario']).sum()
    )
    share = component / total * 100
    
    for y in years:
        stats.add(share[y], header='Share of {}'.format(header),
                  subheader='in {} (%)'.format(total_name), row=y)
In [10]:
pe = df.filter(variable='Primary Energy').timeseries()
pe.index = pe.index.droplevel([2, 3, 4])
In [11]:
pe_re_vars = [
    'Primary Energy|Biomass',
    'Primary Energy|Non-Biomass Renewables'
]

add_stats_share(pe_re_vars, 'renewables', pe, 'primary energy')
pyam.core - INFO: All scenarios have the required variable `Primary Energy|Biomass`
pyam.core - INFO: All scenarios have the required variable `Primary Energy|Non-Biomass Renewables`
In [12]:
ele = df.filter(variable='Secondary Energy|Electricity').timeseries()
ele.index = ele.index.droplevel([2, 3, 4])
In [13]:
ele_re_vars = [
    'Secondary Energy|Electricity|Biomass',
    'Secondary Energy|Electricity|Non-Biomass Renewables'
]

add_stats_share(ele_re_vars, 'renewables', ele, 'electricity generation')
pyam.core - INFO: All scenarios have the required variable `Secondary Energy|Electricity|Biomass`
pyam.core - INFO: 1 scenario does not include required variable `Secondary Energy|Electricity|Non-Biomass Renewables`, marked as `exclude: True` in metadata

Share of fossil fuels in electricity generation

In [14]:
ele_foss_vars = [
    'Secondary Energy|Electricity|Coal',
    'Secondary Energy|Electricity|Gas',
    'Secondary Energy|Electricity|Oil',
]

add_stats_share(ele_foss_vars, 'fossil fuels', ele, 'electricity generation')
pyam.core - INFO: All scenarios have the required variable `Secondary Energy|Electricity|Coal`
pyam.core - INFO: All scenarios have the required variable `Secondary Energy|Electricity|Gas`
pyam.core - INFO: All scenarios have the required variable `Secondary Energy|Electricity|Oil`

Energy demand in buildings (relative to 2010)

In [15]:
bld = df.filter(variable='Final Energy|Residential and Commercial', year=years).timeseries()
In [16]:
for y in table_years:
    stats.add(-(bld[y] / bld[compare_year] - 1) * 100,
              header='Change in energy demand in buildings',
              subheader='relative to {} (%)'.format(compare_year), row=y)

Direct emissions reductions from buildings (relative to 2010)

In [17]:
co2_bld = df.filter(variable='Emissions|CO2|Energy|Demand|Residential and Commercial', year=years).timeseries()
In [18]:
for y in table_years:
    stats.add(-(co2_bld[y] / co2_bld[compare_year] - 1) * 100,
              header='Direct emissions reductions from buildings',
              subheader='relative to {} (%)'.format(compare_year), row=y)

Share of low-carbon fuels and electricity in the transport sector

For the scenario presented by "Löffler et al. (2017)", the share of low-carbon fuels was read directly from one of the figures in the manuscript.

In [19]:
trp = df.filter(variable='Final Energy|Transportation').timeseries()
trp.index = trp.index.droplevel([2, 3, 4])
In [20]:
trp_low_vars = [
    'Final Energy|Transportation|Electricity',
    'Final Energy|Transportation|Hydrogen',
    'Final Energy|Transportation|Liquids|Biomass'
]
add_stats_share(trp_low_vars, 'low-carbon fuels', trp, 'transport')
pyam.core - INFO: All scenarios have the required variable `Final Energy|Transportation|Electricity`
pyam.core - INFO: 50 scenarios do not include required variable `Final Energy|Transportation|Hydrogen`, marked as `exclude: True` in metadata
pyam.core - INFO: 28 scenarios do not include required variable `Final Energy|Transportation|Liquids|Biomass`, marked as `exclude: True` in metadata
In [21]:
trp_ele_vars = ['Final Energy|Transportation|Electricity']
add_stats_share(trp_ele_vars, 'electricity', trp, 'transport')
pyam.core - INFO: All scenarios have the required variable `Final Energy|Transportation|Electricity`
In [22]:
trp_bio_vars = ['Final Energy|Transportation|Liquids|Biomass']
add_stats_share(trp_bio_vars, 'biofuels', trp, 'transport')
pyam.core - INFO: All scenarios have the required variable `Final Energy|Transportation|Liquids|Biomass`

Industrial emissions (relative to 2010)

In [23]:
co2_ind = df.filter(variable='Emissions|CO2|Energy|Demand|Industry', year=years).timeseries()
In [24]:
for y in table_years:
    stats.add(-(co2_ind[y] / co2_ind[compare_year] - 1) * 100,
              header='Industrial emissions reductions',
              subheader='relative to {} (%)'.format(compare_year), row=y)

Display summary statistics table and export as xlsx

In [25]:
summary = stats.summarize(center='median', interquartile=True, custom_format='{:.2f}')
summary = (
    summary
    .swaplevel(0, 2, axis=0).swaplevel(1, 2, axis=0)
    .sort_index(axis=0, level=0, sort_remaining=False)
)
summary
Out[25]:
count Share of renewables Share of fossil fuels Change in energy demand in buildings Direct emissions reductions from buildings Share of low-carbon fuels Share of electricity Share of biofuels Industrial emissions reductions
median (interquartile range) in primary energy (%) in electricity generation (%) in electricity generation (%) relative to 2010 (%) relative to 2010 (%) in transport (%) in transport (%) in transport (%) relative to 2010 (%)
2020 IAM pathways no & lo os 1.5 50 14.90 (16.25, 14.24) 26.32 (29.04, 24.13) 61.32 (63.15, 58.64) -10.84 (-7.49, -11.96) [42] -1.47 (6.62, -7.98) [42] 4.42 (4.51, 3.66) [29] 1.24 (1.58, 1.11) [46] 3.03 (3.23, 1.69) [37] -12.68 (-0.50, -15.79) [42]
lo os 1.5 43 15.31 (16.23, 14.03) 26.26 (28.83, 23.58) 61.08 (63.17, 58.74) -10.86 (-7.53, -14.83) [35] -0.83 (6.62, -9.69) [35] 4.39 (4.51, 3.59) [23] 1.24 (1.76, 1.09) [40] 1.97 (3.17, 1.55) [31] -11.81 (-1.66, -17.80) [35]
hi os 1.5 35 15.08 (15.84, 14.44) 28.37 (29.24, 24.33) 61.58 (63.83, 59.70) -12.49 (-10.75, -19.44) [29] -3.52 (6.62, -15.22) [29] 3.59 (4.45, 3.27) [23] 1.36 (1.50, 1.10) [31] 2.18 (2.98, 1.72) [24] -15.50 (-12.70, -23.70) [29]
S1 12.46 23.24 63.72 -9.20 -0.83 0.95 1.69 4.46
S2 16.61 27.00 60.11 -16.20 -0.25 2.18 0.97 1.22 -20.61
S5 13.46 17.38 71.03 3.16 0.95 2.20
LED 15.63 24.61 54.11 -8.78 15.11 2.51 -32.87
sectoral studies Löffler et al. (2017) 13.47 31.41 57.60
IEA ETP (2017) 19.02 29.91 58.63 -1.52 10.25 5.74 1.70 4.03 -9.37
IEA WEM (2017) 16.67 29.32 58.75 -7.44 5.78 4.94 1.21 3.73 -6.51
2030 IAM pathways no & lo os 1.5 50 29.08 (37.06, 25.73) 53.68 (64.80, 46.74) 30.04 (37.60, 20.25) 0.30 (7.31, -6.73) [42] 33.53 (51.77, 21.47) [42] 12.07 (17.83, 8.55) [29] 5.31 (7.27, 3.92) [46] 6.54 (10.05, 2.51) [37] 42.29 (54.71, 34.25) [42]
lo os 1.5 43 28.75 (35.31, 25.45) 52.63 (58.90, 44.48) 31.54 (38.14, 23.14) -2.61 (5.41, -7.73) [35] 30.11 (43.16, 20.58) [35] 9.71 (15.24, 8.44) [23] 5.18 (7.01, 3.19) [40] 5.06 (9.60, 2.12) [31] 39.81 (49.58, 30.13) [35]
hi os 1.5 35 23.65 (27.45, 20.03) 42.73 (53.78, 36.91) 42.02 (47.27, 32.61) -16.64 (-12.07, -20.01) [29] 8.15 (23.54, -0.61) [29] 6.65 (8.32, 5.55) [23] 3.43 (4.49, 2.38) [31] 3.54 (3.85, 1.38) [24] 17.67 (27.65, -12.81) [29]
S1 28.79 57.89 27.84 -7.68 35.32 3.92 5.06 49.09
S2 28.72 47.89 35.37 -14.12 47.92 5.17 4.46 0.71 19.11
S5 13.78 25.11 57.38 3.43 1.32 1.93
LED 37.42 59.64 17.14 30.42 59.81 20.93 42.10
sectoral studies Löffler et al. (2017) 45.59 79.25 13.73
IEA ETP (2017) 31.09 46.73 37.92 1.98 46.91 13.80 5.47 8.18 22.39
IEA WEM (2017) 27.24 49.58 34.74 -6.37 32.03 17.12 5.76 11.20 15.28
2050 IAM pathways no & lo os 1.5 50 60.24 (67.09, 51.77) 77.12 (86.43, 69.23) 8.61 (13.42, 3.88) -17.19 (3.31, -36.20) [42] 70.26 (89.56, 54.48) [42] 55.00 (65.66, 34.67) [29] 22.71 (28.61, 18.16) [46] 15.24 (22.95, 10.95) [37] 78.75 (90.79, 67.33) [42]
lo os 1.5 43 58.37 (66.65, 49.97) 75.98 (85.32, 68.54) 8.69 (13.59, 4.80) -19.43 (2.17, -37.44) [35] 68.30 (89.48, 54.32) [35] 52.95 (65.14, 34.10) [23] 22.63 (30.46, 17.11) [40] 14.71 (21.73, 10.11) [31] 78.69 (89.17, 70.60) [35]
hi os 1.5 35 62.16 (67.51, 47.48) 82.39 (88.34, 63.65) 6.33 (16.06, 2.26) -37.41 (-13.37, -51.04) [29] 48.64 (59.49, 40.82) [29] 38.38 (43.62, 27.01) [23] 18.49 (22.88, 13.67) [31] 14.96 (17.78, 5.10) [24] 68.12 (80.61, 53.62) [29]
S1 58.37 81.26 10.15 -20.54 79.74 33.68 12.95 73.70
S2 52.90 63.08 11.42 -24.59 89.65 25.65 22.67 2.98 72.81
S5 67.04 70.27 6.69 53.36 9.54 35.46
LED 72.51 77.40 0.19 44.67 95.00 59.21 91.38
sectoral studies Löffler et al. (2017) 100.00 99.76 0.00
IEA ETP (2017) 57.77 74.33 9.72 5.10 82.71 54.83 29.65 24.43 57.26
IEA WEM (2017) 47.02 68.72 13.71 -5.38 73.14 58.18 32.07 25.19 54.61
In [26]:
summary.to_excel('output/table_4.SM.1_suppl_sectoral_indicators.xlsx')