#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 pocas veces al año.",}, 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_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(valor[3]), 'num_reincidencia_t': str(valor[4]), 'mes_t': str(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',value=0) with col2: total_min = st.number_input('Total de minutos usados',value=0) with col3: mes = st.number_input('Cuantos meses ha usado mi bici',value=0.0) #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]))