|
|
|
import streamlit as st |
|
import random |
|
import pickle |
|
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 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 |
|
} |
|
|
|
|
|
|
|
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) |
|
|
|
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"]+"✅") |
|
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('Dias recientes que ha usado MIBICI',min_value=1, max_value=30, value=1) |
|
|
|
with col2: |
|
|
|
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)) |
|
|
|
|
|
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])) |
|
|
|
|