File size: 5,466 Bytes
0d7c039
 
 
 
 
 
 
 
 
 
 
 
 
 
ed06be6
30347d1
0d7c039
 
 
30347d1
0d7c039
 
 
 
27b170b
 
ed06be6
2287d86
0d7c039
 
ed06be6
0d7c039
 
ed06be6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d7c039
ed06be6
 
0d7c039
ed06be6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d7c039
ed06be6
0d7c039
ed06be6
0d7c039
ed06be6
0d7c039
 
ed06be6
 
0d7c039
ed06be6
 
 
0d7c039
ed06be6
 
 
 
 
 
 
0d7c039
ed06be6
 
 
 
 
 
 
 
 
 
 
0d7c039
ed06be6
 
0d7c039
 
 
 
30347d1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# Actualizado por: José Carlos Machicao, Fecha de actualización: 2024_07_08, Lima
# Esta vinculado a los PKL de https://sites.google.com/continental.edu.pe/edusights/inicio

# Importacion de librerias
import torch
import torch.nn as nn
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split
from torch.utils.data import DataLoader, TensorDataset
import plotly.express as px
import streamlit as st
from es_class_nn import SimplePlusNN2
from prediction_analyzer import PredictionAnalyzer
version_name = 'CON_44'

c1, c2 = st.columns([6,6])
with c2:
    st.image('img/logo_vidad.png', width=300, caption='https://www.continental.edu.pe/')

st.title("Predicción de Abandono o Permanencia")
st.write("Cargue el archivo PKL para visualizar el análisis de su contenido.")

st.write('Cargue el archivo con datos nuevos aqui. Este archivo deberá seguir las pautas del diccionario de categorías y deberá estar en formato XLSX')
st.write('En caso no conozca el diccionario descarguelo aquí.')
st.link_button('Diccionario', 'https://huggingface.co/spaces/gestiodinamica/continental_predictivo/resolve/main/auxiliares/diccionario_variables_pkl_train.txt?download=true')

uploaded_file = st.file_uploader("Cargar archivo: ", type='xlsx')

df_categ = pd.read_excel('auxiliares/lista_categorias_rev.xlsx')

if uploaded_file is not None:

    df_2 = pd.read_excel(uploaded_file)
    
    # Procesamiento de archivo listo para predicción
    df_2 = df_2.dropna(axis=0)
    df_2.index = df_2.DNI
    df_2.drop(columns=['DNI'], inplace=True)
    st.write('Dimensiones de archivo ingresado: ', df_2.shape)
    
    cat_list = []
    num_list = []
    for col in df_2.columns:
        if df_2[col].dtype == 'object':
            if len(df_2[col].unique()) < 35:
                cat_list.append(col)
        else:
            num_list.append(col)

    df_a = df_2[cat_list]
    df_b = pd.get_dummies(df_a)
    df_b = df_b.set_index(df_2.index)
    #df_b.index
    scaler = MinMaxScaler()
    X_sc = scaler.fit_transform(df_b)
    df_sc = pd.DataFrame(X_sc)
    df_sc.columns = df_b.columns
    df_n = df_2[num_list]
    df_n = df_n.set_index(df_2.index)
    #df_n.index
    df_sc.index = df_b.index
    if (df_sc.index == df_n.index).sum()==len(df_2):
        st.write('Indices Consistentes Verificados.')
    df_r = pd.concat([df_sc, df_n], axis=1)
    st.write('Dimensiones del archivo procesado: ', df_r.shape)
    
    
    list_df_modelo = pd.read_excel('auxiliares/lista_categorias_CON_44_v0.xlsx')
    lista_categorias = list_df_modelo[0].to_list()
    
    cats_ad = []
    cats_res = []
    for c in df_r.columns:
        if c not in lista_categorias:
            cats_ad.append(c)
        else:
            cats_res.append(c)
    
    cats_dis = []
    cats_res2 = []
    for c in lista_categorias:
        if c not in df_r.columns:
            cats_dis.append(c)
        else:
            cats_res2.append(c)
    
    df_ad = pd.DataFrame(0, index=range(140), columns=cats_dis)
    df_ad.index = df_r.index
    df_base = df_r[cats_res]
    df_base.index = df_r.index
    df_tot = pd.concat([df_base, df_ad], axis=1)
    
    cats_test = []
    for c in df_tot.columns:
        if c in lista_categorias:
            cats_test.append(c)
        
    cats_final = []
    for c in lista_categorias:
        if c[0:6]=='ESTADO':
            print(c)
        else:
            cats_final.append(c)

    df_ready = df_tot[cats_final]
    #df_ready.shape
    #st.write(df_ready.index[0:10])
    st.write('Dimensiones del archivo para predicción: ', df_ready.shape)

    DROPOUTX = 0.10
    version_name = 'CON_44'
    X_train = df_ready.values
    X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
    st.write('Dimensiones del tensor: ', X_train_tensor.shape)
    input_size = X_train_tensor.shape[1]
    num_classes = 2

    model = SimplePlusNN2(input_size, num_classes)
    data_path = 'models/'
    dict_name = f'edusights_20240702_state_dict_{version_name}.pth'
    st.write(dict_name)
    model.load_state_dict(torch.load(data_path+dict_name))
    model.eval()
    
    outputs = model(X_train_tensor)
    outputs_show = outputs.detach().numpy().flatten()
    st.write('Salida: ', outputs_show.shape)
    outputs_show[outputs_show > 0.51] = 1.0
    outputs_show[outputs_show < 0.49] = 0.0
    filtered_arr = outputs_show[(outputs_show == 0.0) | (outputs_show == 1.0)]
    unique, counts = np.unique(filtered_arr, return_counts=True)
    st.write(unique, counts)
    pred_df = pd.DataFrame(filtered_arr)
    st.write('Dimensión de predicciones totales: ', pred_df.shape)
    df_ready_2 = df_ready.copy()
    df_ready_2['Predicción'] = pred_df
    st.write(df_ready_2.head())

    analyzer = PredictionAnalyzer(model, df_ready)
    results_df = analyzer.predictions_loop()
    st.write(results_df)

    csv_out = df_ready_2.to_csv(encoding='iso-8859-1')
    st.download_button(
        label="Descargar Predicciones Totales", data=csv_out,
        file_name='predicciones_carga.csv', mime='text/csv'
    )
    
    csv_out = results_df.to_csv(encoding='iso-8859-1')
    st.download_button(
        label="Descargar Predicciones por Categoría", data=csv_out,
        file_name='predicciones_carga.csv', mime='text/csv'
    )
        
c3, c4 = st.columns([6,6])
with c3:
    st.image('img/gdmklogo.png', width=100, caption='Powered by GestioDinámica 2024')