import streamlit as st
import pandas as pd
import folium
from folium.plugins import MarkerCluster
from streamlit_folium import st_folium
import html
# --- Configuración ---
st.set_page_config(page_title="Puntajes SIMCE de centros escolares, para estudiantes de 2do medio 2024", page_icon=":school:", layout="wide")
st.title(":school: Puntajes SIMCE 2024")
# --- Diccionarios para mapear valores a descripciones ---
dependencia_map = {
1: 'Municipal Corporación',
2: 'Municipal DAEM',
3: 'Particular subvencionado',
4: 'Particular pagado',
5: 'Corporación de administración delegada',
6: 'Servicio Local de Educación'
}
socioecon_map = {
1: 'Bajo',
2: 'Medio Bajo',
3: 'Medio',
4: 'Medio Alto',
5: 'Alto'
}
rural_map = {
1: 'Urbano',
2: 'Rural'
}
# --- Cargar datos ---
@st.cache_data
def load_data():
df = pd.read_csv(
"data/simce.csv",
sep=";",
decimal=",",
encoding="ISO-8859-1",
header=0,
on_bad_lines="skip"
)
# Crear columnas con descripciones
df['dependencia_desc'] = df['dependencia'].map(dependencia_map)
df['grupo_socioecon_desc'] = df['grupo_socioecon'].map(socioecon_map)
df['es_rural_desc'] = df['es_rural'].map(rural_map)
return df
# Cargar datos
df = load_data()
# --- Descripción ---
st.subheader("Establecimientos educacionales en Chile")
st.markdown("Datos del MINEDUC")
# --- Filtros ---
col1, col2 = st.columns(2)
regiones = ["(Todas)"] + sorted(df["nombre_region"].dropna().unique().tolist())
ruralidades = ["(Todas)"] + sorted(df["es_rural_desc"].dropna().unique().tolist())
with col1:
sel_region = st.selectbox("Región", regiones, index=0)
with col2:
sel_ruralidad = st.selectbox("Ruralidad", ruralidades, index=0)
# Filtrar datos
df_f = df.copy()
if sel_region != "(Todas)":
df_f = df_f[df_f["nombre_region"] == sel_region]
if sel_ruralidad != "(Todas)":
df_f = df_f[df_f["es_rural_desc"] == sel_ruralidad]
# Filtrar filas con coordenadas válidas
df_map = df_f.dropna(subset=["latitud", "longitud"])
# --- Mapeo de colores por tipo ---
color_map = {
'Municipal Corporación': 'blue',
'Municipal DAEM': 'green',
'Particular subvencionado': 'orange',
'Particular pagado': 'purple',
'Corporación de administración delegada': 'red',
'Servicio Local de Educación': 'cadetblue'
}
# Función para asignar color según tipo
def tipo_color(tipo: str) -> str:
return color_map.get(tipo, "gray")
# --- Crear mapa centrado en Chile ---
m = folium.Map(location=[-33.45, -70.65], zoom_start=6, tiles="CartoDB positron")
# Cluster
cluster = MarkerCluster().add_to(m)
# --- Agregar marcadores ---
for _, r in df_map.iterrows():
lat, lon = float(r["latitud"]), float(r["longitud"])
nombre = html.escape(str(r.get("nombre_colegio", "")))
comuna = html.escape(str(r.get("nombre_comuna", "")))
tipo = html.escape(str(r.get("dependencia_desc", "")))
lenguaje = html.escape(str(r.get("promedio_lectura", "")))
matematica = html.escape(str(r.get("promedio_matematica", "")))
rural = html.escape(str(r.get("es_rural_desc", "")))
grupoeconomico = html.escape(str(r.get("grupo_socioecon_desc", "")))
popup_html = f"""
{nombre}
Tipo: {tipo}
Comuna: {comuna}
Promedio lenguaje: {lenguaje}
Promedio matematica: {matematica}
Es rural: {rural}
Grupo socioeconomico: {grupoeconomico}
"""
folium.Marker(
location=[lat, lon],
popup=folium.Popup(popup_html, max_width=350),
icon=folium.Icon(color=tipo_color(r.get("dependencia_desc")), icon="plus", prefix="fa"),
).add_to(cluster)
# --- Leyenda ---
legend_html = """