drguilhermeapolinario commited on
Commit
dfba057
·
verified ·
1 Parent(s): 9361497

Update views/cad_cid.py

Browse files
Files changed (1) hide show
  1. views/cad_cid.py +349 -349
views/cad_cid.py CHANGED
@@ -1,350 +1,350 @@
1
- import pandas as pd
2
- import plotly.express as px
3
- import streamlit as st
4
- from pathlib import Path
5
- from streamlit_extras.add_vertical_space import add_vertical_space
6
- from streamlit_extras.stylable_container import stylable_container
7
-
8
-
9
- st.title("Atualização de cadastro - UBS Flamengo")
10
-
11
- add_vertical_space(10)
12
-
13
- # Load the Excel file
14
- @st.cache_data
15
- def load_data():
16
- file_path = Path("src/atual.xlsx")
17
- df = pd.read_excel(file_path, sheet_name="ANALISE", engine='openpyxl')
18
- df["ATUALIZADO"] = pd.to_datetime(df["ATUALIZADO"], errors="coerce", dayfirst=True)
19
- df["Trimestre"] = df["ATUALIZADO"].dt.to_period("Q")
20
- df["Mês"] = df["ATUALIZADO"].dt.to_period("M")
21
- df["Semestre"] = df["ATUALIZADO"].dt.to_period("6M")
22
-
23
- # Convert RUA column to string to ensure consistent sorting
24
- df["RUA"] = df["RUA"].astype(str)
25
-
26
- return df
27
-
28
- #df = load_data()
29
- uploaded_file = st.sidebar.file_uploader("Adicione o arquivo Excel", type= ".xlsx")
30
- if uploaded_file is not None:
31
- df = load_data()
32
-
33
-
34
- # Custom CSS for dark theme
35
- st.markdown(
36
- """
37
- <style>
38
- .reportview-container {
39
- background: #0e1117;
40
- color: #fafafa;
41
- }
42
- .big-font {
43
- font-size:30px !important;
44
- font-weight: bold;
45
- color: #fafafa;
46
- }
47
- .stSelectbox [data-baseweb="select"] {
48
- background-color: #262730;
49
- }
50
- .stSelectbox [data-baseweb="select"] > div {
51
- background-color: #262730;
52
- color: #fafafa;
53
- }
54
- </style>
55
- """,
56
- unsafe_allow_html=True,
57
- )
58
-
59
- if uploaded_file is not None:
60
- col1, col2, col3, col4 = st.columns([1, 1, 1, 3])
61
- with col1:
62
- rua_selecionada = st.selectbox("Selecione a Rua", sorted(df["RUA"].unique()))
63
- with col2:
64
- anos_disponiveis = sorted(df["ATUALIZADO"].dt.year.dropna().unique(), reverse=True)
65
- anos_disponiveis.insert(0, "Total")
66
- ano_selecionado = st.selectbox("Selecione o Ano", anos_disponiveis)
67
- with col3:
68
- granularidade = st.selectbox(
69
- "Selecione a Granularidade", ["Mensal", "Trimestral", "Semestral"]
70
- )
71
- with col4:
72
- st.write('')
73
- # Filter data
74
- if ano_selecionado == "Total":
75
- dados_filtrados = df[df["RUA"] == rua_selecionada]
76
- else:
77
- dados_filtrados = df[
78
- (df["RUA"] == rua_selecionada) & (df["ATUALIZADO"].dt.year == ano_selecionado)
79
- ]
80
-
81
- # Add period column based on granularity
82
- if granularidade == "Mensal":
83
- dados_filtrados["Período"] = dados_filtrados["ATUALIZADO"].dt.strftime("%m-%Y")
84
- elif granularidade == "Trimestral":
85
- dados_filtrados["Período"] = (
86
- dados_filtrados["ATUALIZADO"].dt.to_period("Q").astype(str)
87
- )
88
- else: # Semestral
89
- dados_filtrados["Período"] = (
90
- dados_filtrados["ATUALIZADO"].dt.to_period("6M").astype(str)
91
- )
92
-
93
- # Function to create scatter plot
94
- def create_scatter_plot(data, title):
95
- fig = px.scatter(
96
- data,
97
- x="ATUALIZADO",
98
- y="IDADE",
99
- color="Período",
100
- hover_data=["NOME", "ATUALIZADO", "Período"],
101
- title=title,
102
- color_discrete_sequence=px.colors.qualitative.Set3,
103
- )
104
- fig.update_layout(
105
- xaxis_title="Período",
106
- yaxis_title="Idade",
107
- legend_title="Período",
108
- plot_bgcolor="#0e1117",
109
- paper_bgcolor="#0e1117",
110
- font=dict(color="#fafafa"),
111
- )
112
- fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='#31333F', tickangle=45)
113
- fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='#31333F')
114
- return fig
115
-
116
- # Main scatter plot
117
- st.subheader(
118
- f"Última Atualização na Rua {rua_selecionada} ({granularidade} - {ano_selecionado})"
119
- )
120
-
121
- c1, c2= st.columns([0.8, 0.2])
122
-
123
- with c1:
124
- fig = create_scatter_plot(dados_filtrados, f"Pacientes Pendentes de Atualização - {rua_selecionada}")
125
- st.plotly_chart(fig, use_container_width=True)
126
-
127
- with c2:
128
- total_usuarios = len(dados_filtrados)
129
-
130
- st.dataframe(dados_filtrados[["NOME", "IDADE", "RUA", "NUM", "Período"]].sort_values(by="Período", ascending=True), hide_index=True)
131
-
132
- st.write(f"Total de usuários: {total_usuarios}")
133
- add_vertical_space()
134
-
135
- st.write('-----')
136
-
137
- add_vertical_space()
138
-
139
- c3, c4, c5 = st.columns([2, 2, 1])
140
-
141
- with c3:
142
- st.markdown('')
143
-
144
-
145
- with c4:
146
- st.subheader("Análise por Faixa Etária")
147
-
148
- with c5:
149
- st.markdown('')
150
-
151
-
152
- co1, co2, co3 = st.columns([2, 2, 2],)
153
- with co1:
154
- with stylable_container(
155
- key="pueri",
156
- css_styles="""
157
- img {
158
- width: 460px;
159
- height: 180px;
160
- overflow: hidden;
161
- position: relative;
162
- object-fit: cover;
163
- border-radius: 14px; /* Adiciona bordas arredondadas */
164
- mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
165
- -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
166
- }
167
- """,
168
- ):
169
- st.image("src/images/pueri.jpg")
170
-
171
- with co2:
172
- with stylable_container(
173
- key="prev",
174
- css_styles="""
175
- img {
176
- width: 460px;
177
- height: 180px;
178
- overflow: hidden;
179
- position: relative;
180
- object-fit: cover;
181
- border-radius: 14px; /* Adiciona bordas arredondadas */
182
- mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
183
- -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
184
- }
185
- """,
186
- ):
187
- st.image("src/images/prev.jpg")
188
-
189
- with co3:
190
- with stylable_container(
191
- key="mamo",
192
- css_styles="""
193
- img {
194
- width: 460px;
195
- height: 180px;
196
- overflow: hidden;
197
- position: relative;
198
- object-fit: cover;
199
- border-radius: 14px; /* Adiciona bordas arredondadas */
200
- mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
201
- -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
202
- }
203
- """,
204
- ):
205
- st.image("src/images/mamo.jpg")
206
-
207
-
208
- # Preventivo (25-64 anos)
209
- preventivo = dados_filtrados[
210
- (dados_filtrados["IDADE"].between(25, 64)) & (dados_filtrados["SEXO"] == "F")
211
- ]
212
- st.markdown("### Preventivo (25-64 anos)")
213
- fig_preventivo = create_scatter_plot(preventivo, f"Preventivo - {rua_selecionada}")
214
- st.plotly_chart(fig_preventivo, use_container_width=True)
215
-
216
-
217
- col1, col2 = st.columns([0.4, 0.6])
218
- with col1:
219
- st.dataframe(
220
- preventivo[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values(
221
- by="ATUALIZADO", ascending=False
222
- ),
223
- hide_index=True,
224
- )
225
- with col2:
226
- st.markdown(f"#### Total de usuários: {len(preventivo)}")
227
-
228
-
229
-
230
- add_vertical_space()
231
-
232
- st.write('-----')
233
-
234
- add_vertical_space()
235
-
236
-
237
- # Mamografia (50-69 anos)
238
- mamografia = dados_filtrados[
239
- (dados_filtrados["IDADE"].between(50, 69)) & (dados_filtrados["SEXO"] == "F")
240
- ]
241
- st.markdown("### Mamografia (50-69 anos)")
242
- fig_mamografia = create_scatter_plot(mamografia, f"Mamografia - {rua_selecionada}")
243
- st.plotly_chart(fig_mamografia, use_container_width=True)
244
-
245
-
246
- col1, col2 = st.columns([0.4, 0.6])
247
- with col1:
248
- st.dataframe(
249
- mamografia[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values(
250
- by="ATUALIZADO", ascending=False
251
- ),
252
- hide_index=True,
253
- )
254
- with col2:
255
- st.markdown(f"#### Total de usuários: {len(mamografia)}")
256
-
257
-
258
-
259
- add_vertical_space()
260
-
261
- st.write('-----')
262
-
263
- add_vertical_space()
264
-
265
-
266
- st.markdown("### Crianças 0 - 2 anos e 0 - 4 anos.")
267
-
268
- # Crianças até 4 anos
269
- criancasdois = dados_filtrados[dados_filtrados["IDADE"] <= 2]
270
- # Crianças até 4 anos
271
- criancasquatro = dados_filtrados[dados_filtrados["IDADE"] <= 4]
272
-
273
- on = st.toggle("Alterne para ver as crianças até dois anos ou até 4 anos.")
274
- if on:
275
- st.markdown("### Crianças até 2 anos")
276
- fig_criancasdois = create_scatter_plot(criancasdois, f"Crianças até 2 anos - {rua_selecionada}")
277
- st.plotly_chart(fig_criancasdois, use_container_width=True)
278
-
279
- col1, col2 = st.columns([0.4, 0.6])
280
- with col1:
281
- st.dataframe(
282
- criancasdois[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values(
283
- by="ATUALIZADO", ascending=False
284
- ),
285
- hide_index=True,
286
- )
287
- with col2:
288
- st.markdown(f"#### Total de usuários: {len(criancasdois)}")
289
- else:
290
- st.markdown("### Crianças até 4 anos")
291
- fig_criancasquatro = create_scatter_plot(criancasquatro, f"Crianças até 2 anos - {rua_selecionada}")
292
- st.plotly_chart(fig_criancasquatro, use_container_width=True)
293
-
294
- col1, col2 = st.columns([0.4, 0.6])
295
- with col1:
296
- st.dataframe(
297
- criancasquatro[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values(
298
- by="ATUALIZADO", ascending=False
299
- ),
300
- hide_index=True,
301
- )
302
- with col2:
303
- st.markdown(f"#### Total de usuários: {len(criancasquatro)}")
304
-
305
- st.write('-----------')
306
- # Percentage of updates by period
307
- st.subheader(
308
- f"Porcentagem de Atualizações por {granularidade} na Rua {rua_selecionada}"
309
- )
310
-
311
- period_count = dados_filtrados["Período"].value_counts().sort_index()
312
- period_percent = (period_count / len(dados_filtrados)) * 100
313
-
314
- period_data = pd.DataFrame(
315
- {
316
- "Período": period_count.index,
317
- "Porcentagem": period_percent.values.round(2),
318
- "Atualizações": period_count.values,
319
- }
320
- )
321
-
322
- st.dataframe(period_data, hide_index=True)
323
-
324
- fig_period = px.bar(
325
- period_data,
326
- x="Período",
327
- y="Porcentagem",
328
- text="Atualizações",
329
- title=f"Porcentagem de Atualizações por {granularidade}",
330
- color="Porcentagem",
331
- color_continuous_scale="Viridis",
332
- )
333
-
334
- fig_period.update_traces(
335
- texttemplate="%{text}",
336
- textposition="outside",
337
- hovertemplate="%{x}: %{y:.2f}%<br>Atualizações: %{text}<extra></extra>",
338
- )
339
- fig_period.update_layout(
340
- xaxis_title=granularidade,
341
- yaxis_title="Porcentagem",
342
- yaxis_tickformat=".2f",
343
- plot_bgcolor="white",
344
- )
345
- fig_period.update_xaxes(showgrid=True, gridwidth=1, gridcolor="lightgray")
346
- fig_period.update_yaxes(showgrid=True, gridwidth=1, gridcolor="lightgray")
347
-
348
- st.plotly_chart(fig_period, use_container_width=True)
349
- else:
350
  st.markdown('# Insira o arquivo com os dados')
 
1
+ import pandas as pd
2
+ import plotly.express as px
3
+ import streamlit as st
4
+ from pathlib import Path
5
+ from streamlit_extras.add_vertical_space import add_vertical_space
6
+ from streamlit_extras.stylable_container import stylable_container
7
+
8
+
9
+ st.title("Atualização de cadastro - UBS Flamengo")
10
+
11
+ add_vertical_space(10)
12
+
13
+ # Load the Excel file
14
+ @st.cache_data
15
+ def load_data():
16
+ file_path = Path("src/atual.xlsx")
17
+ df = pd.read_excel(file_path, sheet_name="ANALISE", engine='openpyxl')
18
+ df["ATUALIZADO"] = pd.to_datetime(df["ATUALIZADO"], errors="coerce", dayfirst=True)
19
+ df["Trimestre"] = df["ATUALIZADO"].dt.to_period("Q")
20
+ df["Mês"] = df["ATUALIZADO"].dt.to_period("M")
21
+ df["Semestre"] = df["ATUALIZADO"].dt.to_period("6M")
22
+
23
+ # Convert RUA column to string to ensure consistent sorting
24
+ df["RUA"] = df["RUA"].astype(str)
25
+
26
+ return df
27
+
28
+ #df = load_data()
29
+ uploaded_file = st.sidebar.file_uploader("Adicione o arquivo Excel", type= ".xlsx")
30
+ if uploaded_file is not None:
31
+ df = load_data()
32
+
33
+
34
+ # Custom CSS for dark theme
35
+ st.markdown(
36
+ """
37
+ <style>
38
+ .reportview-container {
39
+ background: #0e1117;
40
+ color: #fafafa;
41
+ }
42
+ .big-font {
43
+ font-size:30px !important;
44
+ font-weight: bold;
45
+ color: #fafafa;
46
+ }
47
+ .stSelectbox [data-baseweb="select"] {
48
+ background-color: #262730;
49
+ }
50
+ .stSelectbox [data-baseweb="select"] > div {
51
+ background-color: #262730;
52
+ color: #fafafa;
53
+ }
54
+ </style>
55
+ """,
56
+ unsafe_allow_html=True,
57
+ )
58
+
59
+ if uploaded_file is not None:
60
+ col1, col2, col3, col4 = st.columns([1, 1, 1, 3])
61
+ with col1:
62
+ rua_selecionada = st.selectbox("Selecione a Rua", sorted(df["RUA"].unique()))
63
+ with col2:
64
+ anos_disponiveis = sorted(df["ATUALIZADO"].dt.year.dropna().unique(), reverse=True)
65
+ anos_disponiveis.insert(0, "Total")
66
+ ano_selecionado = st.selectbox("Selecione o Ano", anos_disponiveis)
67
+ with col3:
68
+ granularidade = st.selectbox(
69
+ "Selecione a Granularidade", ["Mensal", "Trimestral", "Semestral"]
70
+ )
71
+ with col4:
72
+ st.write('')
73
+ # Filter data
74
+ if ano_selecionado == "Total":
75
+ dados_filtrados = df[df["RUA"] == rua_selecionada]
76
+ else:
77
+ dados_filtrados = df[
78
+ (df["RUA"] == rua_selecionada) & (df["ATUALIZADO"].dt.year == ano_selecionado)
79
+ ]
80
+
81
+ # Add period column based on granularity
82
+ if granularidade == "Mensal":
83
+ dados_filtrados["Período"] = dados_filtrados["ATUALIZADO"].dt.strftime("%m-%Y")
84
+ elif granularidade == "Trimestral":
85
+ dados_filtrados["Período"] = (
86
+ dados_filtrados["ATUALIZADO"].dt.to_period("Q").astype(str)
87
+ )
88
+ else: # Semestral
89
+ dados_filtrados["Período"] = (
90
+ dados_filtrados["ATUALIZADO"].dt.to_period("6M").astype(str)
91
+ )
92
+
93
+ # Function to create scatter plot
94
+ def create_scatter_plot(data, title):
95
+ fig = px.scatter(
96
+ data,
97
+ x="ATUALIZADO",
98
+ y="IDADE",
99
+ color="Período",
100
+ hover_data=["NOME", "ATUALIZADO", "Período"],
101
+ title=title,
102
+ color_discrete_sequence=px.colors.qualitative.Set3,
103
+ )
104
+ fig.update_layout(
105
+ xaxis_title="Período",
106
+ yaxis_title="Idade",
107
+ legend_title="Período",
108
+ plot_bgcolor="#0e1117",
109
+ paper_bgcolor="#0e1117",
110
+ font=dict(color="#fafafa"),
111
+ )
112
+ fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='#31333F', tickangle=45)
113
+ fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='#31333F')
114
+ return fig
115
+
116
+ # Main scatter plot
117
+ st.subheader(
118
+ f"Última Atualização na Rua {rua_selecionada} ({granularidade} - {ano_selecionado})"
119
+ )
120
+
121
+ c1, c2= st.columns([0.8, 0.2])
122
+
123
+ with c1:
124
+ fig = create_scatter_plot(dados_filtrados, f"Pacientes Pendentes de Atualização - {rua_selecionada}")
125
+ st.plotly_chart(fig, use_container_width=True)
126
+
127
+ with c2:
128
+ total_usuarios = len(dados_filtrados)
129
+
130
+ st.dataframe(dados_filtrados[["NOME", "IDADE", "RUA", "NUM", "Período"]].sort_values(by="Período", ascending=True), hide_index=True)
131
+
132
+ st.write(f"Total de usuários: {total_usuarios}")
133
+ add_vertical_space()
134
+
135
+ st.write('-----')
136
+
137
+ add_vertical_space()
138
+
139
+ c3, c4, c5 = st.columns([2, 2, 1])
140
+
141
+ with c3:
142
+ st.markdown('')
143
+
144
+
145
+ with c4:
146
+ st.subheader("Análise por Faixa Etária")
147
+
148
+ with c5:
149
+ st.markdown('')
150
+
151
+
152
+ co1, co2, co3 = st.columns([2, 2, 2],)
153
+ with co1:
154
+ with stylable_container(
155
+ key="pueri",
156
+ css_styles="""
157
+ img {
158
+ width: 460px;
159
+ height: 180px;
160
+ overflow: hidden;
161
+ position: relative;
162
+ object-fit: cover;
163
+ border-radius: 14px; /* Adiciona bordas arredondadas */
164
+ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
165
+ -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
166
+ }
167
+ """,
168
+ ):
169
+ st.image("pueri.jpg")
170
+
171
+ with co2:
172
+ with stylable_container(
173
+ key="prev",
174
+ css_styles="""
175
+ img {
176
+ width: 460px;
177
+ height: 180px;
178
+ overflow: hidden;
179
+ position: relative;
180
+ object-fit: cover;
181
+ border-radius: 14px; /* Adiciona bordas arredondadas */
182
+ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
183
+ -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
184
+ }
185
+ """,
186
+ ):
187
+ st.image("prev.jpg")
188
+
189
+ with co3:
190
+ with stylable_container(
191
+ key="mamo",
192
+ css_styles="""
193
+ img {
194
+ width: 460px;
195
+ height: 180px;
196
+ overflow: hidden;
197
+ position: relative;
198
+ object-fit: cover;
199
+ border-radius: 14px; /* Adiciona bordas arredondadas */
200
+ mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0));
201
+ -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)); /* For Safari */
202
+ }
203
+ """,
204
+ ):
205
+ st.image("mamo.jpg")
206
+
207
+
208
+ # Preventivo (25-64 anos)
209
+ preventivo = dados_filtrados[
210
+ (dados_filtrados["IDADE"].between(25, 64)) & (dados_filtrados["SEXO"] == "F")
211
+ ]
212
+ st.markdown("### Preventivo (25-64 anos)")
213
+ fig_preventivo = create_scatter_plot(preventivo, f"Preventivo - {rua_selecionada}")
214
+ st.plotly_chart(fig_preventivo, use_container_width=True)
215
+
216
+
217
+ col1, col2 = st.columns([0.4, 0.6])
218
+ with col1:
219
+ st.dataframe(
220
+ preventivo[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values(
221
+ by="ATUALIZADO", ascending=False
222
+ ),
223
+ hide_index=True,
224
+ )
225
+ with col2:
226
+ st.markdown(f"#### Total de usuários: {len(preventivo)}")
227
+
228
+
229
+
230
+ add_vertical_space()
231
+
232
+ st.write('-----')
233
+
234
+ add_vertical_space()
235
+
236
+
237
+ # Mamografia (50-69 anos)
238
+ mamografia = dados_filtrados[
239
+ (dados_filtrados["IDADE"].between(50, 69)) & (dados_filtrados["SEXO"] == "F")
240
+ ]
241
+ st.markdown("### Mamografia (50-69 anos)")
242
+ fig_mamografia = create_scatter_plot(mamografia, f"Mamografia - {rua_selecionada}")
243
+ st.plotly_chart(fig_mamografia, use_container_width=True)
244
+
245
+
246
+ col1, col2 = st.columns([0.4, 0.6])
247
+ with col1:
248
+ st.dataframe(
249
+ mamografia[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values(
250
+ by="ATUALIZADO", ascending=False
251
+ ),
252
+ hide_index=True,
253
+ )
254
+ with col2:
255
+ st.markdown(f"#### Total de usuários: {len(mamografia)}")
256
+
257
+
258
+
259
+ add_vertical_space()
260
+
261
+ st.write('-----')
262
+
263
+ add_vertical_space()
264
+
265
+
266
+ st.markdown("### Crianças 0 - 2 anos e 0 - 4 anos.")
267
+
268
+ # Crianças até 4 anos
269
+ criancasdois = dados_filtrados[dados_filtrados["IDADE"] <= 2]
270
+ # Crianças até 4 anos
271
+ criancasquatro = dados_filtrados[dados_filtrados["IDADE"] <= 4]
272
+
273
+ on = st.toggle("Alterne para ver as crianças até dois anos ou até 4 anos.")
274
+ if on:
275
+ st.markdown("### Crianças até 2 anos")
276
+ fig_criancasdois = create_scatter_plot(criancasdois, f"Crianças até 2 anos - {rua_selecionada}")
277
+ st.plotly_chart(fig_criancasdois, use_container_width=True)
278
+
279
+ col1, col2 = st.columns([0.4, 0.6])
280
+ with col1:
281
+ st.dataframe(
282
+ criancasdois[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values(
283
+ by="ATUALIZADO", ascending=False
284
+ ),
285
+ hide_index=True,
286
+ )
287
+ with col2:
288
+ st.markdown(f"#### Total de usuários: {len(criancasdois)}")
289
+ else:
290
+ st.markdown("### Crianças até 4 anos")
291
+ fig_criancasquatro = create_scatter_plot(criancasquatro, f"Crianças até 2 anos - {rua_selecionada}")
292
+ st.plotly_chart(fig_criancasquatro, use_container_width=True)
293
+
294
+ col1, col2 = st.columns([0.4, 0.6])
295
+ with col1:
296
+ st.dataframe(
297
+ criancasquatro[["NOME", "RUA", "NUM", "ATUALIZADO", "IDADE", "Período"]].sort_values(
298
+ by="ATUALIZADO", ascending=False
299
+ ),
300
+ hide_index=True,
301
+ )
302
+ with col2:
303
+ st.markdown(f"#### Total de usuários: {len(criancasquatro)}")
304
+
305
+ st.write('-----------')
306
+ # Percentage of updates by period
307
+ st.subheader(
308
+ f"Porcentagem de Atualizações por {granularidade} na Rua {rua_selecionada}"
309
+ )
310
+
311
+ period_count = dados_filtrados["Período"].value_counts().sort_index()
312
+ period_percent = (period_count / len(dados_filtrados)) * 100
313
+
314
+ period_data = pd.DataFrame(
315
+ {
316
+ "Período": period_count.index,
317
+ "Porcentagem": period_percent.values.round(2),
318
+ "Atualizações": period_count.values,
319
+ }
320
+ )
321
+
322
+ st.dataframe(period_data, hide_index=True)
323
+
324
+ fig_period = px.bar(
325
+ period_data,
326
+ x="Período",
327
+ y="Porcentagem",
328
+ text="Atualizações",
329
+ title=f"Porcentagem de Atualizações por {granularidade}",
330
+ color="Porcentagem",
331
+ color_continuous_scale="Viridis",
332
+ )
333
+
334
+ fig_period.update_traces(
335
+ texttemplate="%{text}",
336
+ textposition="outside",
337
+ hovertemplate="%{x}: %{y:.2f}%<br>Atualizações: %{text}<extra></extra>",
338
+ )
339
+ fig_period.update_layout(
340
+ xaxis_title=granularidade,
341
+ yaxis_title="Porcentagem",
342
+ yaxis_tickformat=".2f",
343
+ plot_bgcolor="white",
344
+ )
345
+ fig_period.update_xaxes(showgrid=True, gridwidth=1, gridcolor="lightgray")
346
+ fig_period.update_yaxes(showgrid=True, gridwidth=1, gridcolor="lightgray")
347
+
348
+ st.plotly_chart(fig_period, use_container_width=True)
349
+ else:
350
  st.markdown('# Insira o arquivo com os dados')