Spaces:
Sleeping
Sleeping
| 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"<div style='background-color:gray;'><span style='color:black;font-weight:bold;font-size:18px'>**ZONA" | |
| f" {zona + 1}:**</span></div>", | |
| unsafe_allow_html=True | |
| ) | |
| for direccion in direcciones_zona: | |
| st.markdown(f"<div>- {direccion}</div>", unsafe_allow_html=True) | |
| st.markdown("<hr>", unsafe_allow_html=True) | |