Sebasur90's picture
Update app.py
6c2d890
raw
history blame
5.91 kB
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