def main(user_input, indicators, data, config, session_state): utils.genHeroSection( title1="DISTANCIAMENTO", title2="SOCIAL", subtitle= "Explore o cumprimento de medidas de segurança sanitária na sua cidade.", logo="https://i.imgur.com/VkG1NLL.png", header=False) st.write( f""" <div class="base-wrapper"> <span class="section-header primary-span">TAXA DE ISOLAMENTO SOCIAL EM {user_input["locality"]}</span> <br><br> <div class="distanciamento-headercaption"> Percentual de smartphones que não deixou o local de residência, em cada dia, calculado pela inloco. Para mais informações, <a target="_blank" style="color:black;" href="https://mapabrasileirodacovid.inloco.com.br/pt/">veja aqui</a>. </div> </div> """, unsafe_allow_html=True, ) try: fig, final_y = plots.gen_social_dist_plots_state_session_wrapper( session_state) gen_cards(final_y) st.plotly_chart(fig, use_container_width=True) except Exception as e: st.write( """<div class="base-wrapper"><b>Seu município ou estado não possui mais de 30 dias de dados, ou não possui o índice calculado pela inloco.</b>""", unsafe_allow_html=True, ) st.write(e)
def main(user_input, indicators, data, config, session_state): utils.genHeroSection( title1="Onda", title2="Covid", subtitle="Veja e compare a evolução da curva de contágio da Covid-19 em sua cidade, estado ou país.", logo="https://i.imgur.com/Oy7IiGB.png", header=False ) # Prompt User to Select Heatmap Location view = st.selectbox("Selecione a sua visão", options=["Cidade", "Estado", "País"], index=1) # Load City/State/Country Heatmap if view == "Estado": load_states_heatmap(copy.deepcopy(loading_cached_states())) elif view == "Cidade": my_dict = utils.Dictionary() load_cities_heatmap(my_dict, session_state) elif view == "País": load_countries_heatmap(config)
def main(user_input, indicators, data, config, session_state): # TODO:o que isso faz?? st.write( '<meta name="viewport" content="width=device-width, initial-scale=1.0">', unsafe_allow_html=True, ) if ( session_state.saude_ordem_data == None ): # If not loaded, load the data we are going to use in the user database session_state.saude_ordem_data = { "slider_value": 70, "opened_tables": [True, True, True, True], "opened_detailed_view": False, } utils.genHeroSection( title1="Saúde", title2="Em Ordem", subtitle="Contribuindo para uma retomada segura da economia.", logo="https://i.imgur.com/FiNi6fy.png", header=False) gen_intro(alert=data["overall_alert"].values[0]) gen_slider(session_state) score_groups, economic_data, place_name = get_score_groups( config, session_state, session_state.saude_ordem_data["slider_value"]) gen_illustrative_plot(score_groups, session_state, place_name) gen_detailed_vision(economic_data, session_state, config) gen_sector_tables( session_state, score_groups, config, default_size=5, download=True, econ_data=economic_data, download_name=place_name, ) gen_protocols_section() gen_partners_section()
def main(): session_state = session.SessionState.get( update=False, number_beds=None, number_ventilators=None, deaths=None, cases=None, state="Acre", city="Todos", refresh=False, ) utils.localCSS("style.css") utils.genHeroSection( "Farol", "Entenda e controle a Covid-19 em sua cidade e estado." ) # GET DATA config = yaml.load(open("configs/config.yaml", "r"), Loader=yaml.FullLoader) df_cities, df_states = get_data(config) # REGION/CITY USER INPUT user_input = dict() user_input["state_name"] = st.selectbox( "Estado", df_cities["state_name"].sort_values().unique() ) user_input["city_name"] = st.selectbox( "Município", utils.add_all( df_cities[df_cities["state_name"] == user_input["state_name"]][ "city_name" ].unique() ), ) user_input, data = filter_options(user_input, df_cities, df_states, config) # SOURCES PARAMS user_input = utils.get_sources(user_input, data, df_cities, ["beds", "ventilators"]) print(user_input["number_ventilators"], user_input["number_beds"]) # POPULATION PARAMS 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]), } user_input["last_updated_cases"] = data["last_updated_subnotification"].max() if data["confirmed_cases"].sum() == 0: st.write( f"""<div class="base-wrapper"> Seu município ou regional 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"] ) st.write( f"""<div class="base-wrapper"> O número de casos confirmados oficialmente no seu município ou estado é de {int(data['confirmed_cases'].sum())} em {pd.to_datetime(data["data_last_refreshed"].values[0]).strftime("%d/%m/%Y")}. Dada a progressão clínica da doença (em média, {infectious_period} dias) e a taxa de notificação ajustada para o município ou estado de ({int(100*data['notification_rate'].values[0])}%), <b>estimamos que o número de casos ativos é de {int(data['active_cases'].sum())}</b>.<br> <br>Caso queria, você pode mudar esse número para a simulação abaixo: </div>""", unsafe_allow_html=True, ) # INDICATORS CARDS indicators = IndicatorCards indicators = update_indicators(indicators, data, config, user_input, session_state) utils.genKPISection( place_type=user_input["place_type"], locality=user_input["locality"], alert=data["overall_alert"].values[0], indicators=indicators, ) # SPACE AFTER CARDS st.write("<div class='base-wrapper product-section'></div>", unsafe_allow_html=True) st.write( """ <div class='base-wrapper'> <i>* Utilizamos 50% da capacidade hospitalar reportada por %s em %s (leitos) e %s em %s (ventiladores) para o cálculo da projeção de dias para atingir a capacidade máxima. Caso tenha dados mais atuais, sugerimos que mude os valores e refaça essa estimação abaixo.</i> </div> """ % ( user_input["author_number_beds"], user_input["last_updated_number_beds"], user_input["author_number_ventilators"], user_input["last_updated_number_ventilators"], ), unsafe_allow_html=True, ) if st.button("Confira a evolução de indicadores-chave"): if st.button("Esconder"): pass st.write( f""" <div class="base-wrapper"> <span class="section-header primary-span">TAXA DE ISOLAMENTO SOCIAL EM {user_input["locality"]}</span> <br><br> Percentual de smartphones que não deixou o local de residência, em cada dia, calculado pela inloco. Para mais informações, <a target="_blank" style="color:#3E758A;" href="https://mapabrasileirodacovid.inloco.com.br/pt/">veja aqui</a>. </div> """, unsafe_allow_html=True, ) if user_input["city_id"]: locality_id = user_input["city_id"] else: df_state_mapping = pd.read_csv("./configs/states_table.csv") locality_id = df_state_mapping.loc[ df_state_mapping["state_name"] == data["state_name"].values[0] ].iloc[0]["state_num_id"] try: fig = plts.gen_social_dist_plots_placeid(locality_id) st.plotly_chart(fig, use_container_width=True) except: st.write("Seu município ou estado não possui mais de 30 dias de dado.") 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 = plts.plot_rt_wrapper(locality_id) st.plotly_chart(fig2, use_container_width=True) except: st.write("Seu município ou estado não possui mais de 30 dias de dado.") st.write( "<div class='base-wrapper'><i>Em breve:</i> gráficos de subnotificação.</div>", unsafe_allow_html=True, ) # CHANGE DATA SECTION utils.genInputCustomizationSectionHeader(user_input["locality"]) user_input, session_state = utils.genInputFields(user_input, config, session_state) if session_state.update: session_state.refresh = True session_state.update = False session.rerun() # AMBASSADOR SECTION utils.genAmbassadorSection() indicators["hospital_capacity"].left_display = user_input["number_beds"] indicators["hospital_capacity"].right_display = user_input["number_ventilators"] indicators["subnotification_rate"].left_display = user_input["population_params"][ "D" ] # TOOLS products = ProductCards products[1].recommendation = f'Risco {data["overall_alert"].values[0]}' utils.genProductsSection(products) product = st.selectbox( "", [ "Como você gostaria de prosseguir?", "SimulaCovid", "Saúde em Ordem (em breve)", ], ) if product == "SimulaCovid": sm.main(user_input, indicators, data, config, session_state) elif product == "Saúde em Ordem (em breve)": pass st.write( """ <div class="base-wrapper"> 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 target="_blank" style="color:#3E758A;" href="https://coronacidades.org/fale-conosco/"><b>Entre em contato conosco</a> </div> """, unsafe_allow_html=True, )
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<=3.7</span></td> <td class="light-yellow-bg bold"><span>3.7<x<=12.5</span></td> <td class="light-orange-bg bold"><span>12.5<=x<=27.4</span></td> <td class="light-red-bg bold"><span>x >= 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><0.5</span></td> <td class="light-yellow-bg bold"><span><0.5 - 1></span></td> <td class="light-orange-bg bold"><span><1 - 1.2></span> </td> <td class="light-red-bg bold"><span>>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>=x>0</span></td> <td class="light-yellow-bg bold"><span>6>=x>4</span></td> <td class="light-orange-bg bold"><span>7>=x>6</span></td> <td class="light-red-bg bold"><span>10>=x>=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, )
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% 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% 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)
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 item.", 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, ) 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, )
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), )
def main(): """ This function generates Escola Segura webpage Parameters: session_state (type): section dataset """ if os.getenv("IS_HEROKU") == "TRUE": urlpath = os.getenv("urlpath") else: urlpath = 'https://escolasegura.coronacidades.org/' GOOGLE_ANALYTICS_CODE = "UA-161606940-3" import pathlib from bs4 import BeautifulSoup TAG_MANAGER = """ function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5ZZ5F66'); """ 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) script_tag_manager = soup.new_tag("script", id="google-tag-manager") script_tag_manager.string = TAG_MANAGER soup.head.append(script_tag_manager) script_tag_manager_body = soup.new_tag( "script", src="https://www.googletagmanager.com/gtm.js?id=GTM-5ZZ5F66") soup.head.append(script_tag_manager_body) index_path.write_text(str(soup)) utils.localCSS("inicio.css") utils.localCSS("localCSS.css") utils.genHeroSection( title1="Escola", title2="Segura", header=True, ) utils.appdescription( title= "A Escola Segura foi criada para apoiar integrantes de secretarias de educação e gestores escolares de todo o Brasil na retomada de atividades presenciais em escolas da rede pública, após o fechamento provocado pela Covid-19. Em 10 passos, mostramos como preparar e gerir o retorno escolar e oferecemos ferramentas para apoiar as etapas desse processo. Queremos contribuir para uma retomada segura das aulas presenciais e reduzir os prejuízos que o fechamento das escolas tem trazido ao aprendizado de milhões de estudantes brasileiros.", subtitle="") # utils.gen_title(title="Como <b>retomar</b> as atividades presenciais?", subtitle="") title = "Siga 10 passos para reabrir escolas com segurança!" sub = "Priorize os passos de acordo com a realidade da sua rede de ensino. É importante seguir todas as recomendações para garantir uma reabertura mais segura. " st.write( f""" <div class="conteudo row" style="margin-top:50px; margin-right:0px; margin-left:0px;"> <div class="card-plan" style="width:100%;"> <div> <div style="font-size:1.3rem; padding:5px; text-align: center; border-top-right-radius: 0.8rem; border-top-left-radius: 0.8rem; background:#2b14ff; color:white;"> {title} </div> <div style="margin:10px"> <div class="card-title"> {sub} </div> <div> <div align="center" style="padding-top:15px; padding-bottom: 15px;"> <a href='{urlpath}?page=guia10passos' target="_self"> <button class="button"; style="border-radius: 0.8rem;">Conheça os passos ></button><br> </a> </div> </div> </div> </div> </div> </div> """, unsafe_allow_html=True, ) # utils.gen_title(title="Como podemos te <b>ajudar</b>?", subtitle="") simulador = "Simule o retorno" simuladorsub = "Informe os dados da sua rede ou escola e calcule quantas turmas podem voltar em segurança e quais materiais você precisa providenciar." title1 = "Quem Somos" sub1 = "Reunimos organizações atuantes nas áreas de educação, saúde e análise de dados para criar este conteúdo técnico, fundamentado em fontes nacionais e internacionais, para apoiar gestores escolares neste desafio." title2 = "Dúvidas Frequentes" sub2 = "Saiba o que outros gestores e gestoras públicos já perguntaram sobre o desafio da retomada das atividades presenciais em escolas." # title3="Quem Somos" # sub3="Saiba mais sobre os envolvidos e o desenvolvimento da plataforma." st.write( f""" <div class="conteudo row" style="margin-top: 30px; margin-right:0px; margin-left:0px;"> <div class="card-plan" style="width:100%;"> <div> <div style="font-size:1.3rem; padding:5px; text-align: center; border-top-right-radius: 0.8rem; border-top-left-radius: 0.8rem; background:#2b14ff; color:white;"> {simulador} </div> <div style="margin:10px"> <div class="card-title"> {simuladorsub} </div> <div> <div align="center" style="padding-top:15px; padding-bottom: 15px;"> <a href='{urlpath}?page=simulation' target="_self"> <button class="button"; style="border-radius: 0.8rem;">Simule já ></button><br> </a> </div> </div> </div> </div> </div> </div> <div class="conteudo row" style="margin-right:0px; margin-left:0px;"> <div class="col card-plan" style="width:100%; margin-top:15px; margin-botton:15px;"> <div> <div style="font-size:1.3rem; padding:5px; text-align: center; border-top-right-radius: 0.8rem; border-top-left-radius: 0.8rem; background:#7ACCA9; color:white;"> {title1} </div> <div style="margin:10px"> <div class="card-title"> {sub1} </div> <div> <div align="center" style="padding-top:15px; padding-bottom: 15px;"> <a href='{urlpath}?page=sobre' target="_self"> <button class="button"; style="border-radius: 0.8rem;">Saiba mais ></button><br> </a> </div> </div> </div> </div> </div> <div class="col card-plan" style="width:100%; margin-top:15px; margin-botton:15px;"> <div> <div style="font-size:1.3rem; padding:5px; text-align: center; border-top-right-radius: 0.8rem; border-top-left-radius: 0.8rem; background:#7ACCA9; color:white;"> {title2} </div> <div style="margin:10px"> <div class="card-title"> {sub2} <br><br> </div> <div> <div align="center" style="padding-top:15px; padding-bottom: 15px;"> <a href='{urlpath}?page=duvidasfrequentes' target="_self"> <button class="button"; style="border-radius: 0.8rem;">Confira ></button><br> </a> </div> </div> </div> </div> </div> </div> <br> """, unsafe_allow_html=True, ) tm.genTermo() foo.genFooter()
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"> Veja aqui! </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"> Ler aqui! </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% 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% 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% 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)
def main(): utils.localCSS("style.css") utils.localCSS("icons.css") # HEADER utils.genHeroSection() utils.genVideoTutorial() # GET DATA config = yaml.load(open('configs/config.yaml', 'r'), Loader=yaml.FullLoader) # if abs(datetime.now().minute - FIXED) > config['refresh_rate']: # caching.clear_cache() cities = loader.read_data('br', config, refresh_rate=refresh_rate(config)) # REGION/CITY USER INPUT user_input = dict() utils.genStateInputSectionHeader() user_input['state'] = st.selectbox('Estado', add_all(cities['state_name'].unique())) cities_filtered = filter_options(cities, user_input['state'], 'state_name') utils.genMunicipalityInputSection() user_input['region'] = st.selectbox( 'Região SUS', add_all(cities_filtered['health_system_region'].unique())) cities_filtered = filter_options(cities_filtered, user_input['region'], 'health_system_region') user_input['city'] = st.selectbox( 'Município', add_all(cities_filtered['city_name'].unique())) cities_filtered = filter_options(cities_filtered, user_input['city'], 'city_name') sources = cities_filtered[[ c for c in cities_filtered.columns if (('author' in c) or ('last_updated_' in c)) ]] selected_region = cities_filtered.sum(numeric_only=True) # GET LAST UPDATE DATE if not np.all(cities_filtered['last_updated'].isna()): last_update_cases = cities_filtered['last_updated'].max().strftime( '%d/%m') # GET NOTIFICATION RATE if len(cities_filtered ) > 1: # pega taxa do estado quando +1 municipio selecionado notification_rate = round( cities_filtered['state_notification_rate'].mean(), 4) else: notification_rate = round( cities_filtered['notification_rate'].values[0], 4) # pick locality according to hierarchy locality = choose_place(user_input['city'], user_input['region'], user_input['state']) st.write('<br/>', unsafe_allow_html=True) utils.genInputCustomizationSectionHeader(locality) # SOURCES USER INPUT source_beds = sources[['author_number_beds', 'last_updated_number_beds']].drop_duplicates() authors_beds = source_beds.author_number_beds.str.cat(sep=', ') source_ventilators = sources[[ 'author_number_ventilators', 'last_updated_number_ventilators' ]].drop_duplicates() authors_ventilators = source_ventilators.author_number_ventilators.str.cat( sep=', ') if locality == 'Brasil': authors_beds = 'SUS e Embaixadores' authors_ventilators = 'SUS e Embaixadores' user_input['n_beds'] = st.number_input( f"Número de leitos destinados aos pacientes com Covid-19 (fonte: {authors_beds}, atualizado: {source_beds.last_updated_number_beds.max().strftime('%d/%m')})", 0, None, int(selected_region['number_beds'])) user_input['n_ventilators'] = st.number_input( f"Número de ventiladores destinados aos pacientes com Covid-19 (fonte: {authors_ventilators}, atualizado: {source_ventilators.last_updated_number_ventilators.max().strftime('%d/%m')}):", 0, None, int(selected_region['number_ventilators'])) # POP USER INPUTS user_input['population_params'] = {'N': int(selected_region['population'])} user_input['population_params']['D'] = st.number_input( 'Mortes confirmadas:', 0, None, int(selected_region['deaths'])) # get infected cases infectious_period = config['br']['seir_parameters'][ 'severe_duration'] + config['br']['seir_parameters'][ 'critical_duration'] if selected_region['confirmed_cases'] == 0: st.write(f'''<div class="base-wrapper"> Seu município ou regional 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'] = st.number_input( 'Casos ativos estimados:', 0, None, 1) else: user_input['population_params']['I'] = int( selected_region['infectious_period_cases'] / notification_rate) st.write(f'''<div class="base-wrapper"> O número de casos confirmados oficialmente no seu município ou regional de saúde é de {int(selected_region['confirmed_cases'].sum())} em {last_update_cases}. Dada a progressão clínica da doença (em média, {infectious_period} dias) e a taxa de notificação ajustada para a região ({int(100*notification_rate)}%), <b>estimamos que o número de casos ativos é de {user_input['population_params']['I']}</b>. <br><br>Caso queria, você pode mudar esse número para a simulação abaixo: </div>''', unsafe_allow_html=True) user_input['population_params']['I'] = st.number_input( 'Casos ativos estimados:', 0, None, user_input['population_params']['I']) # calculate recovered cases user_input = calculate_recovered(user_input, selected_region, notification_rate) # AMBASSADOR SECTION utils.genAmbassadorSection() st.write('<br/>', unsafe_allow_html=True) # DEFAULT WORST SCENARIO user_input['strategy'] = {'isolation': 90, 'lockdown': 90} user_input['population_params']['I'] = [ user_input['population_params']['I'] if user_input['population_params']['I'] != 0 else 1 ][0] _, dday_beds, dday_ventilators = simulator.run_evolution( user_input, config) worst_case = SimulatorOutput( color=BackgroundColor.GREY_GRADIENT, min_range_beds=dday_beds['worst'], max_range_beds=dday_beds['best'], min_range_ventilators=dday_ventilators['worst'], max_range_ventilators=dday_ventilators['best']) # DEFAULT BEST SCENARIO user_input['strategy'] = {'isolation': 0, 'lockdown': 90} _, dday_beds, dday_ventilators = simulator.run_evolution( user_input, config) best_case = SimulatorOutput( color=BackgroundColor.LIGHT_BLUE_GRADIENT, min_range_beds=dday_beds['worst'], max_range_beds=dday_beds['best'], min_range_ventilators=dday_ventilators['worst'], max_range_ventilators=dday_ventilators['best']) resources = ResourceAvailability(locality=locality, cases=selected_region['active_cases'], deaths=selected_region['deaths'], beds=user_input['n_beds'], ventilators=user_input['n_ventilators']) utils.genSimulationSection(int(user_input['population_params']['I']), locality, resources, worst_case, best_case) utils.genActNowSection(locality, worst_case) utils.genStrategiesSection(Strategies) st.write(''' <div class="base-wrapper"> <span class="section-header primary-span">Etapa 4: Simule o resultado de possíveis intervenções</span> <br /> <span>Agora é a hora de planejar como você pode melhor se preparar para evitar a sobrecarga hospitalar. Veja como mudanças na estratégia adotada afetam a necessidade de internação em leitos.</span> </div>''', unsafe_allow_html=True) user_input['strategy']['isolation'] = st.slider( 'Em quantos dias você quer acionar a Estratégia 2, medidas restritivas? (deixe como 0 se a medida já estiver em vigor)', 0, 90, 0, key='strategy2') user_input['strategy']['lockdown'] = st.slider( 'Em quantos dias você quer acionar a Estratégia 3, quarentena?', 0, 90, 90, key='strategy3') st.write('<br/><br/>', unsafe_allow_html=True) # SIMULATOR SCENARIOS: BEDS & RESPIRATORS fig, dday_beds, dday_ventilators = simulator.run_evolution( user_input, config) utils.genChartSimulationSection( user_input['strategy']['isolation'], user_input['strategy']['lockdown'], SimulatorOutput(color=BackgroundColor.SIMULATOR_CARD_BG, min_range_beds=dday_beds['worst'], max_range_beds=dday_beds['best'], min_range_ventilators=dday_ventilators['worst'], max_range_ventilators=dday_ventilators['best']), fig) utils.genWhatsappButton() utils.genFooter()
def main(user_input, indicators, data, config, session_state): utils.genHeroSection( title1="Onda", title2="Covid", subtitle= "Veja e compare a evolução da curva de contágio da Covid-19 em seu estado ou município.", logo="https://i.imgur.com/Oy7IiGB.png", header=False) try: # load data # print("loading br cases") br_cases = loading_cached() # print("finished laoding br cases") my_dict = utils.Dictionary() # ONDA POR ESTADO da.prepare_heatmap(br_cases, place_type="state_id") st.write("") pass except Exception as e: st.write(str(e)) # ONDA POR MUNICIPIO st.write( """ <div class="base-wrapper"> <span class="section-header primary-span">ONDA MORTES DIÁRIAS POR MUNICÍPIO</span> <br><br> <span class="ambassador-question"><b>Selecione seu estado e município para prosseguir</b></span> </div>""", unsafe_allow_html=True, ) dfs, places_ids = get_data(loader.config) state_name = st.selectbox("Estado ", utils.filter_place(dfs, "state")) city_name = st.selectbox( "Município ", utils.filter_place(dfs, "city", state_name=state_name, health_region_name="Todos"), ) deaths_or_cases = (st.selectbox( "Qual análise você quer ver: Número de mortes ou Taxa de letalidade (mortes por casos)?", ["Mortes", "Letalidade"]) == "Mortes por casos") # print("checking") if city_name != "Todos": # the user selected something # print("passed") br_cases = br_cases[br_cases["state_name"] == state_name] # .reset_index() # gen_banners() uf = my_dict.get_state_alphabetical_id_by_name(state_name) da.prepare_heatmap( br_cases, place_type="city_name", group=uf, your_city=city_name, deaths_per_cases=deaths_or_cases, ) # print("finished preparation") # ONDA POR PAÍS st.write("") da.prepare_heatmap( loader.read_data( "br", loader.config, endpoint=config["br"]["api"]["endpoints"]["analysis"]["owid"], ), place_type="country_pt", )
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;">×</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% 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)
def main(session_state): """ This is a function that returns the "about" page Parameters: session_state (type): section dataset """ utils.localCSS("style.css") utils.genHeroSection( title1="Escola", title2="Segura", header=True, ) st.write( f""" <div class="container main-padding"> <div class="text-title-section bold"> Quem somos? </div> <div class="minor-padding"> <span class="text-card-section main-orange-span"> Impulso </span> <br> <span> A Impulso é uma organização não governamental com a missão auxiliar governos na melhora da entrega de serviços públicos de saúde à população através do uso de dados e tecnologia, apoiando o processo de tomada de decisão e visando o aprimoramento contínuo de políticas públicas. Foi fundada em 2019 e é uma das idealizadoras da plataforma <a target="_blank" href="https://coronacidades.org/">CoronaCidades.org</a>. </span> </div><br> <div class="minor-padding"> <span class="text-card-section main-orange-span" style="font-size: 20px;">Banco Interamericano de Desenvolvimento</span> <br> <span> O Banco Interamericano de Desenvolvimento tem como missão melhorar vidas. Criado em 1959, o BID é uma das principais fontes de financiamento de longo prazo para o desenvolvimento econômico, social e institucional da América Latina e do Caribe. O BID também realiza projetos de pesquisas de vanguarda e oferece assessoria sobre políticas, assistência técnica e capacitação a clientes públicos e privados em toda a região. </span> </div><br> <div class="minor-padding"> <span class="text-card-section main-orange-span" style="font-size: 20px;">Fundação Lemann</span> <br> <span> A Fundação Lemann acredita que um Brasil feito por todos e para todos é um Brasil que acredita no seu maior potencial: gente. Isso só acontece com educação de qualidade e com o apoio a pessoas que querem resolver os grandes desafios sociais do país. Nós realizamos projetos ao lado de professores, gestores escolares, secretarias de educação e governos por uma aprendizagem de qualidade. Também apoiamos centenas de talentos, lideranças e organizações que trabalham pela transformação social. Tudo para ajudar a construir um país mais justo, inclusivo e avançado. Saiba mais em: <a target="_blank" href="fundacaolemann.org.br">fundacaolemann.org.br</a> </span> </div><br> <div class="minor-padding"> <span class="text-card-section main-orange-span" style="font-size: 20px;">Imaginable Futures</span> <br> <span> Imaginable Futures é uma empresa de investimento filantrópico global que acredita que a aprendizagem tem o poder de estimular o potencial humano e tem como missão oferecer a cada aluno oportunidades e ferramentas para que eles imaginem e realizem um futuro brilhante. Com compromisso com a parceria e a cocriação, a organização está capacitando alunos, famílias e comunidades para serem os agentes que moldam o futuro. A Imaginable Futures é um empreendimento do The Omidyar Group, fundada e financiada por Pierre e Pam Omidyar. </span> </div><br> <div class="minor-padding"> <span class="text-card-section main-orange-span" style="font-size: 20px;">Programa Formar</span> <br> <span> O programa Formar foi concebido na Fundação Lemann e atua em parceria com redes públicas de educação em todo o Brasil. Sua gestão é feita por uma equipe multidisciplinar de consultores e especialistas que buscam o aprimoramento da gestão pedagógica e administrativa, a partir do engajamento de dirigentes e equipes gestoras das secretarias e escolas que compõem os sistemas de educação. Buscam também estimular a adoção de políticas públicas perenes que contribuam na melhoria do processo de aprendizagem juntamente com professores e estudantes. </span> </div><br> </div> """, unsafe_allow_html=True, )