import glob
import colorlover as cl
import cufflinks as cf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
cf.set_config_file(offline=True)
beccs = [
'Secondary Energy|Electricity|Biomass|w/ CCS',
'Capacity|Electricity|Biomass|w/ CCS',
]
fuel = [
'Secondary Energy|Liquids|Biomass|w/ CCS',
'Secondary Energy|Liquids|Biomass|w/o CCS',
'Capacity|Liquids|Biomass',
]
hydrogen = [
'Secondary Energy|Hydrogen|Biomass',
'Capacity|Hydrogen|Biomass',
]
supply = [
'Primary Energy|Biomass',
]
capvars = lambda x: x[-1:]
capacity = capvars(beccs) + capvars(fuel) + capvars(hydrogen)
actvars = lambda x: x[:-1]
activity = actvars(beccs) + actvars(fuel) + actvars(hydrogen)
allvars = beccs + fuel + hydrogen + supply
def read(f):
df = pd.read_excel(f)
df = df[df.Region == 'World']
df = df[df.Variable.isin(allvars)]
info = df.Scenario.iloc[0].split('-')
df['policy'] = info[1]
df['case'] = info[2]
df['tech'] = info[3]
return df
def numcols(df):
"""Returns all columns in df that have data types of floats or ints"""
dtypes = df.dtypes
return [i for i in dtypes.index if dtypes.loc[i].name.startswith(('float', 'int'))]
## this takes a while, only do this if needed
# files = glob.glob('/mnt/h/work/iiasa/message/emf33/runs/upload_EMF33_V3_R3*')
# pd.concat([read(f) for f in files]).to_csv('analysis.csv', index=False)
df = pd.read_csv('analysis.csv')
df.columns = df.columns.str.lower()
value_vars = numcols(df)
id_vars = list(set(df.columns) - set(value_vars))
df = pd.melt(df, id_vars=id_vars, value_vars=value_vars, var_name='year')
df.head()
none
: no capacity variables, small or no activity variablesnofuel
: no liquids biomass capacity, small or no activitynobeccs
: no elec biomass capacity, small or no activityready2050
: no capacity before 2050, small or no activity before 2050limbio
: supply under criteriavar = 'Secondary Energy|Liquids|Biomass|w/ CCS'
_df = df[df.variable.isin([var])]
traces = _df.set_index(id_vars + ['year'])['value'].unstack('year').T
# policy
dash = {
'B': 'solid',
'P': 'dashdot',
'BASE': 'dash',
}
# case
symbol = {
'lo': 'square',
'vlo': 'diamond',
'hi': 'triangle-up',
'0': 'dot',
}
# tech
scale = cl.scales['7']['qual']['ggplot']
colors = {t: c for t, c in zip(df.tech.unique(), scale)}
_symbol = list(traces.columns.get_level_values('case').map(lambda x: symbol[x]))
_dash = list(traces.columns.get_level_values('policy').map(lambda x: dash[x]))
_colors = list(traces.columns.get_level_values('tech').map(lambda x: colors[x]))
_label = list(traces.columns.get_level_values('scenario'))
_unit = traces.columns.get_level_values('unit')[0]
_traces = traces.copy()
_traces.columns = _label
_traces.iplot(
kind='scatter', mode='lines+markers',
dash=_dash, colors=_colors,
symbol=_symbol, size=7,
xTitle='Year', yTitle=_unit, title=var,
)