Ojeda01 commited on
Commit
fea07eb
·
verified ·
1 Parent(s): 9aaddab

Upload 3 files

Browse files
Files changed (3) hide show
  1. app.py +127 -0
  2. datos.json +0 -0
  3. escuelas.json +28 -0
app.py ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import streamlit as st
3
+ from collections import Counter
4
+ import pandas as pd
5
+ import numpy as np
6
+ import re
7
+ import json
8
+ import matplotlib.pyplot as plt
9
+ import nltk
10
+ nltk.download('stopwords')
11
+ from wordcloud import WordCloud
12
+ from nltk.corpus import stopwords
13
+ import spacy
14
+ nlp = spacy.load("es_core_news_sm")
15
+
16
+ def lemmatize_text(text):
17
+ doc = nlp(text)
18
+ lemmatized = ' '.join([token.lemma_ for token in doc if not token.is_stop])
19
+ return lemmatized
20
+
21
+ def clean_text(series):
22
+ # Convertir la serie a una sola cadena de texto
23
+ text = ' '.join(series.dropna().astype(str))
24
+ # Eliminar caracteres no deseados (opcional, pero recomendado)
25
+ text = re.sub(r'[^\w\s]', '', text.lower())
26
+ # Lematizar el texto
27
+ lemmatized_text = lemmatize_text(text)
28
+ # Eliminar stopwords adicionales que no fueron removidas por spaCy
29
+ stop_words = set(stopwords.words('spanish'))
30
+ stop_words.update(["maestro", "clase", "profesor", "doctor", "profe", "alumno", "dr", "doctora", "material", "maestra", "ms", "mejor"])
31
+ words = [word for word in lemmatized_text.split() if word not in stop_words]
32
+ cleaned_text = ' '.join(words)
33
+ return cleaned_text
34
+
35
+ # Crear la nube de palabras
36
+ def create_wordcloud_from_series(cleaned_text, escuela):
37
+ wordcloud = WordCloud(width=800, height=400, background_color='white').generate(cleaned_text)
38
+ # Mostrar la nube de palabras
39
+ plt.figure(figsize=(10, 5))
40
+ plt.imshow(wordcloud, interpolation='bilinear')
41
+ plt.axis('off')
42
+ plt.show()
43
+ #st.write(f"Palabras mas utilizadas por los alumnos de {escuela}")
44
+ st.pyplot(plt)
45
+
46
+
47
+
48
+ def plot_top_words(words, top_n=20):
49
+ words = words.split(" ")
50
+ word_counts = Counter(words)
51
+ common_words = word_counts.most_common(top_n)
52
+ words, counts = zip(*common_words)
53
+ fig, ax = plt.subplots(figsize=(10, 5))
54
+ ax.bar(words, counts)
55
+ plt.xticks(rotation=90)
56
+ plt.xlabel('Palabras')
57
+ plt.ylabel('Frecuencia')
58
+ plt.title(f'Top {top_n} palabras más usadas')
59
+ st.pyplot(fig)
60
+
61
+
62
+ # cargamos información de Escuelas
63
+ escuelas = pd.read_json('./escuelas.json', orient='records', lines=True).drop(columns = "Unnamed: 0")
64
+ categories = escuelas["Escuela"].unique()
65
+
66
+ # cargamos datos
67
+ datos = pd.read_json('./datos.json', orient='records', lines=True)
68
+ print(datos.columns)
69
+
70
+ def tabla_materias(df):
71
+ # seleccionamos las materias con más comentarios
72
+ materias = df["Class Name"].value_counts().index[:12]
73
+ df_f = df[df["Class Name"].isin(materias)].groupby("Class Name").sentimiento.value_counts(normalize = True).fillna(0).unstack(-1).style.format('{:.2%}')
74
+ return df_f
75
+
76
+ def tabla_anio(df):
77
+ # seleccionamos las materias con más comentarios
78
+ df["year"] = df.Date.dt.year
79
+ df_f = df.groupby(["year"]).sentimiento.value_counts(normalize = True).fillna(0.0).unstack(0).T.reset_index() # .style.format('{:.2%}')
80
+ fig, ax = plt.subplots(figsize=(10, 5))
81
+ for column in ["postivo", "negativo"]:
82
+ ax.plot(df_f['year'], df_f[column], label=column)
83
+ ax.set_xlabel('Year')
84
+ ax.set_ylabel('%')
85
+ ax.set_title('Sentimiento anual por años')
86
+ ax.legend()
87
+ return st.pyplot(fig)
88
+
89
+
90
+
91
+ def main():
92
+ st.title('Análisis de Sentimiento a comentarios Realizados en MisProfesores.com')
93
+ selected_category = st.selectbox("Seleccionar una Escuela para hacer Web Scrapping", categories)
94
+ datos_f= datos[datos.escuela == selected_category]
95
+ # eliminar al cambiar el dato
96
+ # generamos dos conjuntos de datos para comparar
97
+ datos_positivos = datos_f[datos_f.sentimiento == "postivo"]
98
+ # generamos dos conjuntos de datos para comparar
99
+ datos_negativos = datos_f[datos_f.sentimiento == "negativo"]
100
+
101
+
102
+ for key, dat in {"positivas": datos_positivos , "negativas": datos_negativos}.items():
103
+ st.header(f"Palabras mas utilizadas por los alumnos con calificaciones {key}")
104
+ # generamos nube de palabras
105
+ cleaned_text = clean_text(dat.Comments)
106
+ create_wordcloud_from_series(cleaned_text, selected_category)
107
+ plot_top_words(cleaned_text, top_n=20)
108
+
109
+ # desplegamos los resultados de las 5 materias mas comunes
110
+ st.header(f"Así es cómo los alumnos de la {selected_category} se sienten a lo largo de los años")
111
+ tabla_anio(datos_f)
112
+ st.write(f"curioso como el porcentaje de sentimientos positivos baja por culpa de la pandemia")
113
+
114
+ st.header(f"estas fueron las calificaciones de las materias más comentadas de {selected_category}")
115
+ st.dataframe( tabla_materias(datos_f))
116
+
117
+ st.write(f"aqui puedes observar los datos por si tienes curiosidad de lo que dicen los usuarios!")
118
+ st.dataframe( datos_positivos)
119
+
120
+ if __name__ == "__main__":
121
+ main()
122
+
123
+
124
+
125
+
126
+
127
+
datos.json ADDED
The diff for this file is too large to render. See raw diff
 
escuelas.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"Unnamed: 0":0,"Escuela":"FACMED","Municipio":"Monterrey","Estado":"Nuevo Leon","num_prof":186,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-Facultad-de-Medicina_1448"}
2
+ {"Unnamed: 0":6,"Escuela":"FO","Municipio":"Monterrey","Estado":"Nuevo Leon","num_prof":91,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-Facultad-de-Odontologia_1555"}
3
+ {"Unnamed: 0":11,"Escuela":"FAMUS","Municipio":"Monterrey","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":67,"url":"https:\/\/www.misprofesores.com\/escuelas\/FACULTAD-DE-MUSICA-UANL_3769"}
4
+ {"Unnamed: 0":17,"Escuela":"FACDYC","Municipio":"Cd. UNIVERSITARIA , SAN NICOLAS DEW LOS GARZA ,N,L","Estado":"NUEVO LEON","num_prof":13,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANLFACDYC_3602"}
5
+ {"Unnamed: 0":19,"Escuela":"FCC","Municipio":"Monterrey","Estado":"NL","num_prof":110,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Ciencias-de-la-Comunicacion-UANL_3312"}
6
+ {"Unnamed: 0":21,"Escuela":"AGRO","Municipio":"Escobedo","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":14,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Agronomia-UANL_3299"}
7
+ {"Unnamed: 0":23,"Escuela":"FACPYA","Municipio":"monterrey","Estado":"nuevo leon","num_prof":8,"url":"https:\/\/www.misprofesores.com\/escuelas\/FACPYAP-UANL_3228"}
8
+ {"Unnamed: 0":25,"Escuela":"FAV","Municipio":"Monterrey","Estado":"NUEVO LEON","num_prof":15,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-ARTES-VISUALES_3194"}
9
+ {"Unnamed: 0":29,"Escuela":"FIC","Municipio":"Monterrey","Estado":"Nuevo Leon","num_prof":143,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Ingenieria-Civil-UANL_2888"}
10
+ {"Unnamed: 0":31,"Escuela":"FARQ","Municipio":"SAN NICOLAS","Estado":"NUEVO LEON","num_prof":538,"url":"https:\/\/www.misprofesores.com\/escuelas\/FARQ-UANL_2628"}
11
+ {"Unnamed: 0":33,"Escuela":"FASPYN","Municipio":"Monterrey","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":72,"url":"https:\/\/www.misprofesores.com\/escuelas\/FASPYN-UANL_2517"}
12
+ {"Unnamed: 0":35,"Escuela":"FACMED","Municipio":"Monterrey","Estado":"Nuevo Leon","num_prof":46,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Medicina-UANL_2374"}
13
+ {"Unnamed: 0":36,"Escuela":"FCQ","Municipio":"Monterrey","Estado":"NL","num_prof":67,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Ciencias-Quimicas-UANL_5378"}
14
+ {"Unnamed: 0":38,"Escuela":"FACPYA","Municipio":"San Nicol\u00c3\u00a1s De Los Garza","Estado":"Nuevo Leon","num_prof":775,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-FACPYA_2373"}
15
+ {"Unnamed: 0":41,"Escuela":"FACDYC","Municipio":"San Nicol\u00c3\u00a1s de los Garza","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":125,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-Facultad-de-Derecho-y-Criminologia_2323"}
16
+ {"Unnamed: 0":44,"Escuela":"FACPYA","Municipio":"mty","Estado":"Nuevo Leon","num_prof":68,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Ciencias-Politicas-y-Admon-Pub-UANL_2277"}
17
+ {"Unnamed: 0":47,"Escuela":"FCQ","Municipio":"mty","Estado":"nuevo leon","num_prof":13,"url":"https:\/\/www.misprofesores.com\/escuelas\/uanl-facultad-de-ciencias-quimicas_2274"}
18
+ {"Unnamed: 0":48,"Escuela":"FARQ","Municipio":"Monterrey","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":14,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Arquitectura-y-Diseno-Industrial-UANL_5172"}
19
+ {"Unnamed: 0":50,"Escuela":"FCT","Municipio":"linares","Estado":"Nuevo le\u00c3\u00b3n","num_prof":8,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-FCT_2269"}
20
+ {"Unnamed: 0":53,"Escuela":"FCFM","Municipio":"San Nicolas de los Garza","Estado":"Nuevo Leon","num_prof":26,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Ciencias-FisicoMatematicas-UANL_2267"}
21
+ {"Unnamed: 0":54,"Escuela":"FCT","Municipio":"Linares","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":13,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-ciencias-de-la-tierra-UANL_5147"}
22
+ {"Unnamed: 0":56,"Escuela":"FCFM","Municipio":"San Nicol\u00c3\u00a1s de los Garza","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":621,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-FCFM_2263"}
23
+ {"Unnamed: 0":59,"Escuela":"VET","Municipio":"Monterrey","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":25,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Medicina-Veterinaria-y-Zootecnia-UANL_2014"}
24
+ {"Unnamed: 0":65,"Escuela":"","Municipio":"Monterrey","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":100,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL_1760"}
25
+ {"Unnamed: 0":68,"Escuela":"FAPSI","Municipio":"Monterrey","Estado":"Nuevo Leon","num_prof":77,"url":"https:\/\/www.misprofesores.com\/escuelas\/Facultad-de-Psicologia-UANL_1643"}
26
+ {"Unnamed: 0":74,"Escuela":"FCB","Municipio":"Monterrey","Estado":"Nuevo Leon","num_prof":126,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-Faculta-de-Ciencias-Biologicas_1537"}
27
+ {"Unnamed: 0":77,"Escuela":"FFYL","Municipio":"monterrey","Estado":"nuevo leon","num_prof":212,"url":"https:\/\/www.misprofesores.com\/escuelas\/uanl-filosofia-y-letras_1487"}
28
+ {"Unnamed: 0":80,"Escuela":"FIME","Municipio":"Monterrey","Estado":"Nuevo Le\u00c3\u00b3n","num_prof":23,"url":"https:\/\/www.misprofesores.com\/escuelas\/UANL-Facultad-de-Ingenieria-Mecanica-yElectrica_1482"}