cambios subidos
Browse files- DataModelo.csv +0 -0
- app.py +129 -20
DataModelo.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
app.py
CHANGED
@@ -1,48 +1,157 @@
|
|
|
|
1 |
import streamlit as st
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
-
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
|
|
10 |
|
|
|
11 |
|
|
|
|
|
|
|
|
|
12 |
col1, col2, col3 = st.columns(3)
|
13 |
with col1:
|
14 |
recency = st.number_input('Inserte los dias recientes',value=0)
|
15 |
|
16 |
with col2:
|
17 |
-
avg_dias = st.number_input('Promedio de dias que se usa mibici',value=0.00)
|
18 |
-
|
|
|
|
|
19 |
with col3:
|
20 |
total_min = st.number_input('Distancia que recorre en km',value=0.000000)
|
21 |
|
22 |
-
col1, col2 = st.columns(
|
23 |
with col1:
|
24 |
num_reincidencia = st.number_input('Numeros de reincidencia',value=0)
|
25 |
with col2:
|
|
|
|
|
26 |
mes = st.number_input('Cuantos meses ha usado mi bici',value=0.0)
|
27 |
-
|
28 |
#Master = Master[[recency, avg_dias, total_min, num_reincidencia, mes]]
|
29 |
-
# st.write('The current number is ', recency)
|
30 |
|
31 |
col1, col2, col3 , col4, col5, col6, col7 = st.columns(7)
|
32 |
with col4:
|
33 |
-
st.button('Calcular')
|
34 |
|
35 |
-
|
36 |
-
with col1:
|
37 |
-
st.image('logo.png')
|
38 |
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
|
|
1 |
+
#imports
|
2 |
import streamlit as st
|
3 |
+
import random
|
4 |
+
import pickle
|
5 |
+
import joblib
|
6 |
+
from sklearn.preprocessing import StandardScaler
|
7 |
+
import pandas as pd
|
8 |
+
import time
|
9 |
|
10 |
+
from sklearn.cluster import KMeans
|
11 |
|
12 |
+
standard_scaler = StandardScaler()
|
13 |
|
14 |
+
#pre cargar
|
15 |
|
16 |
+
dataIni = pd.read_csv('DataModelo.csv')
|
17 |
+
#data = dataIni.drop(['Usuario_Id','Cluster','recency','Avg_dias','distancia','total_min','num_reincidencia','mes'], axis=1, )
|
18 |
+
#data = dataIni.drop(columns= {'Cluster','Usuario_Id','recency', 'Avg_dias','distancia', 'total_min', 'num_reincidencia', 'mes'})
|
19 |
+
data = dataIni[['recency_t','Avg_dias_t','distancia_t','total_min_t','num_reincidencia_t','mes_t']]
|
20 |
+
# var
|
21 |
+
|
22 |
+
cluster_dict = {
|
23 |
+
0: {"descripcion":"Usuarios que usan muchas veces el servicio, por distancias largas y frecuentemente.",},
|
24 |
+
1: {"descripcion":"Usuarios que no lo usan por distancias largas, lo usan pocas veces al año y con muy poca frecuencia.",},
|
25 |
+
2: {"descripcion":"Usuarios que usan el servicio para distancias largas, pocas veces al año y no muy frecuentemente.",},
|
26 |
+
3: {"descripcion":"Usuarios que no lo usan por distancias largas, lo usan varias veces al año y frecuentemente.",},
|
27 |
+
4: {"descripcion":"Usuarios que no lo usan por distancias largas, lo usan varias veces al año y muy frecuentemente",},
|
28 |
+
5: {"descripcion":"Usuarios que lo usan por distancias muy cortas, muy pocas veces al año y muy pocas veces al año.",},
|
29 |
+
6: {"descripcion":"Usuarios que usan el servicio para distancias cortas, pero lo utilizan muy seguido durante todo el año.",},
|
30 |
+
7: {"descripcion":"Usuarios que utilizan el servicio para distancias largas, pero muy pocas veces al año y con muy poca frecuencia."},
|
31 |
+
}
|
32 |
+
|
33 |
+
diccionario_operaciones = {
|
34 |
+
'recency_t': (1/3),
|
35 |
+
'Avg_dias_t': (1/5),
|
36 |
+
'distancia_t': 1,
|
37 |
+
'total_min_t': (1/3),
|
38 |
+
'num_reincidencia_t': (1/3),
|
39 |
+
'mes_t': 1
|
40 |
+
|
41 |
+
}
|
42 |
+
|
43 |
+
diccionario_promedio = {
|
44 |
+
'1 - 10 dias': 1,
|
45 |
+
'10 - 30 dias': 15,
|
46 |
+
'30 - 50 dias': 40,
|
47 |
+
}
|
48 |
+
|
49 |
+
#Funciones
|
50 |
+
|
51 |
+
def transformacionData(formularioTemp):
|
52 |
+
for k, v in formularioTemp.items():
|
53 |
+
formularioTemp[k]= (float(v[0]) ** diccionario_operaciones[k])
|
54 |
+
return formularioTemp
|
55 |
+
|
56 |
+
def procesarDatos(valor):
|
57 |
+
with st.spinner('Cargando...'):
|
58 |
+
|
59 |
+
|
60 |
+
formulario = {
|
61 |
+
'recency_t': str(valor[0]),
|
62 |
+
'Avg_dias_t': str(diccionario_promedio[valor[1]]),
|
63 |
+
'distancia_t': str(valor[2]),
|
64 |
+
'total_min_t': str(valor[3]),
|
65 |
+
'num_reincidencia_t': str(valor[4]),
|
66 |
+
'mes_t': str(valor[5])
|
67 |
+
}
|
68 |
+
|
69 |
+
resultado = transformacionData(formulario)
|
70 |
+
|
71 |
+
dataNew = data.append(resultado,ignore_index=True)
|
72 |
+
dataNew = dataNew.fillna(0)
|
73 |
+
#standard_scaler
|
74 |
+
Master_scaled = standard_scaler.fit_transform(dataNew)
|
75 |
+
Master_scaled = pd.DataFrame(Master_scaled)
|
76 |
+
Master_scaled.columns = dataNew.columns
|
77 |
+
|
78 |
+
|
79 |
+
|
80 |
+
# Agregar el diccionario de entrada al dataset como último valor
|
81 |
+
|
82 |
+
#last_data = Master_scaled.iloc[1:]
|
83 |
+
|
84 |
+
# Verificar el tiempo de respuesta de estandarización para estandarizar los datos de entrada
|
85 |
+
|
86 |
+
# Ejecución de modelo
|
87 |
+
kmeans = KMeans()
|
88 |
+
|
89 |
+
# Aplicación del método del codo para la obtención de número de clúster óptimos
|
90 |
+
distortions = []
|
91 |
+
K = range(1,8)
|
92 |
+
for k in K:
|
93 |
+
kmeanModel = KMeans(n_clusters=k)
|
94 |
+
kmeanModel.fit(Master_scaled)
|
95 |
+
distortions.append(kmeanModel.inertia_)
|
96 |
+
|
97 |
+
dataNew["Cluster"] = kmeans.fit_predict(Master_scaled)
|
98 |
+
|
99 |
+
|
100 |
+
# Resultado
|
101 |
+
#resultado = dataNew.iloc[1:]['cluster']
|
102 |
+
|
103 |
+
#st.text(resultado)
|
104 |
|
105 |
|
106 |
+
# print(resultado)
|
107 |
+
#dataNew.to_csv(r'C:\Users\Jartemio\Desktop\Saturdays\repositorioPruebaHuggingface\export_dataframe.csv', index=False, header=True)
|
108 |
+
st.success(cluster_dict[dataNew["Cluster"].iloc[-1]]["descripcion"], icon="✅")
|
109 |
+
return ""
|
110 |
+
#list1 = [0,1, 2, 3, 4, 5, 6,7]
|
111 |
+
#return cluster_dict[random.choice(list1)]["descripcion"]
|
112 |
|
113 |
+
#Interface
|
114 |
|
115 |
+
st.image('banner.jpg')
|
116 |
|
117 |
+
col1, col2, col3 , col4, col5 = st.columns(5)
|
118 |
+
with col3:
|
119 |
+
st.image('logo.png')
|
120 |
+
|
121 |
col1, col2, col3 = st.columns(3)
|
122 |
with col1:
|
123 |
recency = st.number_input('Inserte los dias recientes',value=0)
|
124 |
|
125 |
with col2:
|
126 |
+
#avg_dias = st.number_input('Promedio de dias que se usa mibici',value=0.00)
|
127 |
+
avg_dias = option = st.selectbox(
|
128 |
+
'Promedio de dias que se usa mibici',
|
129 |
+
('1 - 10 dias', '10 - 30 dias', '30 - 50 dias '))
|
130 |
with col3:
|
131 |
total_min = st.number_input('Distancia que recorre en km',value=0.000000)
|
132 |
|
133 |
+
col1, col2, col3 = st.columns(3)
|
134 |
with col1:
|
135 |
num_reincidencia = st.number_input('Numeros de reincidencia',value=0)
|
136 |
with col2:
|
137 |
+
total_min = st.number_input('Total de minutos usados',value=0)
|
138 |
+
with col3:
|
139 |
mes = st.number_input('Cuantos meses ha usado mi bici',value=0.0)
|
|
|
140 |
#Master = Master[[recency, avg_dias, total_min, num_reincidencia, mes]]
|
|
|
141 |
|
142 |
col1, col2, col3 , col4, col5, col6, col7 = st.columns(7)
|
143 |
with col4:
|
144 |
+
buttonCalcular = st.button('Calcular')
|
145 |
|
146 |
+
texto_output = st.markdown('')
|
|
|
|
|
147 |
|
148 |
+
|
149 |
+
|
150 |
+
|
151 |
+
|
152 |
+
|
153 |
+
|
154 |
+
|
155 |
+
if buttonCalcular:
|
156 |
+
texto_output.markdown(procesarDatos([recency, avg_dias, total_min, total_min, num_reincidencia, mes]))
|
157 |
+
|