-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathapp.py
202 lines (168 loc) · 7.85 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
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import requests
import json
API="https://midas.minsal.cl/farmacia_v2/WS/getLocales.php"
# def obtenerDatos():
# try:
# response = requests.get(API) # Realizar una solicitud GET a la API
# # Mostrar el contenido de la respuesta
# st.write("Respuesta:", response.text) # Muestra el cuerpo de la respuesta
# st.write("Código de estado:", response.status_code) # Muestra el código de estado
# # Asegúrate de que la respuesta tenga un código de estado 200
# if response.status_code == 200:
# data = response.json() # Convirtiendo la respuesta JSON a un diccionario de Python
# st.write("Datos obtenidos:", data) # Muestra los datos obtenidos
# return pd.DataFrame(data) # Devuelve los datos como un DataFrame
# else:
# st.error("Error al obtener los datos. Código de estado: " + str(response.status_code))
# return pd.DataFrame() # Devuelve un DataFrame vacío si no se obtienen los datos
# except Exception as e:
# st.error(f"Ocurrió un error al intentar obtener los datos: {e}")
# return pd.DataFrame() # Devuelve un DataFrame vacío si hay un error
# Ruta al archivo JSON (asumimos que está en el mismo directorio que app.py)
json_file_path = 'data.json'
regiones_map = {
2: "Región de Tarapacá",
3: "Región de Antofagasta",
4: "Región de Atacama",
5: "Región de Coquimbo",
6: "Región de Valparaíso",
7: "Región Metropolitana del Gran Santiago",
8: "Región de O'Higgins",
9: "Región del Maule",
10: "Región del Biobío",
11: "Región de la Araucanía",
12: "Región de Los Ríos",
13: "Región de Los Lagos",
14: "Región de Aysén",
16: "Región de Ñuble"
}
def obtenerDatos():
try:
with open(json_file_path, 'r', encoding='utf-8') as f:
data = json.load(f) # Cargar los datos del archivo JSON
# Diccionario de mapeo de FK a nombres de región (puedes ajustarlo según tus datos)
# Reemplazar FK con nombres de región
for item in data:
if 'fk_region' in item:
# Reemplazar el número de la región con el nombre correspondiente
item['region_nombre'] = regiones_map.get(item['fk_region'], f"Región {item['fk_region']}")
return pd.DataFrame(data) # Convertir los datos a un DataFrame de Pandas
except Exception as e:
st.error(f"Error al cargar el archivo JSON: {e}")
return pd.DataFrame() # Retorna un DataFrame vacío en caso de error
st.set_page_config(page_title="Farmacias Chile", page_icon=":flag_chile:", layout="wide")
# Cargar CSS desde la carpeta 'style'
def cargar_estilos():
with open("style/style.css", "r") as f:
st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
# Llamar a la función para cargar los estilos
cargar_estilos()
# Cargar datos
datos = obtenerDatos()
# Encabezado con imagen de fondo
st.markdown("""
<div class="header">
<h1>Análisis y Visualización de Farmacias en Chile</h1>
</div>
""", unsafe_allow_html=True)
#intro
with st.container():
st.write('Esta aplicación web permite visualizar la ubicación de las farmacias en Chile, además de información relevante sobre ellas, asi como nombre de local, en que localidad o region se encuentra, horarios de apertura y cierre segun el dia actual, entre otras.')
# Crear contenedor para filtros y resultados
if not datos.empty:
# Crear columnas para sidebar y contenido principal
col_filtros, col_contenido = st.columns([1, 16])
# Crear columnas para sidebar y contenido principal
col_filtros, col_contenido = st.columns([1, 16])
with col_filtros:
# Filtros en la columna izquierda
st.sidebar.header("Filtros de Búsqueda")
# Filtro de Región con Checkboxes
st.sidebar.subheader("Regiones")
regiones = datos["region_nombre"].unique()
selected_regiones = st.sidebar.multiselect(
"Selecciona y busca por Regiones",
options=regiones, # Lista de regiones
default=[]
)
# Filtro de Localidad con Checkboxes
st.sidebar.subheader("Localidades")
if selected_regiones: # Mostrar solo localidades dentro de las regiones seleccionadas
localidades = datos[datos["region_nombre"].isin(selected_regiones)]["localidad_nombre"].unique()
else:
localidades = datos["localidad_nombre"].unique() # Todas las localidades
selected_localidades = st.sidebar.multiselect(
"Selecciona y busca por Localidades",
options=localidades,
default=[]
)
# Filtro de Comuna con Checkboxes
st.sidebar.subheader("Comunas")
if selected_localidades: # Mostrar solo comunas dentro de las localidades seleccionadas
comunas = datos[datos["localidad_nombre"].isin(selected_localidades)]["comuna_nombre"].unique()
elif selected_regiones: # Mostrar comunas dentro de las regiones seleccionadas
comunas = datos[datos["region_nombre"].isin(selected_regiones)]["comuna_nombre"].unique()
else:
comunas = datos["comuna_nombre"].unique() # Todas las comunas
selected_comunas = st.sidebar.multiselect(
"Selecciona y busca por Comunas",
options=comunas,
default=[]
)
# Mostrar la leyenda en la parte inferior del panel de filtros
st.sidebar.markdown("### Leyenda de Regiones")
for key, value in regiones_map.items():
st.sidebar.markdown(f"**{key}**: {value}")
# Aplicar filtros al DataFrame
datos_filtrados = datos.copy()
if selected_regiones: # Filtrar por regiones seleccionadas
datos_filtrados = datos_filtrados[datos_filtrados["region_nombre"].isin(selected_regiones)]
if selected_localidades: # Filtrar por localidades seleccionadas
datos_filtrados = datos_filtrados[datos_filtrados["localidad_nombre"].isin(selected_localidades)]
if selected_comunas: # Filtrar por comunas seleccionadas
datos_filtrados = datos_filtrados[datos_filtrados["comuna_nombre"].isin(selected_comunas)]
# Mostrar datos filtrados
with col_contenido:
st.subheader("Datos de Farmacias Filtrados")
st.dataframe(datos_filtrados)
# Gráfico de cantidad de farmacias basado en filtros
if not datos_filtrados.empty:
st.subheader("Gráfico: Cantidad de Farmacias Filtradas")
# Determinar el campo de agrupación dinámicamente según los filtros aplicados
if selected_comunas:
agrupacion = "comuna_nombre"
titulo_grafico = "Comunas"
elif selected_localidades:
agrupacion = "localidad_nombre"
titulo_grafico = "Localidades"
elif selected_regiones:
agrupacion = "region_nombre"
titulo_grafico = "Regiones"
else:
agrupacion = "region_nombre"
titulo_grafico = "Regiones (sin filtros aplicados)"
# Contar ocurrencias en la columna de agrupación
grafico_datos = datos_filtrados[agrupacion].value_counts()
# Crear el gráfico solo si hay datos
if not grafico_datos.empty:
fig, ax = plt.subplots(figsize=(10, 6))
grafico_datos.plot(kind="bar", ax=ax, color="#4CAF50")
ax.set_title(f"Cantidad de Farmacias por {titulo_grafico}")
ax.set_xlabel(titulo_grafico)
ax.set_ylabel("Cantidad")
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
st.pyplot(fig)
else:
st.write("No hay datos suficientes para generar el gráfico.")
# Descargar datos filtrados
if not datos_filtrados.empty:
st.download_button(
label="Descargar datos filtrados en CSV",
data=datos_filtrados.to_csv(index=False),
file_name="farmacias_filtradas.csv",
mime="text/csv"
)