def gen_detailed_vision(economic_data, session_state, config):
    """ Uses session_state to decided wheter to hide or show the plot """
    st.write(
        f"""
        <div class="base-wrapper">
            <span style="width: 80%; max-width: 1000px; margin-top: -50px;">
            <i><b>Clique em "Visão Detalhada" para ver o gráfico completo com todas as informações.</b></i>
            </span><br>""",
        unsafe_allow_html=True,
    )
    if st.button(
            "Visão Detalhada"
    ):  # If the button is clicked just alternate the opened flag and plot it
        amplitude.gen_user(
            utils.get_server_session()).safe_log_event(  # Logs the event
                "picked saude_em_ordem_detailed_view",
                session_state,
                event_args={
                    "state": session_state.state_name,
                    "city": session_state.city_name,
                },
            )
        session_state.saude_ordem_data[
            "opened_detailed_view"] = not session_state.saude_ordem_data[
                "opened_detailed_view"]
        if session_state.saude_ordem_data["opened_detailed_view"] is True:
            display_detailed_plot(economic_data, session_state)
    else:  # If the button is not clicked plot it as well but do not alter the flag
        if session_state.saude_ordem_data["opened_detailed_view"] is True:
            display_detailed_plot(economic_data, session_state)

    utils.stylizeButton(
        name="Visão Detalhada",
        style_string=
        """border: 1px solid var(--main-white);box-sizing: border-box;border-radius: 15px; width: auto;padding: 0.5em;text-transform: uppercase;font-family: var(--main-header-font-family);color: var(--main-white);background-color: var(--main-primary);font-weight: bold;text-align: center;text-decoration: none;font-size: 18px;animation-name: fadein;animation-duration: 3s;margin-top: 1em;""",
        session_state=session_state)
def gen_slider(session_state):
    """ Generates the weight slider we see after the initial sector diagram and saves it to session_state"""
    radio_label = "Caso queira, altere abaixo o peso dado à Segurança Sanitária:"
    # Code in order to horizontalize the radio buttons
    radio_horizontalization_html = utils.get_radio_horizontalization_html(
        radio_label)
    session_state.saude_ordem_data["slider_value"] = st.radio(
        radio_label, [70, 80, 90, 100])
    # print("VALOR SELECIONADO:", session_state.saude_ordem_data["slider_value"])
    st.write(
        f"""
        <div class="base-wrapper">
            {radio_horizontalization_html}
            <div class="saude-slider-value-display"><b>Peso selecionado (Segurança): {session_state.saude_ordem_data["slider_value"]}%</b>&nbsp;&nbsp;|  &nbsp;Peso restante para Economia: {100 - session_state.saude_ordem_data["slider_value"]}%</div>
        </div>""",
        unsafe_allow_html=True,
    )
    amplitude.gen_user(utils.get_server_session()).safe_log_event(
        "chose saude_slider_value",
        session_state,
        event_args={
            "slider_value": session_state.saude_ordem_data["slider_value"]
        },
    )
示例#3
0
def main(session_state=None):
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event("opened analysis",
                                                     session_state,
                                                     is_new_page=True)
    utils.localCSS("style.css")
    utils.localCSS("icons.css")

    config = yaml.load(open("configs/config.yaml", "r"),
                       Loader=yaml.FullLoader)
    br_cases = loader.read_data(
        "br",
        config,
        endpoint=config["br"]["api"]["endpoints"]["analysis"]["cases"])

    st.write(
        """
        <div class="base-wrapper">
                <span class="section-header primary-span">MORTES DIÁRIAS POR MUNICÍPIO</span>
        </div>
        """,
        unsafe_allow_html=True,
    )

    user_uf = st.selectbox("Selecione um estado para análise:",
                           utils.get_ufs_list())

    prepare_heatmap(
        br_cases,
        place_type="city_name",
        group=user_uf,
    )

    prepare_heatmap(
        br_cases,
        place_type="state_id",
    )

    prepare_heatmap(
        loader.read_data(
            "br",
            config,
            endpoint=config["br"]["api"]["endpoints"]["analysis"]["owid"]),
        place_type="country_pt",
    )
示例#4
0
def main(session_state):
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event("opened who_is",
                                                     session_state,
                                                     is_new_page=True)
    utils.localCSS("style.css")
    he.genHeader("2")

    st.write(
        """
        <div class="base-wrapper">
            <br><br>
            <a href="https://coronacidades.org/"><img class="coronacidades-logo" src="%s" width="300"/></a><br><br>
                <span>
                Coronacidades é uma plataforma feita para gestores públicos, que reúne
                ferramentas e informações chave para superar a COVID-19.<br>Além dos recursos online, 
                nosso time multidisciplinar está a postos para apoiar municípios e estados
                parceiros no planejamento e implementação de ações específicas nas áreas
                de saúde, assistência social, planejamento e economia. Entre em contato
                conosco.<br><br>
                <i>O CoronaCidades é uma iniciativa da Impulso, do Instituto Arapyau e do
                Instituto de Estudos de Políticas de Saúde (IEPS). 
                <b><a target="_blank" style="color:#3E758A;" href="https://coronacidades.org/pessoas/">Conheça quem faz o Coronacidades.org aqui!</a></b></i>
                </span><br><br><br>
            <a href="https://www.impulsogov.com.br/"><img class="impulso-logo" src="%s" width="150"/></a><br><br>
                <span>
                O FarolCovid e SimulaCovid são desenvolvidos pela Impulso, uma
                organização não-governamental sem fins lucrativos cujo principal
                objetivo é criar capacidade analítica em governos. Fortalecemos o
                processo de coleta e análise de dados para auxiliar gestores públicos na
                tomada de decisão diária, visando aprimoramento contínuo de suas
                políticas.
                </span><br><br>
        </div>
        """ % (Logo.CORONACIDADES.value, Logo.IMPULSO.value),
        unsafe_allow_html=True,
    )
示例#5
0
def main(session_state):
    # Analytics
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event(
        "opened saude_em_ordem_description", session_state, is_new_page=True)

    # Layout
    utils.localCSS("style.css")
    he.genHeader("1")
    st.write(
        f"""
        <div class="base-wrapper" style="background-color:#0090A7;">
            <div class="hero-wrapper">
                <div class="hero-container" style="width:60%;">
                    <div class="hero-container-content">
                        <span class="subpages-container-product white-span">MODELOS, LIMITAÇÕES <br>E FONTES</span>
                        <span class="subpages-container-subtitle white-span"></span>
                    </div>
                </div>
                <div class="subpages-container-image">   
                    <img style="width: 100%;" src="https://i.imgur.com/FiNi6fy.png"/>
                </div>
            </div><br>
        </div>
        <div>
            <br><br>
        </div>
        """,
        unsafe_allow_html=True,
    )

    st.write(
        """<div class="base-wrapper primary-span">
            <span class="section-header">FERRAMENTAS E FONTES</span>
        </div>
        """,
        unsafe_allow_html=True,
    )

    item = st.radio(
        "Selecione abaixo um dos itens para ver mais detalhes:",
        [
            "FarolCovid",
            "SimulaCovid",
            "Saúde em Ordem",
            "Fontes de dados e Referências",
        ],
    )

    if item == "FarolCovid":
        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">FAROLCOVID: Como saber se estou no controle da Covid-19?</span>
            </div>
            """,
            unsafe_allow_html=True,
        )

        risk_description.main(session_state)

    if item == "SimulaCovid":
        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">SIMULACOVID: Modelo Epidemiológico</span>
            </div>
            """,
            unsafe_allow_html=True,
        )

        model_description.main(session_state)

    if item == "Saúde em Ordem":
        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">SAÚDE EM ORDEM</span>
            </div>
            """,
            unsafe_allow_html=True,
        )

        saude_em_ordem_description.main(session_state)

    if item == "Fontes de dados e Referências":
        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">FONTES DE DADOS E REFERÊNCIAS</span>
            </div>""",
            unsafe_allow_html=True,
        )

        gen_sources_table()

        st.write(
            """<div class="base-wrapper">
            Agência Nacional de Saúde Suplementar, 2012. Taxa de Ocupação Operacional Geral. Disponível em:
            http://www.ans.gov.br/images/stories/prestadores/E-EFI-03.pdf <br> <br>CDC, 2019. Severe Outcomes
            Among Patients with Coronavirus Disease 2019 (COVID-19) — United States, February 12–March 16, 2020.
            MMWR Morb Mortal Wkly Rep. ePub: 18 March 2020. DOI: http://dx.doi.org/10.15585/mmwr.mm6912e2.<br>
            <br>G. Stein, V. N. Sulzbach and Lazzari. Nota Técnica sobre o Índice Setorial para Distanciamento
            Controlado.  Technical report, 2020<br> <br>Cori, A., Ferguson, N.M., Fraser, C. and Cauchemez, S., 2013. A new framework and software to estimate time-varying reproduction numbers during epidemics. American journal of epidemiology, 178(9), pp.1505-1512. 
            <br> <br> Hill, A, 2020. Model Description. Modelling COVID-19 Spread vs
            Healthcare Capacity. Disponível em: https://alhill.shinyapps.io/COVID19seir/<br> <br>Lazaro Gamio.
            The workers who face the greatest coronavirus risk, 2020.
            https://www.nytimes.com/interactive/2020/03/15/business/economy/coronavirus-worker-risk.html.<br> <br>
            Li, R., Pei, S., Chen, B., Song, Y., Zhang, T., Yang, W., & Shaman, J., 2020. Substantial
            undocumented infection facilitates the rapid dissemination of novel coronavirus (SARS-CoV2).
            Science, 3221(March), eabb3221. DOI: https://doi.org/10.1126/science.abb3221<br> <br>Max Roser, Hannah
            Ritchie, Esteban Ortiz-Ospina and Joe Hasell (2020) - "Coronavirus Disease (COVID-19)". Published
            online at OurWorldInData.org. Retrieved from: 'https://ourworldindata.org/coronavirus' [Online
            Resource]<br> <br>Ministério da Saúde do Brasil, 2020. Boletim Diário. 28 mar. 2020. Disponível em:
            https://www.saude.gov.br/images/pdf/2020/marco/28/28.03%20-%20COVID.pdf
            <br> <br>Nishiura, Hiroshi, Natalie M. Linton, and Andrei R. Akhmetzhanov. "Serial interval of novel coronavirus (COVID-19) infections." International journal of infectious diseases (2020).<br> <br>Vanessa Neumann Sulzbach.
            Essays on Labor Market Polarization in Brazil. Unpublished PhD’s Thesis, 2020.<br> <br>Verity, Robert, et
            al. "Estimates of the severity of coronavirus disease 2019: a model-based analysis." The Lancet
            infectious diseases (2020). Disponível em:
            https://www.medrxiv.org/content/10.1101/2020.03.09.20033357v1 <br> <br>Walker, P.G., Whittaker, C., Watson,
            O., Baguelin, M., Ainslie, K.E.C., Bhatia, S., Bhatt, S., Boonyasiri, A., Boyd, O., Cattarino, L.
            and Cucunubá, Z., 2020. The global impact of COVID-19 and strategies for mitigation and suppression.
            Imperial College London, doi: https://doi. org/10.25561/77735. <br> <br>[1] Wang, C, et al. (2020) Evolving
            Epidemiology and Impact of Non-pharmaceutical Interventions on the Outbreak of Coronavirus Disease
            2019 in Wuhan, China. DOI: https://doi.org/10.1101/2020.03.03.20030593 e pdf de apresentação
            https://docs.google.com/presentation/d/1-rvZs0zsXF_0Tw8TNsBxKH4V1LQQXq7Az9kDfCgZDfE/edit#slide=id.p1
            <br> <br>[2] Wang, J., Zhou, M., & Liu, F., 2020. Reasons for healthcare workers becoming infected with novel
            coronavirus disease 2019 (COVID-19) in China. Journal of Hospital Infection. DOI:
            https://doi.org/10.1016/j.jhin.2020.03.002 <br> <br>Y. O. de Lima, D. M. Costa, and J. M. de Souza. Covid-19:
            Risco de contágio por ocupação no Brasil: Nota metodológica. Technical report, 2020.
            <br>
            </div>""",
            unsafe_allow_html=True,
        )
示例#6
0
def main(session_state):
    # Analytics
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event(
        "opened saude_em_ordem_description", session_state, is_new_page=True)

    # Layout
    utils.localCSS("style.css")

    utils.genHeroSection(
        title1="Farol",
        title2="Covid",
        subtitle="Entenda a metodologia da ferramenta.",
        logo="https://i.imgur.com/CkYDPR7.png",
        header=True,
    )

    st.write(
        """
        <div class="base-wrapper flex flex-column" style="background-color: rgb(0, 144, 167);">
            <div class="white-span header p1" style="font-size:30px;">MODELOS, LIMITAÇÕES E FONTES</div>
        </div><br><br>
        """,
        unsafe_allow_html=True,
    )

    # NIVEIS DE ALERTA
    st.write(
        """<div class="base-wrapper primary-span">
            <span class="section-header">NÍVEIS DE ALERTA (FAROLCOVID): Como saber se estou no controle da Covid-19?</span>
        </div>
        """,
        unsafe_allow_html=True,
    )

    # Intro
    st.write(
        f"""<div class="base-wrapper">Até que uma vacina ou tratamento definitivos sejam encontrados para a Covid-19, será
            necessário <b>controlar a quantidade de pessoas infectadas</b> e a <b>disponibilidade de
            recursos do sistema de saúde</b>, para ter certeza de que todos(as) receberão o
            tratamento necessário, <b>sem que o sistema venha a colapsar.</b> Depois de um primeiro
            momento de mitigação da Covid-19 nos estados e municípios brasileiros, passamos a uma
            nova fase de resposta à pandemia: a de supressão da doença. Nela, é necessário avaliar
            periodicamente qual o cenário e quais as ações mais adequada para a cidade, regional de
            saúde ou estado, de acordo com indicadores sobre a dinâmica de transmissão da doença e
            sua capacidade de resposta.<br><br> É a partir dessa avaliação que políticas de
            resposta à Covid-19 devem ser calibradas: <b>o objetivo é chegar no "novo normal," onde
            a situação está sob controle.</b> Para auxiliar a população e os gestores públicos nessa
            tarefa, desenvolvemos uma classificação em Níveis de Alerta, baseada em 4 eixos,
            correspondentes a perguntas-chave que devem ser respondidas por quem está tomando
            decisões sobre resposta à pandemia. Cada pergunta é respondida através de um indicador
            de referência:<br><br>
            <span class="subsection-header">Situação da Covid-19: Qual a incidência da doença na minha população?</span><br>
            <b>Indicador</b>: Novos casos por 100k habitantes (média movel 7 dias).<br>
            <b>Qual sua tendência?</b> Aumentadno, estabilizando ou diminuindo?<br><br>
            <span class="subsection-header">Controle da Covid-19: Estamos conseguindo frear o surgimento de novos casos?</span><br>
            <b>Indicador</b>: Taxa de contágio (Número efetivo de Reprodução - R_t)<br>
            <b>Qual sua tendência?</b>Aumentado, estabilizando ou diminuindo?<br><br>
            <span class="subsection-header">Capacidade do sistema: Como está a capacidade de resposta do sistema de saúde? </span><br>
            <b>Indicador</b>: Dias até atingir ocupação total de leitos UTI-Covid<br>
            <b>Qual sua tendência?</b> Aumentado, estabilizando ou diminuindo?<br><br>
            <span class="subsection-header">Confiança nos dados: Quão representativo são os casos oficialmente identificados 
            frente ao total de casos esperados?</span><br>
            <b>Indicador</b>: Taxa de subnotificação<br>
            <b>Qual sua tendência?</b> Aumentado, estabilizando ou diminuindo?<br><br>
            É importante notar que a classificação em níveis de alerta é <b>dinâmica</b>, ou seja,
            <b>muda conforme os indicadores das cidades e municípios são atualizados diariamente</b>.
            Portanto, aconselhamos que seja feito um acompanhamento frequente do FarolCovid por parte
            de gestores. Esses números podem, ainda, ser uma importante ferramenta para comunicação com
            os cidadãos, servindo de embasamento e justificativa para a tomada de decisão adequada a
            cada realidade local. O público, em geral, também pode utilizar esses números para engajar o
            poder público em um debate informado sobre quais são as melhores políticas para sua cidade,
            regional ou e estado.<br><br><br>
            <span class="subsection-header"><b>Como os Indicadores-Chave são avaliados?</b></span><br>
            Avaliamos os indicadores-chave em 4 níveis crescentes de risco: <strong style="color:#0090A7">Novo Normal</strong>, 
            <strong style="color:#F7B500">Moderado</strong>, <strong style="color:#F77800">Alto</strong> ou
            <strong style="color:#F02C2E">Altíssimo</strong>, e também suas tendências (se estão diminuindo,
            estabilizando ou crescendo). 
            A classificação de cada indicador segue a tabela de valores de referência abaixo. Após analisar cada indicador, classificamos 
            o município, regional ou estado no nível de alerta <b>equivalente ao mais alto entre os de cada indicador individual</b>. 
            Caso o município não conte com algum dos indicadores, mostramos o número correspondente para o nível regional. 
            Nesse caso, ele não terá classificação de risco.
            </div>""",
        unsafe_allow_html=True,
    )

    # Valores de referência
    st.write(
        """<div class="base-wrapper"><div style="margin: 10px 10px 10px 10px;">
            <div class="info-div-table">
            <table class="info-table">
            <tbody>
                <tr>
                    <td class="grey-bg"><strong>Dimensão</strong></td>
                    <td class="grey-bg"><strong>Indicador</strong></td>
                    <td class="grey-bg"><strong>Novo Normal</strong></td>
                    <td class="grey-bg"><strong>Risco Moderado</strong></td>
                    <td class="grey-bg"><strong>Risco Alto</strong></td>
                    <td class="grey-bg"><strong>Risco Altíssimo</strong></td>
                </tr>
                <tr>
                    <td rowspan="2">
                    <p><span>Situação da doença</span></p><br/>
                    </td>
                    <td><span>Novos casos diários (Média móvel 7 dias)</span></td>
                    <td class="light-blue-bg bold"><span>x&lt;=3.7</span></td>
                    <td class="light-yellow-bg bold"><span>3.7&lt;x&lt;=12.5</span></td>
                    <td class="light-orange-bg bold"><span>12.5&lt;=x&lt;=27.4</span></td>
                    <td class="light-red-bg bold"><span>x &gt;= 27.4</span></td>
                </tr>
                <tr>
                    <td><span>Tendência de novos casos diários</span></td>
                    <td class="lightgrey-bg" colspan="4"><span>Se crescendo*, mover para o nível mais alto</span></td>
                </tr>
                <tr>
                    <td><span>Controle da doença</span></td>
                    <td><span>Número de reprodução efetiva</span></td>
                    <td class="light-blue-bg bold"><span>&lt;0.5</span></td>
                    <td class="light-yellow-bg bold"><span>&lt;0.5 - 1&gt;</span></td>
                    <td class="light-orange-bg bold"><span>&lt;1 - 1.2&gt;</span>&nbsp;</td>
                    <td class="light-red-bg bold"><span>&gt;1.2</span></td>
                </tr>
                <tr>
                    <td><span>Capacidade de respostas do sistema de saúde</span></td>
                    <td><span>Projeção de tempo para ocupação total de leitos UTI</span></td>
                    <td class="light-blue-bg bold">60 - 90 dias</td>
                    <td class="light-yellow-bg bold"><span>30 - 60 dias</span></td>
                    <td class="light-orange-bg bold"><span>15 - 30 dias</span></td>
                    <td class="light-red-bg bold"><span>0 - 15 dias</span></td>
                </tr>
                <tr>
                    <td><span>Confiança dos dados</span></td>
                    <td><span>Subnotificação (casos <b>não</b> diagnosticados a cada 10 infectados)</span></td>
                    <td class="light-blue-bg bold"><span>4&gt;=x&gt;0</span></td>
                    <td class="light-yellow-bg bold"><span>6&gt;=x&gt;4</span></td>
                    <td class="light-orange-bg bold"><span>7&gt;=x&gt;6</span></td>
                    <td class="light-red-bg bold"><span>10&gt;=x&gt;=7</span></td>
                </tr>
            </tbody>
            </table>
            </div>
            <div style="font-size: 14px">
                * Como determinamos a tendência:
                <ul class="sub"> 
                    <li> Crescendo: caso o aumento de novos casos esteja acontecendo por pelo menos 5 dias. </li>
                    <li> Descrescendo: caso a diminuição de novos casos esteja acontecendo por pelo menos 14 dias. </li>
                    <li> Estabilizando: qualquer outra mudança. </li>
                </ul>
            </div>
            </div>
        </div>""",
        unsafe_allow_html=True,
    )

    # Limitação
    st.write(
        """<div class="base-wrapper"><span class="subsection-header"><b>Essas métricas são suficientes?</b></span><br>
        <b>Não.</b><br><br>Desenvolvemos os níveis de alerta do FarolCovid com dados públicos e abertos, disponíveis
        online. É um primeiro passo para o gestor orientar sua tomada de decisão de maneira informada,
        orientado por dados que o atualizam tanto sobre o estágio de evolução da doença em seu local 
        quanto sua capacidade de resposta. O gestor público, entretanto, conta com uma riqueza
        maior de informações que deve ser utilizada na formulação de respostas adequadas à sua realidade.
        Informações como a quantidade de testes realizados, a taxa de pessoas que testam positivo e o tempo
        médio de internação são outros fatores importantes para a tomada de decisão. Estamos à disposição
        para apoiar o gestor público a aprofundar a análise para seu estado ou município, de forma
        inteiramente gratuita. <a class="github-link" href="https://coronacidades.org/fale-conosco/>Entre em contato pelo Coronacidades.org</a>!
        </div>""",
        unsafe_allow_html=True,
    )

    # Detalhes
    st.write(
        """<div class="base-wrapper"><span class="subsection-header"><b>Detalhes da distribuição dos indicadores-chave</b></span><br>
        Para ilustrar as classificações dos indicadores, geramos os gráficos das distribuições de cada indicador 
        (diagonal) e as distribuições por pares de indicadores (em cada eixo) abaixo, para cidades, regionais e estados.
        </div>""",
        unsafe_allow_html=True,
    )

    # st.image(
    #     Image.open("imgs/cities_indicators_202009.png"),
    #     use_column_width=True,
    #     caption="Distribuição de indicadores-chaves para cidades (retrato de 1/set/2020. Cada ponto representa uma cidade, os eixos x e y trazem os valores dos indicadores-chaves para aquela cidade. Na diagonal segue o histograma do indicador-chave.",
    # )

    # st.write("<br><br>", unsafe_allow_html=True)

    # st.image(
    #     Image.open("imgs/states_indicators_202009.png"),
    #     use_column_width=True,
    #     caption="Distribuição de indicadores-chaves para regionais de saúde (retrato de 1/set/2020). Cada ponto representa uma estado, os eixos x e y trazem os valores dos indicadores-chaves para aquela cidade. Na diagonal segue o histograma do indicador-chave.",
    # )

    # st.image(
    #     Image.open("imgs/states_indicators_202009.png"),
    #     use_column_width=True,
    #     caption="Distribuição de indicadores-chaves para estados (retrato de 1/set/2020). Cada ponto representa uma estado, os eixos x e y trazem os valores dos indicadores-chaves para aquela cidade. Na diagonal segue o histograma do indicador-chave.",
    # )

    st.write(
        """<div class="base-wrapper primary-span">
            <span class="section-header">CÁLCULO E CLASSIFICAÇÃO DE INDICADORES</span>
        </div>
        """,
        unsafe_allow_html=True,
    )

    indicador = st.radio(
        "Selecione abaixo o indicador para ver a descrição em detalhe:",
        [
            "SITUAÇÃO DA DOENÇA: Média móvel de novos casos por 100 mil habitantes",
            "CONTROLE DA DOENÇA: Taxa de contágio (Rt)",
            "CAPACIDADE DO SISTEMA: Dias até atingir ocupação total de leitos UTI-Covid",
            "CONFIANÇA NOS DADOS: Taxa de subnotificação de casos",
        ],
    )

    if (indicador ==
            "SITUAÇÃO DA DOENÇA: Média móvel de novos casos por 100 mil habitantes"
        ):
        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">SITUAÇÃO DA DOENÇA: Média móvel de novos casos por 100 mil habitantes</span>
            </div>
            """,
            unsafe_allow_html=True,
        )

        st.write(
            """<div class="base-wrapper">
            <span class="subsection-header"><b>Como saber o quão crítico é o nível de novos casos?</b></span><br> 
            Para responder essa pergunta precisamos entender como vem evoluindo a incidência dos casos na
            população ao longo do tempo e onde estamos nessa curva. Logo, os valores de referência para a
            classificação dos níveis de alerta foram definidos com base na série histórica de novos casos de
            Covid-19 nas capitais brasileiras, por maior consistência no reporte de casos e também maior período
            de tempo transcorrido desde o 1º caso. 
            Como calculamos os valores de referência?  Dada a série histórica, com a média móvel semanal de
            novos casos diários por 100mil habitantes das capitais, separamos a distribuição de novos casos por
            dia das capitais em 4 intervalos traduzidos nos quartis:<br>
            <li>Novo normal (Q1): máximo dentre 25% dos menores valores de novos casos diários;</li>
            <li>Moderado (Q2):máximo dentre 50% dos menores valores de novos casos diários;</li>
            <li>Alto (Q3): máximo dentre 75% dosmenores valores de novos casos diários; </li>
            <li>Altíssimo: todos os valores acima do classificado para alto.</li><br>
            O valor final é dado pela média dos quartis das capitais. Tomemos o exemplo de Aracaju: abaixo temos
            a distribuição da média de novos casos até 30/08/2020. Até esta data, 25% dos dias tiveram uma média
            de até 1.7 por 100 mil habitantes (novo normal); 50% dos dias tiveram uma média até de 22.7
            (moderado); e 75% foram abaixo de 61.3 (alto - os valores acima deste são considerados altíssimo).
            </div>""",
            unsafe_allow_html=True,
        )

        st.image(
            Image.open("imgs/new_cases_aracaju_20200830.png"),
            use_column_width=True,
            caption=
            "Distribuição da média móvel semanal de novos casos por 100mil habitantes em Aracaju (retrato de 30/ago/2020).",
        )

        st.write(
            """<div class="base-wrapper">
            A distribuição de todas as capitais abaixo reflete parte da variação local de
            intensidade e progressão da doença em diferentes localidades do Brasil. A média dos
            quartis de todas as capitais nos fornece os valores de referência utilizados para a
            classificação da Situação da doença - novo normal até 3.7 (Q1); moderado até 12.5 (Q2);
            alto até 27.4 (Q3); altíssimo acima de 27.4.
            </div>""",
            unsafe_allow_html=True,
        )

        st.image(
            Image.open("imgs/new_cases_capitals_20200830.png"),
            use_column_width=True,
            caption=
            "Distribuição da média móvel semanal de novos casos por 100mil habitantes para todas as capitais (retrato de 30/ago/2020).",
        )

        st.write(
            """<div class="base-wrapper">
            <span class="subsection-header"><b>LIMITAÇÕES</b></span><br> 
            <li>Utilizamos dados abertos de casos reportados - ou seja, as datas são do reporte do caso e não do
            início dos sintomas. Como sabemos que existe um  atraso entre o início dos sintomas e a inserção do
            resultado do teste no sistema, os valores não traduzem fielmente a realidade do dia de hoje.</li>
            <li>Existe viés de seleção atrelado ao período de evolução da doença que não observamos ainda. Isso ocorre
            pois nenhuma das capitais extinguiram o número de novos casos diários até a 30/08/2020. Caso a
            tendência seja somente de diminuição do número de casos a partir de hoje, por exemplo, os valores de
            referência estariam superestimados.</li>
            <li> Existe também viés de seleção relacionado ao porte das capitais. 
            Por um lado, estas possuem maior densidade populacional, o que aumenta a chance de terem
            maior número de casos, mas por outro lado, também possuem maior infraestrutura para resposta à
            crise. Estas foram escolhidas por ter uma maior estabilidade no reporte dos casos e maior número de
            testes RT-PCR dentre os testes realizados (que indica a presença ativa do vírus no organismo).</li>
            </div>""",
            unsafe_allow_html=True,
        )

    if indicador == "CONFIANÇA NOS DADOS: Taxa de subnotificação de casos":

        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">CONFIANÇA NOS DADOS: Taxa de subnotificação de casos</span>
            </div>
            """,
            unsafe_allow_html=True,
        )

        st.write(
            """<div class="base-wrapper">
                <span class="subsection-header"><b>O que é?</b></span><br> 
                Um modelo de subnotificação é uma ferramenta estatística utilizada para auxiliar a compreensão da
                real situação de infectados num determinado local, pois os dados de casos reportados não refletem
                perfeitamente a realidade, uma vez que há - por diversas razões - casos não identificados
                oficialmente. Alguns dos fatores que aumentam o grau de subnotificação são a falta de testagem
                massiva na população; detecção de casos somente após apresentação de sintomas; e a própria
                característica da doença de existirem infectados assintomáticos, que são transmissores ainda que em
                menor escala (WHO, 2020).
                <br><br><span class="subsection-header"><b>Como foi desenvolvido?</b></span><br> 
                O modelo de subnotificação do grupo de pesquisa <a class="github-link" href='http://www.cemeai.icmc.usp.br/ModCovid19/'>ModCovid</a> 
                foi desenvolvido inicialmente para ajudar a determinar o estágio da epidemia em Aracaju e Maceió.
                <br><br><span class="subsection-header"><b>Por que é importante?</b></span><br> 
                Para a evolução da epidemia numa região precisamos descobrir quantos novos casos de infecção são
                gerados a cada dia, a partir de um certo momento no tempo. Porém, sabemos que a medição desses casos
                é deficiente, principalmente por gargalos na testagem de Covid-19 em nosso país. Portanto,
                calculamos um número corrigido de casos a partir de comparações com proporções esperadas de mortes
                para casos, conforme a literatura nascente sobre a dinâmica da Covid-19 em diferentes populações.
                Isso nos permite planejar novas ações de combate à disseminação, sua ordem de prioridade e
                preparação para novos leitos de atendimento.
                <br><br><span class="subsection-header"><b>Como o modelo funciona?</b></span><br> 
                Fazemos uma regressão a partir do número de mortos reportados por Covid-19 para estimar o número
                de casos de pessoas infectadas 14 dias compatível com aquela quantidade de mortes. Ao compará-lo com
                a quantidade de casos registrados, calculamos a taxa de subnotificação correspondente. O período de
                14 dias é um tempo médio aproximado para a evolução da doença do momento da infecção até o
                falecimento de um indivíduo (Alison, 2020).
                <br><br><span class="subsection-header"><b>Como é feito o cálculo</b></span><br> 
                Utilizando uma <a class="github-link" href="https://www.inf.ufsc.br/~andre.zibetti/probabilidade/binomial_negativa.html">distribuição binomial negativa</a> 
                como modelo probabilístico, o cálculo gera o número de casos positivos que seriam esperados dado o número mortes observadas.
                A distribuição modela a probabilidade de que um número  de novos infectados possa falecer 14 dias
                após de ter se tornado infeccioso, dado o total de mortes até a data () e a taxa de mortalidade por
                infecção (IFR). A taxa de mortalidade por infecção (IFR) das regiões é calculada utilizando IFRs por
                faixa etária estimados em Hubei, segundo Verity, Robert, et al. (2020)[1], e obtém-se a IFR total da
                região ponderada pela população em cada faixa com os dados da População Residente (CNES - 2019).<br><br>
                Selecionamos a série histórica de mortes da região a partir da 15a morte e com pelo menos 15 dias
                desde o 1o caso, de maneira a garantir significância estatística. Dado o total de mortes  e a IFR,
                realizamos 100.000 simulações para cada data da série e os casos estimados são dados pelo valor
                médio da distribuição gerada.
                <br><br><span class="subsection-header"><b>LIMITES E CONSIDERAÇÕES SOBRE O MODELO</b></span><br> 
                <li>Existe atraso na confirmação do diagnóstico de mortes por Covid-19, logo a data do reporte não
                reflete a data real de quando ocorreu o óbito. Isso significa que estamos olhando muitas vezes para
                um retrato do passado e não de agora. Quanto maior o atraso no reporte, menos ajustada está a taxa
                de subnotificação à realidade atual.</li>
                <li>Existe subnotificação de mortes que ocorrem fora do ambiente
                hospitalar, que podem influenciar sensivelmente as estimativas. Quem morre de Covid-19 em casa não é
                necessariamente reportado nas estatísticas de óbito por Covid e portanto leva a subestimarmos o
                tamanho da subnotificação.</li>
                <li>Existem inconsistências no reporte de mortes por Covid-19. Há uma
                superestimação da subnotificação atrelada à protocolos de notificação independente da causa
                principal da morte ser Covid-19.</li>
                <br>Outras opções para a estimação de infecciosos podem ser o uso de
                pacientes com Síndrome Respiratória Aguda Grave (SRAG), pacientes em leitos hospitalares de
                retaguarda e pacientes internados em leitos de UTI. Essas estratégias, porém, podem ser ainda mais
                imprecisas, uma vez que há uma grande incerteza envolvendo questões básicas como o número total de
                leitos disponíveis (SUS e particulares), etiologia dos casos de SRAG e disponibilidade local de
                UTIs. Neste momento, com uma amostragem relativamente pequena no início da epidemia, a estimação
                dos infecciosos usando a série histórica dos mortos se mostra a melhor opção. Reiteramos que dados
                de testagem massiva e estruturada em modelos estatísticos e probabilísticos são essenciais para o
                controle da evolução da doença em um futuro próximo.
                </div>""",
            unsafe_allow_html=True,
        )

    if indicador == "CONTROLE DA DOENÇA: Taxa de contágio (Rt)":

        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">CONTROLE DA DOENÇA: Taxa de contágio (Rt)</span>
            </div>
            """,
            unsafe_allow_html=True,
        )

        st.write(
            """<div class="base-wrapper">
            <span class="subsection-header"><b>O que é?</b></span><br> 
            O número de reprodução efetivo (Rt) traduz a quantidade de pessoas que cada pessoa
            doente infectará em determinado intervalo de tempo.  Já o número básico de reprodução
            (<i>R0</i>) da uma doença traduz qual a dinâmica de contágio de todo o curso de transmissão em
            determinado grupo populacional, sendo, portanto, fixo para a doença. Mas a quantidade de
            novas infecções geradas por cada pessoa varia ao longo do tempo: se, no início, há menos
            pessoas imunes, ele tende a ser mais alto; enquanto, tudo mais constante, o aumento da
            imunidade na população se traduzirá em um número menor de novas infecções. Igualmente,
            mudanças de comportamento - como a redução de contato entre pessoas ou uso de máscaras, no
            caso de doenças transmitidas por vias áreas, como a Covid-19 - também influenciam o número
            de novas infecções.<br><br> A Covid-19 chegou em momentos distintos em cada cidade brasileira e
            a sociedade também reagiu de maneira diferente em cada uma delas. Portanto, medir o
            <i>Rt</i>, traduzindo o <i>R0</i> para o momento específico no qual cada local se encontra, a
            nível municipal e estadual, traz informações importantes sobre a taxa de contágio da doença.
            Enquanto o <i>R0</i> é um número geral, portanto, o  então é calculado para cada local e
            momento no tempo. Por exemplo, um <i>Rt</i> maior do que 1 indica que, mantendo-se o
            comportamento e intervenções ativas até aquele dia, ainda há tendência de crescimento
            exponencial da doença naquela população. Esperamos que cada pessoa infectada naquele momento
            infectará mais de uma pessoa no futuro - gerando uma curva de contágio que se acelera
            rapidamente. Já um <i>Rt</i> abaixo de 1 se traduz na expectativa de que o número de novas infecções 
            vai diminuir ao longo do tempo, indicando que a situação está sob controle se todas as medidas e
            comportamentos forem mantidos.<br><br>Uma boa notícia: por causa da mudança de comportamento, o
            <i>Rt</i> tende a ser menor que o <i>R0</i>, como explicam os desenvolvedores do
            <i>CovidActNow</i>. Calculá-lo também nos permite, portanto, comparar qual seria a evolução
            do contágio da Covid-19 caso medidas restritivas de contato e contágio não tivessem sido
            adotadas.<br> Medir diretamente o número efetivo de reprodução da Covid-19 não é possível.
            Porém, podemos estimar o número de reprodução instantâneo (<i>Rt</i>) mais provável pelo
            número de novos casos por dia.<br><br>
            <span class="subsection-header"><b>Como funciona o modelo?</b></span><br> 
            O modelo utilizado para o cálculo do Rt foi desenvolvido por Cori et.
            al (2013) e implementado no pacote <i>EpiEstim</i>, podendo ser utilizado no R (linguagem de
            programação) ou no Excel. Ele toma como entrada a série de casos da doença na população e
            estima o Rt utilizando um modelo bayesiano. Esse modelo estima a distribuição a posteriori
            do Rt dado o número de casos ativos no tempo <i>t</i> e a infectividadde da doença no local.
            A infectividade pode ser entendida como a probabilidade de um indivíduo infectar pessoas o
            momento de evolução da doenca no qual se encontra - por exemplo, um indivíduo com Covid no
            4º dia de sintomas é mais infeccioso que o um indivíduo no 15º dia.  Esse valor não é
            observado, portanto, é estimado pela distribuição esperada do tempo de geração da doença
            (intevalo serial) - que é o tempo esperado entre uma pessoa apresentar os sintomas e uma
            pessoa contaminada por esta passar a apresentar os sintomas da doença. Esse número para a
            Covid hoje segue uma distribuição com média de 4.7 e desvio padrão de 2.9 (Hiroshi, 2020).<br><br>
            Dada a série de novos casos por dia, e a média e desvio padrão do intervalo serial, o modelo
            então estima o valor mais provável do número de reprodução básica da doença no tempo
            <i>t</i> e os respectivos intervalos de confiança. Utilizamos o intevalo de 95% de confiança
            para reportar as estimativas.
            </div>""",
            unsafe_allow_html=True,
        )

    if (indicador ==
            "CAPACIDADE DO SISTEMA: Dias até atingir ocupação total de leitos UTI-Covid"
        ):

        st.write(
            """<div class="base-wrapper">Ver metodologia do SimulaCovid: a capacidade hospitalar é projetada com os dados mais recentes da doença no município, regional ou estado.
                </div>""",
            unsafe_allow_html=True,
        )

    st.write(
        """<div class="base-wrapper primary-span">
            <span class="section-header">FERRAMENTAS</span>
        </div>
        """,
        unsafe_allow_html=True,
    )

    ferramenta = st.radio(
        "Selecione abaixo uma das ferramenta para ver mais detalhes:",
        [
            "FarolCovid (acima)",
            "SimulaCovid",
            "Saúde em Ordem",
        ],
    )

    if ferramenta == "FarolCovid (acima)":
        pass

    if ferramenta == "Saúde em Ordem":
        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">SAÚDE EM ORDEM</span>
            </div>
            """,
            unsafe_allow_html=True,
        )

        saude_em_ordem_description.main(session_state)

    if ferramenta == "SimulaCovid":
        st.write(
            """<div class="base-wrapper primary-span">
                <span class="section-header">SIMULACOVID: Modelo Epidemiológico</span>
            </div>
            """,
            unsafe_allow_html=True,
        )

        model_description.main(session_state)

    st.write(
        """<div class="base-wrapper primary-span">
            <span class="section-header">FONTES DE DADOS</span>
        </div>""",
        unsafe_allow_html=True,
    )

    gen_table()

    st.write(
        """<div class="base-wrapper primary-span">
            <span class="section-header">REFERÊNCIAS</span>
        </div>""",
        unsafe_allow_html=True,
    )

    st.write(
        """<div class="base-wrapper">
        Agência Nacional de Saúde Suplementar, 2012. Taxa de Ocupação Operacional Geral. Disponível em:
        http://www.ans.gov.br/images/stories/prestadores/E-EFI-03.pdf <br> <br>CDC, 2019. Severe Outcomes
        Among Patients with Coronavirus Disease 2019 (COVID-19) — United States, February 12–March 16, 2020.
        MMWR Morb Mortal Wkly Rep. ePub: 18 March 2020. DOI: http://dx.doi.org/10.15585/mmwr.mm6912e2.<br>
        <br>G. Stein, V. N. Sulzbach and Lazzari. Nota Técnica sobre o Índice Setorial para Distanciamento
        Controlado.  Technical report, 2020<br> <br>Cori, A., Ferguson, N.M., Fraser, C. and Cauchemez, S., 2013. A new framework and software to estimate time-varying reproduction numbers during epidemics. American journal of epidemiology, 178(9), pp.1505-1512. 
        <br> <br> Hill, A, 2020. Model Description. Modelling COVID-19 Spread vs
        Healthcare Capacity. Disponível em: https://alhill.shinyapps.io/COVID19seir/<br> <br>Lazaro Gamio.
        The workers who face the greatest coronavirus risk, 2020.
        https://www.nytimes.com/interactive/2020/03/15/business/economy/coronavirus-worker-risk.html.<br> <br>
        Li, R., Pei, S., Chen, B., Song, Y., Zhang, T., Yang, W., & Shaman, J., 2020. Substantial
        undocumented infection facilitates the rapid dissemination of novel coronavirus (SARS-CoV2).
        Science, 3221(March), eabb3221. DOI: https://doi.org/10.1126/science.abb3221<br> <br>Max Roser, Hannah
        Ritchie, Esteban Ortiz-Ospina and Joe Hasell (2020) - "Coronavirus Disease (COVID-19)". Published
        online at OurWorldInData.org. Retrieved from: 'https://ourworldindata.org/coronavirus' [Online
        Resource]<br> <br>Ministério da Saúde do Brasil, 2020. Boletim Diário. 28 mar. 2020. Disponível em:
        https://www.saude.gov.br/images/pdf/2020/marco/28/28.03%20-%20COVID.pdf
        <br> <br>Nishiura, Hiroshi, Natalie M. Linton, and Andrei R. Akhmetzhanov. "Serial interval of novel coronavirus (COVID-19) infections." International journal of infectious diseases (2020).<br> <br>Vanessa Neumann Sulzbach.
        Essays on Labor Market Polarization in Brazil. Unpublished PhD’s Thesis, 2020.<br> <br>Verity, Robert, et
        al. "Estimates of the severity of coronavirus disease 2019: a model-based analysis." The Lancet
        infectious diseases (2020). Disponível em:
        https://www.medrxiv.org/content/10.1101/2020.03.09.20033357v1 <br> <br>Walker, P.G., Whittaker, C., Watson,
        O., Baguelin, M., Ainslie, K.E.C., Bhatia, S., Bhatt, S., Boonyasiri, A., Boyd, O., Cattarino, L.
        and Cucunubá, Z., 2020. The global impact of COVID-19 and strategies for mitigation and suppression.
        Imperial College London, doi: https://doi. org/10.25561/77735. <br> <br>[1] Wang, C, et al. (2020) Evolving
        Epidemiology and Impact of Non-pharmaceutical Interventions on the Outbreak of Coronavirus Disease
        2019 in Wuhan, China. DOI: https://doi.org/10.1101/2020.03.03.20030593 e pdf de apresentação
        https://docs.google.com/presentation/d/1-rvZs0zsXF_0Tw8TNsBxKH4V1LQQXq7Az9kDfCgZDfE/edit#slide=id.p1
        <br> <br>[2] Wang, J., Zhou, M., & Liu, F., 2020. Reasons for healthcare workers becoming infected with novel
        coronavirus disease 2019 (COVID-19) in China. Journal of Hospital Infection. DOI:
        https://doi.org/10.1016/j.jhin.2020.03.002 <br> <br>Y. O. de Lima, D. M. Costa, and J. M. de Souza. Covid-19:
        Risco de contágio por ocupação no Brasil: Nota metodológica. Technical report, 2020.
        <br> <br>[2] Wang, J., Zhou, M., & Liu, F., 2020. Serial interval of novel coronavirus (COVID-19) infections. Journal of Hospital Infection. DOI:
        https://doi.org/10.1016/j.jhin.2020.03.002 <br> <br>Y. O. de Lima, D. M. Costa, and J. M. de Souza. Covid-19:
        Risco de contágio por ocupação no Brasil: Nota metodológica. Technical report, 2020.
        </div>""",
        unsafe_allow_html=True,
    )
示例#7
0
def main(session_state):
    # GOOGLE ANALYTICS SETUP
    if os.getenv("IS_DEV") == "FALSE":
        utils.setup_google_analytics()

    # Amplitude: Get user info
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event("opened farol",
                                                     session_state,
                                                     is_new_page=True)

    config = yaml.load(open("configs/config.yaml", "r"),
                       Loader=yaml.FullLoader)

    utils.localCSS("style.css")
    st.write(
        """<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MKWTV7X" height="0" width="0" style="display:none;visibility:hidden"></iframe>""",
        unsafe_allow_html=True,
    )

    utils.genHeroSection(
        title1="Farol",
        title2="Covid",
        subtitle="Entenda e controle a Covid-19 em sua cidade e estado.",
        logo="https://i.imgur.com/CkYDPR7.png",
        header=True,
        explain=True)

    # TEMPORARY BANNER FC
    escolasegura_logo = utils.load_image("imgs/escolasegura_favicon.png")
    st.write(
        f"""<div>
            <div class="base-wrapper flex flex-column" style="background-color:#0090A7">
                <div class="white-span header p1" style="font-size:30px;"><img class="icon-cards" src="data:image/png;base64,{escolasegura_logo}" alt="Fonte: Impulso"> COMO PLANEJAR UMA REABERTURA SEGURA?</div>
                <span class="white-span">Veja guias e protocolos para facilitar uma reabertura planejada da rede pública de ensino, respeitando boas práticas de distanciamento e segurança sanitária para controle da Covid-19.
                <br><b>Acesse o Escola Segura: <a target="_blank" style="color:#FFFFFF;" href="http://escolasegura.coronacidades.org">http://escolasegura.coronacidades.org</a></b></span>
        </div>""",
        unsafe_allow_html=True,
    )

    st.write(
        """
    <div class="base-wrapper primary-span">
        <span class="section-header">Selecione seu estado ou município no mapa abaixo:</span>
    </div>""",
        unsafe_allow_html=True,
    )

    # GET DATA
    dfs, cnes_sources = get_data(config)

    # REGION/CITY USER INPUT
    user_input = dict()
    user_input["state_name"] = st.selectbox("Estado",
                                            utils.filter_place(dfs, "state"))

    user_input["health_region_name"] = st.selectbox(
        "Região de Saúde",
        utils.filter_place(dfs,
                           "health_region",
                           state_name=user_input["state_name"]),
    )

    user_input["city_name"] = st.selectbox(
        "Município",
        utils.filter_place(
            dfs,
            "city",
            state_name=user_input["state_name"],
            health_region_name=user_input["health_region_name"],
        ),
    )

    changed_city = user_analytics.safe_log_event(
        "picked farol place",
        session_state,
        event_args={
            "state": user_input["state_name"],
            "city": user_input["city_name"]
        },
    )

    user_input, data = update_user_input_places(user_input, dfs, config)

    # GENERATE MAPS
    map_place_id = utils.Dictionary().get_state_alphabetical_id_by_name(
        user_input["state_name"])

    if os.getenv("IS_LOCAL").upper() == "TRUE":
        map_url = config["br"]["api"]["mapserver_local"]
    else:
        map_url = config["br"]["api"]["mapserver_external"]

    st.write(
        f"""
    <div class="brazil-map-div">
        <div class="alert-levels-map-overlay">
        </div>
        <div>
        <iframe id="map" src="resources/iframe-gen.html?url={map_url}maps/map-iframe?place_id=BR" class="map-br" scrolling="no">
        </iframe>
        </div>
    </div>
    """,
        unsafe_allow_html=True,
    )
    st.write(
        f"""
    <iframe id="map-state" src="resources/iframe-gen.html?url={map_url}maps/map-iframe?place_id={map_place_id}" class="map-state" scrolling="no">
    </iframe>
    """,
        unsafe_allow_html=True,
    )
    st.write(
        f"""
        <div class="selectors-box" id="selectors-box">
        </div>
        <iframe src="resources/select-box-mover.html?place_id={user_input["state_name"]}{user_input["health_region_name"]}{user_input["city_name"]}" height="0px">
        </iframe>""",
        unsafe_allow_html=True,
    )

    # SOURCES PARAMS
    user_input = utils.get_sources(user_input, data, cnes_sources,
                                   ["beds", "icu_beds"])

    # POPULATION PARAMS
    try:
        user_input["population_params"] = {
            "N": int(data["population"].fillna(0).values[0]),
            "D": int(data["deaths"].fillna(0).values[0]),
            "I": int(data["active_cases"].fillna(0).values[0]),
            "I_confirmed": int(data["confirmed_cases"].fillna(0).values[0]),
            "I_compare": int(data["confirmed_cases"].fillna(0).values[0]),
        }
    except:
        user_input["population_params"] = {
            "N": int(data["population"].fillna(0).values[0]),
            "D": int(data["deaths"].fillna(0).values[0]),
            "I": 0,
            "I_confirmed": int(data["confirmed_cases"].fillna(0).values[0]),
            "I_compare": int(data["confirmed_cases"].fillna(0).values[0]),
        }

    user_input["Rt"] = {
        "best": data["rt_low_95"].values[0],
        "worst": data["rt_high_95"].values[0],
        "is_valid": data["rt_most_likely"].apply(str).values[0],
    }

    user_input["last_updated_cases"] = data[
        "last_updated_subnotification"].max()
    # Update session values to standard ones if changed city or opened page or reseted values
    if (session_state.state_name != user_input["state_name"]
            or session_state.health_region_name !=
            user_input["health_region_name"]
            or session_state.city_name != user_input["city_name"]
            or session_state.number_beds is None or session_state.reset):
        session_state.state_name = user_input["state_name"]
        session_state.health_region_name = user_input["health_region_name"]
        session_state.city_name = user_input["city_name"]

        session_state.state_num_id = user_input["state_num_id"]
        session_state.health_region_id = user_input["health_region_id"]
        session_state.city_id = user_input["city_id"]

        session_state.number_beds = int(
            user_input["number_beds"] *
            config["br"]["simulacovid"]["resources_available_proportion"])
        session_state.number_icu_beds = int(
            user_input["number_icu_beds"] *
            config["br"]["simulacovid"]["resources_available_proportion"])
        session_state.number_cases = user_input["population_params"][
            "I_confirmed"]
        session_state.number_deaths = user_input["population_params"]["D"]
        session_state.reset = True

    if data["confirmed_cases"].sum() == 0:
        st.write(
            f"""<div class="base-wrapper">
                    Seu município ou Região de Saúde ainda não possui casos reportados oficialmente. Portanto, simulamos como se o primeiro caso ocorresse hoje.
                    <br><br>Caso queria, você pode mudar esse número abaixo:
                </div>""",
            unsafe_allow_html=True,
        )

        user_input["population_params"]["I"] = 1

    else:
        infectious_period = (
            config["br"]["seir_parameters"]["severe_duration"] +
            config["br"]["seir_parameters"]["critical_duration"])
        placeholder_value_pls_solve_this = 0

    # TEMPORARY BANNER - TODO: remove after done
    if user_input["state_name"] in ["Mato Grosso", "Espírito Santo"]:
        st.write("""
            <div>
                <div class="base-wrapper flex flex-column" style="background-color:#0090A7">
                    <div class="white-span header p1" style="font-size:30px;">⚠️ ATENÇÃO: Os municípios e regionais de saúde de MT e ES estão desatualizados</div>
                        <span class="white-span">Utilizamos dados abertos das secretarias estaduais para os cálculos dos indicadores. 
                        Esses dados são capturados diariamente por voluntários do Brasil.io, que vêm enfrenteando problemas na atualização dos dados desses estados.
                        Estamos resolvendo a situação e iremos retornar com os indicadores o mais breve possível.</b></span>
                </div>
            <div>""",
                 unsafe_allow_html=True)

    # DIMENSIONS CARDS
    dimensions = DimensionCards
    utils.genAnalysisDimmensionsSection(dimensions)

    # INDICATORS CARDS
    indicators = IndicatorCards

    indicators = update_indicators(indicators, data, config, user_input,
                                   session_state)

    data["overall_alert"] = data["overall_alert"].map(
        config["br"]["farolcovid"]["categories"])

    if "state" in user_input["place_type"]:
        # Add disclaimer to cities in state alert levels
        total_alert_regions = (dfs["health_region"][
            dfs["health_region"]["state_num_id"] == data["state_num_id"].
            unique()[0]].assign(overall_alert=lambda df: df["overall_alert"].
                                map(config["br"]["farolcovid"]["categories"]))
                               ["overall_alert"].value_counts())

        utils.genKPISection(
            place_type=user_input["place_type"],
            locality=user_input["locality"],
            alert=data["overall_alert"].values[0],
            indicators=indicators,
            n_colapse_regions=total_alert_regions[
                total_alert_regions.index.isin(["altíssimo", "alto"])].sum(),
        )

    elif "city" in user_input["place_type"]:
        utils.genKPISection(
            place_type=user_input["place_type"],
            locality=user_input["locality"],
            alert=data["overall_alert"].values[0],
            indicators=indicators,
            rt_type=data["rt_place_type"].values[0],
        )

    else:
        utils.genKPISection(
            place_type=user_input["place_type"],
            locality=user_input["locality"],
            alert=data["overall_alert"].values[0],
            indicators=indicators,
        )

    # AVAILABLE CAPACITY DISCLAIMER
    st.write(
        """
        <div class='base-wrapper'>
            <i>* Utilizamos %s&percnt; do total de leitos UTI reportados por %s em %s 
            para cálculo da projeção de dias para atingir capacidade máxima.<br><b>Para municípios, utilizamos os recursos da respectiva regional de saúde.</b>
            Leitos enfermaria contém os tipos: cirúrgicos, clínicos e hospital-dia; sendo considerado %s&percnt; já ocupado.</i>
        </div>
        """ % (
            str(
                int(config["br"]["simulacovid"]
                    ["resources_available_proportion"] * 100)),
            user_input["author_number_beds"],
            user_input["last_updated_number_beds"],
            str(
                int(config["br"]["simulacovid"]
                    ["resources_available_proportion"] * 100)),
        ),
        unsafe_allow_html=True,
    )

    # TODO: remove comment on this later!
    # utils.gen_pdf_report()

    # INDICATORS PLOTS
    if st.button("Confira a evolução de indicadores-chave"):
        opening_response = user_analytics.log_event("picked key_indicators",
                                                    dict())
        if st.button("Esconder"):
            pass
        st.write(
            f"""
            <div class="base-wrapper">
                    <span class="section-header primary-span">CÁLCULO DA TAXA DE CONTÁGIO EM {user_input["locality"]}</span>
                    <br><br>
                    <b>A taxa de contágio, conhecida como número de reprodução efetivo (Rt), traduz a dinâmica de disseminação da Covid-19 a cada dia.</b>
                    <br>O valor pode ser lido como o número médio de novas infecções diárias causadas por uma única pessoa infectada.
                    Para mais informações, visite a página de Modelos no menu lateral.
            </div>
            """,
            unsafe_allow_html=True,
        )

        try:
            fig2 = plots.plot_rt_wrapper(user_input[user_input["place_type"]],
                                         user_input["place_type"], config)
            st.plotly_chart(fig2, use_container_width=True)
        except:
            st.write(
                """<div class="base-wrapper"><b>Seu município, regional ou estado não possui mais de 30 dias de dados de casos confirmados.</b>""",
                unsafe_allow_html=True,
            )
        st.write(
            "<div class='base-wrapper'><i>Em breve:</i> gráficos de subnotificação e média móvel (últimos 7 dias) de novos casos por 100k habitantes.</div>",
            unsafe_allow_html=True,
        )

    utils.stylizeButton(
        name="Confira a evolução de indicadores-chave",
        style_string=
        """border: 1px solid var(--main-white);box-sizing: border-box;border-radius: 15px; width: auto;padding: 0.5em;text-transform: uppercase;font-family: var(--main-header-font-family);color: var(--main-white);background-color: var(--main-primary);font-weight: bold;text-align: center;text-decoration: none;font-size: 18px;animation-name: fadein;animation-duration: 3s;margin-top: 1em;""",
        session_state=session_state,
    )

    # AMBASSADOR SECTION
    utils.gen_ambassador_section()

    # PDF-REPORT GEN BUTTON
    # if st.button("Gerar Relatório PDF"):
    #     user_analytics.log_event("generated pdf")
    #     st.write(
    #         """<div class="base-wrapper">Aguarde um momento por favor...</div>""",
    #         unsafe_allow_html=True,
    #     )
    #     st.markdown(
    #         pdfgen.gen_pdf_report(user_input, indicators, data, config),
    #         unsafe_allow_html=True,
    #     )

    # TOOLS
    products = ProductCards

    utils.genProductsSection(products)

    # SELECTION BUTTONS
    # TODO: limpar esse código! está 100% repetido!!!
    if session_state.continuation_selection is None:
        session_state.continuation_selection = [False, False, False, False]

    simula_button_name = "Clique Aqui"  # Simula covid 0space
    saude_button_name = "Clique Aqui "  # Saude em ordem 1space
    distancia_button_name = "Clique_Aqui"  # Distanciamento social
    onda_button_name = "Clique_Aqui "  # onda covid
    if st.button(simula_button_name):  # SIMULA
        session_state.continuation_selection = [True, False, False, False]
    if st.button(distancia_button_name):  # DISTANCIAMENTO
        session_state.continuation_selection = [False, True, False, False]
    if st.button(saude_button_name):  # SAUDE
        session_state.continuation_selection = [False, False, True, False]
    if st.button(onda_button_name):  # ONDA
        session_state.continuation_selection = [False, False, False, True]

    utils.stylizeButton(
        name=simula_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 1},
    )

    utils.stylizeButton(
        name=distancia_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 2},
    )
    utils.stylizeButton(
        name=saude_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 3},
    )
    utils.stylizeButton(
        name=onda_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 4},
    )
    if session_state.continuation_selection[0]:
        user_analytics.safe_log_event(
            "picked simulacovid",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        # Downloading the saved data from memory
        sm.main(user_input, indicators, data, config, session_state)
        # TODO: remove comment on this later!
        # utils.gen_pdf_report()

    elif session_state.continuation_selection[1]:
        user_analytics.safe_log_event(
            "picked distanciamento",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        ds.main(user_input, indicators, data, config, session_state)

    elif session_state.continuation_selection[2]:
        user_analytics.safe_log_event(
            "picked saude_em_ordem",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        so.main(user_input, indicators, data, config, session_state)

    elif session_state.continuation_selection[3]:
        user_analytics.safe_log_event(
            "picked onda",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        oc.main(user_input, indicators, data, config, session_state)

    # BIG TABLE
    gen_big_table(config, dfs, user_input["state_name"])
    # FOOTER
    utils.gen_whatsapp_button(config["impulso"]["contact"])
    utils.gen_footer()
    user_analytics.conclude_user_session(session_state)
示例#8
0
def main(session_state):
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event("opened model",
                                                     session_state,
                                                     is_new_page=True)

    st.write("v1.4 - Atualizações")
    st.subheader("Inicialização dos estados")

    st.write("""
        Nosso modelo de projeção da capacidade hospitalar estima 2 tipos de demandas baseadas na
        intensidade da infecção: **casos severos (I2) e casos graves (I3)**. Como ponto de partida do modelo,
        determinamos qual o percentual de casos severos e graves dentre o total de casos ativos - já
        ajustados pela taxa de subnotificação conforme definimos anteriormente (ver Inicialização dos
        estados em v1.2). 
        
        Devido à mudança no cálculo de subnotificação, passamos a estimar casos
        assintomáticos dentre o total de casos ativos e consideramos também a distribuição etária da
        população na definição dos percentuais considerados para a inicialização. Conforme o levantamento de
        parâmetros de referência de Alison Hill (2020), cerca de 30% dos casos totais são assintomáticos.
        Dentre os 70% restantes, passamos a calcular o percentual de hospitalizados graves (I2 / I) e
        severos (I3 / I) estimando a proporção esperada de hospitalizações na região/estado (I2+I3 / I).
        
        A proporção esperada de hospitalizações é dada pela estimativa de hospitalizações de cada faixa, de
        Verity, Robert, et al. (2020) num amplo estudo com base em 3.665 casos na China, ponderado pelo
        total da população em cada faixa etária (População residente em 2019 - CNES). Esse valor nos fornece
        o percentual total de hospitalizações esperadas na população (I2+I3/I). Para obter o percentual por
        intensidade do caso, mantivemos a razão entre severos (I3) e graves (I2) constante: antes tínhamos
        12.5% graves e 2.5% severos do total de casos ativos (I) - ou seja, uma razão de 0.2 severos em
        relação a graves -, que passa a ser de 83.3% graves (I2) e 16.7% severos (I3) do percentual estimado
        de hospitalizados (I2+I3 / I).  Alteramos ainda a categoria “Ventiladores” para “Leitos UTI-Covid”
        seguindo a atualização realizada na base do CNES, que agora conta com as categorias “UTI-Covid
        Adulto” e “UTI-Covid Infantil”.  A taxa de contágio utilizada nos diferentes cenários segue a nova
        metodologia da Taxa de Contágio descrita nos indicadores dos Níveis de Alerta.
        """)

    st.header("Limitações atualizadas do modelo")

    st.write("""
        - O modelo trata cada cidade como um sistema fechado. Ou seja, não há mobilidade ou
          transmissão entre cidades. Também não modelamos a entrada simultânea de múltiplas pessoas
          infectadas no sistema fechado.  Além disso, tratamos todos os casos como igualmente
          capazes de infectar outras pessoas suscetíveis, não modelando a existência de
          "super-disseminadores".
        - Esta é uma doença nova. Portanto, parâmetros que modelam sua dinâmica de infecção e
          transmissão são ainda preliminares e podem mudar com o tempo. Faremos um esforço contínuo
          de atualização desses parâmetros para o melhor conhecimento científico. A velocidade de
          transmissão e a dinâmica de progressão da doença entre brasileiros podem estar sub ou
          superestimados. Os resultados da simulação devem ser interpretados de acordo.
        - Os números básicos de reprodução estimados para cada cenário são meramente fictícios, não
          estão atrelados diretamente a nenhuma intervenção que dobre ou diminua pela metade o valor
          observado hoje. Não esperamos, portanto, uma equivalência perfeita com a situação
          brasileira.  Os dados do número de leitos e leitos UTI Covid são atualizados mensalmente
          no DATASUS CNES e há conhecidos problemas de reporte.
        - Os dados do número de casos confirmados em cada município reportados pelas secretarias
          estaduais de saúde frequentemente refletem metodologia distinta do que aqueles reportados
          pelo próprio município. Adicionalmente, existe um lag temporal entre o reporte em boletins
          epidemiológicos, a atualização no Brasil.io e o input do novo dado em nossa ferramenta.
          Sugerimos que o usuário ajuste esse parâmetro na hora de realizar a simulação.
        - A análise não considera o desenvolvimento de medidas de mitigação como vacinas e
          medicamentos anti-virais.
        """)

    st.write("v1.3 - Atualizações")

    st.subheader("Ritmo de contágio (**Rt**)")

    st.write("""
      Nessa atualização do SimulaCovid alteramos a seleção de diferentes estratégias de intervenção para a 
      seleção de *diferentes cenários de evolução da doença, a partir de hoje, dada a situação de seu município ou estado*. 
      Essa evolução é dada pelo *ritmo de contágio* estimado, que traduz quantas pessoas em média um contaminado infecta. 
      O ritmo de contágio é atualizado diariamente de acordo com o número de novos casos do município ou estado 
      (veja o cálculo desse indicador em *Estimando Ritmo de Contágio*). Os diferentes cenários para simulação são:

        - Cenário Estável: cenário no qual o ritmo de contágio da simulação é o mesmo do atual;
        - Cenário Negativo: cenário no qual o ritmo de contágio da simulação é o *dobro* do atual;
        - Cenário Positivo: cenário no qual o ritmo de contágio da simulação é a *metade* do atual;
      """)

    st.subheader("Capacidade Hospitalar (Oferta)")

    st.write("""
      Dada a evolução do Covid nos município e estados brasileiros desde a versão anterior da metodologia, 
      e a resposta dos governos com a construção e obtenção de novos recursos hospitalares, 
      modificamos também o percentual de leitos e ventiladores SUS e não-SUS disponíveis para a Covid de 20\% para 50\%.
      
      Os leitos disponíveis para Covid considerados são os tipos de leitos cirúrgicos, clínicos e hospital-dia. 
      Atualizamos os dados de leitos e ventiladores com base na última versão do DataSUS de abril/2020. 
      """)

    st.write("v1.2")

    st.write("""
        Aqui explicamos o cálculo básico por trás do SimulaCovid, além das
        fontes dos dados e modelos utilizados para estimar demanda e oferta por
        equipamentos hospitalares. Os resultados da simulação não devem ser
        usados como previsões exatas do número de casos, hospitalizações ou
        pacientes com Covid-19 que necessitarão de tratamento intensivo.

        Utilizamos cinco tipos de dados:
        - Informações sobre o número de casos e mortes confirmadas em cada
          município;
        - Informações sobre a capacidade instalada do sistema de saúde em cada
          município;
        - Informações demográficas de cada município;
        - Informações sobre a transmissão da doença, coletadas da literatura;
        - Informações sobre o impacto das diferentes políticas públicas,
          coletadas da literatura.

        """)

    st.subheader("Cálculo básico")

    st.write("""
        O SimulaCovid calcula em quantos dias a demanda de pacientes com
        Covid-19 por leitos hospitalares ($$l$$) e ventiladores ($$v$$) atingirá
        a capacidade alocada para recebê-los em cada cidade ou Região de Saúde
        no país. Portanto, estimamos tanto a oferta quanto a demanda para cada
        um dos equipamentos, $$e$$. 


        A demanda por equipamento $$e$$ ($$\mathcal{D^e(t)}$$) é dada pelo número de
        casos graves e críticos em $$t$$, estimado por meio de de um modelo
        epidemiológico. A oferta $$e$$ ($$\mathcal{O^e(t)}$$) é determinada pelo
        número de equipamentos que o município tem a disposição para pacientes
        de Covid-19. Ela também é dinâmica pois os municípios estão, por
        exemplo, instalando novos leitos e remanejando cirurgias. 


        A capacidade hospitalar é atingida quando ($$\mathcal{D^e(t)}$$) =
        ($$\mathcal{O^e(t)}$$). Logo, buscamos obter o menor  $$t$$ em dias no
        qual essa igualdade é satisfeita.
        """)

    st.latex("t^* = min \{t [dias] : \mathcal{D}^e(t) = \mathcal{O}^e(t)\}")

    st.write("""
        A demanda é uma função dos estados populacionais ($$\mathcal{P}$$),
        parâmetros da doença ($$\mathcal{D}$$) e parâmetros da reação do governo
        e sociedade ($$\mathcal{G}$$) portanto, $$\mathcal{D^e}(\mathcal{P},
        \mathcal{D}, \mathcal{G}, t)$$. Os estados populacionais dependem da
        população do município e qual estágio de contágio está a doença. Os
        parâmetro da doença dizem respeito à transmissibilidade e ao tempo de
        progressão dos diferentes estágios da doença. Os parâmetros de reação do
        governo e sociedade são relacionados às políticas públicas implementadas
        e o quanto a população adere às mesmas, ao tempo e à amplitude de
        testagem, taxa de subnotificação e cobertura da vacinação. Por exemplo,
        a transmissibilidade da doença pode variar de acordo com o nível de
        medida de restrição de contato adotada pelas diferentes esferas
        governamentais. O número básico de reprodução ($$R_0$$), em especial, é
        dependente da transmissibilidade da doença e, portanto, é impactado
        diretamente pela reação do governo e da sociedade.

        Portanto, neste exercício, variamos ($$R_0$$) de acordo com a estratégia
        de medida de restrição escolhida. Os valores foram baseados em
        estimativas do número básico de reprodução da SARS-COV-2 em Wuhan, na
        China, e sua variação conforme autoridades públicas mudavam sua
        abordagem (Wang et. al, 2020)[1]. Assim, ao permitir simular a adoção dessas
        estratégias em diferentes dias - em um espaço de até 3 meses - podemos
        projetar diferentes curvas de demanda de equipamentos hospitalares no
        município ou Região de Saúde.

        As próximas duas seções, Capacidade Hospitalar e Modelo Epidemiológico,
        apresentam os modelos para a oferta e demanda de equipamentos
        hospitalares. Finalmente, a seção Fontes de Dados mostra de onde
        extraímos os dados e como estamos nos organizando para atualizar a
        oferta de equipamentos hospitalares.
        """)

    st.header("Capacidade Hospitalar (Oferta)")

    st.write("""
        Os equipamentos hospitalares que consideramos para esse exercício são os
        ventiladores e leitos hospitalares. 

        - **Leitos**

        A quantidade de leitos por municípios soma tanto leitos hospitalares da
        rede do Sistema Único de Saúde quanto da rede não-SUS. Avaliamos que
        ambas estariam envolvidas no esforço de resposta à crise. Para usar por
        base apenas a rede SUS, seria necessário filtrar a população
        SUS-dependente de cada município.

        O número de leitos utilizado inclui leitos complementares. Retiramos os
        de tratamento intensivo, já que nossa medida de possibilidade de
        adaptação para essa modalidade são os equipamentos. 

        Consideramos, na simulação inicial, que apenas $20\%$ dos leitos
        registrados no Cadastro Nacional de Estabelecimentos Hospitalares
        estariam disponíveis para alocação de pacientes da Covid-19 que
        necessitem de internação. Esse número está dentro do parâmetro
        recomendado pela Agência Nacional de Saúde Suplementar (ANS), de
        manutenção da taxa de ocupação de hospitalar entre $75\%$ e $85\%$,
        ainda que saibamos que há grande variação nesse percentual nas
        realidades locais de cada município (ANS, 2012).

        Caso um percentual maior ou menor esteja alocado para pacientes com
        Covid-19, é possível ajustar a quantidade de leitos alocados para a
        simulação.

        - **Ventiladores**

        O número de ventiladores informado no DATASUS não traz uma distinção
        entre aqueles instalados na rede SUS ou não-SUS. Foram incluídos
        portanto todos os ventiladores.


        Vale ressaltar que não utilizamos o número de leitos já instalados como
        Unidades de Tratamento Intensivo pois entendemos que o gargalo para
        expansão da capacidade desse tipo de atendimento será a disponibilidade
        desse equipamento.
        """)

    st.header("Quantidade de internações (Demanda)")

    st.write("""
        A ferramenta utiliza uma variação do modelo epidemiológico SEIR para
        estimar a demanda por leitos hospitalares e ventiladores nos municípios
        brasileiros de pacientes com Covid-19. Permitimos a simulação do impacto
        de 3 estratégias de contenção da transmissão na sociedade, baseados na
        resposta do governo e da sociedade.

        Cada estratégia está associada a um número básico de reprodução distinto
        da Covid-19 (aproximadamente o número de novas pessoas infectadas por
        uma pessoa que já está doente). As taxas foram estimadas pelo estudo de
        Wang et. al (2020)[1] da evolução da transmissão em Wuhan, na China, sob
        diferentes políticas de restrição de contato, protocolos de tratamento e
        de testagem. Assim, ao indicar quando cada uma entrará em vigor no
        município selecionado, é possível simular a evolução da doença associada
        à sequência de estratégias indicada.
        """)

    st.subheader("Sobre o modelo")

    st.write("""
        Utilizamos o modelo epidemiológico SEIR (Suscetíveis, Expostos, Infectados e
        Removidos) adaptado segundo o modelo desenvolvido por Hill (2020) para
        calcular a disseminação e evolução clínica do COVID-19. De acordo com esse
        modelo, uma população é dividida em diferentes estados populacionais, grupos
        mutuamente excludentes de indivíduos:

        - Suscetíveis ($S$): aqueles que não têm imunidade à doença, estes se tornam
        expostos à doença a uma taxa $\\beta_i$ devido ao contato com indivíduos
        infetados $I_i$;

        - Expostos ($E$): aqueles que entram em contato com a doença e desenvolvem
        ou não sintomas, mas ainda não transmitem infecção. Esses indivíduos
        expostos progridem para o primeiro estágio de infecção ($I_1$), leve, a
        uma taxa $\sigma$.

        - Infectados ($I$): são aqueles que desenvolvem sintomas e transmitem a
        doença a uma taxa $\\beta_i$. Os casos de infecção são separados em
        diferentes estágios de gravidade:
        - Leve ($I_1$): aquele que não necessita de hospitalização, progride para
            o estado severo a uma taxa $p_1$, ou se recupera a uma taxa $\gamma_1$;
        - Severo ($I_2$): aquele que necessita de hospitalização, progride para o
            estado crítico a uma taxa $p_1$, ou se recupera a uma taxa $\gamma_2$;
        - Grave ($I_3$): aquele que além de hospitalização, necessita de
            tratamento intensivo com equipamento de ventiladores. Chegando ao caso
            grave, o indivíduo pode se recuperar a uma taxa $\gamma_3$ ou o quadro
            pode levar à morte com uma taxa $\mu$;

        - Recuperados ($R$): aqueles que, após o curso da doença, se recuperam e
        desenvolvem imunidade - não retornam ao estado suscetível.
        - Mortos ($D$): indivíduos que morrem pelo agravamento da infecção.
        """)

    pic = open("imgs/model_graph", "r").read()
    st.image(pic, use_column_width=True, caption=None)
    st.write(
        "*Fonte: [Alison Hill](https://alhill.shinyapps.io/COVID19seir/)*")

    st.write(
        "Conforme a descrição acima, o conjunto de equações que determina a dinâmica do modelo é dado por:"
    )
    st.latex("\\frac{dS}{dt} = - (β_1 I_1 + β_2 I_2 + β_3 I_3) S")
    st.latex("\\frac{dE}{dt} = (β_1 I_1 + β_2 I_2 + β_3 I_3) S - \sigma E")
    st.latex("\\frac{dI_1}{dt} = \sigma E - (γ_1 + p_1) I_1")
    st.latex("\\frac{dI_2}{dt} = p_1 I_1 - (γ_2 + p_2) I_2")
    st.latex("\\frac{dI_3}{dt} = p_2 I_2 - (γ_3 + μ) I_3")
    st.latex("\\frac{dR}{dt} = γ_1 I_1 + γ_2 I_2 + γ_3 I_3")
    st.latex("\\frac{dD}{dt} = μ I_3")

    st.subheader("Parâmetros da doença")

    st.write("- **Número básico de reprodução ($$R_0$$)**")
    st.write("""
        O número básico de reprodução da doença nos remete ao número médio de
        pessoas que uma pessoa doente consegue infectar. Esse é um número
        característico da doença, que costuma ser estimado de forma retroativa
        conforme sua transmissão avança. Para simular diferentes estratégias,
        utilizamos $$R_0$$s estimados para a evolução da transmissão da
        SARS-Cov-2 em Wuhan, na China, conforme reportado em (Wang et. al, 2020)[1], 
        calculado para cada medida adotada pelo governo local.
        """)

    st.write(
        "- **Taxas de progressão ($p_i, \\sigma$) e mortalidade ($\\mu$)**")
    st.write("""
        As taxas de progressão da doença representam o grau no qual um indivíduo
        avança nos estados de infecção da doença. Inicialmente, um indivíduo
        exposto avança para o primeiro estado de infeção, leve ($I_1$) a uma
        taxa $\\sigma$. Uma vez infectado, o indivíduo progride para estados
        mais graves da doença a uma taxa $p_1$ - de leve para severo - e $p_2$ -
        de severo para crítico. Assume-se que a infecção avança gradualmente, ou
        seja, uma infeção leve deve passar pelo estado severo para chegar ao
        crítico. Por fim, os casos críticos acarretam na morte de indivíduos a
        uma taxa $\\mu$.
        """)

    df = pd.read_csv(
        "https://docs.google.com/spreadsheets/d/1wvg1KFWZp4WhYVI4Gw_82bL_je_2WZHNLCcSnx95MTI/gviz/tq?tqx=out:csv&sheet=Taxas_de_progressao"
    )
    df.index = ["" for i in range(len(df))]
    st.table(df)
    st.write("- **Taxas de recuperação ($\\gamma_i$)**")
    st.write("""
        As taxas de recuperação da doença representam o grau no qual um
        indivíduo se recupera em qualquer estado de gravidade. Assume-se que,
        uma vez recuperado, esse indivíduo não contrai mais a doença, não
        retornando ao estado de suscetível.
        """)

    df = pd.read_csv(
        "https://docs.google.com/spreadsheets/d/1wvg1KFWZp4WhYVI4Gw_82bL_je_2WZHNLCcSnx95MTI/gviz/tq?tqx=out:csv&sheet=Taxas_de_recuperacao"
    )
    df.index = ["" for i in range(len(df))]
    st.table(df)

    st.write("- **Taxas de transmissão ($\\beta_i$)**")
    st.write("""
        As taxas de transmissão dizem respeito ao potencial de infecção de
        indivíduos infectados em contato a indivíduos suscetíveis. Para casos
        severos ($\\beta_2$) e críticos ($\\beta_3$), as taxas de transmissão
        desses indivíduos são referentes à transmissão interna nos hospitais, de
        pacientes para profissionais da saúde. Segundo estudos realizados na
        China e Itália (Wang et. al, 2020 [2]), esse grupo é afetado de forma
        desproporcional, sendo observado cerca de $5\%$ e $10\%$ de
        profissionais da saúde dentre o total de casos notificados,
        respectivamente. 

        Calculamos esses valores através da equação da taxa de reprodução básica
        de Hill (2020), assumindo que apenas $10\%$ do valor do $R_0$ deve-se a
        transmissões de infectados severvos ou críticos(refente a $\\beta_2,
        \\beta_3$) e que infectados severos transmitem a uma mesma taxa de
        infectados críticos, ambos hospitalizados ($\\beta_2 = \\beta_3$).
        """)

    st.latex(
        "R_0  = N\\frac{\\beta_1}{p_1+\gamma_1} + N\\frac{p_1}{p_1 + \gamma_1} \left( \\frac{\\beta_2}{p_2+\gamma_2} + \\frac{p_2}{p_2 + \gamma_2} \\frac{\\beta_3}{\mu+\gamma_3}\\right)"
    )

    st.write("- **Cálculo das taxas**")

    st.write("""
        As taxas não são observadas diretamente. Logo, utilizamos parâmetros
        observados na literatura para o cálculo das mesmas. Os parâmetros de
        referência são descritos na tabela abaixo.
        """)

    df = pd.read_csv(
        "https://docs.google.com/spreadsheets/d/1wvg1KFWZp4WhYVI4Gw_82bL_je_2WZHNLCcSnx95MTI/export?format=csv"
    ).fillna("-")  # .set_index('Descrição', drop=True)
    df.index = ["" for i in range(len(df))]
    st.table(df)
    st.subheader("Parâmetros da Reação da Sociedade e Governo")

    st.write("""
        - **Taxa de notificação ($$\\alpha$$)**

        Ainda não temos relatórios sobre a subnotificação de casos de Covid-19
        no Brasil. Estudos consultados variam ao abordar a questão: Wang et al.
        (2020)[1] consideram subnotificação de $50\%$, enquanto  Li et al.
        (2020) calculam que apenas $14\%$ dos casos de pessoas infectadas
        foram reportados, com intervalo de confiança de $10-18\%$. Os dois
        artigos consideram que casos não-notificados não tem sintomas graves e
        que não serão hospitalizados.

        O protocolo de testagem adotado atualmente no Brasil submete a testes
        clínicos somente aquelas pessoas com sintomas graves o suficiente para
        buscarem um hospital. Além disso, há crescente documentação da falta de
        testes para todos os que chegam com suspeita de coronavírus. O protocolo
        técnico de tratamento médico é o mesmo, independente do diagnóstico
        preciso. Porém, isso quer dizer que nem todos os casos não-notificados
        no Brasil são leves ou moderados: podem haver pessoas sendo
        hospitalizadas com Covid-19 mas que não são testadas e, por isso, não
        constam no registro. Têm sido recorrentes, inclusive, relatos sobre o
        aumento atípico no número de internações por doenças respiratórias.

        A taxa de notificação ($$\\alpha$$) é um número que relaciona o total de casos reportado ($I$) com o total de casos esperado dado o número de mortes reportado ($\hat{I}$). 
        Temos alguns motivos para acreditar que há menos subnotificações sistemáticos no número de mortes reportado do que casos:
        
        - Legalmente, a causa da morte precisa ser relatada e classificada de alguma forma no Brasil;
        - As mortes ocorrem após uma progressão temporal da doença, durante a qual há tempo para identificar e confirmar se a pessoa está infectada com SARS-CoV-2. 

        Portanto, utilizamos a taxa de mortalidade esperada ($$CFR = \\text{total mortes/total casos}$$) para ajustar o número de casos tomando como verdadeiro o número de mortes. 
        A melhor estimativa da taxa de mortalidade dentre diversos estudos feita por Hill (2020) é de $2\\%$.
        Utilizamos esse valor por ser calculado com base em estudos de diferentes países, diminuindo a chance de estar suscetível a algum protocolo local.
        
        O número de infectados esperado em $t$ é então dado por $\hat{I}(t) = D(t) / CFR$. Com essa estimativa, obtemos a taxa de notificação diária em $t$, dada por $\\alpha(t) = I(t)/\hat{I}(t)$. 
        A taxa de notificação calculada para o município é dada pela média dos últimos 7 dias, buscando uma maior homogeneidade:
        """)

    st.latex(
        "\\alpha = \sum_{t=t_i - 7}^{t_i} \\frac{I(t)}{\hat{I}(t)}, \\text{   $t_i$ = última data de atualização dos casos}"
    )
    st.write("<br>", unsafe_allow_html=True)

    st.write("""
        - **Tempo de diagnóstico ($$\\tau$$)**

        O tempo de diagnóstico é o tempo entre a execução do teste até o
        resultado e a inclusão do caso entre o número oficial de confirmados
        pelo Estado. Esse tempo varia de acordo com o tipo do teste realizado, a
        capacidade do estado e de clínicas privadas de realizar testes em escala
        e se há protocolo de re-testagem. O tempo de diagnóstico é importante
        pois ele representa um ‘atraso’ com o qual  que estamos inicializando o
        modelo. Por exemplo, se o tempo de diagnóstico é de 1 semana, então os
        casos confirmados hoje, são, na verdade pacientes que estavam
        apresentando sintomas há uma semana. Dependendo do tempo de diagnóstico,
        pacientes podem estar recuperados ou mortos até a doença ser confirmada.
        Portanto, essa variável nos diz quão atualizado estão os dados com
        relação à situação real da doença no município.
        """)

    st.subheader("Inicialização dos estados")
    st.write(
        "Para simular a evolução da doença, determinamos os valores iniciais de cada estado populacional do modelo."
    )

    st.write("""
        - **Infectados (I)**: o total de infectados inicialmente é dado pela
          estimativa do número de casos ativos, $I_0$, dentre os casos
          reportados no município, ajustados pela taxa de notificação. Este
          valor pode ser modificado pelo usuário nos controles para simulação.

          Dado o tempo de progressão da doença ($\delta$), os casos ativos serão
          a soma dos novos casos reportados no intervalo $t_i - \delta$ e $t_i$,
          onde $t_i$ é o dia de início da simulação. Considerando $\delta$ como
          a soma do tempo de progressão somente dos casos severo e crítico, pois
          assumimos subnotificação dos casos leves, ainda sim podemos estar
          superestimando os casos ativos por não considerar dentre eles os
          recuperados durante esse período de progressão. Por fim, ajustamos o
          total de casos ativos pela taxa de notificação de casos do municípios.
          
          Assim, se $I^t$ é o número de novos casos reportados em $t$ e
          $$\\alpha$$ é a taxa estimada de notificação de casos no município, o
          número de casos ativos é dado por: 
          """)

    st.latex("I(0) = \\frac{\sum_{t=t_i - \delta}^{t_i} I^t}{\\alpha}")

    st.write("""  
          A partir desse total, inferimos de acordo com parâmetros reportados
          quantos casos devem ser leves ($$I_1$$), severos ($$I_2$$) e críticos
          ($$I_3$$).

          Configura-se como caso severo ou crítico aquele que necessita de
          hospitalização - o caso crítico, entretanto, necessita de tratamento
          intensivo com equipamento de ventiladores. Utilizando a atualização do
          Ministério da Saúde do Brasil lançado em 28 de março de 2020,
          consideramos que aproximadamente $14.6\%$ dos casos confirmados são
          hospitalizados (569 dos 3904 casos totais). Não há reporte oficial da
          porcentagem de casos graves e severos para o Brasil. Portanto,
          buscamos a referência dos Estados Unidos, onde o CDC (2020) reportou
          que:

          - Aproximadamente $12\%$ dos casos diagnosticados precisam de
            internação (508 dos 4446 casos confirmados)
          - Aproximadamente $2.5\%$ dos casos diagnosticados precisam de
            tratamento intensivo (121 dos 4446)

          Justificamos o uso dessa referência pela maior proximidade do perfil
          de comorbidades e hábitos entre a população dos Estados Unidos quando
          comparado à da China, além da maior semelhança na atual fase de
          transmissão comunitária da doença e da capacidade de testagem.
          Ademais, o percentual total de casos graves/severos e críticos deste
          país ($14.5\%$) resulta em percentual similar ao reportado pelo
          Ministério da Saúde brasileiro ($14.6\%$).

          Vale ressaltar que, nessa primeira versão, não diferenciamos taxas de
          infecção e hospitalização de acordo com estrutura etária de
          brasileiros infectados por Covid-19 por não haver esse dado
          consolidado.
        """)

    st.latex("I_1(0) = \\frac{\gamma_1}{\gamma_1 + p_1} I(0)")
    st.latex("I_2(0) = \\frac{\gamma_2}{\gamma_2 + p_2} I(0)")
    st.latex("I_3(0) = \\frac{\gamma_3}{\gamma_3 + \mu} I(0)")
    st.latex(
        "\\text{sendo }\\frac{\gamma_1}{\gamma_1 + p_1} + \\frac{\gamma_2}{\gamma_2 + p_2} + \\frac{\gamma_3}{\gamma_3 + \mu} = 1"
    )

    st.write("""
            Para municípios que não possuem casos confirmados em boletins oficiais, conforme 
            reportado no Brasil.io, simulamos os números a partir do primeiro caso. 
            Isso quer dizer que, ao selecionar unidades de análise mais altas, portanto, 
            como as regionais de saúde ou os estados, você está simulando um cenário 
            onde todos os municípios têm ao menos um caso confirmado.
        """)

    st.write("""
        - **Expostos (E)**: dado o número inicial de infectados leves ($I_1$)
          calculado acima, calculamos $E(0)$ discretizando a equação
          $\\frac{dI_1}{dt}$ em $t=1$, conforme mostrado abaixo. Dado que o
          número de casos dobra a cada 5 dias (Our World in Data, 2020), aproximamos $I_1(1)
          \\approx \sqrt[5]{2} \\times I(0) \\approx 1.15 I(0)$.
        """)
    # st.latex("I_1(1) - I_1(0) = \sigma E(0) - \gamma I_1(0) \\rightarrow E(0) =\\frac{ I_1(1) + (\gamma - 1)I_1(0)}{\sigma}")
    st.latex(
        "E(0) \\approx \\frac{ I(1) - I(0)}{\sigma} \\approx \\frac{0.15}{\sigma} \\times I(0)"
    )

    st.write("""
        - **Mortos (D)**: iniciamos esse estado com o total de mortes reportado
          pelo município com os dados do Brasil.io.

        - **Recuperados (R)**: sabendo o acumulado histórico de casos, o número
          mortes ($D$) e o número de casos ativos ($I(0)$), então $R =
          \sum_{t=t_0}^{t_i} - I(0) - D$. Como é possível o número de ativos
          estar superestimado, por construção o número de recuperados estaria
          subestimado - nos casos em que o cálculo dos recuperados não é
          consistente (negativo), assumimos $R(0) = 0$.

        - **Suscetíveis (S)**: o número de indivíduos suscetíveis inicial é dado
          pelo restante da polucação do município que não se encontra em nenhum
          dos estados acima.
        """)

    st.latex("S(0) = N - I(0) - E(0) - R(0) - D(0)")

    st.header("Simulação das estratégias")

    st.write("""
        Conforme já mencionado, a dinâmica de transmissão de doenças é impactada
        diretamente por comportamentos sociais. Políticas públicas desenhadas
        para restrição de contato, desenhadas com o objetivo de influenciar
        nesse comportamento, portanto, podem ter impacto sobre a velocidade de
        transmissão de doenças. 

        Incluímos no SimulaCovid a possibilidade de estimar a evolução da
        demanda por leitos hospitalares e ventiladores sob diferentes
        estratégias de políticas públicas, que se diferenciam pelo número básico
        de reprodução ($$R_0$$) atribuído a cada uma. As mesmas foram estimadas
        por Wang et al (2020)[1] com dados empíricos da disseminação da Covid-19 em
        Wuhan, na China, em período de um pouco mais de um mês, duração da
        primeira onda de contágio por lá, e estão dispostas na tabela abaixo:

        """)

    df = pd.read_csv(
        "https://docs.google.com/spreadsheets/d/1wvg1KFWZp4WhYVI4Gw_82bL_je_2WZHNLCcSnx95MTI/gviz/tq?tqx=out:csv&sheet=Taxas_de_reproducao"
    )  # .set_index('Descrição', drop=True)
    df.index = ["" for i in range(len(df))]
    st.table(df)

    st.write("""
        Ainda que haja problemas com a analogia entre dinâmicas de contágio e
        aderência a decretos públicos entre o Brasil e a China, escolhemos essa
        referência por ela ter sido calculada a partir de dados observados, não
        sendo resultante de simulação, como Ferguson et al. (2020). Essa também
        é uma análise que secciona os $$R_0$$ de acordo com as políticas públicas
        adotadas no período, possibilitando que façamos a simulação desses
        diferentes cenários para os municípios brasileiros. Entretanto, ainda
        não se tem certeza de que a mudança na velocidade da infecção da
        população se deveu apenas às mudanças políticas, embora pelo tamanho das
        intervenções isso seja muito provável.
        """)

    st.header("Limitações")

    st.write("""
        - O modelo trata cada cidade como um sistema fechado. Ou seja, não há
          mobilidade ou transmissão entre cidades. Também não modelamos a
          entrada simultânea de múltiplas pessoas infectadas no sistema fechado.
          Além disso, tratamos todos os casos como igualmente capazes de
          infectar outras pessoas suscetíveis, não modelando a existência de
          "super-disseminadores".
        - Esta é uma doença nova. Portanto, parâmetros que modelam sua dinâmica
          de infecção e transmissão são ainda preliminares e podem mudar com o
          tempo. Faremos um esforço contínuo de atualização desses parâmetros
          para o melhor conhecimento científico. A velocidade de transmissão e a
          dinâmica de progressão da doença entre brasileiros podem estar sub ou
          superestimados. Os resultados da simulação devem ser interpretados de
          acordo.
        - Os números básicos de reprodução estimados para cada uma das
          estratégias de políticas públicas foram estimados de maneira
          sequencial e em contexto específico, de Wuhan, na China. Sua tradução
          para o contexto brasileiro dependerá de fatores não estimados no
          modelo, como a existência de orientações uniformes em diferentes
          esferas do poder público. Não esperamos, portanto, uma equivalência
          perfeita com a situação brasileira. Também não sabemos se as
          estratégias têm o mesmo efeito fora da sequência adotada na cidade.
        - Os dados do número de leitos e ventiladores são atualizados
          mensalmente no DATASUS CNES e há conhecidos problemas de reporte.
        - Os dados do número de casos confirmados em cada município reportados
          pelas secretarias estaduais de saúde frequentemente refletem
          metodologia distinta do que aqueles reportados pelo próprio município.
          Adicionalmente, existe um lag temporal entre o reporte em boletins
          epidemiológicos, a atualização no Brasil.io e o input do novo dado em
          nossa ferramenta. Sugerimos que o usuário ajuste esse parâmetro na
          hora de realizar a simulação.
        - A análise não considera o desenvolvimento de medidas de mitigação como
        vacinas e medicamentos anti-virais.
        """)

    st.header("Fonte de Dados")
    st.write("""
    Os dados iniciais utilizados na ferramenta foram coletados de:
    """)

    df = pd.read_csv(
        "https://docs.google.com/spreadsheets/d/1wvg1KFWZp4WhYVI4Gw_82bL_je_2WZHNLCcSnx95MTI/gviz/tq?tqx=out:csv&sheet=Fontes"
    )

    # link is the column with hyperlinks
    df["Fonte"] = df[["URL", "Fonte"]].apply(
        lambda row: make_clickable(row["Fonte"], row["URL"]), 1)
    st.write(df.drop("URL", axis=1).to_html(escape=False),
             unsafe_allow_html=True)
    st.write("<br>", unsafe_allow_html=True)

    # st.subheader("Programa de Embaixadores")
    # st.write(
    #     """
    #     Para esta versão, também são integrados dados atualizados enviados pelos
    #     nossos Embaixadores. Os Embaixadores serão devidamente identificados como contribuidores,
    #     exceto se o Embaixador preferir colaborar de maneira anônima

    #     **Para se tornar um embaixador, inscreva-se [aqui](https://forms.gle/iPFE7T6Wrq4JzoEw9)**
    #     """
    # )
    # st.write("<br>", unsafe_allow_html=True)

    st.header("Referências")

    st.write("""
        Agência Nacional de Saúde Suplementar, 2012. Taxa de Ocupação Operacional Geral. Disponível em: http://www.ans.gov.br/images/stories/prestadores/E-EFI-03.pdf

        Ministério da Saúde do Brasil, 2020. Boletim Diário. 28 mar. 2020. Disponível em: https://www.saude.gov.br/images/pdf/2020/marco/28/28.03%20-%20COVID.pdf

        CDC, 2019. Severe Outcomes Among Patients with Coronavirus Disease 2019 (COVID-19) — United States, February 12–March 16, 2020. MMWR Morb Mortal Wkly Rep. ePub: 18 March 2020. DOI: http://dx.doi.org/10.15585/mmwr.mm6912e2.

        Hill, A, 2020. Model Description. Modelling COVID-19 Spread vs Healthcare Capacity. Disponível em: https://alhill.shinyapps.io/COVID19seir/

        Li, R., Pei, S., Chen, B., Song, Y., Zhang, T., Yang, W., & Shaman, J., 2020. Substantial undocumented infection facilitates the rapid dissemination of novel coronavirus (SARS-CoV2). Science, 3221(March), eabb3221. DOI: https://doi.org/10.1126/science.abb3221

        Max Roser, Hannah Ritchie, Esteban Ortiz-Ospina and Joe Hasell (2020) - "Coronavirus Disease (COVID-19)". Published online at OurWorldInData.org. Retrieved from: 'https://ourworldindata.org/coronavirus' [Online Resource]

        Walker, P.G., Whittaker, C., Watson, O., Baguelin, M., Ainslie, K.E.C., Bhatia, S., Bhatt, S., Boonyasiri, A., Boyd, O., Cattarino, L. and Cucunubá, Z., 2020. The global impact of COVID-19 and strategies for mitigation and suppression. Imperial College London, doi: https://doi.org/10.25561/77735.

        [1] Wang, C, et al. (2020) Evolving Epidemiology and Impact of Non-pharmaceutical Interventions on the Outbreak of Coronavirus Disease 2019 in Wuhan, China. DOI: https://doi.org/10.1101/2020.03.03.20030593 e pdf de apresentação https://docs.google.com/presentation/d/1-rvZs0zsXF_0Tw8TNsBxKH4V1LQQXq7Az9kDfCgZDfE/edit#slide=id.p1
        
        [2] Wang, J., Zhou, M., & Liu, F., 2020. Reasons for healthcare workers becoming infected with novel coronavirus disease 2019 (COVID-19) in China. Journal of Hospital Infection. DOI: https://doi.org/10.1016/j.jhin.2020.03.002
        """)
def main(session_state):
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event(
        "opened saude_em_ordem_description", session_state, is_new_page=True)

    st.subheader("O que é?")

    st.write(
        """O Saúde em Ordem é uma ferramenta desenvolvida para apoiar o planejamento da
    retomada de atividades econômicas em estados e municípios em fase de supressão da crise causada
    pela pandemia de Covid-19. """)

    st.subheader("""Introdução""")
    st.write("""
        Nossa indicação é que todo processo de retomada econômica gradual comece pela reabertura
        daqueles setores que proporcionam menores riscos à saúde pública por um lado, e maior
        importância econômica por outro.

        Para determinar o momento de retomada, desenvolvemos a metodologia de Níveis de Alerta em
        parceria com diversos especialistas, com o intuito de auxiliar no desenvolvimento de
        estratégias adequadas para cada nível de incidência da doença e capacidade de resposta à
        crise, de maneira a estabelecer um “novo normal”. A metodologia por trás do Saúde em Ordem
        foi inspirada no trabalho que realizamos junto ao Grupo Técnico de Atividade Econômica do
        Comitê de Dados da Secretaria de Planejamento, Orçamento e Gestão do Estado do Rio Grande do
        Sul para ordenar os setores econômicos do estado em fases de abertura de acordo com seu
        risco de contágio e sua importância econômica.

        É importante notar que o modelo aqui apresentado possui algumas variações em relação ao
        modelo utilizado no Rio Grande do Sul: a fim de tornar a ferramenta implementável em todo o
        país foi fundamental levar em consideração informações sobre o mercado de trabalho informal.
        Também permitimos que o gestor ajuste a ponderação dada aos critérios objetivos que
        elencamos. 
    """)
    st.subheader("Dados")
    st.write("""
    Os dados utilizados para dimensionar a massa salarial (que é a soma de todos os salários gerados em
    um setor econômico) do mercado de trabalho formal são da Secretaria Especial de Previdência e
    Trabalho do Ministério da Economia e são provenientes dos microdados da Relação Anual de Informações
    Sociais (RAIS) de 2018. Para acessar o mercado de trabalho informal foram utilizados os microdados
    da Pesquisa Nacional Domiciliar Contínua de 2019 do IBGE.
    
    Para calcularmos o índice de segurança
    foram utilizados dados do Departamento Americano de Trabalho e Emprego referentes à pesquisa
    Occupational Information Network (O*Net). Essa pesquisa traz características das ocupações e do
    contexto em que estão inseridas.

    """)
    st.subheader("Metodologia")
    st.write("""
    #### a. Índice de importância econômica
    Como medida de importância econômica utiliza-se a **massa salarial setorial**. A escolha dessa
    variável para representar a importância econômica de uma atividade se deve principalmente a dois
    fatores: em primeiro lugar é uma variável que reflete bem o impacto econômico de uma atividade
    na sociedade e em segundo lugar as informações necessárias para a construção de tal variável são
    públicas e disponíveis na RAIS e na PNADc.
    
    **Mas atenção!** Cabe, todavia, destacar uma
    fragilidade desta variável. Ao priorizarmos setores com maior massa salarial no processo de
    retomada econômica estamos potencialmente priorizando aqueles setores que mais empregam, de modo
    que é necessário que sejam adotados protocolos específicos para garantir que a mobilidade desses
    indivíduos no espaço urbano não gere situações que favoreçam o contágio.

    **Como o cálculo de contribuição econômica considera ocupações formais e informais?** Os dados
    da RAIS trazem informações sobre o mercado de trabalho formal por ocupação, atividade e
    município.  Então é possível saber, potencialmente para cada município brasileiro, o número de
    empregados de cada ocupação e setor e sua remuneração. Assim, é possível calcular a média dos
    salários de cada ocupação em cada atividade de modo que a massa salarial é na verdade a
    multiplicação do salário médio de cada ocupação naquela atividade ponderada pelo número de
    empregados daquela ocupação que trabalham naquela atividade. 

    Sabemos que a informalidade ainda é relevante em muitos estados brasileiros. Por isso, estimamos
    a informalidade e o salário médio dos trabalhadores informais em cada atividade e UF utilizando
    os dados da PNADc.  Para realizar esta estimação, os dados da PNADc, que é uma pesquisa
    amostral, foram expandidos utilizando os pesos populacionais de cada observação fornecidos pelo
    IBGE. Para cada atividade e estado, foram considerados empregados informais aqueles que
    satisfizessem pelo menos uma das seguintes condições:


    - Empregado no setor privado sem carteira de trabalho assinada
    - Empregado doméstico sem carteira de trabalho assinada
    - Trabalhador familiar auxiliar
    - Empregador sem CNPJ
    - Conta própria sem CNPJ

    O número estimado de trabalhadores informais foi somado ao número de trabalhadores formais da
    RAIS para englobar em cada atividade tanto os setor formal como o  informal do mercado de
    trabalho de cada estado. Da mesma maneira, a massa salarial considerada é a soma dos valores do
    mercado de trabalho formal e informal.

    Para o cálculo referente às regionais de saúde, faz-se a análise por municípios, que são
    agrupados em regionais de saúde. No caso da informalidade, utiliza-se a taxa de informalidade
    por atividade do estado em que a regional se encontra.


    #### b. Índice de segurança

    Para construir uma medida que representasse o risco de funcionamento de cada atividade
     recorremos à pesquisa O*NET que traz informações sobre a exposição da ocupação a doenças e
     infecções e intensidade e extensão de contatos físicos no ambiente de trabalho. Assim, as
     ocupações americanas foram classificadas de acordo com o risco de contágio que proporcionam com
     base na metodologia desenvolvida por Lima et al (2020) e Gamio (2020). 

    Como adaptamos a abordagem à realidade brasileira?  Como as ocupações americanas estão
    codificadas usando o Standard Occupational Classification foi necessário utilizar o método
    desenvolvido por Sulzbach (2020) para realizar a tradução dessa classificação para o Código de
    Ocupações Brasileiras.

    Assim, chega-se a uma medida de risco para cada ocupação e para calcular o risco de cada
    atividade faz-se uma média do risco das ocupações naquela atividade ponderada pelo número de
    trabalhadores de cada ocupação. Portanto a medida de risco de uma atividade é específica para
    cada Estado (ou município), uma vez que a distribuição de ocupações por atividade varia de lugar
    para lugar.

    Por fim, como gostaríamos de ter uma medida de segurança e não uma medida de risco, aplica-se a
    seguinte transformação monotônica:
    """)

    st.latex("S_i=100-R_i")
    st.write("""
    em que $$R_i$$ é a nossa medida de risco e $$S_i$$ é a medidade de segurança. Desse modo a
    medida de segurança varia entre 100 (atividade mais segura) e 0 (atividade menos segura).

    Cabe ressaltar que consideramos uma atividade como mais segura se ela exige menos proximidade
    entre indivíduos e expõe menos os trabalhadores a doenças e infecções.

    **Como adaptamos o cálculo para ocupações informais?**
    Além disso, analisamos também a hipótese do risco de exposição à Covid-19 não ser o mesmo entre
    formais e informais. Para isso, avaliamos os microdados da PNAD-Covid do IBGE, e observamos que a
    prevalência de sintomas da Covid-19 é maior entre a população informal do que para a população
    formal, como mostramos na tabela abaixo. De maneira geral, a presença desses sintomas é 15% maior
    entre os informais, de modo que aumentamos o risco de contágio para esses indivíduos em 15%.
    """)
    gen_table()
    st.write("""
    ### c. Ordenamento setorial

    A partir das duas dimensões descritas acima e seguindo o que foi proposto pelo Grupo Técnico de
    Atividade Econômica da Seplag-RS, o índice de ordenamento setorial é construído a partir de uma
    média geométrica que pondera essas duas dimensões de acordo com a preferência do policymaker,
    que atribui um peso entre zero e um à uma das dimensões e o peso complementar à outra dimensão.
    """)
示例#10
0
def main(session_state):
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event("opened risk_level",
                                                     session_state,
                                                     is_new_page=True)

    # Config labels
    config = yaml.load(open("configs/config.yaml", "r"),
                       Loader=yaml.FullLoader)
    date_update = config["br"]["farolcovid"]["date_update"]

    # Layout
    utils.localCSS("style.css")

    st.write(
        f"""<div class="base-wrapper"><span class="subsection-header">Atualização - v.2 ({date_update})</span>""",
        unsafe_allow_html=True,
    )

    st.write(
        """<div class="base-wrapper">
            <span class="subsection-header"><b>Níveis de classificação</span></b></br>
            Depois de um primeiro momento de mitigação da Covid-19 nos estados e municípios brasileiros, passamos a uma
            nova fase de resposta à pandemia: a de supressão da doença. Nela, é necessário avaliar
            periodicamente qual o cenário e quais as ações mais adequada para a cidade, regional de
            saúde ou estado, de acordo com indicadores sobre a dinâmica de transmissão da doença e
            sua capacidade de resposta.<br><br> É a partir dessa avaliação que políticas de
            resposta à Covid-19 devem ser calibradas: <b>o objetivo é chegar no "novo normal," onde
            a situação está sob controle.</b> Para auxiliar a população e os gestores públicos nessa
            tarefa, desenvolvemos uma classificação em Níveis de Alerta, baseada em 4 eixos,
            correspondentes a perguntas-chave que devem ser respondidas por quem está tomando
            decisões sobre resposta à pandemia. Adaptamos os antigos "níveis de risco" dos municípios, 
            regiões de saúde e estados com a nova metodologia de <a target="_blank" style="color:#3E758A;" href="https://coronacidades.org/niveis-de-alerta/">Níveis de Alerta</a> 
            desenvolvida pela Vital Strategies e adaptada pela Impulso, composta por 4 níveis:</br>
            <br>
            <li><strong style="color:#F02C2E">Altíssimo</strong>: Há um crescente número de casos de Covid-19 e grande número deles não são detectados</li>
            <li><strong style="color:#F77800">Alto</strong>: Há muitos casos de Covid-19 com transmissão comunitária. A presença de casos não detectados é provável.</li>
            <li><strong style="color:#F7B500">Moderado</strong>: há um número moderado de casos e a maioria tem uma fonte de transmissão conhecida.</li>
            <li><strong style="color:#0090A7">Novo Normal</strong>: casos são raros e técnicas de rastreamento de contato e monitoramento de casos suspeitos evitam disseminação.</li>
            <br></div>
        """,
        unsafe_allow_html=True,
    )

    st.write(
        """<div class="base-wrapper">
        <span class="subsection-header"><b>Classificação</span></b></br>
        A classificação de cada indicador segue a tabela de valores de referência abaixo. Após analisar cada indicador, classificamos 
        o município, regional ou estado no nível de alerta <b>equivalente ao mais alto entre os de cada indicador individual</b>. 
        Caso o município não conte com algum dos indicadores, mostramos o número correspondente para o nível regional. 
        Nesse caso, ele não terá classificação de risco.</div>""",
        unsafe_allow_html=True,
    )

    # Valores de referência
    st.write("""
        <div class="base-wrapper">%s</div>
        """ % gen_reference_table(config),
             unsafe_allow_html=True)

    st.write(
        """<div class="base-wrapper">
        <span class="subsection-header"><b>Indicadores</span></b></br>
        <br>
        <span class="subsection-header"><b>Situação da Covid-19:</b> Qual a incidência da doença na minha população?</span><br>
        <b>Indicador</b>: Novos casos por 100mil habitantes (média móvel 7 dias).<br>
        <b>Qual sua tendência?</b> Aumentando, estabilizando ou diminuindo?<br><br>
        Utilizamos como indicador nessa dimensão os <b>novos casos reportados de Covid-19 por 100 mil habitantes (medido em média móvel de sete dias)</b>. 
        Essa é uma métrica importante para entender como a doença está atingindo a população no momento atual, e qual sua <b>tendência</b> de evolução dos 
        novos casos - piorando (crescendo pelo menos há 5 dias), melhorando (diminuindo pelo menos há 14 dias) ou estável.</br>
        <br><span class="subsection-header"><b>Controle da Covid-19:</b> Estamos conseguindo frear o surgimento de novos casos?</span><br>
        <b>Indicador</b>: Taxa de contágio (Número efetivo de Reprodução - Rt)<br>
        <b>Qual sua tendência?</b>Aumentado, estabilizando ou diminuindo?<br><br>
        Por não possuirmos dados abertos de testagem estruturados da maioria dos municípios brasileiros, optamos por classificar o controle através da <b>taxa de contágio</b>. 
        Essa métrica busca estimar quantas pessoas em média uma pessoa está infectando hoje - é uma tentativa de entender o espalhamento da doença 
        quando não temos informação de rastreamento de contatos.</br>
        <br>
        Comparado com a versão anterior do Farol, fizemos uma alteração em nosso modelo estatístico de forma <b>a capturar melhor as variações 
        nos novos casos</b>, porém este modelo não se mostrou consistente para algumas cidades. Revertemos o cálculo para o modelo anterior 
        enquanto estudamos uma solução.</br>
        <br><span class="subsection-header"><b>Capacidade do sistema:</b> Como está a capacidade de resposta do sistema de saúde? </span><br>
        <b>Indicador</b>: Dias até atingir ocupação total de leitos UTI<br>
        <b>Qual sua tendência?</b> Aumentado, estabilizando ou diminuindo?<br><br>
        Comparado à versão anterior do Farol Covid, passamos a realizar a projeção de em quanto tempo todos os leitos UTI da regional 
        de saúde (caso município ou região) ou estado estarão ocupados, não mais o número de ventiladores. Realizamos essa mudança por entender 
        que essa rubrica, adotada pelo CNES a partir do mês de maio, traduz de maneira mais fiel a disponibilidade de equipamentos para 
        pacientes Covid. Ajustamos também os valores de referência para ser mais conservadores, observando um período de até 1 mês de cobertura 
        ao invés de 3 meses na versão anterior.</br>
        <br><span class="subsection-header"><b>Confiança nos dados:</b> Quão representativo são os casos oficialmente identificados 
        frente ao total de casos esperados?</span><br>
        <b>Indicador</b>: Taxa de subnotificação<br>
        <b>Qual sua tendência?</b> Aumentado, estabilizando ou diminuindo?<br><br>
        Propomos um 4º nível de análise devido a lidarmos com <b>dados abertos de reporte de casos e 
        mortes</b>, e já ser conhecido o baixo nível de testagem no país. Na versão anterior do Farol já apresentávamos a taxa de subnotificação 
        de casos como uma métrica importante dado o baixo nível de testagem e protocolos de reporte de casos com sintomas avançados para mostrar 
        o quanto possivelmente não estamos observando do espalhamento da doença.</br>
        <br>
        Na nova versão, junto à organização ModCovid com pesquisadores da USP, ajustamos a taxa de notificação para capturar melhor 
        características locais, com base na distribuição etária do município, região ou estado e na incidência da doença em diferentes 
        faixas etárias, e também estimar casos assintomáticos. <b>Isso fez com que alguns municípios que tinham uma baixa subnotificação 
        aumentassem seu nível de alerta</b>, pois consideramos os casos assintomáticos agora nessa métrica. Em contrapartida, ajustamos os 
        valores de referência dos níveis de subnotificação considerando cerca de 30%, de casos assintomáticos, que são de extrema dificuldade 
        de serem diagnosticados.
        </div>""",
        unsafe_allow_html=True,
    )

    # Limitação
    st.write(
        """<div class="base-wrapper"><span class="subsection-header"><b>Essas métricas são suficientes?</b></span><br>
        <b>Não.</b><br><br>Desenvolvemos os níveis de alerta do FarolCovid com dados públicos e abertos, disponíveis
        online. É um primeiro passo para o gestor orientar sua tomada de decisão de maneira informada,
        orientado por dados que o atualizam tanto sobre o estágio de evolução da doença em seu local 
        quanto sua capacidade de resposta. O gestor público, entretanto, conta com uma riqueza
        maior de informações que deve ser utilizada na formulação de respostas adequadas à sua realidade.
        Informações como a quantidade de testes realizados, a taxa de pessoas que testam positivo e o tempo
        médio de internação são outros fatores importantes para a tomada de decisão. Estamos à disposição
        para apoiar o gestor público a aprofundar a análise para seu estado ou município, de forma
        inteiramente gratuita. <a class="github-link" href="https://coronacidades.org/fale-conosco/>Entre em contato pelo Coronacidades.org</a>!
        </div>""",
        unsafe_allow_html=True,
    )

    # Detalhes dos indicadores
    gen_indicators_details(session_state, date_update)
示例#11
0
def main(session_state):
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event("opened spread_rhythm",
                                                     session_state,
                                                     is_new_page=True)
    st.header("""$$R_t$$ de Estados e Municípios""")

    st.subheader("""Calculo do $$R_t$$""")

    st.write("""
        O número de reprodução efetivo ($$R_t$$) traduz a quantidade de pessoas que cada pessoa doente infectará em determinado intervalo de tempo. 
        Já o número básico de reprodução ($$R_0$$) da uma doença traduz qual a dinâmica de contágio de todo o curso de transmissão em determinado grupo 
        populacional, sendo, portanto, fixo para a doença. Mas a quantidade de novas infecções geradas por cada pessoa varia ao longo do tempo: se, 
        no início, há menos pessoas imunes, ele tende a ser mais alto; enquanto, tudo mais constante, o aumento da imunidade na população se 
        traduzirá em um número menor de novas infecções. Igualmente, mudanças de comportamento - como a redução de contato entre pessoas ou uso de 
        máscaras, no caso de doenças transmitidas por vias áreas, como a Covid-19 - também influenciam o número de novas infecções.

        A Covid-19 chegou em momentos distintos em cada cidade brasileira e a sociedade também reagiu de maneira diferente em cada uma delas. 
        Portanto, medir o $$R_t$$, traduzindo o $$R_0$$ para o momento específico no qual cada local se encontra, a nível municipal e estadual, traz informações 
        importantes sobre o ritmo de contágio da doença. Enquanto o $$R_0$$ é um número geral, portanto, o  então é calculado para cada local e momento no tempo.

        Por exemplo, um $$R_t$$ maior do que 1 indica que, mantendo-se o comportamento e intervenções ativas até aquele dia, ainda há tendência de 
        crescimento exponencial da doença naquela população. Esperamos que cada pessoa infectada naquele momento infectará mais de uma pessoa no futuro - gerando 
        uma curva de contágio que se acelera rapidamente. Portanto, medidas para controlar o contágio têm que ser acirradas. Já um $$R_t$$ abaixo de 
        1 se traduz na expectativa de que o número de novas infecções vai diminuir ao longo do tempo, indicando que a situação está sob controle se todas 
        as medidas e comportamentos forem mantidos.

        Uma boa notícia: por causa da mudança de comportamento, o $$R_t$$ tende a ser menor que o $$R_0$$, como explicam os desenvolvedores do 
        Covid ActNow [1]. Calculá-lo também nos permite, portanto, 
        comparar qual seria a evolução do contágio da Covid-19 caso medidas restritivas de contato e contágio não tivessem sido adotadas.

        Medir diretamente o número efetivo de reprodução da Covid-19 não é possível. Porém, podemos estimar o número de reprodução 
        instantâneo ($$R_t$$) mais provável pelo número de novos casos por dia:

        - Modelo bayesiano no qual o número de novos casos segue uma distribuição de Poisson, e a relação entre os novos casos e $$R_t$$ é dada pela 
        equação encontrada em Bettencourt & Ribeiro [2]:

        """)

    st.latex("""k \sim Pois(\lambda), \lambda = k_{t-1} e^{\gamma(R_t-1)}""")

    st.write("""
        - A cada nova observação, atualizamos nossa crença em relação ao valor de $$R_t$$ pela regra de Bayes:
        """)

    st.latex(
        r"""P(k_t) = \sum_{R_t} P(k_t \mid R_t) P(R_t) \rightarrow P(R_t \mid k_t) = \frac{P(R_t \mid k_t) P(R_t)}{P(k_t)}"""
    )

    st.subheader("""Considerações""")
    st.write(r"""
        Reportamos o $$R_t$$ em intervalos de confiança, identificando o valor mais provável.

        - A relação dada por $$\lambda = k_{t-1} e^{\gamma(R_t-1)}$$  é obtida a partir de $$R_0 = \frac{\beta}{\gamma}$$
        tamando $$\beta$$ e $$\gamma$$ fixos, o que não contempla a variabilidade de transmissão devido à intervenções sociais. 
        O *CovidAct Now* [1] sinaliza, por exemplo, o 
        $$R_0$$ como o número pré-intervenção e o $$R_{eff}$$ (efetivo) como pós;

        - O $$R_t$$ deve ser lido como número de novas infecções que são esperadas no tempo serial determinado - estimado em 8 dias para a 
        Covid-19. Ou seja, esperamos que cada pessoa infectada hoje infecte aquele número de novas pessoas nesse intervalo de tempo;
        
        - Seguindo Covid ActNow [3], reportamos o $$R_t$$ de 10 dias 
        atrás - garantindo que não incorreremos em problemas de demora no resultado de testes, por exemplo;

        """)

    st.subheader("""Referências""")
    st.write("""
        [1] COVID ActNow Blog, 2020. [Inference projections for states.](https://blog.covidactnow.org/inference-projections-for-states/)
        
        
        [2] Bettencourt & Ribeiro. 2008. [Real Time Bayesian Estimation of the Epidemic Potential of Emerging Infectious Diseases](https://doi.org/10.1371/journal.pone.0002185). PLoS ONE 3(5): e2185.
        
        
        [3] COVID ActNow Blog, 2020. [Modeling metrics critical to reopen safely](https://blog.covidactnow.org/modeling-metrics-critical-to-reopen-safely/)
        
        
        [4] Kevin Systrom. 2020. [The Metric We Need to Manage COVID-19 (código base)](http://systrom.com/blog/the-metric-we-need-to-manage-covid-19/)
        
        
        [5] Loft-BR. 2020. [Visualizando a evolução do número de reprodução no Brasil (código adaptado).](https://github.com/loft-br/realtime_r0_brazil/blob/master/realtime_r0_bettencourt_ribeiro.ipynb) 
        
        
        [6] COVID ActNow, 2020. [Infer R_t (código adaptado)](https://github.com/covid-projections/covid-data-model/blob/089e4e81db32befd6e86e4e105454629fd834ad2/pyseir/inference/infer_rt.py)
        """)
示例#12
0
def genSimulationContainer(df, config, session_state):

    params = dict()
    main_icon = utils.load_image("imgs/simulation_main_icon.png")
    st.write(
            f"""
            <div class="text-title-section minor-padding">
                 Quantos <span class="bold main-orange-span">estudantes e professores(as)</span> retornam às salas de aula em diferentes modelos?
            </div>
            <div class="container main-padding" style="padding-left:0px;">
                <div class="container minor-padding main-orange-span" style="font-size: 20px; color:#FF934A; font-weight: bold;"> 
                    <img class="minor-icon" src="data:image/png;base64,{main_icon}" alt="Fonte: Flaticon">
                    Simule o retorno
                </div>
                <div class="minor-padding">
                    O retorno às atividades presenciais deve ser pensado em etapas para definir não só <b>quem pode retornar</b>, mas também <b>como</b>. Trazemos abaixo um passo a passo para construir a simulação da sua rede - experimente!
                </div>
                 <div class="minor-padding" style="font-size: 20px; color:#FF934A; font-weight: bold;">
                    <br>Para qual etapa de ensino você está planejando?
            </div>
            """,
            unsafe_allow_html=True,
        )

    # TODO: colocar por estado somente também
    # if city_name:
    data = df[
        (df["city_name"] == session_state.city_name)
        & (df["administrative_level"] == session_state.administrative_level)
    ]
    col1, col2 = st.beta_columns([0.9, 0.2])
    with col1:
        education_phase = st.selectbox(
            "", data["education_phase"].sort_values().unique()
        )
        data = data[data["education_phase"] == education_phase]
    with col2:
        st.write(
            f"""<div class="container">
                <br>
                </div>
                <br>
            """,
            unsafe_allow_html=True,
        )

    st.write(
        f"""<br>
            <div class="container" style="padding-left:0px;">
                <div class="minor-padding" style="font-size: 20px; color:#FF934A;"><b>1. Escolha o modelo de retorno às atividades</b></div>
                <div class="minor-padding">
                    Existem diversos modelos possíveis de retorno avaliadas de acordo com as etapas de aprendizado. Separamos abaixo 5 opções possíveis indicadas pela UNESCO.
                </div>
            </div>
        """,
        unsafe_allow_html=True,
    )

    UNESCO_models = {
        'Totalmente Presencial': {
            "description": """Neste modelo, todos os estudantes <b>retornam às aulas
            presenciais padrão</b>, isto é, os mesmos horários em sala de
            aula, porém seguindo os novos protocolos de distanciamento e segurança
            sanitária.
            <br><br><b>Por que este modelo?</b><br>
            Modelo tradicional, onde os estudantes e docentes estão habituados."""
            ,
            "hours_per_day": 5,
            "priority": False
        }
        , 
        'Aulas presenciais + Tarefas remota': {
            "description": """Neste modelo professores(as) <b>transmitem
            conceitos para os estudantes presencialmente</b>, e, em seguida,
            <b>estudantes completam exercícios e tarefas em casa</b>.
            <br><br><b>Por que este modelo?</b><br>
            Alunos e professores mantêm um contato próximo, e estudantes podem tirar dúvidas durante a exposição da matéria."""
            ,
            "hours_per_day": 3,
            "priority": False
        }
        , 
        'Aulas por vídeo + Tarefas presenciais': {
            "description": """Neste modelo estudantes <b>aprendem
            novos conceitos de forma remota</b> e, em seguida, <b>concluem exercícios e 
            tarefas presencialmente</b> com o(a) professor(a).
            <br><br><b>Por que este modelo?</b><br>
            Alunos e professores mantêm o convívio, e os estudantes podem tirar dúvidas 
            urante a realização dos exercícios e se beneficiarem com as dúvidas dos colegas."""
            ,
            "hours_per_day": 2,
            "priority": False
        }
        , 
        'Parte remoto + Parte presencial': {
            "description": """Neste modelo, os professores têm uma <b>aula normal completa com um grupo
            de estudantes presencial, enquanto outro grupo acompanha remotamente 
            por meio de videoconferência (VC)</b>.
            <br><br><b>Por que este modelo?</b>
            Turma mantém o convívio, mesmo que virtual, e os professores atentem todos da turma no mesmo momento."""
            ,
            "hours_per_day": 5,
            "priority": True
        }
    }

    col1_1, col1_2, col1_3, col1_4 = st.beta_columns([0.35, 0.05, 0.85, 0.3])
    with col1_1:
        params["education_model"] = st.selectbox(
            "", list(UNESCO_models.keys())
        )
        params["priority"] = UNESCO_models[params["education_model"]]["priority"]
    with col1_2:
        st.write(
            f"""
            <div class="container main-padding">
                <br>
            </div>
            """,
            unsafe_allow_html=True,
        )
    with col1_3:
    # Sobre o modelo
        st.write(
                f"""
                <div class="col light-green-simulator-bg card-simulator" style="border-radius:30px;">
                    <div style="font-family: 'Roboto Condensed', sans-serif; padding:10px; margin-bottom:0px; margin-top: 16px;margin-left: 16px; margin-right: 16px;">
                        <b>{params["education_model"]}</b>
                        <br><br>{UNESCO_models[params["education_model"]]["description"]}
                        <br><br><b><a href="https://en.unesco.org/sites/default/files/unesco-covid-19-response-toolkit-hybrid-learning.pdf">FONTE: UNESCO</a></b>
                    </div>
                    <div class="button-position" style="margin-bottom: 0px;padding: 10px;margin-top: 16px;margin-right: 16px;margin-left: 16px;">
                        <a href="#entenda-modelo">
                            <button class="button-protocolos" style="border-radius: .25rem; font-size:16px; margin-right: 10px;margin-left: 10px;">
                                leia sobre todos os modelos >
                            </button>
                        </a>
                    </div>
                    <div class="button-position" style="margin-bottom: 0px;padding: 10px;margin-top: 16px;margin-right: 16px;margin-left: 16px;">
                        <a href="#entenda-etapa">
                            <button class="button-protocolos" style="border-radius: .25rem; font-size:16px; margin-right: 10px;margin-left: 10px;">
                                veja considerações por etapa de ensino >
                            </button>
                        </a>
                    </div>
                </div>
                <div id="entenda-modelo" class="info-modal-window" style="width: 80%; height: 70%;">
                    <div>
                        <a href="#" title="Close" class="info-btn-close" style="color: white;">&times</a>
                        <h1 class="main-orange-span bold" style="padding: 0px 50px 0px 50px;">Modelos</h1>
                        <div style="font-size: 16px; padding: 0px 50px 0px 50px;">
                            Abaixo há o quadro completo. Caso não consiga ver a imagem, clique na imagem para baixa-la ou <a href="https://drive.google.com/u/1/uc?id=1tqBItM8XkLdY9u2wk0ZcPrVcHccgdp1f&export=download">[AQUI]</a>.
                        </div>
                        <a href="https://drive.google.com/u/1/uc?id=1tqBItM8XkLdY9u2wk0ZcPrVcHccgdp1f&export=download"><img style="padding: 50px 50px 50px 50px;" class="images" src="https://i.imgur.com/ZByy47a.jpg"></a>
                    </div>
                </div>
                <div id="entenda-etapa" class="info-modal-window" style="width: 80%; height: 70%;">
                    <div>
                        <a href="#" title="Close" class="info-btn-close" style="color: white;">&times</a>
                        <h1 class="main-orange-span bold" style="padding: 0px 50px 0px 50px;">Etapas de Ensino</h1>
                        <div style="font-size: 16px; padding: 0px 50px 0px 50px;">
                            <br>
                            <b>4 - 8 anos</b><br>
                            Pontos principais para consideração:<br>
                            <li>Crianças desta faixa etária possuem menor risco de apresentar sintomas graves.</li>                            
                            <li>Pais e responsáveis necessitam de creches e suporte para manter demais atividades do dia a dia</li>
                            <li>Eficácia muito baixa do ensino remoto</li><br>
                            <b>8 - 12 anos</b><br>
                            Pontos principais para consideração:<br>
                            <li>Crianças desta faixa etária possuem menor risco de apresentar sintomas graves, mas há maior dificuldade em adotar medidas sanitárias.</li>
                            <li>Já possuem maior autonomia no cotidiano e pode</li><br>
                            <b>12 - 17 anos</b><br>
                            Pontos principais para consideração:<br>
                            <li>Crianças desta faixa etária possuem maior risco intrínseco de contrair e desenvolver sintomas, mas apresentam maior aderência aos protocolos sanitários</li>
                            <li>Logística de agendamento presencial pode ser mais complexa, pois os anos possuem matérias e professores diversos.</li><br>
                            <b>17 - 18 anos</b><br>
                            Pontos principais para consideração:<br>
                            <li>Crianças desta faixa etária possuem maior risco intrínseco de contrair e desenvolver sintomas, mas apresentam maior aderência aos protocolos sanitários.</li>
                            <li>Alta eficácia e adesão ao método remoto</li>
                            <br>Abaixo há o quadro completo. Caso não consiga ver a imagem, clique na imagem para baixa-la ou <a href="https://drive.google.com/u/1/uc?id=1Sj65MXPkRcw6VxojYBLsJ8otIuvpLfq_&export=download">[AQUI]</a>.
                        </div>
                        <a href="https://drive.google.com/u/1/uc?id=1Sj65MXPkRcw6VxojYBLsJ8otIuvpLfq_&export=download"><img style="padding: 50px 50px 50px 50px;" class="images" src="https://i.imgur.com/FyoIFe9.jpg"></a>
                    </div>
                </div>
                """,
                unsafe_allow_html=True,
        )
    with col1_4:
        st.write(
            f"""<div class="container">
                <br>
                </div>
                <br>
            """,
            unsafe_allow_html=True,
        )


    st.write(
        f"""<br>
            <div class="container" style="padding-left:0px;">
                <div class="minor-padding" style="font-size: 20px; color:#FF934A;"><b>2. Escolha quem pode retornar</b></div>
            </div>
        """,
        unsafe_allow_html=True,
    )

    col2a_1, col2a_2, col2a_3, col2a_4 = st.beta_columns([0.35, 0.05, 0.85, 0.3])
    with col2a_1:
        params["number_students"] = st.number_input(
            "Quantos estudantes retornam às aulas presenciais?",
            format="%d",
            value=data["number_students"].values[0],
            step=1,
        )
        if params["priority"]:
            params["number_remote_students"] = st.number_input(
            "Quantos estudantes acompanham às aulas somente de forma remota?",
            format="%d",
            value=data["number_students"].values[0],
            step=1,
        )


    with col2a_2:
        st.write(
            f"""
            <div class="container main-padding">
                <br>
            </div>
            """,
            unsafe_allow_html=True,
        )
    with col2a_3:
        st.write(
            f"""
            <div class="col light-green-simulator-bg card-simulator" style="border-radius:30px;">
                <div class="row" style="font-family: 'Roboto Condensed', sans-serif; margin-bottom:0px; padding:10px;">
                    <b>Iniciamos com total de estudantes reportados no Censo Escolar 2019 (INEP).</b>
                    <br>Você pode alterar esse valor ao lado. Leve em consideração quais grupos de estudantes podem ser vulneráveis ou ter prioridade.
                </div>
                <div class="button-position" style="padding-bottom: 15px;">
                    <a href="#entenda-estudantes">
                        <button class="button-protocolos" style="border-radius: .25rem; font-size:16px; margin-right: 10px;margin-left: 10px;">
                            grupos que requerem atencão especial >
                        </button>
                    </a>
                </div>
            </div>
            <div id="entenda-estudantes" class="info-modal-window" style="width: 80%; height: 70%;">
                <div>
                    <a href="#" title="Close" class="info-btn-close" style="color: white;">&times</a>
                    <h1 class="main-orange-span bold" style="padding: 0px 50px 0px 50px;">Estudantes</h1>
                    <div style="font-size: 20px; padding: 0px 50px 0px 50px;">
                        <b>Grupos que requerem atencão especial</b>
                    </div>
                    <br>
                    <div style="font-size: 16px; padding: 0px 50px 0px 50px;">
                        <b>Exemplos de grupos vulneráveis ou/e marginalizados</b>
                        <li>Minorias</li>
                        <li>Meninas adolescentes</li>
                        <li>Crianças com deficiência de aprendizagem</li>
                        <li>Crianças que vivem em instituições de abrigo</li>
                        <li>Crianças vivendo em condição de pobreza, em residências com alta ocupância ou improvisadas</li>
                        <li>Orfãos</li>
                        <li>Crianças separadas de seus responsáveis</li>
                        <li>Crianças e adolescentes em risco de abandono escolar</li>
                    </div>
                </div>
            </div>
            """,
            unsafe_allow_html=True,
        )
    with col2a_4:
        st.write(
            f"""<div class="container">
                <br>
                </div>
                <br>
            """,
            unsafe_allow_html=True,
        )
    st.write(
        f"""
        <div class="container main-padding">
            <br>
        </div>
        """,
        unsafe_allow_html=True,
    )

    col2b_1, col2b_2, col2b_3, col2b_4 = st.beta_columns([0.35, 0.05, 0.85, 0.3])
    with col2b_1:
        params["number_teachers"] = st.number_input(
            "Quantos professores(as) retornam?",
            format="%d",
            value=data["number_teachers"].values[0],
            step=1,
        )
    col2b_2=col2a_2
    with col2b_3:
        st.write(
            f"""
            <div class="col light-green-simulator-bg card-simulator" style="border-radius:30px;">
                <div class="row" style="font-family: 'Roboto Condensed', sans-serif; margin-bottom:0px; padding:10px;">
                    <b>Iniciamos com total de professores reportados no Censo Escolar 2019 (INEP).</b> 
                    <br>Você pode alterar esse valor ao lado. Leve em consideração quais grupos de professores podem ser de risco, confortáveis para retorno e outros.
                </div>
                <div class="button-position" style="padding-bottom: 15px;">
                    <a href="#entenda-professores">
                        <button class="button-protocolos" style="border-radius: .25rem; font-size:16px; margin-right: 10px;margin-left: 10px;">
                            como retornar professores(as) >
                        </button>
                    </a>
                </div>
                <div id="entenda-professores" class="info-modal-window" style="width: 80%; height: 70%;">
                    <div>
                        <a href="#" title="Close" class="info-btn-close" style="color: white;">&times</a>
                        <h1 class="main-orange-span bold" style="padding: 0px 50px 0px 50px;">Professores</h1>
                        <div style="font-size: 16px; padding: 0px 50px 0px 50px;">
                            <b>Fatores a serem considerados:</b> grupos vulneráveis, número de casos suspeitos, desconforto da rede com o retorno presencial, dificuldade logística e a disponibilidade de retorno presencial.
                            <br><br>O quadro explicativo traz para cada fator um desafio e uma ação sugerida.
                            <br><br>Caso não consiga ver a imagem, clique na imagem para baixa-la ou <a href="https://drive.google.com/u/1/uc?id=1lLtbEMau4nIj8tZ5rQF51ThV2Q8K1DzE&export=download">[AQUI]</a>.
                        </div>
                        <a href="https://drive.google.com/u/1/uc?id=1lLtbEMau4nIj8tZ5rQF51ThV2Q8K1DzE&export=download"><img style="padding: 50px 50px 50px 50px;" class="images" src="https://i.imgur.com/4ai7xDK.jpg"></a>
                    </div>
                </div>
            </div>
            """,
            unsafe_allow_html=True,
        )
    col2b_4=col2a_4
    st.write(
        f"""
        <br>
        <div class="container" style="padding-left:0px;">
            <div class="minor-padding" style="font-size: 20px; color:#FF934A;"><b>3. Defina as restrições de retorno</b></div><br>
                </div>
            </div>
        </div>
        """,
        unsafe_allow_html=True,
    )

    col3_1, col3_2, col3_3, col3_4, col3_5, col3_6 = st.beta_columns(
        [0.35, 0.05, 0.4, 0.05, 0.4, 0.3]
    )
    with col3_1:
        params["number_classrooms"] = st.number_input(
            "Quantas salas de aula disponíveis?",
            format="%d",
            value=data["number_classroms"].values[0],
            step=1,
        )
        st.write(
            f"""
            <div class="row" style="margin:0px; padding:10px; background:#DDFBF0; border-radius: 1rem 1rem 1rem 1rem;">
                O número de salas restringe o número de turmas que podem voltar de forma simultânea.
            </div>
        """,
            unsafe_allow_html=True,
        )
    col3_2=col2a_2
    with col3_3:
        params["max_students_per_class"] = st.slider(
            "Selecione o máximo de estudantes por turma:", 0, 20, 20, 1
        )
        st.write(
            f"""
            <div class="row" style="margin:0px; padding:10px; background:#DDFBF0; border-radius: 1rem 1rem 1rem 1rem;">
                Limitamos em 20 estudantes por sala para diminiuir o risco de transmissão seguindo critérios sanitários.
            </div>
            """,
            unsafe_allow_html=True,
        )
    col3_4 = col2a_2
    with col3_5:
        params["hours_per_day"] = int(st.slider(
            "Selecione o número de horas presenciais diárias na escola por turma:", 
            min_value=1, 
            max_value=5, 
            value=UNESCO_models[params["education_model"]]["hours_per_day"], 
            step=1,
        ))

        st.write(
            f"""
            <div class="row" style="margin:0px; padding:10px; background:#DDFBF0; border-radius: 1rem 1rem 1rem 1rem;">
                As restrições sanitárias limitam a quantidade de tempo e estudantes que conseguem retornar à sala de aula.
            </div>

            <div class="container">
            <br>
            </div>
            <br>
            """,
            unsafe_allow_html=True,
        )
    col3_6=col2a_4

    with st.beta_expander("simular retorno"):
        user_analytics = amplitude.gen_user(utils.get_server_session())
        opening_response = user_analytics.safe_log_event(
            "clicked simule retorno", session_state, is_new_page=True
        )
        print(params)
        genSimulationResult(params, config)

    '''if st.button("Simular retorno"):
        if st.button("Esconder"):
            pass
        genSimulationResult()
    utils.stylizeButton(
        name="SIMULAR RETORNO",
        style_string="""
        box-sizing: border-box;
        border-radius: 15px; 
        width: 150px;padding: 0.5em;
        text-transform: uppercase;
        font-family: 'Oswald', sans-serif;
        background-color: #0097A7;
        font-weight: bold;
        text-align: center;
        text-decoration: none;font-size: 18px;
        animation-name: fadein;
        animation-duration: 3s;
        margin-top: 1.5em;""",
        session_state=session_state,
    )'''

    # TODO: escrever metodologia v1.2
    with st.beta_expander("ler metodologia"):
        user_analytics = amplitude.gen_user(utils.get_server_session())
        opening_response = user_analytics.safe_log_event(
            "clicked simule metodologia", session_state, is_new_page=True
        )
        methodology_text = load_markdown_content("methodology.md")
        st.write(methodology_text)
示例#13
0
def main(user_input, indicators, data, config, session_state):
    user_analytics = amplitude.gen_user(utils.get_server_session())

    utils.localCSS("style.css")

    utils.genHeroSection(
        title1="Simula",
        title2="Covid",
        subtitle="Um simulador da demanda por leitos hospitalares.",
        logo="https://i.imgur.com/w5yVANW.png",
        header=False,
    )

    if (user_input["place_type"] == user_input["rt_level"]
        ):  # indicators["rt"].display != "- ":
        st.write(
            f"""
            <div class="base-wrapper">
                    <span class="section-header primary-span">Simule o impacto de diferentes ritmos de contágio no seu sistema hospitalar</span>
                    <br><br>
                    <span>Agora é a hora de se preparar para evitar a sobrecarga hospitalar. 
                    No momento, em {user_input["locality"]}, estimamos que <b>a taxa de contágio esteja entre {indicators["control"].left_display}</b>, 
                    ou seja, cada pessoa doente infectará em média entre outras {indicators["control"].left_display} pessoas.
                    </span>
            </div>""",
            unsafe_allow_html=True,
        )

    else:
        places = {"health_region_id": "Regional", "state_num_id": "Estado"}
        st.write(
            f"""
            <div class="base-wrapper">
                    <span class="section-header primary-span">Simule o impacto de diferentes ritmos de contágio no seu sistema hospitalar</span>
                    <br><br>
                    <span>Agora é a hora de se preparar para evitar a sobrecarga hospitalar. 
                    No momento, em {user_input["locality"]}, não temos dados suficientes para estimativa do ritmo de contágio. 
                    Por isso, <b>iremos simular com a taxa de contágio do seu {places[user_input["rt_level"]]}, que está entre {str(user_input["rt_values"]["best"])}-{str(user_input["rt_values"]["worst"])}</b>, 
                    ou seja, cada pessoa doente infectará em média entre outras {str(user_input["rt_values"]["best"])}-{str(user_input["rt_values"]["worst"])} pessoas.
                    </span>
            </div>""",
            unsafe_allow_html=True,
        )
    # CHANGE DATA SECTION
    utils.genInputCustomizationSectionHeader(user_input["locality"])
    old_user_input = dict(user_input)
    user_input, session_state = utils.genInputFields(user_input, config,
                                                     session_state)

    if session_state.reset:
        session.rerun()
    if session_state.update:
        opening_response = user_analytics.log_event(
            "updated sim_numbers",
            {
                "beds_change":
                session_state.number_beds - int(old_user_input["number_beds"]),
                "icu_beds_change":
                session_state.number_icu_beds -
                int(old_user_input["number_icu_beds"]),
                "cases_change":
                session_state.number_cases -
                int(old_user_input["population_params"]["I_confirmed"]),
                "deaths_change":
                session_state.number_deaths -
                int(old_user_input["population_params"]["D"]),
            },
        )
        session_state.update = False
        session.rerun()

    dic_scenarios = {
        "Cenário Estável: O que acontece se seu ritmo de contágio continuar constante?":
        "estavel",
        "Cenário Negativo: O que acontece se dobrar o seu ritmo de contágio?":
        "negativo",
        "Cenário Positivo: O que acontece se seu ritmo de contágio diminuir pela metade?":
        "positivo",
    }

    option = st.selectbox(
        "",
        ["Selecione uma mudança no seu ritmo de contágio"] +
        list(dic_scenarios.keys()),
    )

    if option == "Selecione uma mudança no seu ritmo de contágio":
        pass

    else:
        # calculate recovered cases
        user_input = _calculate_recovered(data, user_input)

        # SIMULATOR SCENARIOS: BEDS & RESPIRATORS
        user_input["strategy"] = dic_scenarios[option]
        if user_input["strategy"] == "estavel":
            user_analytics.log_event("picked stable_scenario")
        elif user_input["strategy"] == "positivo":
            user_analytics.log_event("picked positive_scenario")
        elif user_input["strategy"] == "negativo":
            user_analytics.log_event("picked negative_scenario")

        # Caso o usuário altere os casos confirmados, usamos esse valor para a estimação
        if (session_state.number_cases is not None) and (
                session_state.number_cases !=
                user_input["population_params"]["I_compare"]):
            user_input["population_params"]["I"] = session_state.number_cases

        # Roda a simulação
        dfs = simulator.run_simulation(_prepare_simulation(user_input, config),
                                       config)
        dday_beds = simulator.get_dday(dfs, "I2",
                                       int(user_input["number_beds"]))

        dday_icu_beds = simulator.get_dday(dfs, "I3",
                                           int(user_input["number_icu_beds"]))

        utils.genChartSimulationSection(
            SimulatorOutput(
                # color=BackgroundColor.SIMULATOR_CARD_BG,
                min_range_beds=dday_beds["worst"],
                max_range_beds=dday_beds["best"],
                min_range_icu_beds=dday_icu_beds["worst"],
                max_range_icu_beds=dday_icu_beds["best"],
            ),
            plot_simulation(dfs, user_input),
        )
示例#14
0
def main(session_state):
    # GOOGLE ANALYTICS SETUP
    if os.getenv("IS_DEV") == "FALSE":
        utils.setup_google_analytics()

    # Amplitude: Get user info
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event("opened farol",
                                                     session_state,
                                                     is_new_page=True)

    config = yaml.load(open("configs/config.yaml", "r"),
                       Loader=yaml.FullLoader)

    utils.localCSS("style.css")
    st.write(
        """<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MKWTV7X" height="0" width="0" style="display:none;visibility:hidden"></iframe>""",
        unsafe_allow_html=True,
    )

    utils.genHeroSection(
        title1="Farol",
        title2="Covid",
        subtitle="Entenda e controle a Covid-19 em sua cidade e estado.",
        logo="https://i.imgur.com/CkYDPR7.png",
        header=True,
        explain=True)

    if os.getenv("IS_HEROKU") == "TRUE":
        urlpath = os.getenv("urlpath")
    elif os.getenv("IS_DEV") == "TRUE":
        urlpath = 'http://localhost:8501/'
    else:
        urlpath = 'https://farolcovid.coronacidades.org/'
        # urlpath = 'http://localhost:8501/'
    vaccine_logo = utils.load_image("imgs/vaccine.png")
    st.write(
        f"""<div>
            <div class="base-wrapper flex flex-column" style="background-color:#0090A7">
                <div class="white-span header p1" style="font-size:30px;"><img class="icon-cards" src="data:image/png;base64,{vaccine_logo}" alt="Fonte: Impulso">QUER SABER MAIS SOBRE A VACINAÇÃO?</div>
                <span class="white-span">Acompanhe nossos novos dados e descobra como avança a vacinação no seu município ou estado!<br><br>
                <a class="btn-ambassador" href="{urlpath}?page=4" target="_self">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Veja aqui!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
                <br><br><span class="white-span">Saiba quando podemos controlar a pandemia no Brasil no nosso estudo realizado com dados inéditos obtidos pela Lei de Acesso à Informação.<br><br>
                <a class="btn-ambassador" href="{urlpath}?page=3" target="_self">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ler aqui!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
        </div>""",
        unsafe_allow_html=True,
    )

    st.write(
        """
    <div class="base-wrapper primary-span">
        <span class="section-header">Selecione seu estado ou município no mapa abaixo:</span>
    </div>""",
        unsafe_allow_html=True,
    )

    # PEGA BASE DA API
    # GET DATA
    dfs, cnes_sources = get_data(config)
    map_url = "https://helper.coronacidades.org/"
    col1, col2 = st.beta_columns([0.6, 0.35])

    with col2:
        # REGIAO/CIDADE SELECAO USUARIO
        # REGION/CITY USER INPUT
        user_input = dict()
        user_input["state_name"] = st.selectbox(
            "Estado", utils.filter_place(dfs, "state"))

        user_input["health_region_name"] = st.selectbox(
            "Região de Saúde",
            utils.filter_place(dfs,
                               "health_region",
                               state_name=user_input["state_name"]),
        )

        user_input["city_name"] = st.selectbox(
            "Município",
            utils.filter_place(
                dfs,
                "city",
                state_name=user_input["state_name"],
                health_region_name=user_input["health_region_name"],
            ),
        )

        changed_city = user_analytics.safe_log_event(
            "picked farol place",
            session_state,
            event_args={
                "state": user_input["state_name"],
                "city": user_input["city_name"]
            },
        )

        user_input, data = update_user_input_places(user_input, dfs, config)
        map_place_id = utils.Dictionary().get_state_alphabetical_id_by_name(
            user_input["state_name"])
        st.write(
            f"""
        <div class="brazil-map-div">
            <br><br>
            <iframe id="map-state" src="{map_url}maps/map-iframe?place_id={map_place_id}" class="map-state" scrolling="no">
            </iframe>
        </div>
        """,
            unsafe_allow_html=True,
        )
    with col1:
        # GENERATE MAPS
        # st.write(
        #     f"""
        # <div class="brazil-map-div">
        #     <div class="alert-levels-map-overlay">
        #     </div>
        #     <div>
        #     <iframe id="map" src="resources/iframe-gen.html?url={map_url}maps/map-iframe?place_id=BR" class="map-br" scrolling="no">
        #     </iframe>
        #     </div>
        # </div>
        # """,
        #     unsafe_allow_html=True,
        # )

        st.write(
            f"""
        <div class="brazil-map-div">
            <iframe id="map" src="{map_url}maps/map-iframe?place_id=BR" class="map-br" scrolling="no">
            </iframe>
        </div>
        """,
            unsafe_allow_html=True,
        )
    # st.write(
    #     f"""

    # """,
    #     unsafe_allow_html=True,
    # )

    # st.write(
    #     f"""
    # <iframe id="map-state" src="resources/iframe-gen.html?url={map_url}maps/map-iframe?place_id={map_place_id}" class="map-state" scrolling="no">
    # </iframe>
    # """,
    #     unsafe_allow_html=True,
    # )
    # st.write(
    #     f"""
    #     <div class="selectors-box" id="selectors-box">
    #     </div>
    #     <iframe src="resources/select-box-mover.html?place_id={user_input["state_name"]}{user_input["health_region_name"]}{user_input["city_name"]}" height="0px">
    #     </iframe>""",
    #     unsafe_allow_html=True,
    # )

    # SOURCES PARAMS
    user_input = utils.get_sources(user_input, data, cnes_sources,
                                   ["beds", "icu_beds"])

    # POPULATION PARAMS
    try:
        user_input["population_params"] = {
            "N": int(data["population"].fillna(0).values[0]),
            "D": int(data["deaths"].fillna(0).values[0]),
            "I": int(data["active_cases"].fillna(0).values[0]),
            "I_confirmed": int(data["confirmed_cases"].fillna(0).values[0]),
            "I_compare": int(data["confirmed_cases"].fillna(0).values[0]),
        }
    except:
        user_input["population_params"] = {
            "N": int(data["population"].fillna(0).values[0]),
            "D": int(data["deaths"].fillna(0).values[0]),
            "I": 0,
            "I_confirmed": int(data["confirmed_cases"].fillna(0).values[0]),
            "I_compare": int(data["confirmed_cases"].fillna(0).values[0]),
        }

    user_input["Rt"] = {
        "best": data["rt_low_95"].values[0],
        "worst": data["rt_high_95"].values[0],
        "is_valid": data["rt_most_likely"].apply(str).values[0],
    }

    user_input["last_updated_cases"] = data[
        "last_updated_subnotification"].max()
    # Update session values to standard ones if changed city or opened page or reseted values
    if (session_state.state_name != user_input["state_name"]
            or session_state.health_region_name !=
            user_input["health_region_name"]
            or session_state.city_name != user_input["city_name"]
            or session_state.number_beds is None or session_state.reset):
        session_state.state_name = user_input["state_name"]
        session_state.health_region_name = user_input["health_region_name"]
        session_state.city_name = user_input["city_name"]

        session_state.state_num_id = user_input["state_num_id"]
        session_state.health_region_id = user_input["health_region_id"]
        session_state.city_id = user_input["city_id"]

        session_state.number_beds = int(
            user_input["number_beds"] *
            config["br"]["simulacovid"]["resources_available_proportion"])
        session_state.number_icu_beds = int(
            user_input["number_icu_beds"] *
            config["br"]["simulacovid"]["resources_available_proportion"])
        session_state.number_cases = user_input["population_params"][
            "I_confirmed"]
        session_state.number_deaths = user_input["population_params"]["D"]
        session_state.reset = True

    if data["confirmed_cases"].sum() == 0:
        st.write(
            f"""<div class="base-wrapper">
                    Seu município ou Região de Saúde ainda não possui casos reportados oficialmente. Portanto, simulamos como se o primeiro caso ocorresse hoje.
                    <br><br>Caso queria, você pode mudar esse número abaixo:
                </div>""",
            unsafe_allow_html=True,
        )

        user_input["population_params"]["I"] = 1

    else:
        infectious_period = (
            config["br"]["seir_parameters"]["severe_duration"] +
            config["br"]["seir_parameters"]["critical_duration"])
        placeholder_value_pls_solve_this = 0

    # ALERT BANNER
    # Aqui ele cria uma lista só com os estados que todas as cidades estao sem o overall_alert para criar um alerta para o estado
    states_list = dfs["city"].groupby(["state_name"]).agg({
        "overall_alert": "count",
        "state_name": "max"
    })
    states_list = states_list.loc[states_list['overall_alert'] < 1]
    # Adiciona forcadamente MT para a lista
    states_list = states_list.append(
        {
            'state_name': 'Mato Grosso',
            'overall_alert': 0
        }, ignore_index=True)
    states_list = states_list['state_name'].to_list()
    utils.noOverallalert(user_input, data, states_list)

    # DIMENSIONS CARDS
    dimensions = DimensionCards
    utils.genAnalysisDimmensionsSection(dimensions)

    # INDICATORS CARDS
    indicators = IndicatorCards

    indicators = update_indicators(indicators, data, config, user_input,
                                   session_state)

    data["overall_alert"] = data["overall_alert"].map({
        0: "novo normal",
        1: "moderado",
        2: "alto",
        3: "altíssimo"
    })

    if "state" in user_input["place_type"]:
        # Add disclaimer to cities in state alert levels
        total_alert_regions = (dfs["health_region"][
            dfs["health_region"]["state_num_id"] ==
            data["state_num_id"].unique()[0]].assign(
                overall_alert=lambda df: df["overall_alert"].map({
                    0: "novo normal",
                    1: "moderado",
                    2: "alto",
                    3: "altíssimo"
                }))["overall_alert"].value_counts())

        utils.genKPISection(
            place_type=user_input["place_type"],
            locality=user_input["locality"],
            alert=data["overall_alert"].values[0],
            indicators=indicators,
            n_colapse_regions=total_alert_regions[
                total_alert_regions.index.isin(["altíssimo", "alto"])].sum(),
        )

    elif "city" in user_input["place_type"]:
        utils.genKPISection(
            place_type=user_input["place_type"],
            locality=user_input["locality"],
            alert=data["overall_alert"].values[0],
            indicators=indicators,
            rt_type=data["rt_place_type"].values[0],
        )

    else:
        utils.genKPISection(
            place_type=user_input["place_type"],
            locality=user_input["locality"],
            alert=data["overall_alert"].values[0],
            indicators=indicators,
        )

    # AVAILABLE CAPACITY DISCLAIMER
    # TODO -> VOLTAR PARA PROJECAO DE LEITOS
    # """
    # <div class='base-wrapper'>
    #     <i>* Utilizamos 100% do total de leitos UTI reportados por %s em %s
    #     para cálculo da projeção de dias para atingir capacidade máxima.<br><b>Para municípios, utilizamos os recursos da respectiva regional de saúde.</b>
    #     Leitos enfermaria contém os tipos: cirúrgicos, clínicos e hospital-dia; sendo considerado %s&percnt; já ocupado.</i>
    # </div>
    # """

    st.write(
        """
        <div class='base-wrapper' 
            <i>* <b>Vacinação</b> </i>
            <li>“A porcentagem da população vacinada em seu local” - Total de pessoas que tomaram ao menos uma dose, dividido pelo total da população do local.<br>
            <li>“Porcentagem da população imunizada” - Total de pessoas que receberam todas as doses recomendadas do imunizante, dividido pelo total da população do local.<br>
            <li>“Total da população sem vacinar” - Número absoluto de habitantes do local que ainda não recebeu nenhuma dose do imunizante.<br>
            <i>Para mais detalhes e explicação completa confira nossa página de Metodologia no menu lateral.</i>
        </div>
        """,
        unsafe_allow_html=True,
    )

    st.write(
        """
        <div class='base-wrapper'>
            <i>* <b>Mudamos o indicador afim de refinarmos ajustes no cálculo de projeção de leitos.</b> Entendemos que a projeção apresentada não capturava a situação da 2ª onda observada nos municípios, regionais e estados, logo substituímos este indicador por ora para revisão dos cálculos. 
            Os valores de referência se baseiam nas estatísticas de países da OCDE, <a target="_blank" style="color:#0068c9;" href="https://docs.google.com/spreadsheets/d/1MKFOHRCSg4KMx5Newi7TYCrjtNyPwMQ38GE1wQ6as70/edit?usp=sharing">veja mais aqui</a></b>.
            As simulações personalizadas ainda podem ser realizadas através do SimulaCovid mais abaixo.<br>
            <li> Leitos Enfermaria: Consideramos %s&percnt; do total reportado por %s em %s dos tipos Cirúrgico, Clínico e Hospital-dia. Para municípios, utilizamos os recursos da respectiva regional de saúde.<br>
            <li> Leitos UTI: Consideramos 100&percnt; do total de leitos UTI reportado por %s em %s. Para municípios, utilizamos os recursos da respectiva regional de saúde.</i>
        </div>
        """ % (
            str(
                int(config["br"]["simulacovid"]
                    ["resources_available_proportion"] * 100)),
            user_input["author_number_beds"],
            user_input["last_updated_number_beds"],
            user_input[
                "author_number_icu_beds"],  # remover na volta de projecao
            user_input[
                "last_updated_number_icu_beds"],  # remover na volta de projecao
        ),
        unsafe_allow_html=True,
    )

    # TODO: remove comment on this later!
    # utils.gen_pdf_report()

    # INDICATORS PLOTS
    if st.button("Confira a evolução de indicadores-chave"):
        opening_response = user_analytics.log_event("picked key_indicators",
                                                    dict())
        if st.button("Esconder"):
            pass
        st.write(
            f"""
            <div class="base-wrapper">
                    <span class="section-header primary-span">CÁLCULO DA TAXA DE CONTÁGIO EM {user_input["locality"]}</span>
                    <br><br>
                    <b>A taxa de contágio, conhecida como número de reprodução efetivo (Rt), traduz a dinâmica de disseminação da Covid-19 a cada dia.</b>
                    <br>O valor pode ser lido como o número médio de novas infecções diárias causadas por uma única pessoa infectada.
                    Para mais informações, visite a página de Modelos no menu lateral.
            </div>
            """,
            unsafe_allow_html=True,
        )

        try:
            fig2 = plots.plot_rt_wrapper(user_input[user_input["place_type"]],
                                         user_input["place_type"], config)
            st.plotly_chart(fig2, use_container_width=True)
        except:
            st.write(
                """<div class="base-wrapper"><b>Seu município, regional ou estado não possui mais de 30 dias de dados de casos confirmados.</b>""",
                unsafe_allow_html=True,
            )
        st.write(
            "<div class='base-wrapper'><i>Em breve:</i> gráficos de subnotificação e média móvel (últimos 7 dias) de novos casos por 100k habitantes.</div>",
            unsafe_allow_html=True,
        )

    utils.stylizeButton(
        name="Confira a evolução de indicadores-chave",
        style_string=
        """border: 1px solid var(--main-white);box-sizing: border-box;border-radius: 15px; width: auto;padding: 0.5em;text-transform: uppercase;font-family: var(--main-header-font-family);color: var(--main-white);background-color: var(--main-primary);font-weight: bold;text-align: center;text-decoration: none;font-size: 18px;animation-name: fadein;animation-duration: 3s;margin-top: 1em;""",
        session_state=session_state,
    )

    # AMBASSADOR SECTION
    utils.gen_ambassador_section()

    # PDF-REPORT GEN BUTTON
    # if st.button("Gerar Relatório PDF"):
    #     user_analytics.log_event("generated pdf")
    #     st.write(
    #         """<div class="base-wrapper">Aguarde um momento por favor...</div>""",
    #         unsafe_allow_html=True,
    #     )
    #     st.markdown(
    #         pdfgen.gen_pdf_report(user_input, indicators, data, config),
    #         unsafe_allow_html=True,
    #     )

    # TOOLS
    products = ProductCards

    utils.genProductsSection(products)

    # SELECTION BUTTONS
    # TODO: limpar esse código! está 100% repetido!!!
    if session_state.continuation_selection is None:
        session_state.continuation_selection = [False, False, False, False]

    simula_button_name = "Clique Aqui"  # Simula covid 0space
    saude_button_name = "Clique Aqui "  # Saude em ordem 1space
    distancia_button_name = "Clique_Aqui"  # Distanciamento social
    onda_button_name = "Clique_Aqui "  # onda covid
    if st.button(simula_button_name):  # SIMULA
        session_state.continuation_selection = [True, False, False, False]
    if st.button(distancia_button_name):  # DISTANCIAMENTO
        session_state.continuation_selection = [False, True, False, False]
    if st.button(saude_button_name):  # SAUDE
        session_state.continuation_selection = [False, False, True, False]
    if st.button(onda_button_name):  # ONDA
        session_state.continuation_selection = [False, False, False, True]

    utils.stylizeButton(
        name=simula_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 1},
    )

    utils.stylizeButton(
        name=distancia_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 2},
    )
    utils.stylizeButton(
        name=saude_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 3},
    )
    utils.stylizeButton(
        name=onda_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 4},
    )
    if session_state.continuation_selection[0]:
        user_analytics.safe_log_event(
            "picked simulacovid",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        # Downloading the saved data from memory
        sm.main(user_input, indicators, data, config, session_state)
        # TODO: remove comment on this later!
        # utils.gen_pdf_report()

    elif session_state.continuation_selection[1]:
        user_analytics.safe_log_event(
            "picked distanciamento",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        ds.main(user_input, indicators, data, config, session_state)

    elif session_state.continuation_selection[2]:
        user_analytics.safe_log_event(
            "picked saude_em_ordem",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        so.main(user_input, indicators, data, config, session_state)

    elif session_state.continuation_selection[3]:
        user_analytics.safe_log_event(
            "picked onda",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        oc.main(user_input, indicators, data, config, session_state)

    # CHAMA FUNCAO QUE GERA TABELA ID big_table
    # CALL FUNCTION TO GENERATE ID big_table
    gen_big_table(config, dfs, user_input["state_name"])
    # CHAMA FUNCOES DO UTILS PARA O FOOTER
    # CALL FUNCTIONS IN UTILS TO FOOTER
    utils.gen_whatsapp_button(config["impulso"]["contact"])
    utils.gen_footer()
    user_analytics.conclude_user_session(session_state)
示例#15
0
def genReferencesContainer(session_state):
    """ 
    This is a function that returns the "References" session

    Parameters: 
        session_state (type): section dataset
              
    """
    st.write(
        f"""
        <div class="container main-padding"></div>
        """,
        unsafe_allow_html=True,
    )
    with st.beta_expander("Fontes e Referências"):
        user_analytics = amplitude.gen_user(utils.get_server_session())
        opening_response = user_analytics.safe_log_event("clicked fontes",
                                                         session_state,
                                                         is_new_page=True)
        st.write(
            f"""
        <div class="container main-padding">
            <div class="title-section">
                <img class="square" src="https://i.imgur.com/gGIFS5N.png">Fontes e Referências
            </div><br>
            <div class="table-responsive">
            <table>
                <thead>
                    <tr>
                        <th>Título</th>
                        <th>Fonte</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td> Estratégias de reabertura das escolas durante a COVID-19 </td>
                        <td> <a href="https://publications.iadb.org/pt/estrategias-de-reabertura-das-escolas-durante-covid-19">
                            BID
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> Orientações para Retomada Segura das Atividades Presenciais nas Escolas de Educação Básica no Contexto da Pandemia da COVID-19 </td>
                        <td> <a href="http://antigo.saude.gov.br/images/pdf/2020/September/18/doc-orientador-para-retomada-segura-das-escolas-no-contexto-da-covid-19.pdf">
                            Ministério da Saúde
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> Manual sobre Biossegurança para Reabertura de Escolas no Contexto da COVID-19 </td>
                        <td> <a href="https://portal.fiocruz.br/sites/portal.fiocruz.br/files/documentos/manualreabertura.pdf">
                            Fiocruz
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> Guia de Implementação de Protocolos de Retorno das Atividades Presenciais nas Escolas de Educação Básica </td>
                        <td> <a href="https://www.gov.br/mec/pt-br/assuntos/GuiaderetornodasAtividadesPresenciaisnaEducaoBsica.pdf">
                            Ministério da Educação
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> Considerations for school-related public health measures in the context of COVID-19 </td>
                        <td> <a href="https://apps.who.int/iris/handle/10665/334294">
                            Organização Mundial da Saúde
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> Manual de Protocolos de Saúde </td>
                        <td> <a href="http://www.educacao.am.gov.br/wp-content/uploads/2020/07/PROTOCOLOS-DE-SAuDE02.pdf">
                            Governo do Estado do Amazonas
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> Ferramenta de Planejamento e Cálculo de Custos de Preparações Alcoólicas para a Higiene das Mãos </td>
                        <td> <a href="https://proqualis.net/sites/proqualis.net/files/FerramentadePlanejamentoeClculodeCustosgrfica.pdf">
                            Proqualis
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> Segurança do paciente em serviços de saúde: limpeza e desinfecção de superfícies </td>
                        <td> <a href="https://www20.anvisa.gov.br/segurancadopaciente/images/documentos/ManualLimpezaeDesinfeccaofinal.pdf">
                            ANVISA
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> NOTA TÉCNICA Nº 47/2020/SEI/GIALI/GGFIS/DIRE4/ANVISA <br> Uso de luvas e máscaras em estabelecimentos da área de alimentos no contexto do enfrentamento ao COVID-19 </td>
                        <td> <a href="https://www.gov.br/anvisa/pt-br/arquivos-noticias-anvisa/310json-file-1">
                            ANVISA
                            </a>
                        </td>
                    </tr>
                    <tr>
                        <td> Appendix A – Risk-assessment for determining environmental cleaning method and frequency </td>
                        <td> <a href="https://www.cdc.gov/hai/prevent/resource-limited/risk-assessment.html">
                            Centers for Disease Control and Prevention
                            </a>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
        </div>
        """,
            unsafe_allow_html=True,
        )
示例#16
0
def main(session_state):
    #  ==== GOOGLE ANALYTICS SETUP ====
    GOOGLE_ANALYTICS_CODE = os.getenv("GOOGLE_ANALYTICS_CODE")
    if GOOGLE_ANALYTICS_CODE:
        import pathlib
        from bs4 import BeautifulSoup

        GA_JS = ("""
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());
        gtag('config', '%s');
        """ % GOOGLE_ANALYTICS_CODE)
        index_path = pathlib.Path(st.__file__).parent / "static" / "index.html"
        soup = BeautifulSoup(index_path.read_text(), features="lxml")
        if not soup.find(id="google-analytics-loader"):
            script_tag_import = soup.new_tag(
                "script",
                src="https://www.googletagmanager.com/gtag/js?id=%s" %
                GOOGLE_ANALYTICS_CODE,
            )
            soup.head.append(script_tag_import)
            script_tag_loader = soup.new_tag("script",
                                             id="google-analytics-loader")
            script_tag_loader.string = GA_JS
            soup.head.append(script_tag_loader)
            index_path.write_text(str(soup))
    # ====

    # Amplitude: Get user info
    user_analytics = amplitude.gen_user(utils.get_server_session())
    opening_response = user_analytics.safe_log_event("opened farol",
                                                     session_state,
                                                     is_new_page=True)

    utils.localCSS("style.css")

    utils.genHeroSection(
        title1="Farol",
        title2="Covid",
        subtitle="Entenda e controle a Covid-19 em sua cidade e estado.",
        logo="https://i.imgur.com/CkYDPR7.png",
        header=True)

    config = yaml.load(open("configs/config.yaml", "r"),
                       Loader=yaml.FullLoader)

    #TEMPORARY BANNER FC
    st.write(
        """
        <div>
            <div class="base-wrapper flex flex-column" style="background-color:#0090A7">
                <div class="white-span header p1" style="font-size:30px;">O FAROLCOVID ESTÁ DE CARA NOVA!</div>
                <span class="white-span">Aprimoramos a plataforma e adicionamos novas ferramentas para acompanhamento da crise da Covid-19 no Brasil. <b>Que tal explorar com a gente?</b></span>
                <br><div style="margin-top: 15px;"></div>
            <div>
                <a href="#novidades" class="info-btn">Entenda como navegar</a>
            </div>
            <div id="novidades" class="nov-modal-window">
                <div>
                    <a href="#" title="Close" class="info-btn-close" style="color: white;">&times</a>
                    <div style="margin: 10px 15px 15px 15px;">
                        <h1 class="primary-span">Saiba como cada ferramenta apoia a resposta ao coronavírus</h1>
                        <p class="darkblue-span uppercase"> <b>Farol Covid</b> </p>
                        <img class="img-modal" src=%s alt="Ícone Farol Covid">
                        <div>	
                            <p> Acompanhe as 4 dimensões:</p>
                            - Situação da Doença (número de novos casos por habitante);</br>
                            - Controle da Doença (ritmo de contágio)</br>
                            - Capacidade do sistema (número de leitos e capacidade UTI)</br>
                            - Confiança de dados (taxa de subnotificação)</br>
                            <p> E descubra o nível de alerta do estado, regional de saúde ou município.</p>
                        </div>
                        <div>
                        <p class="darkblue-span uppercase"> <b>SimulaCovid</b> </p>
                        <img class="img-modal" src=%s alt="Ícone SimulaCovid">	
                        <p style="height:100px;">Simule o que pode acontecer com o sistema de saúde local se o ritmo de contágio aumentar 
                            ou diminuir e planeje suas ações para evitar a sobrecarga hospitalar.</p>
                        </div>
                        <div>
                        <p class="darkblue-span uppercase"> <b>Distanciamento Social</b> </p>
                        <img class="img-modal" src=%s alt="Ícone Distanciamento Social">
                            <p style="height:100px;">Acompanhe a atualização diária do índice e descubra como está a circulação de pessoas 
                                e o distanciamento social no seu estado ou município.    
                            </p>
                        </div>
                        <div>
                        <p class="darkblue-span uppercase"> <b>Saúde em Ordem</b> </p>
                        <img class="img-modal" src=%s alt="Ícone Saúde em Ordem">
                        <p> Entenda quais atividades deveriam reabrir primeiro na sua região, considerando: </p>
                            - Segurança Sanitária: quais setores trazem menor risco de exposição à Covid-19 para os trabalhadores.</br>
                            - Contribuição Econômica: quais setores movimentam mais a economia daquele estado ou regional de saúde.</br>
                        <p> </p>
                        </div>
                        <div>
                        <p class="darkblue-span uppercase"> <b>Onda Covid</b> </p>
                        <img class="img-modal" src=%s alt="Ícone Onda Covid">
                        <p>Com base no número de óbitos de Covid-19 registrados, acompanhe se seu município já saiu do pico da doença. </p>
                        </div>
                    </div>
                </div>
            </div>
        </div>""" % (config["br"]["icons"]["farolcovid_logo"],
                     config["br"]["icons"]["simulacovid_logo"],
                     config["br"]["icons"]["distanciamentosocial_logo"],
                     config["br"]["icons"]["saudeemordem_logo"],
                     config["br"]["icons"]["ondacovid_logo"]),
        unsafe_allow_html=True,
    )

    st.write(
        """
    <div class="base-wrapper primary-span">
        <span class="section-header">Selecione seu estado ou município no mapa abaixo:</span>
    </div>""",
        unsafe_allow_html=True,
    )

    # GET DATA
    dfs = get_data(config)

    # REGION/CITY USER INPUT
    user_input = dict()
    user_input["state_name"] = st.selectbox("Estado",
                                            utils.filter_place(dfs, "state"))

    user_input["health_region_name"] = st.selectbox(
        "Região de Saúde",
        utils.filter_place(dfs,
                           "health_region",
                           state_name=user_input["state_name"]),
    )

    user_input["city_name"] = st.selectbox(
        "Município",
        utils.filter_place(
            dfs,
            "city",
            state_name=user_input["state_name"],
            health_region_name=user_input["health_region_name"],
        ),
    )

    changed_city = user_analytics.safe_log_event(
        "picked farol place",
        session_state,
        event_args={
            "state": user_input["state_name"],
            "city": user_input["city_name"]
        },
    )

    user_input, data = update_user_input_places(user_input, dfs, config)

    # GENERATE MAPS
    map_place_id = utils.Dictionary().get_state_alphabetical_id_by_name(
        user_input["state_name"])

    if os.getenv("IS_LOCAL") == "TRUE":
        map_url = config["br"]["api"]["mapserver_local"]
    else:
        map_url = config["br"]["api"]["mapserver_external"]

    st.write(
        f"""
    <div class="brazil-map-div">
        <div class="alert-levels-map-overlay">
        </div>
        <div>
        <iframe id="map" src="resources/iframe-gen.html?url={map_url}map-iframe?place_id=BR" class="map-br" scrolling="no">
        </iframe>
        </div>
    </div>
    """,
        unsafe_allow_html=True,
    )
    st.write(
        f"""
    <iframe id="map-state" src="resources/iframe-gen.html?url={map_url}map-iframe?place_id={map_place_id}" class="map-state" scrolling="no">
    </iframe>
    """,
        unsafe_allow_html=True,
    )
    st.write(
        f"""
        <div class="selectors-box" id="selectors-box">
        </div>
        <iframe src="resources/select-box-mover.html?place_id={user_input["state_name"]}{user_input["health_region_name"]}{user_input["city_name"]}" height="0px">
        </iframe>""",
        unsafe_allow_html=True,
    )

    # SOURCES PARAMS
    user_input = utils.get_sources(user_input, data, dfs["city"],
                                   ["beds", "icu_beds"])

    # POPULATION PARAMS
    try:
        user_input["population_params"] = {
            "N": int(data["population"].fillna(0).values[0]),
            "D": int(data["deaths"].fillna(0).values[0]),
            "I": int(data["active_cases"].fillna(0).values[0]),
            "I_confirmed": int(data["confirmed_cases"].fillna(0).values[0]),
            "I_compare": int(data["confirmed_cases"].fillna(0).values[0]),
        }
    except:
        user_input["population_params"] = {
            "N": int(data["population"].fillna(0).values[0]),
            "D": int(data["deaths"].fillna(0).values[0]),
            "I": 0,
            "I_confirmed": int(data["confirmed_cases"].fillna(0).values[0]),
            "I_compare": int(data["confirmed_cases"].fillna(0).values[0]),
        }

    user_input["Rt"] = {
        "best": data["rt_low_95"].values[0],
        "worst": data["rt_high_95"].values[0],
        "is_valid": data["rt_most_likely"].apply(str).values[0],
    }

    user_input["last_updated_cases"] = data[
        "last_updated_subnotification"].max()
    # Update session values to standard ones if changed city or opened page or reseted values
    if (session_state.state_name != user_input["state_name"]
            or session_state.health_region_name !=
            user_input["health_region_name"]
            or session_state.city_name != user_input["city_name"]
            or session_state.number_beds is None or session_state.reset):
        session_state.state_name = user_input["state_name"]
        session_state.health_region_name = user_input["health_region_name"]
        session_state.city_name = user_input["city_name"]

        session_state.state_num_id = user_input["state_num_id"]
        session_state.health_region_id = user_input["health_region_id"]
        session_state.city_id = user_input["city_id"]

        session_state.number_beds = int(
            user_input["number_beds"] *
            config["br"]["simulacovid"]["resources_available_proportion"])
        session_state.number_icu_beds = int(
            user_input["number_icu_beds"] *
            config["br"]["simulacovid"]["resources_available_proportion"])
        session_state.number_cases = user_input["population_params"][
            "I_confirmed"]
        session_state.number_deaths = user_input["population_params"]["D"]
        session_state.reset = True

    if data["confirmed_cases"].sum() == 0:
        st.write(
            f"""<div class="base-wrapper">
                    Seu município ou Região de Saúde ainda não possui casos reportados oficialmente. Portanto, simulamos como se o primeiro caso ocorresse hoje.
                    <br><br>Caso queria, você pode mudar esse número abaixo:
                </div>""",
            unsafe_allow_html=True,
        )

        user_input["population_params"]["I"] = 1

    else:
        infectious_period = (
            config["br"]["seir_parameters"]["severe_duration"] +
            config["br"]["seir_parameters"]["critical_duration"])
        placeholder_value_pls_solve_this = 0

    # DIMENSIONS CARDS
    dimensions = DimensionCards
    utils.genAnalysisDimmensionsSection(dimensions)

    # INDICATORS CARDS
    indicators = IndicatorCards

    indicators = update_indicators(indicators, data, config, user_input,
                                   session_state)

    data["overall_alert"] = data["overall_alert"].map(
        config["br"]["farolcovid"]["categories"])
    if "state" in user_input["place_type"]:
        # Add disclaimer to cities in state alert levels
        total_alert_regions = dfs["health_region"][
            dfs["health_region"]["state_num_id"] == data["state_num_id"].
            unique()[0]].assign(overall_alert=lambda df: df[
                "overall_alert"].map(config["br"]["farolcovid"]["categories"])
                                )["overall_alert"].value_counts()

        utils.genKPISection(
            place_type=user_input["place_type"],
            locality=user_input["locality"],
            alert=data["overall_alert"].values[0],
            indicators=indicators,
            n_colapse_regions=total_alert_regions[
                total_alert_regions.index.isin(["altíssimo", "alto"])].sum(),
        )

    else:
        utils.genKPISection(
            place_type=user_input["place_type"],
            locality=user_input["locality"],
            alert=data["overall_alert"].values[0],
            indicators=indicators,
        )

    # AVAILABLE CAPACITY DISCLAIMER
    st.write(
        """
        <div class='base-wrapper'>
            <i>* Utilizamos %s&percnt; da capacidade hospitalar reportada por %s em %s 
            para cálculo da projeção de dias para atingir capacidade máxima.<br><b>Para municípios, utilizamos os recursos da respectiva regional de saúde.</b>
            São considerados leitos os tipos: cirúrgicos, clínicos e hospital-dia. A capacidade de UTI é dada pelo total de leitos UTI Covid adulto.</i>
        </div>
        """ % (
            str(
                int(config["br"]["simulacovid"]
                    ["resources_available_proportion"] * 100)),
            user_input["author_number_beds"],
            user_input["last_updated_number_beds"],
        ),
        unsafe_allow_html=True,
    )

    # TODO: remove comment on this later!
    # utils.gen_pdf_report()

    # INDICATORS PLOTS
    if st.button("Confira a evolução de indicadores-chave"):
        opening_response = user_analytics.log_event("picked key_indicators",
                                                    dict())
        if st.button("Esconder"):
            pass
        st.write(
            f"""
            <div class="base-wrapper">
                    <span class="section-header primary-span">CÁLCULO DO RITMO DE CONTÁGIO EM {user_input["locality"]}</span>
                    <br><br>
                    O ritmo de contágio, conhecido como número de reprodução efetivo (Rt), traduz a dinâmica de disseminação do Covid a cada dia.
                    <br>O valor pode ser lido como o número médio de novas infecções diárias causadas por uma única pessoa infectada.
                    Para mais informações, visite a página de Metodologia.
            </div>
            """,
            unsafe_allow_html=True,
        )

        try:
            fig2 = plots.plot_rt_wrapper(user_input[user_input["place_type"]],
                                         user_input["place_type"])
            st.plotly_chart(fig2, use_container_width=True)
        except:
            st.write(
                """<div class="base-wrapper"><b>Seu município, regional ou estado não possui mais de 30 dias de dados de casos confirmados.</b>""",
                unsafe_allow_html=True,
            )
        st.write(
            "<div class='base-wrapper'><i>Em breve:</i> gráficos de subnotificação e média móvel de novos casos por 100k habitantes.</div>",
            unsafe_allow_html=True,
        )

    utils.stylizeButton(
        name="Confira a evolução de indicadores-chave",
        style_string=
        """border: 1px solid var(--main-white);box-sizing: border-box;border-radius: 15px; width: auto;padding: 0.5em;text-transform: uppercase;font-family: var(--main-header-font-family);color: var(--main-white);background-color: var(--main-primary);font-weight: bold;text-align: center;text-decoration: none;font-size: 18px;animation-name: fadein;animation-duration: 3s;margin-top: 1em;""",
        session_state=session_state,
    )

    # AMBASSADOR SECTION
    utils.gen_ambassador_section()

    # indicators["hospital_capacity"].left_display = user_input["number_beds"]
    # indicators["hospital_capacity"].right_display = user_input["number_icu_beds"]
    # indicators["subnotification_rate"].left_display = user_input["population_params"][
    # "D"
    # ]

    # PDF-REPORT GEN BUTTON
    # if st.button("Gerar Relatório PDF"):
    #     user_analytics.log_event("generated pdf")
    #     st.write(
    #         """<div class="base-wrapper">Aguarde um momento por favor...</div>""",
    #         unsafe_allow_html=True,
    #     )
    #     st.markdown(
    #         pdfgen.gen_pdf_report(user_input, indicators, data, config),
    #         unsafe_allow_html=True,
    #     )

    # TOOLS
    products = ProductCards
    # products[2].recommendation = f'Risco {data["overall_alert"].values[0]}'

    utils.genProductsSection(products)

    # SELECTION BUTTONS
    # TODO: limpar esse código! está 100% repetido!!!
    if session_state.continuation_selection is None:
        session_state.continuation_selection = [False, False, False, False]

    simula_button_name = "Clique Aqui"  # Simula covid 0space
    saude_button_name = "Clique Aqui "  # Saude em ordem 1space
    distancia_button_name = "Clique_Aqui"  # Distanciamento social
    onda_button_name = "Clique_Aqui "  # onda covid
    if st.button(simula_button_name):  # SIMULA
        session_state.continuation_selection = [True, False, False, False]
    if st.button(distancia_button_name):  # DISTANCIAMENTO
        session_state.continuation_selection = [False, True, False, False]
    if st.button(saude_button_name):  # SAUDE
        session_state.continuation_selection = [False, False, True, False]
    if st.button(onda_button_name):  # ONDA
        session_state.continuation_selection = [False, False, False, True]

    utils.stylizeButton(
        name=simula_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 1},
    )

    utils.stylizeButton(
        name=distancia_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 2},
    )
    utils.stylizeButton(
        name=saude_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 3},
    )
    utils.stylizeButton(
        name=onda_button_name,
        style_string="""border: 1px solid black;""",
        session_state=session_state,
        others={"ui_binSelect": 4},
    )
    if session_state.continuation_selection[0]:
        user_analytics.safe_log_event(
            "picked simulacovid",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        # Downloading the saved data from memory
        user_input["number_beds"] = session_state.number_beds
        user_input["number_icu_beds"] = session_state.number_icu_beds
        user_input["number_deaths"] = session_state.number_deaths
        user_input["number_cases"] = session_state.number_cases
        sm.main(user_input, indicators, data, config, session_state)
        # TODO: remove comment on this later!
        # utils.gen_pdf_report()

    elif session_state.continuation_selection[1]:
        user_analytics.safe_log_event(
            "picked distanciamento",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        ds.main(user_input, indicators, data, config, session_state)

    elif session_state.continuation_selection[2]:
        user_analytics.safe_log_event(
            "picked saude_em_ordem",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        so.main(user_input, indicators, data, config, session_state)

    elif session_state.continuation_selection[3]:
        user_analytics.safe_log_event(
            "picked onda",
            session_state,
            event_args={
                "state": session_state.state_name,
                "health_region": session_state.health_region_name,
                "city": session_state.city_name,
            },
            alternatives=[
                "picked saude_em_ordem",
                "picked simulacovid",
                "picked onda",
                "picked distanciamento",
            ],
        )
        oc.main(user_input, indicators, data, config, session_state)

    # BIG TABLE
    gen_big_table(config, dfs)
    # FOOTER
    utils.gen_whatsapp_button(config["impulso"]["contact"])
    utils.gen_footer()
    user_analytics.conclude_user_session(session_state)