perezcatriel's picture
[FIX] README
a35a72c
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)