Blog
Tutorial de análisis de sentimientos de Twitter con Python p.3
- Publicado por: Rafael Fernandez
- Categoría: Curso de SQLite Dash

-Te explicamos el código completo para generar una gráfica con los sentimientos seleccionados.
Bienvenido a la parte 3 de nuestra aplicación de análisis de sentimientos con Dash y Python. A continuación, vamos a poner todo junto para crear un gráfico básico de actualización de sentimiento de Twitter para un término elegido. Para hacer esto, todo lo que voy a hacer es tomar nuestras actualizaciones y aplicarlas a los Gráficos a tiempo real con el código del tutorial de Dash, que es este código.
Todo lo que tenemos que hacer aquí es cambiar algunas cosas menores, y estaremos listos. Básicamente, nuestro objetivo principal es reemplazar las variables X e Y con nuestros datos. Para empezar, necesitamos conectarnos a la base de datos. Idealmente, nos gustaría conectarnos en la parte superior de este script, pero, Dash usa hilos, y el objeto de conexión no lo apreciará. Si hacemos esto, obtendremos el siguiente error: los objetos SQLite creados en un thread sólo pueden ser usados en ese mismo thread, el objeto fue creado en el thread id 7828 y este es el thread id 14092. También no verá ese error si esta registrando otros errores. En su lugar, necesitamos establecer el objeto de conexión dentro de la función de actualización del gráfico.
Empezamos con las importaciones:
import sqlite3 import pandas as pd
Después dentro de la función update_graph_scatter añadiremos:
conn = sqlite3.connect('twitter.db') c = conn.cursor() df = pd.read_sql("SELECT * FROM sentimiento WHERE tweet LIKE '%pyc%' ORDER BY unix DESC LIMIT 1000", conn) df.sort_values('unix', inplace=True) df['sentimiento_smoothed'] = df['sentimiento'].rolling(int(len(df)/5)).mean() df.dropna(inplace=True)
Ahora creamos las variables X e Y:
X = df.unix.values[-100:] Y = df.sentimiento_smoothed.values[-100:]
Ahora, el resto sigue igual. Vamos a borrar X e Y de la parte superior del script (donde los definimos como objetos deque). El guión completo:
import dash from dash.dependencies import Output, Event import dash_core_components as dcc import dash_html_components as html import plotly import random import plotly.graph_objs as go from collections import deque import sqlite3 import pandas as pd #temas populares: google, tesla, trump, usa app = dash.Dash(__name__) app.layout = html.Div( [ html.H2('Grafica a tiempo real de sentimiento en Twitter'), dcc.Graph(id='live-graph', animate=True), dcc.Interval( id='graph-update', interval=1*1000 ), ] ) @app.callback(Output('live-graph', 'figure'), events=[Event('graph-update', 'interval')]) def update_graph_scatter(): try: conn = sqlite3.connect('twitter.db') c = conn.cursor() df = pd.read_sql("SELECT * FROM sentimiento WHERE tweet LIKE '%usa%' ORDER BY unix DESC LIMIT 1000", conn) df.sort_values('unix', inplace=True) df['sentimiento_smoothed'] = df['sentimiento'].rolling(int(len(df)/5)).mean() df.dropna(inplace=True) X = df.unix.values[-100:] Y = df.sentimiento_smoothed.values[-100:] data = plotly.graph_objs.Scatter( x=X, y=Y, name='Scatter', mode= 'lines+markers' ) return {'data': [data],'layout' : go.Layout(xaxis=dict(range=[min(X),max(X)]), yaxis=dict(range=[min(Y),max(Y)]),)} except Exception as e: with open('errors.txt','a') as f: f.write(str(e)) f.write('\n') if __name__ == '__main__': app.run_server(debug=True)
Para que esto sea streaming a tiempo real, necesitará tener el siguiente programa también en ejecución, con las credenciales de la API completadas. Yo en mi caso uso el IDE Spyder, entonces lo que yo he hecho es correr el código de Dash en spyder y luego en el cmd viajo hasta la carpeta donde tengo el codigo de lee de twitter a partir de su API y este codigo lo ejecuto en cmd. Para ejecutar este código en el cmd viaja hasta la carpeta donde tienes el codigo y escribe en el cmd “python nombre_de_tu_codigo.py” y debería ejecutarse.
from tweepy import Stream from tweepy import OAuthHandler from tweepy.streaming import StreamListener import json import sqlite3 from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer from unidecode import unidecode import time analyzer = SentimentIntensityAnalyzer() conn = sqlite3.connect('twitter.db') c = conn.cursor() def create_table(): try: c.execute("CREATE TABLE IF NOT EXISTS sentimiento(unix REAL, tweet TEXT, sentimiento REAL)") c.execute("CREATE INDEX fast_unix ON sentimiento(unix)") c.execute("CREATE INDEX fast_tweet ON sentimiento(tweet)") c.execute("CREATE INDEX fast_sentiment ON sentimiento(sentimiento)") conn.commit() except Exception as e: print(str(e)) create_table() #consumer key, consumer secret, access token, access secret. ckey="F2pIrutjymGr9vZuqTeViAymw" csecret="QFLTXwFJZNuR6i00IswAZIgaKsKl5AtmPufoSaRnR57ER2yVxS" atoken="879408865997201408-QJDeVNKYBsTdp97caK0qFV454YYwRLp" asecret="gLNfeVRjT7LrDaWWSgCX0ZRu6TeTPBquTxlYKQ4hUzAka" class listener(StreamListener): def on_data(self, data): try: data = json.loads(data) tweet = unidecode(data['text']) time_ms = data['timestamp_ms'] vs = analyzer.polarity_scores(tweet) sentimiento = vs['compound'] print(time_ms, tweet, sentimiento) c.execute("INSERT INTO sentimiento (unix, tweet, sentimiento) VALUES (?, ?, ?)", (time_ms, tweet, sentimiento)) conn.commit() except KeyError as e: print(str(e)) return(True) def on_error(self, status): print(status) while True: try: auth = OAuthHandler(ckey, csecret) auth.set_access_token(atoken, asecret) twitterStream = Stream(auth, listener()) twitterStream.filter(track=["a","e","i","o","u"]) except Exception as e: print(str(e)) time.sleep(5)
Hice algunos pequeños cambios en el código anterior. Uno para lidiar con los errores y no romper el flujo, el otro para hacer todos los índices de las columnas lo más rápido posible.
Si tienes todo esto, deberías ver algo como:
Ahora, si lo desea, puede editar manualmente la instrucción %usa% por otra similar, volver a guardar, y el gráfico se actualizará para cualquier término que ponga allí. Aunque esto funciona, ¡sería mejor que formáramos parte del GUI! Empecemos a trabajar en eso y en otras cosas después!
Proyecto Dash con Análisis de Sentimientos en Python, 5º tutorial