Example #1
0
def plot_predictions(offset, melted_traces, dias=365):
    htrace = melted_traces[melted_traces.Estado ==
                           'Hospitalizações Acumuladas']
    mtrace = melted_traces[melted_traces.Estado == 'Mortes Acumuladas']
    htrace.loc[:, 'dtime'] = htrace.time.astype(int)
    mtrace.loc[:, 'dtime'] = mtrace.time.astype(int)
    htrace = htrace.groupby('dtime').mean()
    mtrace = mtrace.groupby('dtime').mean()

    data = dashboard_data.get_data()
    region_name, data_uf = dashboard_data.get_data_uf(data, False, [],
                                                      "Casos Confirmados")
    region_name, m_data_uf = dashboard_data.get_data_uf(
        data, False, [], "Mortes Acumuladas")
    drange = pd.date_range(
        data_uf[data_uf['Casos Confirmados'] > 0].date.min() -
        timedelta(offset),
        periods=dias,
        freq='D')
    fig, ax = plt.subplots(1, 1)
    ax.semilogy(drange,
                htrace['Indivíduos'].values,
                '-v',
                label='Casos previstos')
    ax.semilogy(drange,
                mtrace['Indivíduos'].values,
                '-v',
                label='Mortes previstas')
    data_uf.loc[:, 'date2'] = data_uf.date
    data_uf.set_index('date2', inplace=True)
    data_uf[data_uf['Casos Confirmados'] > 0]['Casos Confirmados'].plot(
        ax=ax, style='o', label='Dados oficiais', grid=True, logy=True)
    m_data_uf.loc[:, 'date2'] = m_data_uf.date
    m_data_uf.set_index('date2', inplace=True)

    m_data_uf[m_data_uf['Mortes Acumuladas'] > 0]['Mortes Acumuladas'].plot(
        ax=ax, style='o', label='Mortes oficiais', grid=True, logy=True)
    ax.set_xlabel('Data (dias)')
    ax.set_ylabel('Casos acumulados')
    plt.legend()
    st.pyplot()
Example #2
0
def main():
    st.sidebar.image(logo, use_column_width=True)
    page = st.sidebar.selectbox("Escolha uma Análise", [
        HOME, MODELS, DATA, PAGE_CASE_DEATH_NUMBER_BR, CUM_DEATH_CART,
        PAGE_GLOBAL_CASES, MAPA, CREDITOS
    ])
    if page == HOME:
        st.header("Analizando a pandemia")
        st.markdown(
            """Neste site buscamos trazer até você os números da epidemia, a medida que se revelam, 
        mas também um olhar analítico, capaz de desvelar a dinâmica do processo de transmissão do vírus SARS-Cov-2
        por meio de modelos matemáticos, análises estatísticas e visualização de informação.
        
Pelo *painel à esquerda* você pode ***navegar entre nossas análises***, as quais estaremos atualizando constantemente 
daqui para frente. 
## Outros Recursos de Interesse
Vamos compilar aqui também outras fontes de informação de confiança para que você possa se manter atualizado 
com os últimos resultados científicos sobre a Pandemia.

* Canal [A Matemática das Epidemias](https://www.youtube.com/channel/UCZFllLoI5kB4o_6w59YVzAA?view_as=subscriber).
* Grupo MAVE: [Métodos Analíticos em Vigilância Epidemiológica](https://covid-19.procc.fiocruz.br).

## Fontes de Dados
As sguintes fontes de dados foram usadas neste projeto:

* [Brasil.io](https://brasil.io): Dados de incidência e mortalidade no Brasil
* [Johns Hopkins CSSE](https://github.com/CSSEGISandData/COVID-19): Dados de incidência e mortalidade globais.

## Softwares opensource
Várias bibliotecas opensource foram utilizadas na construção deste dashboard:

* [Streamlit](streamlit.io): Web framework voltada para ciência de dados.
* [Epimodels](https://github.com/fccoelho/epimodels): Biblioteca de modelos matemáticos para simulação de epidemias.

        """)
        dashboard_data.get_data()
    elif page == MODELS:
        st.title("Explore a dinâmica da COVID-19")
        st.sidebar.markdown("### Parâmetros do modelo")
        chi = st.sidebar.slider('χ, Fração de quarentenados', 0.0, 1.0, 0.7)
        phi = st.sidebar.slider('φ, Taxa de Hospitalização', 0.0, 0.5, 0.01)
        beta = st.sidebar.slider('β, Taxa de transmissão', 0.0, 1.0, 0.5)
        rho = st.sidebar.slider('ρ, Taxa de alta dos hospitalizados:', 0.0,
                                1.0, 0.02)
        delta = st.sidebar.slider('δ, Taxa de recuperação:', 0.0, 1.0, 0.1)
        alpha = st.sidebar.slider('α, Taxa de incubação', 0.0, 10.0, .33)
        mu = st.sidebar.slider('μ, Taxa de mortalidade pela COVID-19', 0.0,
                               1.0, .01)

        p = st.slider('Fração de assintomáticos:', 0.0, 1.0, 0.75)
        q = st.slider('Dia de início da Quarentena:', 1, 165, 50)
        r = st.slider('duração em dias da Quarentena:', 0, 200, 10)
        N = st.number_input('População em Risco:',
                            value=97.3e6,
                            max_value=200e6,
                            step=1e6)
        st.markdown(
            f"""$R_0={-(beta * chi - beta) / delta:.2f}$, durante a quarentena. &nbsp 
                    $R_0={-(beta * 0 - beta) / delta:.2f}$, fora da quarentena."""
        )

        params = {
            'chi': chi,
            'phi': phi,
            'beta': beta,
            'rho': rho,
            'delta': delta,
            'alpha': alpha,
            'mu': mu,
            'p': p,
            'q': q,
            'r': r
        }
        traces = pd.DataFrame(data=seqiahr_model(params=params)).rename(
            columns=COLUMNS)
        final_traces = dashboard_models.prepare_model_data(
            traces, VARIABLES, COLUMNS, N)

        # Dataframes
        Hospitalizacoes = traces['Hospitalizações Acumuladas']
        Hosp_t = traces['Hospitalizados']
        Mortes = traces['Mortes Acumuladas']
        Infectados = traces['Infectados']
        Recuperados = traces['Recuperados']

        # Valores
        pico_infectados = Infectados.iloc[Infectados.idxmax()]
        pico_hosp = Hosp_t.iloc[Hosp_t.idxmax()]
        pico_mortes = Mortes.iloc[Mortes.diff().idxmax()]
        Hospitalizacoes_totais = Hospitalizacoes.iloc[-1]
        mortes_totais = Mortes.iloc[-1]
        inf_tot = N - Recuperados.iloc[-1] - mortes_totais

        stats = pd.DataFrame(data={
            'Pico': [
                hp.intword(pico_infectados * N),
                hp.intword(pico_hosp * N),
                hp.intword(pico_mortes * N)
            ],
            'Total': [
                hp.intword(inf_tot),
                hp.intword(Hospitalizacoes_totais * N),
                hp.intword(mortes_totais * N)
            ]
        },
                             index=['Infecções', 'Hospitalizações', 'Mortes'])

        st.markdown(f"""### Números importantes da simulação""")
        st.dataframe(stats)
        st.markdown(
            f"""O pico das hospitalizações ocorrerá após {Hosp_t.idxmax()} dias"""
        )
        st.markdown(
            f"""O pico das Mortes ocorrerá após {Mortes.diff().idxmax()} dias"""
        )

        dashboard_models.plot_model(final_traces, q, r)
        st.markdown('''### Comparando Projeções e Dados
Podemos agora comparar nossa série simulada de Hospitalizações acumuladas com o número de casos acumulados 
de notificações oficiais.
        ''')
        ofs = st.number_input("Atraso no início da notificação (dias)",
                              value=15,
                              min_value=0,
                              max_value=90,
                              step=1)
        st.markdown(
            'Na caixa acima, você pode mover lateralmente a curva, Assumindo que os primeiro caso '
            'notificado não corresponde ao início da transmissão')
        dashboard_models.plot_predictions(ofs, final_traces, dias=365)
        st.markdown('### Formulação do modelo')
        st.write(r"""
                $\frac{dS}{dt}=-\lambda[(1-\chi) S]$

                $\frac{dE}{dt}= \lambda [(1-\chi) S] -\alpha E$

                $\frac{dI}{dt}= (1-p)\alpha E - \delta I$

                $\frac{dA}{dt}= p\alpha E -\delta A$

                $\frac{dH}{dt}= \phi \delta I -(\rho+\mu) H$

                $\frac{dR}{dt}= (1-\phi)\delta I +\rho H + \delta A$

                $\lambda=\beta(I+A)$

                $R_0 = -\frac{\beta \chi -\beta}{\delta}$
                """)

    elif page == DATA:
        st.title('Probabilidade de Epidemia por Município ao Longo do tempo')

        @st.cache
        def read_video():
            with open('dashboard/video_prob.mp4', 'rb') as v:
                video = v.read()
            return video

        st.video(read_video())
        st.markdown(r'''## Descrição da modelagem:
Os municípios brasileiros são conectados por uma malha de transporte muito bem desenvolvida e através desta,
cidadãs e cidadãos viajam diariamente entre as cidades para trabalhar, estudar e realizar outras atividades.
Considerando o fluxo de indivíduos (infectados) que chega em um município em um determinado dia, caso este município
ainda não estejam em transmissão comunitária, podemos calcular a probabilidade de uma epidemia se estabelecer.
Esta probabilidade é dada por esta fórmula:

$$P_{epi}=1-\left(\frac{1}{R_0}\right)^{I_0}$$,

onde $I_0$ é o número de infectados chegando diáriamente no município. Neste cenário usamos um $R_0=2.5$.
        ''')

    elif page == PAGE_CASE_DEATH_NUMBER_BR:
        st.title(PAGE_CASE_DEATH_NUMBER_BR)
        x_variable = "date"
        y_variable = "Casos Confirmados"
        y_variable2 = "Mortes Acumuladas"

        data = dashboard_data.get_data()
        ufs = sorted(list(data.state.drop_duplicates().values))
        uf_option = st.multiselect("Selecione o Estado", ufs)

        city_options = None

        if uf_option:
            cities = dashboard_data.get_city_list(data, uf_option)
            city_options = st.multiselect("Selecione os Municípios", cities)

        is_log = st.checkbox('Escala Logarítmica', value=False)
        region_name, data_uf_confirmed = dashboard_data.get_data_uf(
            data, uf_option, city_options, y_variable)
        region_name, data_uf_deaths = dashboard_data.get_data_uf(
            data, uf_option, city_options, y_variable2)

        figure = dashboard_data.plot_series(data_uf_confirmed, x_variable,
                                            y_variable, region_name, is_log)
        figure = dashboard_data.add_series(figure, data_uf_deaths, x_variable,
                                           y_variable2, region_name, is_log)

        st.plotly_chart(figure)

        st.markdown(
            "**Fonte**: [brasil.io](https://brasil.io/dataset/covid19/caso)")
        st.markdown(r"""## Evolução da Mortalidade por Estado Brasileiro
No gráfico abaixo, podemos ver como a mortalidade(Fração dos casos confirmados que foi a óbito) está evoluindo 
com o tempo em cada estado.

É importante lembrar que estes números não representam todas as mortes por COVID-19 no país, pois apenas as mortes de 
casos testados e confirmados são efetivamente contadas como mortes oficiais pela COVID-19. Devido à escassez de testes e 
recomendações sobre quem deve ser testado, existe um viés nestas estimativas.

Na figura abaixo o eixo vertical representa a mortalidade: $\frac{mortes}{casos}$, o eixo Horizontal representa o número 
total de casos. O tamanho dos círculos representa o número total de mortes em cada estado. Este gráfico é mais fácil de 
ser estudado em tela cheia. clicando na legenda é possível "ligar" e "desligar" a visualização dos estados individualmente,
para facilitar a visualização dos demais. Passsndo o Mouse por sobre os circulos, podemos ler os valores da mortalidade e 
da data a que corresponde.
        """)
        dashboard_data.plot_scatter_CFR(data)

        st.markdown('''## Excesso de mortes em SP
Abaixo, exploramos o excesso de mortalidade no estado de são que a COVID-19 representa, quando compara à média dos 
últimos 10 anos de mortes por doenças respiratorias com causa viral.
        ''')
        dashboard_data.plot_excess_deaths(data)

    # elif page == CUM_DEATH_COUNT_BR:
    #     st.title(CUM_DEATH_COUNT_BR)
    #     x_variable = "date"
    #     y_variable = "Mortes Acumuladas"
    #     data = dashboard_data.get_data()
    #     ufs = sorted(list(data.state.drop_duplicates().values))
    #     uf_option = st.multiselect("Selecione o Estado", ufs)
    #
    #     city_options = None
    #     if uf_option:
    #         cities = dashboard_data.get_city_list(data, uf_option)
    #         city_options = st.multiselect("Selecione os Municípios", cities)
    #
    #     is_log = st.checkbox('Escala Logarítmica', value=False)
    #     region_name, data_uf = dashboard_data.get_data_uf(
    #         data,
    #         uf_option,
    #         city_options,
    #         y_variable
    #     )
    #
    #     dashboard_data.plot_series(data_uf, x_variable, y_variable, region_name, is_log)
    #     st.markdown("**Fonte**: [brasil.io](https://brasil.io/dataset/covid19/caso)")

    elif page == CUM_DEATH_CART:
        st.title(CUM_DEATH_CART)
        x_variable = "date"
        y_variable = "deaths_covid19"
        data = dashboard_data.get_data_from_source(
            dashboard_data.BRASIL_IO_CART, usecols=None, rename_cols=None)
        ufs = sorted(list(data.state.drop_duplicates().values))
        uf_option = st.multiselect("Selecione o Estado", ufs)
        is_log = st.checkbox('Escala Logarítmica', value=False)
        city_options = None
        region_name, data_uf = dashboard_data.get_data_cart(
            data, uf_option, y_variable)
        fig = dashboard_data.plot_series(data_uf, x_variable, y_variable,
                                         region_name, is_log)

        st.plotly_chart(fig)

        st.markdown(
            "**Fonte**: [brasil.io](https://brasil.io/dataset/covid19/obito_cartorio)"
        )

    elif page == MAPA:

        # Precisa refatorar
        st.title("Distribuição Geográfica de Casos")
        cases = dashboard_data.get_data()
        estados = dashboard_data.load_lat_long()
        estados['casos'] = 0
        cases = cases[cases.place_type != 'state'].groupby(['date',
                                                            'state']).sum()
        cases.reset_index(inplace=True)

        for i, row in estados.iterrows():
            if row.Estados in list(cases.state):
                estados.loc[estados.Estados == row.Estados, 'casos'] += \
                    cases[(cases.state == row.Estados) & (cases.is_last)]['Casos Confirmados'].iloc[0]

        midpoint = (np.average(estados["Latitude"]),
                    np.average(estados["Longitude"]))

        layer = pdk.Layer("ColumnLayer",
                          data=estados,
                          get_position=["Longitude", "Latitude"],
                          get_elevation=['casos'],
                          auto_highlight=True,
                          radius=50000,
                          elevation_scale=300,
                          get_color=[100, 255, 100, 255],
                          pickable=True,
                          extruded=True,
                          coverage=1)

        view_state = pdk.ViewState(
            longitude=midpoint[1],
            latitude=midpoint[0],
            zoom=3,
            pitch=20.,
        )

        mapbox_style = 'mapbox://styles/mapbox/light-v9'
        mapbox_key = 'pk.eyJ1IjoiZmNjb2VsaG8iLCJhIjoiY2s4c293dzc3MGJodzNmcGEweTgxdGpudyJ9.UmSRs3e4EqTOte6jYWoaxg'

        st.write(
            pdk.Deck(
                map_style=mapbox_style,
                mapbox_key=mapbox_key,
                initial_view_state=view_state,
                layers=[layer],
                tooltip={
                    "html":
                    "<b>Estado:</b> {Estados}<br><b>Número de casos:</b> {casos}",
                    "style": {
                        "color": "white"
                    }
                },
            ))

        st.markdown(
            "**Fonte**: [brasil.io](https://brasil.io/dataset/covid19/caso)")

    elif page == PAGE_GLOBAL_CASES:
        st.title(PAGE_GLOBAL_CASES)
        x_variable = "Data"
        y_variable = "Casos"
        global_cases = dashboard_data.get_global_cases() \
            .drop(["Province/State", "Lat", "Long"], axis="columns")

        melted_global_cases = pd.melt(global_cases,
                                      id_vars=["País/Região"],
                                      var_name=x_variable,
                                      value_name=y_variable)
        melted_global_cases["Data"] = pd.to_datetime(
            melted_global_cases["Data"])
        countries = dashboard_data.get_countries_list(melted_global_cases)
        countries_options = st.multiselect("Selecione os Países", countries)

        region_name, countries_data = dashboard_data.get_countries_data(
            melted_global_cases, countries_options)
        is_log = st.checkbox('Escala Logarítmica', value=False)

        fig = dashboard_data.plot_series(countries_data, x_variable,
                                         y_variable, region_name, is_log)
        st.plotly_chart(fig)
        st.markdown(
            "**Fonte**: [Johns Hopkins CSSE](https://github.com/CSSEGISandData/COVID-19)"
        )

    elif page == CREDITOS:
        st.markdown(open('dashboard/creditos.md', 'r').read())
Example #3
0
def main():
    st.sidebar.image(logo, use_column_width=True)
    page = st.sidebar.selectbox("Escolha uma Análise", [
        HOME, MODELS, DATA, PAGE_CASE_NUMBER_BR, CUM_DEATH_COUNT_BR,
        PAGE_GLOBAL_CASES, MAPA, CREDITOS
    ])
    if page == HOME:
        st.header("Analizando a pandemia")
        st.markdown(
            """Neste site buscamos trazer até você os números da epidemia, a medida que se revelam, 
        mas também um olhar analítico, capaz de desvelar a dinâmica do processo de transmissão do vírus SARS-Cov-2
        por meio de modelos matemáticos, análises estatísticas e visualização de informação.
        
Pelo *painel à esquerda* você pode ***navegar entre nossas análises***, as quais estaremos atualizando constantemente 
daqui para frente. 
## Outros Recursos de Interesse
Vamos compilar aqui também outras fontes de informação de confiança para que você possa se manter atualizado 
com os últimos resultados científicos sobre a Pandemia.

* Canal [A Matemática das Epidemias](https://www.youtube.com/channel/UCZFllLoI5kB4o_6w59YVzAA?view_as=subscriber).
* Grupo MAVE: [Métodos Analíticos em Vigilância Epidemiológica](https://covid-19.procc.fiocruz.br).

## Fontes de Dados
As sguintes fontes de dados foram usadas neste projeto:

* [Brasil.io](https://brasil.io): Dados de incidência e mortalidade no Brasil
* [Johns Hopkins CSSE](https://github.com/CSSEGISandData/COVID-19): Dados de incidência e mortalidade globais.

## Softwares opensource
Várias bibliotecas opensource foram utilizadas na construção deste dashboard:

* [Streamlit](streamlit.io): Web framework voltada para ciência de dados.
* [Epimodels](https://github.com/fccoelho/epimodels): Biblioteca de modelos matemáticos para simulação de epidemias.

        """)
    elif page == MODELS:
        st.title("Explore a dinâmica da COVID-19")
        st.sidebar.markdown("### Parâmetros do modelo")
        chi = st.sidebar.slider('χ, Fração de quarentenados', 0.0, 1.0, 0.7)
        phi = st.sidebar.slider('φ, Taxa de Hospitalização', 0.0, 0.5, 0.01)
        beta = st.sidebar.slider('β, Taxa de transmissão', 0.0, 1.0, 0.5)
        rho = st.sidebar.slider('ρ, Taxa de alta dos hospitalizados:', 0.0,
                                1.0, 0.02)
        delta = st.sidebar.slider('δ, Taxa de recuperação:', 0.0, 1.0, 0.1)
        alpha = st.sidebar.slider('α, Taxa de incubação', 0.0, 10.0, .33)
        mu = st.sidebar.slider('μ, Taxa de mortalidade pela COVID-19', 0.0,
                               1.0, .03)

        p = st.slider('Fração de assintomáticos:', 0.0, 1.0, 0.75)
        q = st.slider('Dia de início da Quarentena:', 0, 120, 50)
        r = st.slider('duração em dias da Quarentena:', 0, 200, 10)
        N = st.number_input('População em Risco:',
                            value=97.3e6,
                            max_value=200e6,
                            step=1e6)
        st.markdown(
            f"$R_0={-(beta*chi-beta)/delta:.2f}$, durante a quarentena.")
        st.markdown(
            f"$R_0={-(beta * 0 - beta) / delta:.2f}$, fora da quarentena.")

        params = {
            'chi': chi,
            'phi': phi,
            'beta': beta,
            'rho': rho,
            'delta': delta,
            'alpha': alpha,
            'mu': mu,
            'p': p,
            'q': q,
            'r': r
        }
        traces = pd.DataFrame(data=seqiahr_model(params=params)).rename(
            columns=COLUMNS)
        final_traces = dashboard_models.prepare_model_data(
            traces, VARIABLES, COLUMNS, N)

        dashboard_models.plot_model(final_traces, q, r)
        st.markdown('### Formulação do modelo')
        st.write(r"""
$\frac{dS}{dt}=-\lambda[(1-\chi) S]$

$\frac{dE}{dt}= \lambda [(1-\chi) S] -\alpha E$

$\frac{dI}{dt}= (1-p)\alpha E - \delta I$

$\frac{dA}{dt}= p\alpha E -\delta A$

$\frac{dH}{dt}= \phi \delta I -(\rho+\mu) H$

$\frac{dR}{dt}= (1-\phi)\delta I +\rho H + \delta A$

$\lambda=\beta(I+A)$

$R_0 = -\frac{\beta \chi -\beta}{\delta}$
        """)

    elif page == DATA:
        st.title('Probabilidade de Epidemia por Município ao Longo do tempo')

        @st.cache
        def read_video():
            with open('dashboard/video_prob.mp4', 'rb') as v:
                video = v.read()
            return video

        st.video(read_video())
        st.markdown(r'''## Descrição da modelagem:
Os municípios brasileiros são conectados por uma malha de transporte muito bem desenvolvida e através desta,
cidadãs e cidadãos viajam diariamente entre as cidades para trabalhar, estudar e realizar outras atividades.
Considerando o fluxo de indivíduos (infectados) que chega em um município em um determinado dia, caso este município
ainda não estejam em transmissão comunitária, podemos calcular a probabilidade de uma epidemia se estabelecer.
Esta probabilidade é dada por esta fórmula:

$$P_{epi}=1-\left(\frac{1}{R_0}\right)^{I_0}$$,

onde $I_0$ é o número de infectados chegando diáriamente no município. Neste cenário usamos um $R_0=2.5$.
        ''')

    elif page == PAGE_CASE_NUMBER_BR:
        st.title(PAGE_CASE_NUMBER_BR)
        x_variable = "date"
        y_variable = "Casos Confirmados"
        data = dashboard_data.get_data()
        ufs = sorted(list(data.state.drop_duplicates().values))
        uf_option = st.multiselect("Selecione o Estado", ufs)

        city_options = None
        if uf_option:
            cities = dashboard_data.get_city_list(data, uf_option)
            city_options = st.multiselect("Selecione os Municípios", cities)

        is_log = st.checkbox('Escala Logarítmica', value=False)
        region_name, data_uf = dashboard_data.get_data_uf(
            data, uf_option, city_options, y_variable)

        dashboard_data.plot_series(data_uf, x_variable, y_variable,
                                   region_name, is_log)
        st.markdown(
            "**Fonte**: [brasil.io](https://brasil.io/dataset/covid19/caso)")
    elif page == CUM_DEATH_COUNT_BR:
        st.title(CUM_DEATH_COUNT_BR)
        x_variable = "date"
        y_variable = "Mortes Acumuladas"
        data = dashboard_data.get_data()
        ufs = sorted(list(data.state.drop_duplicates().values))
        uf_option = st.multiselect("Selecione o Estado", ufs)

        city_options = None
        if uf_option:
            cities = dashboard_data.get_city_list(data, uf_option)
            city_options = st.multiselect("Selecione os Municípios", cities)

        is_log = st.checkbox('Escala Logarítmica', value=False)
        region_name, data_uf = dashboard_data.get_data_uf(
            data, uf_option, city_options, y_variable)

        dashboard_data.plot_series(data_uf, x_variable, y_variable,
                                   region_name, is_log)
        st.markdown(
            "**Fonte**: [brasil.io](https://brasil.io/dataset/covid19/caso)")

    elif page == MAPA:

        # Precisa refatorar
        st.title("Distribuição Geográfica de Casos")
        cases = dashboard_data.get_data()
        estados = dashboard_data.load_lat_long()
        estados['casos'] = 0
        cases = cases[cases.place_type != 'state'].groupby(['date',
                                                            'state']).sum()
        cases.reset_index(inplace=True)

        for i, row in estados.iterrows():
            if row.Estados in list(cases.state):
                estados.loc[estados.Estados == row.Estados, 'casos'] += \
                cases[(cases.state == row.Estados) & (cases.is_last)]['Casos Confirmados'].iloc[0]

        midpoint = (np.average(estados["Latitude"]),
                    np.average(estados["Longitude"]))

        geojson_url = "https://data.brasil.io/dataset/shapefiles-brasil/0.01/BR-UF.geojson"

        layer = pdk.Layer("ColumnLayer",
                          data=estados,
                          get_position=["Longitude", "Latitude"],
                          get_elevation=['casos'],
                          auto_highlight=True,
                          radius=50000,
                          elevation_scale=300,
                          get_color=[100, 255, 100, 255],
                          pickable=True,
                          extruded=True,
                          coverage=1)

        view_state = pdk.ViewState(
            longitude=midpoint[1],
            latitude=midpoint[0],
            zoom=3,
            pitch=20.,
        )

        mapbox_style = 'mapbox://styles/mapbox/light-v9'
        mapbox_key = 'pk.eyJ1IjoiZmNjb2VsaG8iLCJhIjoiY2s4c293dzc3MGJodzNmcGEweTgxdGpudyJ9.UmSRs3e4EqTOte6jYWoaxg'

        st.write(
            pdk.Deck(
                map_style=mapbox_style,
                mapbox_key=mapbox_key,
                initial_view_state=view_state,
                layers=[layer],
                tooltip={
                    "html":
                    "<b>Estado:</b> {Estados}<br><b>Número de casos:</b> {casos}",
                    "style": {
                        "color": "white"
                    }
                },
            ))

        st.markdown(
            "**Fonte**: [brasil.io](https://brasil.io/dataset/covid19/caso)")

    elif page == PAGE_GLOBAL_CASES:
        st.title(PAGE_GLOBAL_CASES)
        x_variable = "Data"
        y_variable = "Casos"
        global_cases = dashboard_data.get_global_cases()\
            .drop(["Province/State", "Lat", "Long"], axis="columns")

        melted_global_cases = pd.melt(global_cases,
                                      id_vars=["País/Região"],
                                      var_name=x_variable,
                                      value_name=y_variable)
        melted_global_cases["Data"] = pd.to_datetime(
            melted_global_cases["Data"])
        countries = dashboard_data.get_countries_list(melted_global_cases)
        countries_options = st.multiselect("Selecione os Países", countries)

        region_name, countries_data = dashboard_data.get_countries_data(
            melted_global_cases, countries_options)
        is_log = st.checkbox('Escala Logarítmica', value=False)

        dashboard_data.plot_series(countries_data, x_variable, y_variable,
                                   region_name, is_log)
        st.markdown(
            "**Fonte**: [Johns Hopkins CSSE](https://github.com/CSSEGISandData/COVID-19)"
        )

    elif page == CREDITOS:
        st.markdown(open('dashboard/creditos.md', 'r').read())