|
|
|
|
|
import streamlit as st |
|
|
import random |
|
|
import pickle |
|
|
import joblib |
|
|
from sklearn.preprocessing import StandardScaler |
|
|
import pandas as pd |
|
|
import time |
|
|
|
|
|
from sklearn.cluster import KMeans |
|
|
|
|
|
standard_scaler = StandardScaler() |
|
|
|
|
|
|
|
|
|
|
|
dataIni = pd.read_csv('DataModelo.csv') |
|
|
|
|
|
|
|
|
data = dataIni[['recency_t','Avg_dias_t','distancia_t','total_min_t','num_reincidencia_t','mes_t']] |
|
|
|
|
|
|
|
|
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_promedio = { |
|
|
'1 - 10 dias': 1, |
|
|
'10 - 30 dias': 15, |
|
|
'30 - 50 dias': 40, |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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_promedio[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) |
|
|
|
|
|
Master_scaled = standard_scaler.fit_transform(dataNew) |
|
|
Master_scaled = pd.DataFrame(Master_scaled) |
|
|
Master_scaled.columns = dataNew.columns |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
kmeans = KMeans() |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
st.success(cluster_dict[dataNew["Cluster"].iloc[-1]]["descripcion"], icon="✅") |
|
|
return "" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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('Inserte los dias recientes',value=0) |
|
|
|
|
|
with col2: |
|
|
|
|
|
avg_dias = option = st.selectbox( |
|
|
'Promedio de dias que se usa mibici', |
|
|
('1 - 10 dias', '10 - 30 dias', '30 - 50 dias ')) |
|
|
with col3: |
|
|
total_min = st.number_input('Distancia que recorre en km',value=0.000000) |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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])) |
|
|
|
|
|
|