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