File size: 5,975 Bytes
805e36e
3267330
805e36e
 
 
 
 
3267330
805e36e
3267330
 
805e36e
d97bbf1
805e36e
 
 
 
 
 
 
 
 
 
 
 
03f1871
805e36e
 
 
 
 
 
 
 
 
 
 
 
 
 
06a6180
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7f98157
 
 
 
 
 
 
 
 
 
805e36e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7f98157
805e36e
06a6180
805e36e
06a6180
805e36e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3267330
 
805e36e
5b78fc2
805e36e
3267330
805e36e
3267330
805e36e
3267330
805e36e
 
 
 
3267330
 
7f98157
3267330
 
805e36e
 
7f98157
 
3267330
7f98157
3267330
805e36e
3267330
06a6180
3267330
06a6180
 
 
 
 
805e36e
06a6180
 
3267330
 
 
 
805e36e
3267330
805e36e
3267330
805e36e
 
 
 
 
 
 
 
 
 
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#imports
import streamlit as st
import random
import pickle 
from sklearn.preprocessing import StandardScaler
import pandas as pd
import time

from sklearn.cluster import KMeans


#pre cargar
standard_scaler = StandardScaler()
dataIni = pd.read_csv('DataModelo.csv')
#data = dataIni.drop(['Usuario_Id','Cluster','recency','Avg_dias','distancia','total_min','num_reincidencia','mes'], axis=1, )
#data = dataIni.drop(columns= {'Cluster','Usuario_Id','recency', 'Avg_dias','distancia', 'total_min', 'num_reincidencia', 'mes'})
data = dataIni[['recency_t','Avg_dias_t','distancia_t','total_min_t','num_reincidencia_t','mes_t']]
# var

cluster_dict = {
    0: {"descripcion":"Usuarios que usan muchas veces el servicio, por distancias largas y frecuentemente.",},
    1: {"descripcion":"Usuarios que no lo usan por distancias largas, lo usan pocas veces al año y con muy poca frecuencia.",},
    2: {"descripcion":"Usuarios que usan el servicio para distancias largas, pocas veces al año y no muy frecuentemente.",},
    3: {"descripcion":"Usuarios que no lo usan por distancias largas, lo usan varias veces al año y frecuentemente.",},
    4: {"descripcion":"Usuarios que no lo usan por distancias largas, lo usan varias veces al año y muy frecuentemente",},
    5: {"descripcion":"Usuarios que lo usan por distancias muy cortas, muy pocas veces al año y muy pocos frecuente",},
    6: {"descripcion":"Usuarios que usan el servicio para distancias cortas, pero lo utilizan muy seguido durante todo el año.",},
    7: {"descripcion":"Usuarios que utilizan el servicio para distancias largas, pero muy pocas veces al año y con muy poca frecuencia."},
}

diccionario_operaciones = {
    'recency_t': (1/3),
    'Avg_dias_t': (1/5),
    'distancia_t': 1,
    'total_min_t': (1/3),
    'num_reincidencia_t': (1/3),
    'mes_t': 1

}

diccionario_mes_t = {
    '1 mes': 1,
    '2 meses': 2,
    '3 meses': 3,
    '4 meses': 4,
    '5 meses': 5,
    '6 meses': 6,
    '7 meses': 7,
    '8 meses': 8,
    '9 meses': 9,
    '10 meses': 10,
    '11 meses': 11,
    '12 meses (1 año)': 12
}

diccionario_total_min_t = {
    '1-10 minutos': 5,
    '10-20 minutos': 15,
    '20-30 minutos': 25,
    '30-40 minutos': 35,
    '40-50 minutos': 45,
    '1 Hora': 60,
    '1 Hora y media': 90,
    '2 Horas': 120,
    '3 Horas': 180,
    '4 Horas': 240,
    '5 Horas o más': 300
}

diccionario_Avg_dias_t = {
    '1 - 5 dias': 2.5,
    '5 - 10 dias': 7.5, 
    '10 - 15 dias': 12.5,
    '15 - 20 dias': 17.5,
    '20 - 25 dias': 22.5,
    '25 - 30 dias': 27.5,
    '30 - 35 dias': 32.5,
    '35 - 40 dias': 37.5,
    '40 dias en adelante': 45
}

#Funciones

def transformacionData(formularioTemp):
    for k, v in formularioTemp.items():
        formularioTemp[k]= (float(v[0])  ** diccionario_operaciones[k])
    return formularioTemp

def procesarDatos(valor): 
    with st.spinner('Cargando...'):  
        
        
        formulario = {
                    'recency_t': str(valor[0]),
                    'Avg_dias_t': str(diccionario_Avg_dias_t[valor[1]]),
                    'distancia_t': str(valor[2]),
                    'total_min_t': str(diccionario_total_min_t[valor[3]]),
                    'num_reincidencia_t': str(valor[4]),
                    'mes_t': str(diccionario_mes_t[valor[5]])
                }

        resultado = transformacionData(formulario)

        dataNew = data.append(resultado,ignore_index=True)
        dataNew = dataNew.fillna(0)
        #standard_scaler
        Master_scaled = standard_scaler.fit_transform(dataNew)
        Master_scaled = pd.DataFrame(Master_scaled)
        Master_scaled.columns = dataNew.columns



        # Agregar el diccionario de entrada al dataset como último valor 

        #last_data = Master_scaled.iloc[1:]

        # Verificar el tiempo de respuesta de estandarización para estandarizar los datos de entrada

        # Ejecución de modelo
        kmeans = KMeans()

        # Aplicación del método del codo para la obtención de número de clúster óptimos
        distortions = []
        K = range(1,8)
        for k in K:
            kmeanModel = KMeans(n_clusters=k)
            kmeanModel.fit(Master_scaled)
            distortions.append(kmeanModel.inertia_)

        dataNew["Cluster"] = kmeans.fit_predict(Master_scaled)


        # Resultado 
        #resultado = dataNew.iloc[1:]['cluster']

        #st.text(resultado)


        # print(resultado)
        st.success(cluster_dict[dataNew["Cluster"].iloc[-1]]["descripcion"]+"✅")
        return ""

#Interface

st.image('banner.jpg')

col1, col2, col3 , col4, col5 = st.columns(5)
with col3:
    st.image('logo.png')
    
col1, col2, col3 = st.columns(3)
with col1:
    recency = st.number_input('Dias recientes que ha usado MIBICI',min_value=1, max_value=30, value=1)

with col2:
    #avg_dias = st.number_input('Promedio de dias que se usa mibici',value=0.00)
    avg_dias = option = st.selectbox(
                    'Dias que usa MIBICI usualmente',
                    (diccionario_Avg_dias_t))
with col3:
    total_min = st.number_input('Distancia que recorre en km', min_value=0.5, max_value=20.0, value=0.5, step=0.5 )

col1, col2, col3 = st.columns(3)
with col1:
    num_reincidencia = st.number_input('Numeros de reincidencia', min_value=1, max_value=10, value=1, step=1)
with col2:
    total_min = option = st.selectbox(
                    'Total de minutos usados',
                    (diccionario_total_min_t))
    
    
with col3:
    mes = option = st.selectbox('¿Cuántos meses ha usado mi bici?',
                            (diccionario_mes_t))
#Master = Master[[recency, avg_dias, total_min, num_reincidencia, mes]]

col1, col2, col3 , col4, col5, col6, col7 = st.columns(7)
with col4:
    buttonCalcular = st.button('Calcular')
    
texto_output = st.markdown('')
    
    


    

    
    
if buttonCalcular:
    texto_output.markdown(procesarDatos([recency, avg_dias, total_min, total_min, num_reincidencia, mes]))