Ojeda01 commited on
Commit
6340bc3
·
verified ·
1 Parent(s): fea07eb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +128 -127
app.py CHANGED
@@ -1,127 +1,128 @@
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
-
 
 
1
+ !pip install nltk
2
+
3
+ import streamlit as st
4
+ from collections import Counter
5
+ import pandas as pd
6
+ import numpy as np
7
+ import re
8
+ import json
9
+ import matplotlib.pyplot as plt
10
+ import nltk
11
+ nltk.download('stopwords')
12
+ from wordcloud import WordCloud
13
+ from nltk.corpus import stopwords
14
+ import spacy
15
+ nlp = spacy.load("es_core_news_sm")
16
+
17
+ def lemmatize_text(text):
18
+ doc = nlp(text)
19
+ lemmatized = ' '.join([token.lemma_ for token in doc if not token.is_stop])
20
+ return lemmatized
21
+
22
+ def clean_text(series):
23
+ # Convertir la serie a una sola cadena de texto
24
+ text = ' '.join(series.dropna().astype(str))
25
+ # Eliminar caracteres no deseados (opcional, pero recomendado)
26
+ text = re.sub(r'[^\w\s]', '', text.lower())
27
+ # Lematizar el texto
28
+ lemmatized_text = lemmatize_text(text)
29
+ # Eliminar stopwords adicionales que no fueron removidas por spaCy
30
+ stop_words = set(stopwords.words('spanish'))
31
+ stop_words.update(["maestro", "clase", "profesor", "doctor", "profe", "alumno", "dr", "doctora", "material", "maestra", "ms", "mejor"])
32
+ words = [word for word in lemmatized_text.split() if word not in stop_words]
33
+ cleaned_text = ' '.join(words)
34
+ return cleaned_text
35
+
36
+ # Crear la nube de palabras
37
+ def create_wordcloud_from_series(cleaned_text, escuela):
38
+ wordcloud = WordCloud(width=800, height=400, background_color='white').generate(cleaned_text)
39
+ # Mostrar la nube de palabras
40
+ plt.figure(figsize=(10, 5))
41
+ plt.imshow(wordcloud, interpolation='bilinear')
42
+ plt.axis('off')
43
+ plt.show()
44
+ #st.write(f"Palabras mas utilizadas por los alumnos de {escuela}")
45
+ st.pyplot(plt)
46
+
47
+
48
+
49
+ def plot_top_words(words, top_n=20):
50
+ words = words.split(" ")
51
+ word_counts = Counter(words)
52
+ common_words = word_counts.most_common(top_n)
53
+ words, counts = zip(*common_words)
54
+ fig, ax = plt.subplots(figsize=(10, 5))
55
+ ax.bar(words, counts)
56
+ plt.xticks(rotation=90)
57
+ plt.xlabel('Palabras')
58
+ plt.ylabel('Frecuencia')
59
+ plt.title(f'Top {top_n} palabras más usadas')
60
+ st.pyplot(fig)
61
+
62
+
63
+ # cargamos información de Escuelas
64
+ escuelas = pd.read_json('./escuelas.json', orient='records', lines=True).drop(columns = "Unnamed: 0")
65
+ categories = escuelas["Escuela"].unique()
66
+
67
+ # cargamos datos
68
+ datos = pd.read_json('./datos.json', orient='records', lines=True)
69
+ print(datos.columns)
70
+
71
+ def tabla_materias(df):
72
+ # seleccionamos las materias con más comentarios
73
+ materias = df["Class Name"].value_counts().index[:12]
74
+ df_f = df[df["Class Name"].isin(materias)].groupby("Class Name").sentimiento.value_counts(normalize = True).fillna(0).unstack(-1).style.format('{:.2%}')
75
+ return df_f
76
+
77
+ def tabla_anio(df):
78
+ # seleccionamos las materias con más comentarios
79
+ df["year"] = df.Date.dt.year
80
+ df_f = df.groupby(["year"]).sentimiento.value_counts(normalize = True).fillna(0.0).unstack(0).T.reset_index() # .style.format('{:.2%}')
81
+ fig, ax = plt.subplots(figsize=(10, 5))
82
+ for column in ["postivo", "negativo"]:
83
+ ax.plot(df_f['year'], df_f[column], label=column)
84
+ ax.set_xlabel('Year')
85
+ ax.set_ylabel('%')
86
+ ax.set_title('Sentimiento anual por años')
87
+ ax.legend()
88
+ return st.pyplot(fig)
89
+
90
+
91
+
92
+ def main():
93
+ st.title('Análisis de Sentimiento a comentarios Realizados en MisProfesores.com')
94
+ selected_category = st.selectbox("Seleccionar una Escuela para hacer Web Scrapping", categories)
95
+ datos_f= datos[datos.escuela == selected_category]
96
+ # eliminar al cambiar el dato
97
+ # generamos dos conjuntos de datos para comparar
98
+ datos_positivos = datos_f[datos_f.sentimiento == "postivo"]
99
+ # generamos dos conjuntos de datos para comparar
100
+ datos_negativos = datos_f[datos_f.sentimiento == "negativo"]
101
+
102
+
103
+ for key, dat in {"positivas": datos_positivos , "negativas": datos_negativos}.items():
104
+ st.header(f"Palabras mas utilizadas por los alumnos con calificaciones {key}")
105
+ # generamos nube de palabras
106
+ cleaned_text = clean_text(dat.Comments)
107
+ create_wordcloud_from_series(cleaned_text, selected_category)
108
+ plot_top_words(cleaned_text, top_n=20)
109
+
110
+ # desplegamos los resultados de las 5 materias mas comunes
111
+ st.header(f"Así es cómo los alumnos de la {selected_category} se sienten a lo largo de los años")
112
+ tabla_anio(datos_f)
113
+ st.write(f"curioso como el porcentaje de sentimientos positivos baja por culpa de la pandemia")
114
+
115
+ st.header(f"estas fueron las calificaciones de las materias más comentadas de {selected_category}")
116
+ st.dataframe( tabla_materias(datos_f))
117
+
118
+ st.write(f"aqui puedes observar los datos por si tienes curiosidad de lo que dicen los usuarios!")
119
+ st.dataframe( datos_positivos)
120
+
121
+ if __name__ == "__main__":
122
+ main()
123
+
124
+
125
+
126
+
127
+
128
+