Download app.py from Jartemio/SysvIA: direct link, hf CLI and curl.
- Browser
- Download file 5.98 kB
-
https://huggingface.co/spaces/Jartemio/SysvIA/resolve/main/app.py
- Command line
-
hf download hf://spaces/Jartemio/SysvIA/app.py
-
curl -L -o app.py https://huggingface.co/spaces/Jartemio/SysvIA/resolve/main/app.py
5.98 kB
| #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])) | |