Расчет углеродоемкости с использованием данных ResourceTradeEarth и ClimateTrace

Документация и данные

КлиматТрейс

  1. "Данные"

ResourceTradeEarth:

  1. "Данные"
  2. "Документация"

Набор данных GitHub, используемый в этом сеансе

  1. "Данные"

Выводы

Построение модели оценки выбросов является очень сложной задачей, даже при применении к наборам данных более высокого качества из-за ряда допущений, которые необходимо сделать. Этот анализ вряд ли можно использовать для целей разработки политики из-за отсутствия точности, ясности и понимания данных.

Текущая методология заключается в том, чтобы получить углеродоемкость из веса/ценности транзакций, а не произведенных/потребленных. Следовательно, это должно привести к гораздо более высокой оценке углеродоемкости.

В основном он будет служить руководством для того, как можно проводить анализ с использованием Python для аналогичных наборов данных в будущем.

Введение

Данные о выбросах всегда было трудно оценить. До сих пор большинство кадастров выбросов основывались на самооценке. Представленные данные о выбросах, как правило, имеют огромный временной лаг, а методологии оценок часто несовместимы друг с другом. Миссия Climate TRACE состоит в том, чтобы предоставлять самые последние данные о выбросах для каждого сектора, используя технологии искусственного интеллекта (ИИ) и машинного обучения (МО) для спутниковых/сенсорных данных.

Предположительно, выбросы углерода могут быть точно определены при наличии достаточной информации об уровне производства каждого товара и локальной интенсивности выбросов углерода для каждой отдельной страны при производстве товаров. Однако получить обе эти данные крайне сложно.

Мой подход состоит в том, чтобы проработать уравнение в обратном порядке, взяв обнаруженные выбросы и разделив их на товары, с которыми были совершены сделки, чтобы найти среднюю интенсивность углерода, которая может быть связана с товаром.

Анализ данных

Вспомогательные функции и библиотеки

import warnings
import numpy as np 
import pandas as pd
import plotly as py
import seaborn as sns
import statistics as stat
from datetime import date
import plotly.express as px
import plotly.graph_objs as go
warnings.filterwarnings("ignore")
pd.set_option('display.max_columns', None)
import plotly.offline as pyo
pyo.init_notebook_mode()
import matplotlib.lines as lines
import matplotlib.pyplot as plt
%matplotlib inline

Кнопка "Показать/скрыть"

import random
from IPython.display import HTML
def hide_toggle(for_next=False):
    this_cell = """$('div.cell.code_cell.rendered.selected')""" ; next_cell = this_cell + '.next()';
    toggle_text = 'Code show/hide'  # text shown on toggle link
    target_cell = this_cell ;  js_hide_current = ''
if for_next:
        target_cell = next_cell; toggle_text += ' next cell';
        js_hide_current = this_cell + '.find("div.input").hide();'
    js_f_name = 'code_toggle_{}'.format(str(random.randint(1,2**64)))
html = """<script>
            function {f_name}() {{{cell_selector}.find('div.input').toggle(); }}
            {js_hide_current}
        </script>
        <a href="javascript:{f_name}()">{toggle_text}</a>
    """.format(f_name=js_f_name,cell_selector=target_cell,js_hide_current=js_hide_current, toggle_text=toggle_text )
    return HTML(html)
hide_toggle()

Данные о выбросах от ClimateTrace

file = 'climatetrace_emissions_by_subsector_timeseries_interval_year_since_2015_to_2020.csv'
df = pd.read_csv(PATH + file)
df[‘year’] = pd.DatetimeIndex(df[‘start’]).year
df[‘month’] = pd.DatetimeIndex(df[‘start’]).month
co2 = pd.DataFrame( df.groupby(['sector', 'subsector', 'year'])['Tonnes Co2e'].sum() ) \
.reset_index() 
    # wow magic line
pd.set_option('display.max_rows', 250)
co2

def make_bar_plot(data, xdata, ydata, cdata, title, legend=True, width=900, height=600):
    import plotly.express as px
fig = px.bar(data, 
                 x= xdata, 
                 y= ydata, 
                 color= cdata, 
                 )
fig.update_layout(
        title= title,
        xaxis_tickfont_size=14,
        yaxis=dict(
            title='',
            titlefont_size=16,
            tickfont_size=14,
        ),
        legend=dict(
            x=0.995,
            y=0.98,
            bgcolor='rgba(255, 255, 255, 0)',
            bordercolor='rgba(255, 255, 255, 0)',
        ),
        showlegend= legend,
        height= height,
        width= width,
        barmode='group', #'stack',
        bargap=0.25, 
        bargroupgap=0.1 
    )
fig.show()
    
hide_toggle()

По странам

make_bar_plot(df[ df['country'].isin(['USA']) &  df['year'].isin([2015, 2016, 2017, 2018, 2019]) ], 
              xdata='year', 
              ydata='Tonnes Co2e', 
              cdata='sector', 
              title='Co2 Emissions by USA')

Цифры на диаграмме должны выглядеть точно так же, как на сайте Climate TRACE live. Мы могли бы попытаться пойти дальше и углубиться в каждый сектор и подсектор.

По секторам и подотраслям

make_bar_plot(co2[ co2['year'].isin([2015, 2016, 2017, 2018, 2019]) ], 
              xdata='year', 
              ydata='Tonnes Co2e', 
              cdata='sector', 
              title='Co2 Emissions by Sector')

make_bar_plot(co2[ co2['sector'].isin(['agriculture']) &  co2['year'].isin([2015, 2016, 2017, 2018, 2019]) ], 
              xdata='year', 
              ydata='Tonnes Co2e', 
              cdata='subsector', 
              title='Co2 Emissions by Subsector (Agriculture)')

Данные о торговле сырьевыми товарами от ResourceTradeEarth

ResourceTradeEarth предоставляет данные о стоимости и весе транзакций для товаров по годам. Веб-сайт разработан Chatham House, и их данные являются уточненной версией, полученной из статистики международной торговли товарами (IMTS).

Впоследствии данные СМТТ собираются национальными таможенными органами и объединяются Статистическим отделом Организации Объединенных Наций в базу данных статистики торговли товарами Организации Объединенных Наций (Комтрейд ООН).

Теперь, когда у нас есть данные о выбросах от Climate TRACE, мы стремимся оценить интенсивность выбросов каждого товара, разделив выбросы, генерируемые товарным сектором, из результатов ClimateTrace на транзакционную стоимость / вес, полученные из ResourceTradeEarth.

export = pd.read_csv(PATH + SUBPATH + 'rte-exporters-2019.csv', 
                     encoding= 'ISO 8859-1')
importe= pd.read_csv(PATH + SUBPATH + 'rte-importers-2019.csv', 
                     encoding= 'ISO 8859-1')
commodities = pd.read_csv(PATH + SUBPATH + 'rte-commodities-2019.csv', 
                          encoding= 'ISO 8859-1')
commodities.drop(['Exporter M.49', 'Exporter ISO3', 'Exporter region', 
                  'Importer M.49', 'Importer ISO3', 'Importer region'], axis=1, inplace=True)
trend = commodities.sort_values(by=['Resource', 'Year'], ascending=True)
# Create differenced column
trend['dvalue_share'] = trend.groupby('Resource')['value share'].diff()
trend['dweight_share'] = trend.groupby('Resource')['weight share'].diff()

График по весу

make_bar_plot(commodities, 'Year', 'Weight (1000kg)', 'Resource', 'Weight (1000kg) Traded by Commodities')

График по доле стоимости/веса

Следующие переменные оцениваются с использованием следующего уравнения:

Доля стоимости_2015 = стоимость ресурса_2015 / сумма стоимости_2015

Доля веса_2015 = Вес ресурса_2015 / Сумма веса_2015

Идея состоит в том, что разные товары имеют разную углеродоемкость во время производства и сделки. Мы хотим выяснить, какая часть нашей торговли сырьевыми товарами имеет высокую углеродоемкость.

make_bar_plot(commodities, 'Year', 'value share', 'Resource', 'Value Share By Traded Commodities')

make_bar_plot(commodities, 'Year', 'weight share', 'Resource', 'Weight Share By Traded Commodities')

Изменение доли стоимости/веса по товарам, по годам

Углеродоемкость по торгуемой стоимости может быть интересна для некоторых, если предприятия стремятся максимизировать свою прибыль при минимальных выбросах. Однако это может быть легко искажено ценами на сырьевые товары.

Если доля стоимости товара в сделках снижается, а доля веса в сделках остается неизменной или растет, это означает, что цены на этот товар становятся менее благоприятными.

trend

def make_line_plot(data, xdata, ydata, cdata, title, legend=True, width=900, height=600):
    import plotly.express as px
fig = px.line(data, 
                  x= xdata,
                  y= ydata, 
                  color= cdata, 
                  symbol= cdata,
                 )
fig.update_layout(
        title= title,
        xaxis_tickfont_size=14,
        yaxis=dict(
            title='',
            titlefont_size=16,
            tickfont_size=14,
        ),
        legend=dict(
            x=1.02,
            y=0.98,
            bgcolor='rgba(255, 255, 255, 0)',
            bordercolor='rgba(255, 255, 255, 0)',
        ),
        showlegend= legend,
        height= height,
        width= width,
    )
fig.show()
hide_toggle()

Изменение доли стоимости

make_line_plot(trend, 
               'Year', 
               'dvalue_share', 
               'Resource', 
               'Value Share Change By Traded Commodities')

make_line_plot(trend[ ~trend['Resource'].isin(['Pearls and gemstones']) ], 
              'Year', 
              'dweight_share', 
              'Resource', 
              'Weight Share Change By Traded Commodities')

Оценка углеродоемкости для товаров

co2 = pd.DataFrame( df.groupby(['sector', 'year'])['Tonnes Co2e'].sum() ) \
.reset_index() # wow magic line
# Agriculture
agri = trend[ trend['Resource'].isin(['Agricultural products']) ]
agri2 = co2[ co2['sector'].isin(['agriculture']) & ~co2['year'].isin([2020]) ]

Имея информацию о выбросах и данные о торговле, мы можем объединить их в один фрейм данных. Здесь мы предполагаем, что:

  1. Agricultural products товар от RTE связан с выбросами Climate Trace для agricultureсектора.
  2. Fossil fuels товар, связанный с oil and gas выбросами.
  3. Metals and minerals товар, связанный с extraction выбросами.
agriculture = pd.concat([agri.reset_index(drop=True), 
                         agri2['Tonnes Co2e'].reset_index(drop=True)],
                        axis= 1) 
agriculture['co2 vintensity'] = agriculture['Tonnes Co2e'] / agriculture['Value (1000USD)']
agriculture['co2 wintensity'] = agriculture['Tonnes Co2e'] / agriculture['Weight (1000kg)']
# Oil and gas
oil = trend[ trend['Resource'].isin(['Fossil fuels']) ]
oil2 = co2[ co2['sector'].isin(['oil and gas']) & ~co2['year'].isin([2020]) ]
fossilfuel = pd.concat([oil.reset_index(drop=True), 
                         oil2['Tonnes Co2e'].reset_index(drop=True)],
                        axis= 1)
                        
fossilfuel['co2 vintensity'] = fossilfuel['Tonnes Co2e'] / fossilfuel['Value (1000USD)']
fossilfuel['co2 wintensity'] = fossilfuel['Tonnes Co2e'] / fossilfuel['Weight (1000kg)']
# Metals and Minerals
metal = trend[ trend['Resource'].isin(['Metals and minerals']) ]
metal2 = co2[ co2['sector'].isin(['extraction']) & ~co2['year'].isin([2020]) ]
extraction = pd.concat([metal.reset_index(drop=True), 
                        metal2['Tonnes Co2e'].reset_index(drop=True)],
                        axis= 1)
extraction['co2 vintensity'] = extraction['Tonnes Co2e'] / extraction['Value (1000USD)']
extraction['co2 wintensity'] = extraction['Tonnes Co2e'] / extraction['Weight (1000kg)']
# All commodities
allcomm = pd.concat([agriculture, fossilfuel, extraction], axis=0)
allcomm

make_line_plot(allcomm,
              'Year', 
              'co2 wintensity', 
              'Resource', 
              'Carbon Intensity by Weight, by Commodities')

make_line_plot(allcomm,
              'Year', 
              'co2 vintensity', 
              'Resource', 
              'Carbon Intensity by Value, by Commodities')

Результаты не удовлетворяют. Следующие проблемы:

  1. Данные об углеродоемкости металлов и минералов настолько малы, что вы не можете увидеть их на диаграмме. Причина в том, что данные о выбросах CO2 для добывающего сектора из Climate TRACE не обновляются, особенно в угледобывающем секторе.
  2. Данные об углеродоемкости для ископаемых видов топлива и металлов очень низкие. Неясно, должны ли мы также включать выбросы из других секторов, которые также подвергались воздействию этих соответствующих товаров. (Например: энергетика и транспорт на ископаемом топливе, производство металлов).
  3. Поскольку углеродоемкость рассчитывается на основе веса/стоимости транзакций, она не учитывает товары, которые потреблялись внутри страны, что приводит к гораздо более высокой оценке углеродоемкости. Тенденция роста углеродоемкости сельскохозяйственных товаров на нашем графике может означать, что внутреннее потребление сельскохозяйственных товаров увеличивается.
  4. Углеродоемкость для одного и того же товара очень зависит от места его производства. EG: Сельское хозяйство в Африке может иметь более высокую углеродоемкость на единицу продукции по сравнению с сельскохозяйственными товарами, производимыми в Европе, из-за технологии вертикального земледелия.

Хотя мы так и не пришли к каким-либо значимым выводам, я надеюсь, что это может вдохновить кого-то другого на лучший подход к решению этой проблемы.

Если вы хотите довести до моего сведения какую-либо ошибку или предложение, не стесняйтесь оставлять комментарии.

Ссылка:

[1] Chatham House (2021 г.), resourcetrade.earth, https://resourcetrade.earth/

[2] Climate Trace (2021), https://www.climatetrace.org/