Расчет углеродоемкости с использованием данных ResourceTradeEarth и ClimateTrace
Документация и данные
КлиматТрейс
- "Данные"
ResourceTradeEarth:
- "Данные"
- "Документация"
Набор данных GitHub, используемый в этом сеансе
- "Данные"
Выводы
Построение модели оценки выбросов является очень сложной задачей, даже при применении к наборам данных более высокого качества из-за ряда допущений, которые необходимо сделать. Этот анализ вряд ли можно использовать для целей разработки политики из-за отсутствия точности, ясности и понимания данных.
Текущая методология заключается в том, чтобы получить углеродоемкость из веса/ценности транзакций, а не произведенных/потребленных. Следовательно, это должно привести к гораздо более высокой оценке углеродоемкости.
В основном он будет служить руководством для того, как можно проводить анализ с использованием 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]) ]
Имея информацию о выбросах и данные о торговле, мы можем объединить их в один фрейм данных. Здесь мы предполагаем, что:
Agricultural products
товар от RTE связан с выбросами Climate Trace дляagriculture
сектора.Fossil fuels
товар, связанный сoil and gas
выбросами.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')
Результаты не удовлетворяют. Следующие проблемы:
- Данные об углеродоемкости металлов и минералов настолько малы, что вы не можете увидеть их на диаграмме. Причина в том, что данные о выбросах CO2 для добывающего сектора из Climate TRACE не обновляются, особенно в угледобывающем секторе.
- Данные об углеродоемкости для ископаемых видов топлива и металлов очень низкие. Неясно, должны ли мы также включать выбросы из других секторов, которые также подвергались воздействию этих соответствующих товаров. (Например: энергетика и транспорт на ископаемом топливе, производство металлов).
- Поскольку углеродоемкость рассчитывается на основе веса/стоимости транзакций, она не учитывает товары, которые потреблялись внутри страны, что приводит к гораздо более высокой оценке углеродоемкости. Тенденция роста углеродоемкости сельскохозяйственных товаров на нашем графике может означать, что внутреннее потребление сельскохозяйственных товаров увеличивается.
- Углеродоемкость для одного и того же товара очень зависит от места его производства. EG: Сельское хозяйство в Африке может иметь более высокую углеродоемкость на единицу продукции по сравнению с сельскохозяйственными товарами, производимыми в Европе, из-за технологии вертикального земледелия.
Хотя мы так и не пришли к каким-либо значимым выводам, я надеюсь, что это может вдохновить кого-то другого на лучший подход к решению этой проблемы.
Если вы хотите довести до моего сведения какую-либо ошибку или предложение, не стесняйтесь оставлять комментарии.
Ссылка:
[1] Chatham House (2021 г.), resourcetrade.earth, https://resourcetrade.earth/
[2] Climate Trace (2021), https://www.climatetrace.org/