实时绘制动态DataFrame的两列

时间:2019-02-06 20:53:24

标签: python pandas dataframe matplotlib sentiment-analysis

我正在尝试绘制实时数据并加载到数据框中。但是,这些尝试导致响应动态数据馈送而打印多个空白图形框架,而不是将数据绘制在图形的单个框架中。

我正在实施一种解决方案,以对实时Twitter流进行情感分析。我能够流化这些推文,将它们放入一个DataFrame中,然后将所需的情感分析算法一对一地应用到它们上。我在DataFrame中创建了一个列,其中包含该算法为单个鸣叫生成的复合值。

随着tweets流,此DataFrame正在动态更新,目的是根据时间绘制此实时更新的复合值。

我尝试按照上述建议使用plt.ion(),plt.draw()而不是plt.show()函数等绘制图表。但是,与其绘制一帧用值更新的帧,不如程序在DataFrame中更新数据时开始依次打印多个帧。

import pandas as pd
import csv
from bs4 import BeautifulSoup
import re
import tweepy
import ast
from pytz import timezone
from datetime import datetime
import matplotlib.pyplot as plt
import time
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import json
from textblob import TextBlob
from unidecode import unidecode
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer 

ckey= '#######'
csecret= '#######'
atoken= '#########'
asecret= '#########'

class listener(StreamListener):

def on_data(self,data):
    try:
        global df
        data=json.loads(data)
        time = data["created_at"]
        tweet = unidecode(data["text"])
        tweet1 = BeautifulSoup(tweet,"lxml").get_text()
        df = pd.DataFrame(columns = ['time','tweet'])
        df['time'] = pd.Series(time)
        df['tweet'] = pd.Series(tweet1)

        def convert_time(time):
            eastern = timezone('US/Eastern')
            utc = timezone('UTC')
            created_at = datetime.strptime(time, '%a %b %d %H:%M:%S %z %Y')
            est_created_at = created_at.astimezone(eastern)
            return (est_created_at)

        df['time'] = df['time'].apply(convert_time)

        def hour(time):
            hour = pd.DatetimeIndex(time).hour
            return hour

        df['hour'] = df['time'].apply(hour)

        def sentiment_analysis(tweet):
            sid = SentimentIntensityAnalyzer()
            return (sid.polarity_scores(tweet)['compound'])

        df['compound'] = df['tweet'].apply(sentiment_analysis)

        #print(df['compound'])
        #print(df['time'])

        plt.ion()
        fig, ax = plt.subplots()

        df.plot(y=df'compound', ax=ax)
        ax.clear()

        ax.axis([ 0, 24, -5,5])
        plt.xlabel('Time')
        plt.ylabel('Sentiment')
        plt.draw()
        plt.pause(0.2)


    except KeyError as e:
        print(str(e))
    return (True)


auth=OAuthHandler(ckey,csecret)
auth.set_access_token(atoken,asecret)

twitterStream =  Stream(auth, listener())
twitterStream.filter(track=["######"])

预期结果-更新一帧图形并绘制实时数据。

实际结果-多个空白图

如果我错过任何信息/点,我深表歉意。

0 个答案:

没有答案