Spaces:
Runtime error
Runtime error
import streamlit as st | |
import plotly.express as px | |
import pandas as pd | |
from wordcloud import WordCloud | |
import matplotlib.pyplot as plt | |
from scrapper_rss import Scrapper | |
import datetime as dt | |
st.set_option('deprecation.showPyplotGlobalUse', False) | |
scrapper = Scrapper() | |
noticias = pd.read_csv('./diarios_historicos.csv') | |
noticias=noticias.drop('descripcion' ,axis=1) | |
fechas = pd.read_csv('./fechas.csv') | |
diarios = list(noticias.diario.unique()) | |
secciones = list(noticias.seccion.unique()) | |
columna_para_nube = ['titulo', 'descripcion'] | |
st.set_page_config( | |
page_title="Observatorio de noticias", | |
initial_sidebar_state="expanded" | |
) | |
with st.sidebar: | |
st.write("Creado por [sebasur90](https://www.linkedin.com/in/sebastian-rodriguez-9b417830/)") | |
diarios_select = st.multiselect('Selecciona los diarios', | |
diarios, default=diarios) | |
secciones_select = st.multiselect('Selecciona las secciones', | |
secciones, default=secciones) | |
palabra_buscada = st.text_input('Buscar palabra', 'Ninguna') | |
if st.button('Actualizar Diarios'): | |
dia_str = str(dt.datetime.today().date()) | |
if fechas.iloc[-1]['dia'] == dia_str: | |
st.success("Las noticias ya estan actualizadas") | |
pass | |
else: | |
with st.spinner('Actualizando los siguientes diarios..'): | |
scrapper.run() | |
st.write("Se actualizaron las noticias") | |
if palabra_buscada == "Ninguna" or palabra_buscada == "": | |
st.title("Observatorio de Noticias") | |
st.write(""" | |
Hola! Bienvenido a la aplicaci贸n de an谩lisis de sentimientos en las noticias. Esta aplicaci贸n extrae las noticias de algunos de los diarios mas | |
importantes del pa铆s ( a traves del RSS) y realiza un analisis de sentimientos sobre los titulos de cada una. | |
La app permite filtrar por palabra clave y generar una nube de palabras con los resultados | |
De acuerdo al sentimiento analizado sobre cada noticia encontraremos 3 grupos: | |
**Sentimiento Positivo:** "YPF aument贸 la distribuci贸n de gasoil y asegur贸 que el campo tiene garantizado el abastecimiento" | |
*Probabilidades: NEGATIVA=0.008 --- NEUTRA 0.43 --- POSITIVA 0.56 (GANADOR --> POSITIVA)* | |
**Sentimiento Neutro:** "El aeroclub de Comodoro Rivadavia celebr贸 su 87掳 aniversario" | |
*Probabilidades: NEGATIVA=0.02 --- NEUTRA 0.67 --- POSITIVA 0.30 (GANADOR --> NEUTRA)* | |
**Sentimiento Negativo:** "Crecen las expectativas de inflaci贸n del mercado" | |
*Probabilidades: NEGATIVA=0.60 --- NEUTRA 0.37 --- POSITIVA 0.15 (GANADOR --> NEGATIVA)* | |
""") | |
pass | |
else: | |
#st.title("Observatorio de Noticias") | |
st.header(f"Resultados para : {palabra_buscada}") | |
noticias = noticias[noticias['titulo'].str.contains(palabra_buscada)] | |
st.session_state['dataframe_filtrado'] = noticias[(noticias.diario.isin( | |
diarios_select)) & (noticias.seccion.isin(secciones_select))] | |
st.subheader("Muestra aleatoria de noticias") | |
st.dataframe(st.session_state['dataframe_filtrado'].sample(frac=1)) | |
st.session_state['dataframe_agrupado'] = st.session_state['dataframe_filtrado'].groupby( | |
'diario')[['pond_negativos', 'pond_neutro', 'pond_positivo']].mean().reset_index() | |
fig = px.bar(st.session_state['dataframe_agrupado'], x="diario", y=['pond_neutro', "pond_negativos", 'pond_positivo'], text_auto=True, | |
title=f"Analisis de sentimientos para las noticias seleccionadas seg煤n el diario" | |
) | |
newnames = {'pond_neutro':'NEUTRAL', 'pond_negativos': 'NEGATIVA','pond_positivo': 'POSITIVA'} | |
fig.for_each_trace(lambda t: t.update(name = newnames[t.name], | |
legendgroup = newnames[t.name], | |
hovertemplate = t.hovertemplate.replace(t.name, newnames[t.name]) | |
) | |
) | |
fig.update_layout( | |
xaxis_title="Diarios", | |
yaxis_title="Probabilidades (de 0 a 1)", | |
) | |
fig.update_layout(legend_title_text='Probabilidades') | |
st.plotly_chart(fig) | |
def transforma_letras_para_wordcloud(dataframe_noticias): | |
columna_analizada = list(dataframe_noticias['titulo']) | |
acentos = {'谩': 'a', '茅': 'e', '铆': 'i', '贸': 'o', '煤': 'u', | |
'脕': 'A', 'E': 'E', '脥': 'I', '脫': 'O', '脷': 'U'} | |
lista_palabras_para_wordcloud = [] | |
for palabras in columna_analizada: | |
palabras_div = palabras.split(' ') | |
for letras in palabras_div: | |
for acen in acentos: | |
if acen in letras: | |
letras = letras.replace(acen, acentos[acen]) | |
lista_palabras_para_wordcloud.append(letras.lower()) | |
return ' '.join(lista_palabras_para_wordcloud) | |
def genera_wordcloud(dataframe_noticias): | |
palabras_para_wordcloud = transforma_letras_para_wordcloud( | |
dataframe_noticias) | |
palabras_ignoradas = set(['a', 'ante', 'con', 'contra', 'de', 'desde', 'durante', 'en', 'para', 'por', 'segun', 'sin', 'sobre', 'el', 'la', 'los', 'las', | |
'...', 'y', 'hoy', 'este', 'cuanto', 'un', 'del', 'las', 'que', 'con', 'todos', 'es', '驴qu茅', 'como', 'cada', | |
'jueves', '驴cuanto', 'hoy', 'al', 'cual', 'se', 'su', 'sus', 'lo', 'una', 'un', 'tiene', | |
'le', 'habia']) | |
wordcloud = WordCloud(width=1920, height=1080, stopwords=palabras_ignoradas).generate( | |
palabras_para_wordcloud) | |
plt.imshow(wordcloud, interpolation='bilinear') | |
plt.axis("off") | |
st.pyplot() | |
if st.button('Generar Nube'): | |
genera_wordcloud(st.session_state['dataframe_filtrado']) | |
else: | |
pass | |