-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
220 lines (186 loc) · 6.48 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
import streamlit as st
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
# Configuração da página
st.set_page_config(
page_title="Análise da Rede de Urgências - Bahia",
page_icon="🏥",
layout="wide"
)
# Função para carregar dados
@st.cache_data
def load_data():
df = pd.read_csv('dados_rede_urgencias_bahia.csv')
return df
# Carregando os dados
df = load_data()
# Título principal
st.title('Análise da Rede de Urgências no Estado da Bahia')
st.markdown('### Dashboard de Monitoramento e Avaliação')
# Sidebar para filtros
st.sidebar.header('Filtros')
# Agrupamento por macrorregião
macrorregioes = {
'NORTE': ['JUAZEIRO', 'PAULO AFONSO'],
'CENTRO-NORTE': ['JACOBINA', 'IRECÊ', 'SEABRA'],
'NORDESTE': ['ALAGOINHAS', 'RIBEIRA DO POMBAL', 'SERRINHA'],
'LESTE': ['SALVADOR', 'CAMAÇARI', 'CRUZ DAS ALMAS', 'SANTO ANTÔNIO DE JESUS'],
'CENTRO-LESTE': ['FEIRA DE SANTANA'],
'SUDOESTE': ['VITÓRIA DA CONQUISTA', 'BRUMADO', 'GUANAMBI', 'ITAPETINGA'],
'SUL': ['ILHÉUS', 'ITABUNA', 'TEIXEIRA DE FREITAS', 'VALENÇA', 'PORTO SEGURO'],
'OESTE': ['BARREIRAS', 'SANTA MARIA DA VITÓRIA', 'IBOTIRAMA', 'BOM JESUS DA LAPA']
}
# Criar seletor de macrorregião
selected_macro = st.sidebar.multiselect(
'Selecione as Macrorregiões',
options=list(macrorregioes.keys()),
default=list(macrorregioes.keys())[0]
)
# Criar lista de regiões baseada nas macrorregiões selecionadas
selected_regions = []
for macro in selected_macro:
selected_regions.extend(macrorregioes[macro])
# Filtro de período
selected_years = st.sidebar.slider(
'Selecione o Período',
min_value=int(df['ano'].min()),
max_value=int(df['ano'].max()),
value=(int(df['ano'].min()), int(df['ano'].max()))
)
# Filtrando dados
mask = (df['regiao'].isin(selected_regions)) & (df['ano'].between(selected_years[0], selected_years[1]))
filtered_df = df[mask]
# Layout em três colunas para métricas principais
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric(
"População Total",
f"{filtered_df[filtered_df['ano'] == filtered_df['ano'].max()]['populacao_estimada'].sum():,.0f}"
)
with col2:
st.metric(
"Cobertura SAMU",
f"{filtered_df['cobertura_samu'].mean():.1f}%"
)
with col3:
st.metric(
"Cobertura Atenção Básica",
f"{filtered_df['cobertura_atencao_basica'].mean():.1f}%"
)
with col4:
st.metric(
"Taxa Média de Mortalidade IAM",
f"{filtered_df['taxa_mortalidade_iam'].mean():.1f}"
)
# Tabs para diferentes análises
tab1, tab2, tab3 = st.tabs(["Indicadores Temporais", "Estrutura da Rede", "Análise Regional"])
with tab1:
# Gráfico 1: Taxa de Mortalidade por IAM
st.subheader('Evolução Temporal dos Indicadores')
# Seletor de indicador
indicador = st.selectbox(
'Selecione o Indicador',
['taxa_mortalidade_iam', 'cobertura_samu', 'cobertura_atencao_basica', 'taxa_leitos_uti']
)
nomes_indicadores = {
'taxa_mortalidade_iam': 'Taxa de Mortalidade por IAM',
'cobertura_samu': 'Cobertura SAMU (%)',
'cobertura_atencao_basica': 'Cobertura da Atenção Básica (%)',
'taxa_leitos_uti': 'Taxa de Leitos UTI'
}
fig = px.line(
filtered_df,
x='ano',
y=indicador,
color='regiao',
title=f'Evolução do Indicador: {nomes_indicadores[indicador]}'
)
st.plotly_chart(fig, use_container_width=True)
with tab2:
st.subheader('Estrutura da Rede de Urgências')
# Criar gráfico de barras para estrutura
latest_year = filtered_df['ano'].max()
latest_data = filtered_df[filtered_df['ano'] == latest_year]
# Seletor de tipo de unidade
unit_type = st.selectbox(
'Tipo de Unidade',
['Todas', 'USB', 'USA', 'UPA', 'PA']
)
if unit_type == 'Todas':
estrutura_cols = ['n_usb', 'n_usa', 'n_upa', 'n_pa']
estrutura_data = latest_data.melt(
id_vars=['regiao'],
value_vars=estrutura_cols,
var_name='tipo_unidade',
value_name='quantidade'
)
fig = px.bar(
estrutura_data,
x='regiao',
y='quantidade',
color='tipo_unidade',
title=f'Estrutura da Rede de Urgências por Região (Ano: {latest_year})',
barmode='group'
)
else:
col_map = {'USB': 'n_usb', 'USA': 'n_usa', 'UPA': 'n_upa', 'PA': 'n_pa'}
fig = px.bar(
latest_data,
x='regiao',
y=col_map[unit_type],
title=f'Quantidade de {unit_type} por Região (Ano: {latest_year})'
)
fig.update_layout(xaxis_tickangle=-45)
st.plotly_chart(fig, use_container_width=True)
with tab3:
st.subheader('Análise Comparativa Regional')
# Seletor de indicadores para comparação
indicador_x = st.selectbox(
'Indicador Eixo X',
['cobertura_samu', 'cobertura_atencao_basica', 'taxa_leitos_uti', 'taxa_mortalidade_iam'],
key='ind_x'
)
indicador_y = st.selectbox(
'Indicador Eixo Y',
['taxa_mortalidade_iam', 'cobertura_samu', 'cobertura_atencao_basica', 'taxa_leitos_uti'],
key='ind_y'
)
# Criar scatter plot
latest_data = filtered_df[filtered_df['ano'] == latest_year]
fig = px.scatter(
latest_data,
x=indicador_x,
y=indicador_y,
color='regiao',
title=f'Correlação entre {nomes_indicadores[indicador_x]} e {nomes_indicadores[indicador_y]}',
hover_data=['populacao_estimada']
)
st.plotly_chart(fig, use_container_width=True)
# Análise detalhada
st.markdown('### Análise Detalhada dos Dados')
if st.checkbox('Mostrar dados brutos'):
st.write(filtered_df)
# Download dos dados
st.markdown('### Download dos Dados')
csv = filtered_df.to_csv(index=False)
st.download_button(
label="Download dados em CSV",
data=csv,
file_name="dados_rede_urgencias_filtrados.csv",
mime="text/csv",
)
# Adicionar footer com informações
st.markdown('---')
st.markdown('''
#### Notas:
- Os dados apresentados são atualizados anualmente
- A taxa de mortalidade por IAM é calculada por 100.000 habitantes
- A cobertura do SAMU e da Atenção Básica é apresentada em percentual
- USB: Unidade de Suporte Básico
- USA: Unidade de Suporte Avançado
- UPA: Unidade de Pronto Atendimento
- PA: Pronto Atendimento
''')