Spaces:
Running
Running
drguilhermeapolinario
commited on
Update app.py
Browse files
app.py
CHANGED
@@ -15,7 +15,7 @@ from streamlit_extras.stylable_container import stylable_container
|
|
15 |
from streamlit_folium import folium_static
|
16 |
from streamlit_option_menu import option_menu
|
17 |
|
18 |
-
from data_cleaning import criar_dataframe, iniciar,
|
19 |
|
20 |
st.set_page_config(
|
21 |
page_title="Dashboard UBS Flamengo",
|
@@ -43,60 +43,67 @@ def processar_arquivo(file):
|
|
43 |
|
44 |
|
45 |
# Inicializar variáveis dos DataFrames como None
|
|
|
|
|
46 |
DF_IDADE = None
|
47 |
DF_GENERO = None
|
48 |
DF_COR = None
|
49 |
DF_DEFICIENCIA = None
|
50 |
DF_DOENCAS = None
|
|
|
|
|
51 |
|
52 |
# Upload de arquivo CSV na barra lateral
|
53 |
uploaded_file = st.sidebar.file_uploader("Escolha um arquivo CSV", type="csv")
|
54 |
|
|
|
|
|
|
|
|
|
|
|
55 |
if uploaded_file is not None:
|
56 |
dataframes = processar_arquivo(uploaded_file)
|
57 |
|
58 |
# Atribuir os DataFrames a variáveis específicas para uso posterior
|
|
|
|
|
59 |
DF_IDADE = dataframes.get("Idade")
|
60 |
DF_GENERO = dataframes.get("genero")
|
61 |
DF_COR = dataframes.get("cor")
|
62 |
DF_DEFICIENCIA = dataframes.get("deficiencia")
|
63 |
DF_DOENCAS = dataframes.get("doencas")
|
|
|
|
|
64 |
|
65 |
# Aplicar capitalização à coluna "Descrição" em cada DataFrame
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
if DF_GENERO is not None:
|
70 |
-
DF_GENERO["Descrição"] = DF_GENERO["Descrição"].str.capitalize()
|
71 |
-
|
72 |
-
if DF_COR is not None:
|
73 |
-
DF_COR["Descrição"] = DF_COR["Descrição"].str.capitalize()
|
74 |
-
|
75 |
-
if DF_DEFICIENCIA is not None:
|
76 |
-
DF_DEFICIENCIA["Descrição"] = DF_DEFICIENCIA["Descrição"].str.capitalize()
|
77 |
-
|
78 |
-
if DF_DOENCAS is not None:
|
79 |
-
DF_DOENCAS["Descrição"] = DF_DOENCAS["Descrição"].str.capitalize()
|
80 |
else:
|
81 |
st.sidebar.info("Adicione um arquivo .csv.")
|
82 |
|
83 |
-
|
84 |
def gerar_resumo_df():
|
85 |
"""
|
86 |
Generates a summary of the dataframes.
|
87 |
-
|
88 |
This function iterates over the local and global variables to check if any of them
|
89 |
-
are named "DF_IDADE", "DF_GENERO", "DF_COR", "DF_DEFICIENCIA",
|
|
|
90 |
If a dataframe is found, it generates a summary of the dataframe by printing its
|
91 |
column names and the count of each unique value in the "Descrição" column.
|
92 |
-
|
93 |
Returns:
|
94 |
str: A string containing the summary of the dataframes.
|
95 |
"""
|
96 |
resumo = ""
|
97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
if "DF_IDADE" in locals() or "DF_IDADE" in globals():
|
99 |
-
# Assumindo que DF_IDADE tem colunas 'Faixa_Etaria', 'Masculino', 'Feminino'
|
100 |
resumo += "Resumo DF_IDADE:\n"
|
101 |
resumo += DF_IDADE.to_string(index=False) + "\n\n"
|
102 |
|
@@ -107,15 +114,22 @@ def gerar_resumo_df():
|
|
107 |
resumo += f"Resumo DF_COR:\n{DF_COR.value_counts().to_string()}\n\n"
|
108 |
|
109 |
if "DF_DEFICIENCIA" in locals() or "DF_DEFICIENCIA" in globals():
|
110 |
-
resumo += (
|
111 |
-
f"Resumo DF_DEFICIENCIA:\n{DF_DEFICIENCIA.value_counts().to_string()}\n\n"
|
112 |
-
)
|
113 |
|
114 |
if "DF_DOENCAS" in locals() or "DF_DOENCAS" in globals():
|
115 |
resumo += f"Resumo DF_DOENCAS:\n{DF_DOENCAS.value_counts().to_string()}\n\n"
|
116 |
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
return resumo
|
118 |
|
|
|
|
|
|
|
119 |
|
120 |
#######################################
|
121 |
#######################################
|
@@ -289,22 +303,50 @@ st.markdown(
|
|
289 |
## Dados de saúde Relatório de cadastro individual.
|
290 |
"""
|
291 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
292 |
|
293 |
|
294 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
295 |
def criar_grafico_personalizado(df, x_col, y_col, titulo):
|
296 |
"""
|
297 |
Generates a custom bar chart using Plotly Express.
|
298 |
-
|
299 |
Args:
|
300 |
df (pandas.DataFrame): The input dataframe.
|
301 |
x_col (str): The column name to be used as the x-axis.
|
302 |
y_col (str): The column name to be used as the y-axis.
|
303 |
titulo (str): The title of the chart.
|
304 |
-
|
305 |
Returns:
|
306 |
plotly.graph_objects.Figure: The generated bar chart.
|
307 |
-
|
308 |
"""
|
309 |
fig = px.bar(
|
310 |
df,
|
@@ -331,11 +373,11 @@ def criar_grafico_personalizado(df, x_col, y_col, titulo):
|
|
331 |
)
|
332 |
return fig
|
333 |
|
334 |
-
with st.expander(" Adicione o arquivo .csv ao lado para
|
335 |
selected_tab = option_menu(
|
336 |
menu_title=None,
|
337 |
-
options=["Faixa Etária", "Gênero", "Cor", "Deficiência", "Doenças"],
|
338 |
-
icons=["person", "gender-female", "person-plus", "person-wheelchair", "capsule-pill"],
|
339 |
menu_icon="cast",
|
340 |
default_index=0,
|
341 |
orientation="horizontal",
|
@@ -355,19 +397,13 @@ with st.expander(" Adicione o arquivo .csv ao lado para visuzalização", expand
|
|
355 |
# Exibição dos DataFrames com base na aba selecionada
|
356 |
if selected_tab == "Faixa Etária" and DF_IDADE is not None:
|
357 |
st.subheader("Distribuição por Faixa Etária")
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
col1, col2 = st.columns(2)
|
362 |
with col1:
|
363 |
st.dataframe(DF_IDADE, hide_index=True)
|
364 |
with col2:
|
365 |
# Criar o gráfico de pirâmide etária
|
366 |
-
|
367 |
-
DF_IDADE["
|
368 |
-
DF_IDADE["Masculino"].astype(int) * -1
|
369 |
-
) # Valores negativos para o lado masculino
|
370 |
-
DF_IDADE["Feminino"] = DF_IDADE["Feminino"].astype(int)
|
371 |
fig_idade = px.bar(
|
372 |
DF_IDADE,
|
373 |
x=["Masculino", "Feminino"],
|
@@ -441,6 +477,35 @@ with st.expander(" Adicione o arquivo .csv ao lado para visuzalização", expand
|
|
441 |
titulo="Distribuição por Doenças"
|
442 |
)
|
443 |
st.plotly_chart(fig_doencas)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
444 |
add_vertical_space()
|
445 |
|
446 |
st.info(
|
@@ -531,4 +596,3 @@ with st.expander(" Converse com o 🤖 Zé Flamengo", expanded=True):
|
|
531 |
# Adicione este código fora do expander para evitar a reexecução do script ao pressionar Enter
|
532 |
if "USER_CHAT_input" in st.session_state and st.session_state.USER_CHAT_input:
|
533 |
st.session_state.USER_CHAT_input = ""
|
534 |
-
|
|
|
15 |
from streamlit_folium import folium_static
|
16 |
from streamlit_option_menu import option_menu
|
17 |
|
18 |
+
from data_cleaning import criar_dataframe, iniciar, limpa_rci1, limpa_rci2, separa_grupos, renomear_escola, limpar_dfs, processar_arquivo
|
19 |
|
20 |
st.set_page_config(
|
21 |
page_title="Dashboard UBS Flamengo",
|
|
|
43 |
|
44 |
|
45 |
# Inicializar variáveis dos DataFrames como None
|
46 |
+
DF_DATA = None
|
47 |
+
DF_HEAD = None
|
48 |
DF_IDADE = None
|
49 |
DF_GENERO = None
|
50 |
DF_COR = None
|
51 |
DF_DEFICIENCIA = None
|
52 |
DF_DOENCAS = None
|
53 |
+
DF_ESCOLA = None
|
54 |
+
DF_TRANSGEN = None
|
55 |
|
56 |
# Upload de arquivo CSV na barra lateral
|
57 |
uploaded_file = st.sidebar.file_uploader("Escolha um arquivo CSV", type="csv")
|
58 |
|
59 |
+
def processar_arquivo(uploaded_file):
|
60 |
+
# Função que processa o arquivo CSV e retorna os DataFrames
|
61 |
+
# (Esta função deve ser importada ou definida aqui)
|
62 |
+
pass
|
63 |
+
|
64 |
if uploaded_file is not None:
|
65 |
dataframes = processar_arquivo(uploaded_file)
|
66 |
|
67 |
# Atribuir os DataFrames a variáveis específicas para uso posterior
|
68 |
+
DF_DATA = dataframes.get("Data")
|
69 |
+
DF_HEAD = dataframes.get("Head")
|
70 |
DF_IDADE = dataframes.get("Idade")
|
71 |
DF_GENERO = dataframes.get("genero")
|
72 |
DF_COR = dataframes.get("cor")
|
73 |
DF_DEFICIENCIA = dataframes.get("deficiencia")
|
74 |
DF_DOENCAS = dataframes.get("doencas")
|
75 |
+
DF_ESCOLA = dataframes.get("Escola")
|
76 |
+
DF_TRANSGEN = dataframes.get("transgen")
|
77 |
|
78 |
# Aplicar capitalização à coluna "Descrição" em cada DataFrame
|
79 |
+
for df in [DF_IDADE, DF_GENERO, DF_COR, DF_DEFICIENCIA, DF_DOENCAS, DF_ESCOLA, DF_TRANSGEN]:
|
80 |
+
if df is not None:
|
81 |
+
df["Descrição"] = df["Descrição"].str.capitalize()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
else:
|
83 |
st.sidebar.info("Adicione um arquivo .csv.")
|
84 |
|
|
|
85 |
def gerar_resumo_df():
|
86 |
"""
|
87 |
Generates a summary of the dataframes.
|
|
|
88 |
This function iterates over the local and global variables to check if any of them
|
89 |
+
are named "DF_DATA", "DF_HEAD", "DF_IDADE", "DF_GENERO", "DF_COR", "DF_DEFICIENCIA",
|
90 |
+
"DF_DOENCAS", "DF_ESCOLA", or "DF_TRANSGEN".
|
91 |
If a dataframe is found, it generates a summary of the dataframe by printing its
|
92 |
column names and the count of each unique value in the "Descrição" column.
|
|
|
93 |
Returns:
|
94 |
str: A string containing the summary of the dataframes.
|
95 |
"""
|
96 |
resumo = ""
|
97 |
|
98 |
+
if "DF_DATA" in locals() or "DF_DATA" in globals():
|
99 |
+
resumo += "Resumo DF_DATA:\n"
|
100 |
+
resumo += DF_DATA.to_string(index=False) + "\n\n"
|
101 |
+
|
102 |
+
if "DF_HEAD" in locals() or "DF_HEAD" in globals():
|
103 |
+
resumo += "Resumo DF_HEAD:\n"
|
104 |
+
resumo += DF_HEAD.to_string(index=False) + "\n\n"
|
105 |
+
|
106 |
if "DF_IDADE" in locals() or "DF_IDADE" in globals():
|
|
|
107 |
resumo += "Resumo DF_IDADE:\n"
|
108 |
resumo += DF_IDADE.to_string(index=False) + "\n\n"
|
109 |
|
|
|
114 |
resumo += f"Resumo DF_COR:\n{DF_COR.value_counts().to_string()}\n\n"
|
115 |
|
116 |
if "DF_DEFICIENCIA" in locals() or "DF_DEFICIENCIA" in globals():
|
117 |
+
resumo += f"Resumo DF_DEFICIENCIA:\n{DF_DEFICIENCIA.value_counts().to_string()}\n\n"
|
|
|
|
|
118 |
|
119 |
if "DF_DOENCAS" in locals() or "DF_DOENCAS" in globals():
|
120 |
resumo += f"Resumo DF_DOENCAS:\n{DF_DOENCAS.value_counts().to_string()}\n\n"
|
121 |
|
122 |
+
if "DF_ESCOLA" in locals() or "DF_ESCOLA" in globals():
|
123 |
+
resumo += f"Resumo DF_ESCOLA:\n{DF_ESCOLA.value_counts().to_string()}\n\n"
|
124 |
+
|
125 |
+
if "DF_TRANSGEN" in locals() or "DF_TRANSGEN" in globals():
|
126 |
+
resumo += f"Resumo DF_TRANSGEN:\n{DF_TRANSGEN.value_counts().to_string()}\n\n"
|
127 |
+
|
128 |
return resumo
|
129 |
|
130 |
+
# Mostrar o resumo no Streamlit
|
131 |
+
st.text(gerar_resumo_df())
|
132 |
+
|
133 |
|
134 |
#######################################
|
135 |
#######################################
|
|
|
303 |
## Dados de saúde Relatório de cadastro individual.
|
304 |
"""
|
305 |
)
|
306 |
+
#
|
307 |
+
#
|
308 |
+
#
|
309 |
+
#
|
310 |
+
#
|
311 |
+
#
|
312 |
+
#
|
313 |
|
314 |
|
315 |
+
if uploaded_file is not None:
|
316 |
+
dataframes = processar_arquivo(uploaded_file)
|
317 |
+
|
318 |
+
# Atribuir os DataFrames a variáveis específicas para uso posterior
|
319 |
+
DF_DATA = dataframes.get("Data")
|
320 |
+
DF_HEAD = dataframes.get("Head")
|
321 |
+
DF_IDADE = dataframes.get("Idade")
|
322 |
+
DF_GENERO = dataframes.get("genero")
|
323 |
+
DF_COR = dataframes.get("cor")
|
324 |
+
DF_DEFICIENCIA = dataframes.get("deficiencia")
|
325 |
+
DF_DOENCAS = dataframes.get("doencas")
|
326 |
+
DF_ESCOLA = dataframes.get("Escola")
|
327 |
+
DF_TRANSGEN = dataframes.get("transgen")
|
328 |
+
|
329 |
+
# Aplicar capitalização à coluna "Descrição" em cada DataFrame
|
330 |
+
for df in [DF_IDADE, DF_GENERO, DF_COR, DF_DEFICIENCIA, DF_DOENCAS, DF_ESCOLA, DF_TRANSGEN]:
|
331 |
+
if df is not None:
|
332 |
+
df["Descrição"] = df["Descrição"].str.capitalize()
|
333 |
+
else:
|
334 |
+
st.sidebar.info("Adicione um arquivo .csv.")
|
335 |
+
#
|
336 |
+
#
|
337 |
+
#
|
338 |
+
#
|
339 |
+
|
340 |
def criar_grafico_personalizado(df, x_col, y_col, titulo):
|
341 |
"""
|
342 |
Generates a custom bar chart using Plotly Express.
|
|
|
343 |
Args:
|
344 |
df (pandas.DataFrame): The input dataframe.
|
345 |
x_col (str): The column name to be used as the x-axis.
|
346 |
y_col (str): The column name to be used as the y-axis.
|
347 |
titulo (str): The title of the chart.
|
|
|
348 |
Returns:
|
349 |
plotly.graph_objects.Figure: The generated bar chart.
|
|
|
350 |
"""
|
351 |
fig = px.bar(
|
352 |
df,
|
|
|
373 |
)
|
374 |
return fig
|
375 |
|
376 |
+
with st.expander(" Adicione o arquivo .csv ao lado para visualização", expanded=True):
|
377 |
selected_tab = option_menu(
|
378 |
menu_title=None,
|
379 |
+
options=["Faixa Etária", "Gênero", "Cor", "Deficiência", "Doenças", "Escolaridade", "Identidade de Gênero"],
|
380 |
+
icons=["person", "gender-female", "person-plus", "person-wheelchair", "capsule-pill", "school", "transgender"],
|
381 |
menu_icon="cast",
|
382 |
default_index=0,
|
383 |
orientation="horizontal",
|
|
|
397 |
# Exibição dos DataFrames com base na aba selecionada
|
398 |
if selected_tab == "Faixa Etária" and DF_IDADE is not None:
|
399 |
st.subheader("Distribuição por Faixa Etária")
|
|
|
|
|
|
|
400 |
col1, col2 = st.columns(2)
|
401 |
with col1:
|
402 |
st.dataframe(DF_IDADE, hide_index=True)
|
403 |
with col2:
|
404 |
# Criar o gráfico de pirâmide etária
|
405 |
+
DF_IDADE["Masculino"] = DF_IDADE["Masculino"].astype(int) * -1 # Valores negativos para o lado masculino
|
406 |
+
DF_IDADE["Feminino"] = DF_IDADE["Feminino"].astype(int)
|
|
|
|
|
|
|
407 |
fig_idade = px.bar(
|
408 |
DF_IDADE,
|
409 |
x=["Masculino", "Feminino"],
|
|
|
477 |
titulo="Distribuição por Doenças"
|
478 |
)
|
479 |
st.plotly_chart(fig_doencas)
|
480 |
+
|
481 |
+
elif selected_tab == "Escolaridade" and DF_ESCOLA is not None:
|
482 |
+
st.subheader("Distribuição por Escolaridade")
|
483 |
+
col1, col2 = st.columns(2)
|
484 |
+
with col1:
|
485 |
+
st.dataframe(DF_ESCOLA, hide_index=True)
|
486 |
+
with col2:
|
487 |
+
fig_escola = criar_grafico_personalizado(
|
488 |
+
DF_ESCOLA,
|
489 |
+
x_col="Descrição",
|
490 |
+
y_col="Valor",
|
491 |
+
titulo="Distribuição por Escolaridade"
|
492 |
+
)
|
493 |
+
st.plotly_chart(fig_escola)
|
494 |
+
|
495 |
+
elif selected_tab == "Identidade de Gênero" and DF_TRANSGEN is not None:
|
496 |
+
st.subheader("Distribuição por Identidade de Gênero")
|
497 |
+
col1, col2 = st.columns(2)
|
498 |
+
with col1:
|
499 |
+
st.dataframe(DF_TRANSGEN, hide_index=True)
|
500 |
+
with col2:
|
501 |
+
fig_transgen = criar_grafico_personalizado(
|
502 |
+
DF_TRANSGEN,
|
503 |
+
x_col="Descrição",
|
504 |
+
y_col="Valor",
|
505 |
+
titulo="Distribuição por Identidade de Gênero"
|
506 |
+
)
|
507 |
+
st.plotly_chart(fig_transgen)
|
508 |
+
|
509 |
add_vertical_space()
|
510 |
|
511 |
st.info(
|
|
|
596 |
# Adicione este código fora do expander para evitar a reexecução do script ao pressionar Enter
|
597 |
if "USER_CHAT_input" in st.session_state and st.session_state.USER_CHAT_input:
|
598 |
st.session_state.USER_CHAT_input = ""
|
|