import pandas as pd import plotly.express as px import streamlit as st from pathlib import Path from streamlit_extras.add_vertical_space import add_vertical_space from streamlit_extras.stylable_container import stylable_container st.title("Atualização de cadastro - UBS Flamengo") add_vertical_space(10) uploaded_file = st.sidebar.file_uploader("Adicione o arquivo Excel", type=".xlsx") if uploaded_file is not None: # Função para carregar e processar os dados @st.cache_data def load_data(file): df = pd.read_excel(file, sheet_name="ANALISE", engine='openpyxl') df["ATUALIZADO"] = pd.to_datetime(df["ATUALIZADO"], errors="coerce", dayfirst=True) df["Trimestre"] = df["ATUALIZADO"].dt.to_period("Q") df["Mês"] = df["ATUALIZADO"].dt.to_period("M") df["Semestre"] = df["ATUALIZADO"].dt.to_period("6M") df["RUA"] = df["RUA"].astype(str) return df df = load_data(uploaded_file) # CSS customizado para o tema escuro st.markdown( """ """, unsafe_allow_html=True, ) # Seleção de Rua, Ano e Granularidade col1, col2, col3, col4 = st.columns([1, 1, 1, 3]) with col1: rua_selecionada = st.selectbox("Selecione a Rua", sorted(df["RUA"].unique())) with col2: anos_disponiveis = sorted(df["ATUALIZADO"].dt.year.dropna().unique(), reverse=True) anos_disponiveis.insert(0, "Total") ano_selecionado = st.selectbox("Selecione o Ano", anos_disponiveis) with col3: granularidade = st.selectbox( "Selecione a Granularidade", ["Mensal", "Trimestral", "Semestral"] ) with col4: st.write('') # Filtragem de dados if ano_selecionado == "Total": dados_filtrados = df[df["RUA"] == rua_selecionada] else: dados_filtrados = df[ (df["RUA"] == rua_selecionada) & (df["ATUALIZADO"].dt.year == ano_selecionado) ] # Adicionar coluna de período baseado na granularidade if granularidade == "Mensal": dados_filtrados["Período"] = dados_filtrados["ATUALIZADO"].dt.strftime("%m-%Y") elif granularidade == "Trimestral": dados_filtrados["Período"] = ( dados_filtrados["ATUALIZADO"].dt.to_period("Q").astype(str) ) else: # Semestral dados_filtrados["Período"] = ( dados_filtrados["ATUALIZADO"].dt.to_period("6M").astype(str) ) # Função para criar scatter plot def create_scatter_plot(data, title): fig = px.scatter( data, x="ATUALIZADO", y="IDADE", color="Período", hover_data=["NOME", "ATUALIZADO", "Período"], title=title, color_discrete_sequence=px.colors.qualitative.Set3, ) fig.update_layout( xaxis_title="Período", yaxis_title="Idade", legend_title="Período", plot_bgcolor="#0e1117", paper_bgcolor="#0e1117", font=dict(color="#fafafa"), ) fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='#31333F', tickangle=45) fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='#31333F') return fig # Scatter plot principal st.subheader( f"Última Atualização na Rua {rua_selecionada} ({granularidade} - {ano_selecionado})" ) c1, c2 = st.columns([0.8, 0.2]) with c1: fig = create_scatter_plot(dados_filtrados, f"Pacientes Pendentes de Atualização - {rua_selecionada}") st.plotly_chart(fig, use_container_width=True) with c2: total_usuarios = len(dados_filtrados) st.dataframe(dados_filtrados[["NOME", "IDADE", "RUA", "NUM", "Período"]].sort_values(by="Período", ascending=True), hide_index=True) st.write(f"Total de usuários: {total_usuarios}") add_vertical_space() st.write('-----') add_vertical_space() c3, c4, c5 = st.columns([2, 2, 1]) with c3: st.markdown('') with c4: st.subheader("Análise por Faixa Etária") with c5: st.markdown('') co1, co2, co3 = st.columns([2, 2, 2]) with co1: with stylable_container( key="pueri", css_styles=""" img { width: 460px; height: 180px; overflow: hidden; position: relative; object-fit: cover; border-radius: 14px; /* Adiciona bordas arredondadas */ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */ } """, ): st.image("pueri.jpg") with co2: with stylable_container( key="prev", css_styles=""" img { width: 460px; height: 180px; overflow: hidden; position: relative; object-fit: cover; border-radius: 14px; /* Adiciona bordas arredondadas */ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */ } """, ): st.image("prev.jpg") with co3: with stylable_container( key="mamo", css_styles=""" img { width: 460px; height: 180px; overflow: hidden; position: relative; object-fit: cover; border-radius: 14px; /* Adiciona bordas arredondadas */ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */ } """, ): st.image("mamo.jpg") # Preventivo (25-64 anos) preventivo = dados_filtrados[ (dados_filtrados["IDADE"].between(25, 64)) & (dados_filtrados["SEXO"] == "F") ] st.markdown("### Preventivo (25-64 anos)") fig_preventivo = create_scatter_plot(preventivo, f"Preventivo - {rua_selecionada}") st.plotly_chart(fig_preventivo, use_container_width=True) col1, col2 = st.columns([0.4, 0.6]) with col1: st.dataframe( preventivo[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values( by="ATUALIZADO", ascending=False ), hide_index=True, ) with col2: st.markdown(f"#### Total de usuários: {len(preventivo)}") add_vertical_space() # Mamografia (50-69 anos) mamografia = dados_filtrados[ (dados_filtrados["IDADE"].between(50, 69)) & (dados_filtrados["SEXO"] == "F") ] st.markdown("### Mamografia (50-69 anos)") fig_mamografia = create_scatter_plot(mamografia, f"Mamografia - {rua_selecionada}") st.plotly_chart(fig_mamografia, use_container_width=True) col1, col2 = st.columns([0.4, 0.6]) with col1: st.dataframe( mamografia[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values( by="ATUALIZADO", ascending=False ), hide_index=True, ) with col2: st.markdown(f"#### Total de usuários: {len(mamografia)}") add_vertical_space() st.write('-----') add_vertical_space() st.markdown("### Crianças 0 - 2 anos e 0 - 4 anos.") # Crianças até 4 anos criancasdois = dados_filtrados[dados_filtrados["IDADE"] <= 2] criancasquatro = dados_filtrados[dados_filtrados["IDADE"] <= 4] on = st.toggle("Alterne para ver as crianças até dois anos ou até 4 anos.") if on: st.markdown("### Crianças até 2 anos") fig_criancasdois = create_scatter_plot(criancasdois, f"Crianças até 2 anos - {rua_selecionada}") st.plotly_chart(fig_criancasdois, use_container_width=True) col1, col2 = st.columns([0.4, 0.6]) with col1: st.dataframe( criancasdois[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values( by="ATUALIZADO", ascending=False ), hide_index=True, ) with col2: st.markdown(f"#### Total de usuários: {len(criancasdois)}") else: st.markdown("### Crianças até 4 anos") fig_criancasquatro = create_scatter_plot(criancasquatro, f"Crianças até 4 anos - {rua_selecionada}") st.plotly_chart(fig_criancasquatro, use_container_width=True) col1, col2 = st.columns([0.4, 0.6]) with col1: st.dataframe( criancasquatro[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values( by="ATUALIZADO", ascending=False ), hide_index=True, ) with col2: st.markdown(f"#### Total de usuários: {len(criancasquatro)}") st.write('-----------') # Percentage of updates by period st.subheader( f"Porcentagem de Atualizações por {granularidade} na Rua {rua_selecionada}" ) period_count = dados_filtrados["Período"].value_counts().sort_index() period_percent = (period_count / len(dados_filtrados)) * 100 period_data = pd.DataFrame( { "Período": period_count.index, "Porcentagem": period_percent.values.round(2), "Atualizações": period_count.values, } ) st.dataframe(period_data, hide_index=True) fig_period = px.bar( period_data, x="Período", y="Porcentagem", text="Atualizações", title=f"Porcentagem de Atualizações por {granularidade}", color="Porcentagem", color_continuous_scale="Viridis", ) fig_period.update_traces( texttemplate="%{text}", textposition="outside", hovertemplate="%{x}: %{y:.2f}%
Atualizações: %{text}", ) fig_period.update_layout( xaxis_title=granularidade, yaxis_title="Porcentagem", yaxis_tickformat=".2f", plot_bgcolor="white", ) fig_period.update_xaxes(showgrid=True, gridwidth=1, gridcolor="lightgray") fig_period.update_yaxes(showgrid=True, gridwidth=1, gridcolor="lightgray") st.plotly_chart(fig_period, use_container_width=True) else: st.markdown('# Insira o arquivo com os dados')