In [167]:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.font_manager as fm
import numpy as np
%matplotlib inline
In this example, we show the current year incidence up to given week.
Along with the current incidence, we present the following intensity thresholds:
Low activity threshold: estimated epidemic threshold based on historical levels. Minimum: incidence equivalent to 5 cases.
High activity threshold: incidence considered high based on historical levels. Minimum: incidence equivalent to 10 cases.
Very high activity threshold: incidence considered very high based on historical levels. Minimum: incidence equivalent to 20 cases.
In [168]:
dfincidence = pd.read_csv('../data/current_estimated_values.csv')
dftypical = pd.read_csv('../data/mem-typical.csv')
dfthresholds = pd.read_csv('../data/mem-report.csv')
dfpop = pd.read_csv('../data/PROJECOES_2013_POPULACAO-simples_agebracket.csv')
level_dict = {'L0': 'Baixa', 'L1': 'Epidêmica',
'L2': 'Alta', 'L3': 'Muito alta'}
In [169]:
dfpop.head(10)
Out[169]:
In [170]:
dfincidence.columns
Out[170]:
In [171]:
dfincidence.head(10)
Out[171]:
In [172]:
dftypical.head(10)
Out[172]:
In [173]:
dfthresholds.tail(10)
Out[173]:
Entries with dfthresholds['se típica do inicio do surto'] = NaN have activity too low for proper epidemic threshold definition
In [174]:
df = pd.merge(dfincidence, dfthresholds[['UF','Unidade da Federação']], on='UF')
df.head(10)
Out[174]:
In [218]:
def plot_timeseries(df, dfthres, dftyp):
# Set font properties
fontproplgd = fm.FontProperties('Oswald')
fontproplgd.set_size(28)
fontproplbl = fm.FontProperties('Oswald')
fontproplbl.set_size(42)
fontpropticks = fm.FontProperties('Oswald')
fontpropticks.set_size(24)
# Set figure size
fig, ax = plt.subplots(1, 1, figsize = [20, 20])
# Set ymax at least = 1:
max_typ = dftyp['corredor alto'].max()
max_thres = dfthres['intensidade muito alta'].max()
max_ts = df[['SRAG', '50%']].max().max()
maxval1 = max([max_typ, max_thres, max_ts, 1])
ax.set_ylim([0,maxval1])
# Plot lines and regions:
ax.fill_between(dftyp['epiweek'], 0, dftyp['corredor baixo'], color='green', alpha=0.5)
ax.fill_between(dftyp['epiweek'], dftyp['corredor baixo'], dftyp['corredor mediano'], color='yellow', alpha=0.5)
ax.fill_between(dftyp['epiweek'], dftyp['corredor mediano'], dftyp['corredor alto'], color='orange', alpha=0.5)
try:
df.plot(ax=ax, x='epiweek', y='SRAG', color='k', lw=3, label='Casos notificados')
except:
pass
try:
minweek = int(df.loc[df['Situation']=='estimated','epiweek'].min())
df_est = df[df['epiweek']>=minweek]
df_est.plot(ax=ax, x='epiweek', y='50%', color='r', lw=3, label='Casos estimados')
df_est.plot(ax=ax, x='epiweek', y='2.5%', color='r', lw=3, style='--', label='Intervalo de confiança')
df_est.plot(ax=ax, x='epiweek', y='97.5%', color='r', lw=3, style='--', label='')
except:
pass
try:
minweek = int(df.loc[df['Situation']=='unknown','epiweek'].min())
df_est = df[df['epiweek']>=minweek]
df_est.plot(ax=ax, x='epiweek', y='97.5%', color='silver', lw=3, style='--', label='Dados potencialmente\nincompletos')
except:
pass
plt.axhline(y=np.float(dfthres['limiar pré-epidêmico']), label='limiar pré-epidêmico', ls='--', lw=3,
color='yellow')
plt.axhline(y=np.float(dfthres['intensidade alta']), label='intensidade alta', ls='--', lw=3,
color='orange')
plt.axhline(y=np.float(dfthres['intensidade muito alta']), label='intensidade muito alta', ls='--', lw=3,
color='darkred')
dftyp.plot(ax=ax, x='epiweek', y='corredor alto', legend=False, alpha=0)
# Grab ylim in order to set the range for the red zone:
miny, maxy = ax.get_ylim()
del(ax.lines[-1])
ax.fill_between(dftyp['epiweek'], dftyp['corredor alto'], maxy, color='red', alpha=0.5)
ax.set_ylim([miny, maxy])
# Draw vertical line indicating user selected week:
plt.axvline(axes=ax, x=week, color='silver', lw=8, alpha=0.5)
# Use defined font properties for axis tick labels
for label in ax.get_xticklabels() :
label.set_fontproperties(fontpropticks)
for label in ax.get_yticklabels() :
label.set_fontproperties(fontpropticks)
ax.set_title(uf, fontproperties=fontproplbl)
ax.set_xlabel('SE', fontproperties=fontproplbl)
ax.set_ylabel('Incidência (por 100mil habitantes)', fontproperties=fontproplbl)
xticks = np.arange(4,53,4)
ax.set_xticks(xticks)
ax.set_xticklabels(xticks)
# Shrink current axis by 20%
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
ax.legend(prop=fontproplgd, loc='center left', bbox_to_anchor=(1,0.5))
if (df.loc[df['epiweek'] == week, 'Situation'].values[0] == 'estimated'):
activity_levels = df.loc[df.epiweek == week, level_dict.keys()]
ax.text(1.01, 0.99, s=str('Probabilidade do nível de atividade:\n'+
'Baixa: %s\n'+
'Epidêmica: %s\n'+
'Alta: %s\n'+
'Muito alta: %s') %
('{:.1f}%'.format(100*float(activity_levels['L0'])),
'{:.1f}%'.format(100*float(activity_levels['L1'])),
'{:.1f}%'.format(100*float(activity_levels['L2'])),
'{:.1f}%'.format(100*float(activity_levels['L3']))),
fontproperties=fontproplgd, ha='left', va='top', transform=ax.transAxes)
elif (df.loc[df.epiweek == week, 'Situation'].values[0] == 'stable'):
df_level = df.loc[(df['epiweek'] == week), level_cols].unstack().copy()
df_level.sort_values(ascending=False, inplace=True)
activity_level = df_level.index[0][0]
ax.text(1.01, 0.99, s=str('Nível de atividade:\n'+
'%s\n') % level_dict[activity_level],
fontproperties=fontproplgd, ha='left', va='top', transform=ax.transAxes)
return
In [219]:
season = 2013
uf = 'Rio Grande do Sul'
week = 32
df_tmp = df[(df['Unidade da Federação'] == uf) & (df['epiyear'] == season)]
dftyp_tmp = dftypical[dftypical['Unidade da Federação'] == uf]
dfthres_tmp = dfthresholds[dfthresholds['Unidade da Federação'] == uf]
plot_timeseries(df=df_tmp, dfthres=dfthres_tmp, dftyp=dftyp_tmp)
In [220]:
season = 2016
uf = 'Rio Grande do Sul'
week = 41
df_tmp = df[(df['Unidade da Federação'] == uf) & (df['epiyear'] == season)]
dftyp_tmp = dftypical[dftypical['Unidade da Federação'] == uf]
dfthres_tmp = dfthresholds[dfthresholds['Unidade da Federação'] == uf]
plot_timeseries(df=df_tmp, dftyp=dftyp_tmp, dfthres=dfthres_tmp)
In [226]:
season = 2016
uf = 'Região 4'
week = 41
df_tmp = df[(df['Unidade da Federação'] == uf) & (df['epiyear'] == season)]
dftyp_tmp = dftypical[dftypical['Unidade da Federação'] == uf]
dfthres_tmp = dfthresholds[dfthresholds['Unidade da Federação'] == uf]
plot_timeseries(df=df_tmp, dfthres=dfthres_tmp, dftyp=dftyp_tmp)
In [222]:
season = 2016
uf = 'Rondônia'
week = 32
df_tmp = df[(df['Unidade da Federação'] == uf) & (df['epiyear'] == season)]
dftyp_tmp = dftypical[dftypical['Unidade da Federação'] == uf]
dfthres_tmp = dfthresholds[dfthresholds['Unidade da Federação'] == uf]
plot_timeseries(df=df_tmp, dfthres=dfthres_tmp, dftyp=dftyp_tmp)
In [227]:
season = 2016
uf = 'Rio Grande do Sul'
week = 41
df_tmp_week_level = df.loc[(df['Unidade da Federação'] == uf) & (df['epiyear'] == season) & (df['epiweek'] == week),
level_dict.keys()]
df_tmp_week_level = df_tmp_week_level.unstack()
df_tmp_week_level.sort_values(ascending=False, inplace=True)
activity_level = df_tmp_week_level.index[0][0]
activity_level_prob = float(df_tmp_week_level[activity_level])
print(level_dict[activity_level], '{:.1f}%'.format(100*activity_level_prob))