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 = """
Leyenda
Municipal Corporación
Municipal DAEM
Particular subvencionado
Particular pagado
Corporación de administración delegada
Servicio Local de Educación
Otros
""" m.get_root().html.add_child(folium.Element(legend_html)) # --- Mostrar el mapa --- st_folium(m, width=1200, height=650) # --- Vista de tabla --- with st.expander("Ver tabla filtrada"): columns_to_display = ['nombre_region', 'nombre_comuna', 'nombre_colegio', 'dependencia_desc', 'grupo_socioecon_desc', 'es_rural_desc', 'promedio_lectura', 'promedio_matematica'] st.dataframe(df_map[columns_to_display])