import folium import matplotlib.pyplot as plt import streamlit as st from streamlit_folium import folium_static import geocoding import means st.set_page_config(layout='wide') # Para usar todo el ancho de la página # Titulo # Ajustar el tamaño del gráfico del codo col1, col2, col3 = st.columns(3) # Gráfico del Codo with col2: col2.title('Clientes por Zonas') fig, ax = plt.subplots(figsize=(6, 4)) ax.plot(range(2, means.max_k + 1), means.inertias, marker='o') ax.set_xlabel('Número de zonas (k)') ax.set_ylabel('Inercia') ax.set_title('Método del Codo') st.pyplot(fig) # Input de K k_optimo = st.number_input( "Ingrese el valor óptimo de k según el gráfico:", min_value=2, max_value=means.max_k, step=1 ) # Llamada means modelo = means.KMeans(n_clusters=k_optimo, random_state=42) modelo.fit(geocoding.coordenadas) etiquetas = modelo.labels_ num_zonas = len(set(etiquetas)) zonas = {} for i, etiqueta in enumerate(etiquetas): if etiqueta not in zonas: zonas[etiqueta] = [] zonas[etiqueta].append(geocoding.direcciones[i]) # Crear el mapa centrado en la primera coordenada primer_coordenada = geocoding.coordenadas[0] mapa = folium.Map(location=primer_coordenada, zoom_start=15) colors = ['red', 'blue', 'green', 'purple', 'orange', 'darkred', 'lightred', 'beige', 'darkblue', 'darkgreen', 'cadetblue', 'darkpurple', 'white', 'pink', 'lightblue', 'lightgreen', 'gray', 'black', 'lightgray'] # Colores disponibles en Folium for i, coordenada in enumerate(geocoding.coordenadas): zona = etiquetas[i] + 1 color = colors[zona % len(colors)] if coordenada != (None, None): folium.Marker( location=coordenada, popup=f'Zona: {zona}', icon=folium.Icon(color=color) ).add_to(mapa) # Mostrar el mapa y la leyenda en Streamlit en dos columnas col1, col2, col3 = st.columns(3) with col1: folium_static(mapa, width=800, height=600) with col3: # Zonas ordenadas de forma descendente for zona, direcciones_zona in sorted(zonas.items(), reverse=False): st.markdown( f"
**ZONA" f" {zona + 1}:**
", unsafe_allow_html=True ) for direccion in direcciones_zona: st.markdown(f"
- {direccion}
", unsafe_allow_html=True) st.markdown("
", unsafe_allow_html=True)