Построение в реальном времени двух столбцов динамического фрейма данных - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь построить данные в реальном времени, загружаемые в фрейм данных.Но попытки привели к печати нескольких пустых фреймов графика в ответ на динамическую подачу данных вместо того, чтобы отобразить данные в одном фрейме графика.

Я реализую решение для анализа настроений в реальном времени в твиттере.Я могу транслировать твиты, помещать их в DataFrame и применять к ним необходимый алгоритм анализа настроений один за другим.Я создал столбец в DataFrame, который содержит составное значение, сгенерированное этим алгоритмом для отдельного твита.

Этот DataFrame динамически обновляется в виде потока твитов, и цель состоит в том, чтобы отобразить это обновленное составное значение в реальном времени по отношению квремя.

Я попытался построить график согласно упомянутым советам использовать plt.ion (), plt.draw () вместо функций plt.show () и т. д. Но вместо построения одного кадра, который обновляетсясо значениями программа начинает печатать несколько кадров один за другим, когда данные обновляются в кадре данных.

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=["######"])

Ожидаемый результат - один кадр графика обновляется и выводит данные в реальном времени.

Фактический результат - Несколько пустых графиков

Я прошу прощения, если я пропустил какую-либо информацию / точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...