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) | |