File size: 5,076 Bytes
fd03181
b906a5a
943aa96
 
fd03181
803b4f5
 
 
25d6c71
803b4f5
 
 
cd371d1
943aa96
 
 
 
 
 
590da27
b906a5a
943aa96
 
 
 
 
 
 
803b4f5
943aa96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
803b4f5
943aa96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51d73a8
943aa96
 
 
 
 
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
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

c1, c2, = st.columns([7,7])
with c2:
    st.image('figures/gdmk_logo.png', width=100, caption='2023') 
with c1:
    st.image('figures/giz_logo.png', width=200, caption='Peru')

st.title('Estudio de Encuesta Integridad')
st.write('Elija si prefiere analizar textos graficos.')
option0 = st.selectbox('Formato de Analisis: ', (None, 'Textos', 'Gráficos'))
option3 = st.selectbox('Documento: ', (None, 'Todos', 'Encuesta', 'Indicadores'))
maprange = {'0 a 50%': 10, '10 a 50%': 20, '20 a 50%': 30, '30 a 50%': 40, '40 a 50%': 50}
option2 = st.selectbox('Franja de Discrepancia siendo la máxima [0, 50]', ('0 a 50%', '10 a 50%', '20 a 50%', '30 a 50%', '40 a 50%'))
mapn = maprange[option2]
st.write('La franja de discrepancia mostrada es entre ', mapn-10, ' y 50%')


if option0 and option2 and option3 is not None:

    # Load dataframe
    file = st.file_uploader('Seleccione un archivo Excel: ')

    if file is not None:

        df00 = pd.read_excel(file, engine='openpyxl')
        st.write(df00.shape)

        if option0 == 'Textos':

            option1 = st.selectbox('Clasificar resultados por:', ('Pregunta', 'Categoria'))
            #df = df00[(df00['diff'] > mapn-10) & (df00['diff'] < mapn)]
            df = df00[(df00['diff'] > mapn-10)]
            if option3 != 'Todos':
                df = df[df['documento']==option3]
            else:
                df = df

            # Group dataframe by chosen option
            if option1 == 'Pregunta':
                grouped_df = df.groupby('pregunta')
            elif option1 == 'Categoria':
                grouped_df = df.groupby('cat_sup')

            # Generate text with bullets
            text = ''

            for name, group in grouped_df:

                cad01 = '\n\n > **'+ option1+ ': '+ name + '**'
                st.write(cad01)
                st.write('Cantidad de afirmaciones: ', len(group))
                texto_tot = ''
                for index, row in group.iterrows():
                    val0 = str(row['diff'])
                    text = '* En el rubro sobre ' + row.pregunta + ' la categoría ' + row.cat_sup + ' responde ' + \
                    row.respuesta + ' un **' + val0 + '%** más que la categoría ' + row.cat_inf + '\n'
                    texto_tot = texto_tot + '\n' + text
                st.write(texto_tot)

            # Download link for text file
            st.download_button(label='Descargar Reporte', data=texto_tot, file_name='reporte.txt', mime='text/plain')

        else:

            option21 = st.selectbox('Tipo de Gráfico ', ('Total', 'Parcial') )

            if option21 == 'Total':
                st.write('Este diagrama muestra las discrepancias promedio de categorías y preguntas, con discrepancias mayores a 15%.')
                st.write('Permite un panorama general de las discrepancias.')
                st.image('figures/discrepancias_heatmap.png', width=1200)
            else:
                
                df2 = df00[(df00['diff'] > mapn-10)]
                
                if option3 != 'Todos':
                    df2 = df2[df2['documento']==option3]
                else:
                    pass

                df_pv = pd.pivot_table(df2, values='diff', index='pid', columns='cat_sup', aggfunc='mean').fillna(0)
                st.write(df_pv.shape)

                data_pv_s = df_pv[df_pv > 10]
                row_to_drop = list(data_pv_s.index[data_pv_s.sum(axis=1) == 0])
                data_pv_s = data_pv_s.drop(row_to_drop, axis=0)
                col_to_drop = list(data_pv_s.columns[data_pv_s.sum(axis=0) == 0])
                data_pv_s = data_pv_s.drop(col_to_drop, axis=1)

                fig, ax = plt.subplots(figsize=(40, 20))

                heatmap = ax.imshow(data_pv_s.T, cmap='inferno')

                ax.set_yticks(range(len(data_pv_s.columns)))
                ax.set_yticklabels(data_pv_s.columns, fontsize=16)

                ax.set_xticks(range(len(data_pv_s.index)))
                ax.set_xticklabels(data_pv_s.index, rotation=90, fontsize=16)

                for i in range(len(data_pv_s.index)):
                    for j in range(len(data_pv_s.columns)):
                        value = data_pv_s.iloc[i, j]
                        if not np.isnan(value):
                            ax.annotate(int(value), xy=(i, j), horizontalalignment='center', 
                                        verticalalignment='center', fontsize=18, color='darkgray',
                                        fontweight='bold'
                                       )

                ax.set_title('Distribución de Discrepancias Máximas en Categorías y Preguntas', fontsize=20)
                ax.set_ylabel('Categorías')
                ax.set_xlabel('Preguntas')

                plt.colorbar(heatmap, ax=ax)
                plt.grid(True)
                st.pyplot(fig)
                st.write('Para grabar la imagen solo presione botón derecho y guardela como imagen en su servidor.')