2019-07-18 09:40:38 +00:00
import pandas as pd
import numpy as np
tj_to_ktoe = 0.0238845
ktoe_to_twh = 0.01163
2020-08-26 11:12:16 +00:00
jrc_base_dir = " data/jrc-idees-2015 "
eb_base_dir = " data/eurostat-energy_balances-may_2018_edition "
2019-07-18 09:40:38 +00:00
2020-08-28 17:13:18 +00:00
# year for which data is retrieved
raw_year = 2015
year = raw_year - 2016
2019-07-18 09:40:38 +00:00
sub_sheet_name_dict = { ' Iron and steel ' : ' ISI ' ,
' Chemicals Industry ' : ' CHI ' ,
' Non-metallic mineral products ' : ' NMM ' ,
' Pulp, paper and printing ' : ' PPA ' ,
' Food, beverages and tobacco ' : ' FBT ' ,
' Non Ferrous Metals ' : ' NFM ' ,
' Transport Equipment ' : ' TRE ' ,
' Machinery Equipment ' : ' MAE ' ,
' Textiles and leather ' : ' TEL ' ,
' Wood and wood products ' : ' WWP ' ,
' Other Industrial Sectors ' : ' OIS ' }
2019-12-19 16:49:45 +00:00
index = [ ' elec ' , ' biomass ' , ' methane ' , ' hydrogen ' , ' heat ' , ' naphtha ' , ' process emission ' , ' process emission from feedstock ' ]
2019-07-18 09:40:38 +00:00
non_EU = [ ' NO ' , ' CH ' , ' ME ' , ' MK ' , ' RS ' , ' BA ' , ' AL ' ]
2020-08-26 11:12:16 +00:00
jrc_names = { " GR " : " EL " ,
" GB " : " UK " }
2019-07-18 09:40:38 +00:00
2020-08-26 11:12:16 +00:00
eu28 = [ ' FR ' , ' DE ' , ' GB ' , ' IT ' , ' ES ' , ' PL ' , ' SE ' , ' NL ' , ' BE ' , ' FI ' ,
' DK ' , ' PT ' , ' RO ' , ' AT ' , ' BG ' , ' EE ' , ' GR ' , ' LV ' , ' CZ ' ,
' HU ' , ' IE ' , ' SK ' , ' LT ' , ' HR ' , ' LU ' , ' SI ' , ' CY ' , ' MT ' ]
2019-07-18 09:40:38 +00:00
2020-08-26 11:12:16 +00:00
countries = non_EU + eu28
2019-07-18 09:40:38 +00:00
sectors = [ ' Iron and steel ' , ' Chemicals Industry ' , ' Non-metallic mineral products ' ,
' Pulp, paper and printing ' , ' Food, beverages and tobacco ' , ' Non Ferrous Metals ' ,
' Transport Equipment ' , ' Machinery Equipment ' , ' Textiles and leather ' ,
' Wood and wood products ' , ' Other Industrial Sectors ' ]
sect2sub = { ' Iron and steel ' : [ ' Electric arc ' , ' Integrated steelworks ' ] ,
' Chemicals Industry ' : [ ' Basic chemicals ' , ' Other chemicals ' , ' Pharmaceutical products etc. ' ] ,
' Non-metallic mineral products ' : [ ' Cement ' , ' Ceramics & other NMM ' , ' Glass production ' ] ,
' Pulp, paper and printing ' : [ ' Pulp production ' , ' Paper production ' , ' Printing and media reproduction ' ] ,
' Food, beverages and tobacco ' : [ ' Food, beverages and tobacco ' ] ,
' Non Ferrous Metals ' : [ ' Alumina production ' , ' Aluminium - primary production ' , ' Aluminium - secondary production ' , ' Other non-ferrous metals ' ] ,
' Transport Equipment ' : [ ' Transport Equipment ' ] ,
' Machinery Equipment ' : [ ' Machinery Equipment ' ] ,
' Textiles and leather ' : [ ' Textiles and leather ' ] ,
' Wood and wood products ' : [ ' Wood and wood products ' ] ,
' Other Industrial Sectors ' : [ ' Other Industrial Sectors ' ] }
2020-08-26 10:06:01 +00:00
subsectors = [ ss for s in sectors for ss in sect2sub [ s ] ]
#material demand per country and industry (kton/a)
countries_demand = pd . DataFrame ( index = countries ,
columns = subsectors ,
dtype = float )
2019-07-18 09:40:38 +00:00
out_dic = { ' Electric arc ' : ' Electric arc ' ,
' Integrated steelworks ' : ' Integrated steelworks ' ,
' Basic chemicals ' : ' Basic chemicals (kt ethylene eq.) ' ,
' Other chemicals ' : ' Other chemicals (kt ethylene eq.) ' ,
' Pharmaceutical products etc. ' : ' Pharmaceutical products etc. (kt ethylene eq.) ' ,
' Cement ' : ' Cement (kt) ' ,
' Ceramics & other NMM ' : ' Ceramics & other NMM (kt bricks eq.) ' ,
' Glass production ' : ' Glass production (kt) ' ,
' Pulp production ' : ' Pulp production (kt) ' ,
' Paper production ' : ' Paper production (kt) ' ,
' Printing and media reproduction ' : ' Printing and media reproduction (kt paper eq.) ' ,
' Food, beverages and tobacco ' : ' Physical output (index) ' ,
' Alumina production ' : ' Alumina production (kt) ' ,
' Aluminium - primary production ' : ' Aluminium - primary production ' ,
' Aluminium - secondary production ' : ' Aluminium - secondary production ' ,
' Other non-ferrous metals ' : ' Other non-ferrous metals (kt lead eq.) ' ,
' Transport Equipment ' : ' Physical output (index) ' ,
' Machinery Equipment ' : ' Physical output (index) ' ,
' Textiles and leather ' : ' Physical output (index) ' ,
' Wood and wood products ' : ' Physical output (index) ' ,
' Other Industrial Sectors ' : ' Physical output (index) ' }
loc_dic = { ' Iron and steel ' : [ 5 , 8 ] ,
' Chemicals Industry ' : [ 7 , 11 ] ,
' Non-metallic mineral products ' : [ 6 , 10 ] ,
' Pulp, paper and printing ' : [ 7 , 11 ] ,
' Food, beverages and tobacco ' : [ 2 , 6 ] ,
' Non Ferrous Metals ' : [ 9 , 14 ] ,
' Transport Equipment ' : [ 3 , 5 ] ,
' Machinery Equipment ' : [ 3 , 5 ] ,
' Textiles and leather ' : [ 3 , 5 ] ,
' Wood and wood products ' : [ 3 , 5 ] ,
' Other Industrial Sectors ' : [ 3 , 5 ] }
# In the summary sheet (IDEES database) some names include a white space
dic_sec_summary = { ' Iron and steel ' : ' Iron and steel ' ,
' Chemicals Industry ' : ' Chemicals Industry ' ,
' Non-metallic mineral products ' : ' Non-metallic mineral products ' ,
' Pulp, paper and printing ' : ' Pulp, paper and printing ' ,
' Food, beverages and tobacco ' : ' Food, beverages and tobacco ' ,
' Non Ferrous Metals ' : ' Non Ferrous Metals ' ,
' Transport Equipment ' : ' Transport Equipment ' ,
' Machinery Equipment ' : ' Machinery Equipment ' ,
' Textiles and leather ' : ' Textiles and leather ' ,
' Wood and wood products ' : ' Wood and wood products ' ,
' Other Industrial Sectors ' : ' Other Industrial Sectors ' }
#countries=['CH']
2020-08-26 11:12:16 +00:00
eb_names = { ' NO ' : ' Norway ' , ' AL ' : ' Albania ' , ' BA ' : ' Bosnia and Herzegovina ' ,
' MK ' : ' FYR of Macedonia ' , ' GE ' : ' Georgia ' , ' IS ' : ' Iceland ' ,
' KO ' : ' Kosovo ' , ' MD ' : ' Moldova ' , ' ME ' : ' Montenegro ' , ' RS ' : ' Serbia ' ,
' UA ' : ' Ukraine ' , ' TR ' : ' Turkey ' , }
2019-07-18 09:40:38 +00:00
dic_sec = { ' Iron and steel ' : ' Iron & steel industry ' ,
' Chemicals Industry ' : ' Chemical and Petrochemical industry ' ,
' Non-metallic mineral products ' : ' Non-ferrous metal industry ' ,
' Pulp, paper and printing ' : ' Paper, Pulp and Print ' ,
' Food, beverages and tobacco ' : ' Food and Tabacco ' ,
' Non Ferrous Metals ' : ' Non-metallic Minerals (Glass, pottery & building mat. Industry) ' ,
' Transport Equipment ' : ' Transport Equipment ' ,
' Machinery Equipment ' : ' Machinery ' ,
' Textiles and leather ' : ' Textile and Leather ' ,
' Wood and wood products ' : ' Wood and Wood Products ' ,
' Other Industrial Sectors ' : ' Non-specified (Industry) ' }
# Mining and Quarrying, Construction
#Annual energy consumption in Switzerland by sector in 2015 (in TJ)
#From: Energieverbrauch in der Industrie und im Dienstleistungssektor, Der Bundesrat
#http://www.bfe.admin.ch/themen/00526/00541/00543/index.html?lang=de&dossier_id=00775
dic_Switzerland = { ' Iron and steel ' : 7889. ,
' Chemicals Industry ' : 26871. ,
' Non-metallic mineral products ' : 15513. + 3820. ,
' Pulp, paper and printing ' : 12004. ,
' Food, beverages and tobacco ' : 17728. ,
' Non Ferrous Metals ' : 3037. ,
' Transport Equipment ' : 14993. ,
' Machinery Equipment ' : 4724. ,
' Textiles and leather ' : 1742. ,
' Wood and wood products ' : 0. ,
' Other Industrial Sectors ' : 10825. ,
' current electricity ' : 53760. }
dic_sec_position = { }
for country in countries :
2020-08-26 10:06:01 +00:00
countries_demand . loc [ country ] = 0.
print ( country )
2019-07-18 09:40:38 +00:00
for sector in sectors :
if country in non_EU :
if country == ' CH ' :
e_country = dic_Switzerland [ sector ] * tj_to_ktoe
else :
# estimate physical output
#energy consumption in the sector and country
2020-08-26 11:12:16 +00:00
excel_balances = pd . read_excel ( ' {} / {} .XLSX ' . format ( eb_base_dir , eb_names [ country ] ) ,
2019-07-18 09:40:38 +00:00
sheet_name = ' 2016 ' , index_col = 2 , header = 0 , skiprows = 1 , squeeze = True )
e_country = excel_balances . loc [ dic_sec [ sector ] , ' Total all products ' ]
#energy consumption in the sector and EU28
excel_sum_out = pd . read_excel ( ' {} /JRC-IDEES-2015_Industry_EU28.xlsx ' . format ( jrc_base_dir ) ,
sheet_name = ' Ind_Summary ' , index_col = 0 , header = 0 , squeeze = True ) # the summary sheet
2020-08-28 17:13:18 +00:00
s_sum_out = excel_sum_out . iloc [ 49 : 76 , year ]
2019-07-18 09:40:38 +00:00
e_EU28 = s_sum_out [ dic_sec_summary [ sector ] ]
ratio_country_EU28 = e_country / e_EU28
excel_out = pd . read_excel ( ' {} /JRC-IDEES-2015_Industry_EU28.xlsx ' . format ( jrc_base_dir ) ,
sheet_name = sub_sheet_name_dict [ sector ] , index_col = 0 , header = 0 , squeeze = True ) # the summary sheet
2020-08-28 17:13:18 +00:00
s_out = excel_out . iloc [ loc_dic [ sector ] [ 0 ] : loc_dic [ sector ] [ 1 ] , year ]
2019-07-18 09:40:38 +00:00
for subsector in sect2sub [ sector ] :
2020-08-26 11:12:16 +00:00
countries_demand . loc [ country , subsector ] = ratio_country_EU28 * s_out [ out_dic [ subsector ] ]
2019-07-18 09:40:38 +00:00
else :
# read the input sheets
2020-08-26 11:12:16 +00:00
excel_out = pd . read_excel ( ' {} /JRC-IDEES-2015_Industry_ {} .xlsx ' . format ( jrc_base_dir , jrc_names . get ( country , country ) ) , sheet_name = sub_sheet_name_dict [ sector ] , index_col = 0 , header = 0 , squeeze = True ) # the summary sheet
2019-07-18 09:40:38 +00:00
2020-08-28 17:13:18 +00:00
s_out = excel_out . iloc [ loc_dic [ sector ] [ 0 ] : loc_dic [ sector ] [ 1 ] , year ]
2019-07-18 09:40:38 +00:00
for subsector in sect2sub [ sector ] :
2020-08-26 11:12:16 +00:00
countries_demand . loc [ country , subsector ] = s_out [ out_dic [ subsector ] ]
2019-07-18 09:40:38 +00:00
2020-08-28 17:13:18 +00:00
#include ammonia demand separately and remove ammonia from basic chemicals
ammonia = pd . read_csv ( snakemake . input . ammonia_production ,
index_col = 0 )
there = ammonia . index . intersection ( countries_demand . index )
2021-04-29 15:11:10 +00:00
missing = countries_demand . index . symmetric_difference ( there )
2020-08-28 17:13:18 +00:00
print ( " Following countries have no ammonia demand: " , missing )
countries_demand . insert ( 2 , " Ammonia " , 0. )
countries_demand . loc [ there , " Ammonia " ] = ammonia . loc [ there , str ( raw_year ) ]
countries_demand [ " Basic chemicals " ] - = countries_demand [ " Ammonia " ]
#EE, HR and LT got negative demand through subtraction - poor data
countries_demand . loc [ countries_demand [ " Basic chemicals " ] < 0. , " Basic chemicals " ] = 0.
countries_demand . rename ( columns = { " Basic chemicals " : " Basic chemicals (without ammonia) " } ,
inplace = True )
2020-08-26 11:12:16 +00:00
countries_demand . index . name = " kton/a "
2019-07-18 09:40:38 +00:00
2020-08-26 11:12:16 +00:00
countries_demand . to_csv ( snakemake . output . industrial_production_per_country ,
2020-08-26 10:06:01 +00:00
float_format = ' %.2f ' )