File size: 2,560 Bytes
479fe69
 
 
 
1588088
e2c45bb
0b1127d
479fe69
 
 
 
 
 
 
 
0b1127d
479fe69
 
 
 
0b1127d
479fe69
 
 
 
 
0b1127d
479fe69
 
0b1127d
479fe69
 
a35a72c
0b1127d
e2c45bb
479fe69
 
 
 
 
 
 
 
e2c45bb
479fe69
 
e2c45bb
479fe69
 
 
 
 
 
 
e2c45bb
479fe69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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)