2017-05-15 6 views
0

私のPythonスクリプトでは、指定されたストリームツイートの値のgeo_enabledの値を表示しようとしています。 geo_enabledfalseの場合はfalseまたはtrueと表示したいと思いますが、placecountryタグをnullと表示する場合は、tweetingという人物で値が入力されていないと表示されます。問題は、私のスクリプトがKeyErrorを投げつけ続けているので、私が現在立ち往生していることです。つぶやきのgeo_enabledフィールドのPythonスクリプトが空のデータフレームを返す

KeyErrorは、geo_enabledが値としてfalseであると表示されています。この周りのすべての作品。

私のPythonスクリプト:

import time 
import json 
import pandas as pd 
import re 

#tweepy based modules 
import tweepy 
from tweepy import OAuthHandler 
from tweepy import Stream 
from tweepy.streaming import StreamListener 


#initializing authentication credentials 
consumer_key = '' 
consumer_secret = '' 
access_key = '' 
access_secret = '' 


#This is a basic listener that just prints received tweets to stdout. 
class StdOutListener(StreamListener) : 
    def __init__(self,time_limit) : 
     self.start_time = time.time() 
     self.limit = time_limit 
     self.saveFile = open('requests.json','a') 
     super(StdOutListener,self).__init__() 

    def on_data(self, data) : 
     if ((time.time() - self.start_time) < self.limit) : 
      self.saveFile.write(data) 
      self.saveFile.write('\n') 
      return True 
     else : 
      self.saveFile.close() 
      return False 

    def on_error(self, status) : 
     print(status) 

def getwords(string) : 
    return re.findall(r"[\w'#]+|[.,!?;]",string) 

if __name__ == '__main__' : 
    #This handles Twitter authetification and the connection to Twitter Streaming API 
    auth = OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_key, access_secret) 

    time_limit = input("Enter the time limit in minutes : ") 
    time_limit *= 60 

    stream = Stream(auth,listener = StdOutListener(time_limit)) 
    string = raw_input("Enter the list of keywords/hashtags to be compared : ") 

    keyword_list = getwords(string) 

    #This line filter Twitter Streams to capture data by the keywords: 'python', 'javascript', 'ruby' 
    stream.filter(track = keyword_list) 

    tweets_data_path = 'requests.json' 

    tweets_data = [] 
    tweet_list = [] 

    tweets_file = open(tweets_data_path, "r") 

    for i, line in enumerate(tweets_file) : 
     if line.rstrip() : 
      tweet = json.loads(line) 
      tweet_list.append(tweet) 

    num_tweets_collected = len(tweet_list) 
    count = 0 

    #Creates a data frame structure 
    text_dump = open('text_dump.txt', 'w') 


    #Populating the location field of the data frame 

    #tweet_dataframe['location'] = map(lambda tweet : tweet['location'], tweet_list) 
    #print(tweet_dataframe['location']) 

    #index column for data frame 
    index_dataframe = [] 

    for i in range(0, num_tweets_collected) : 
     index_dataframe.append(i) 

    tweet_text = [tweet['text'].encode('utf-8') for tweet in tweet_list] 
    tweet_text_dataframe = pd.DataFrame(tweet_text, index = index_dataframe, columns = ['text']) 

    tweet_geolocation_dataframe = pd.DataFrame() 
    tweet_geolocation_dataframe['geo_enabled'] = map(lambda tweet: tweet['geo_enabled'] if tweet['geo_enabled'] != "false" else "false", tweet_list) 

    tweet_text_ = tweet_text_dataframe['text'] 

    print(tweet_geolocation_dataframe['geo_enabled']) 

出力:

abhijeet-mohanty-2:Desktop SubrataMohanty$ python twitter_stream_dump.py 
Enter the time limit in minutes : 1 
Enter the list of keywords/hashtags to be compared : python ruby scala 
Traceback (most recent call last): 
    File "twitter_stream_dump.py", line 94, in <module> 
    tweet_geolocation_dataframe['geo_enabled'] = map(lambda tweet: tweet['geo_enabled'] if tweet['geo_enabled'] != "false" else "false", tweet_list) 
    File "twitter_stream_dump.py", line 94, in <lambda> 
    tweet_geolocation_dataframe['geo_enabled'] = map(lambda tweet: tweet['geo_enabled'] if tweet['geo_enabled'] != "false" else "false", tweet_list) 
KeyError: 'geo_enabled' 

編集:

は、だから、私はPythonスクリプトに次の変更をしたが、データフレームが返されます。

私は次の行に置き換え - 下の行と

tweet_geolocation_dataframe['geo_enabled'] = map(lambda tweet: tweet['geo_enabled'] if tweet['geo_enabled'] != "false" else "false", tweet_list) 

for tweet in tweet_list : 
    if 'geo_enabled' in tweet : 
     tweet_geolocation_dataframe['geo_enabled'] = map(lambda tweet: tweet['geo_enabled'] if tweet['geo_enabled'] != "false" else "false", tweet_list) 
    else: 
     tweet_geolocation_dataframe['geo_enabled'] = False 

出力:データフレームの問題を解決するための

abhijeet-mohanty-2:Desktop SubrataMohanty$ python twitter_stream_dump.py 
Enter the time limit in minutes : 1 
Enter the list of keywords/hashtags to be compared : python ruby scala 
Series([], Name: geo_enabled, dtype: bool) 

任意の方法をgeo_enabledフィールド。

+0

あなたは私達にあなたのプログラムが失敗しているスタックトレースを表示する必要があります。 – BoarGules

+0

@BoarGules私は得ている出力を出しました。 –

+1

geo_enabledにfalse値が含まれているため、KeyError NOTが返されますが、geo_enabledはツイートに存在しません。 – Codeformer

答えて

1

はこれを試してみてください -

if 'geo_enabled' in tweet: 
    tweet_geolocation_dataframe['geo_enabled'] = map(lambda tweet: tweet['geo_enabled'] if tweet['geo_enabled'] != "false" else "false", tweet_list) 
else: 
    tweet_geolocation_dataframe['geo_enabled'] = False 
+0

空のデータフレームを返します。 –

+0

お手伝いできますか? –

関連する問題