SysvIA / app.py
Jartemio's picture
modificacion de interface
03f1871
#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]))