处理大量推文以进行探索性数据分析,例如唯一推文的数量以及每个用户的推文计数直方图

Processing a large amount of tweets for exploratory data analysis such as number of unique tweets, and histogram of tweet counts per user

我在一个 tweet.txt 文件(给我)中有 1400 万条推文,其中整个 JSON 推文是 txt 文件的一行。我想获得一些基本统计数据,例如唯一推文的数量、唯一用户的数量、每条推文的转发计数直方图以及每个用户的推文直方图。稍后我可能对更复杂的分析感兴趣。

我有以下代码,但速度非常慢。我把它 运行 放了一整天,它只处理了 200,000 条推文。当前代码是否可以以某种方式修复以加快速度?当前创建 1400 万条推文的 pandas 数据框的想法对于探索性数据分析来说是一个好主意还是可行的?我当前的机器有 32GB RAM 和 12 个 CPU。如果这在这台机器上不可行,我也可以在我的大学访问 shared cluster

import pandas as pd

import json
from pprint import pprint
tweets = open('tweets.txt')

columns = ['coordinates', 'created_at', 'favorite_count', 'favorited', 'tweet_id', 'lang', 'quote_count', 'reply_count', 'retweet_count',
           'retweeted', 'text', 'timestamp_ms', 'user_id', 'user_description', 'user_followers_count', 'user_favorite_count',
           'user_following_count', 'user_friends_count', 'user_location', 'user_screenname', 'user_statuscount', 'user_profile_image', 'user_name', 'user_verified' ]

#columns =['coordinates', 'created_at']


df = pd.DataFrame()

count = 0
for line in tweets:
    count += 1
    print(count)
    #print(line)
    #print(type(line))
    tweet_obj = json.loads(line)
    #pprint(tweet_obj)
    #print(tweet_obj['id'])
    #print(tweet_obj['user']['id'])
    df = df.append({'coordinates': tweet_obj['coordinates'],
                    'created_at': tweet_obj['created_at'],
                    'favorite_count': tweet_obj['favorite_count'],
                    'favorited': tweet_obj['favorited'],
                    'tweet_id': tweet_obj['id'],
                    'lang': tweet_obj['lang'],
                    'quote_count': tweet_obj['quote_count'],
                    'reply_count': tweet_obj['reply_count'],
                    'retweet_count': tweet_obj['retweet_count'],
                    'retweeted': tweet_obj['retweeted'],
                    'text': tweet_obj['text'],
                    'timestamp_ms': tweet_obj['timestamp_ms'],
                    'user_id': tweet_obj['user']['id'],
                    'user_description': tweet_obj['user']['description'],
                    'user_followers_count': tweet_obj['user']['followers_count'],
                    'user_favorite_count': tweet_obj['user']['favourites_count'],
                    'user_following': tweet_obj['user']['following'],
                    'user_friends_count': tweet_obj['user']['friends_count'],
                    'user_location': tweet_obj['user']['location'],
                    'user_screen_name': tweet_obj['user']['screen_name'],
                    'user_statuscount': tweet_obj['user']['statuses_count'],
                    'user_profile_image': tweet_obj['user']['profile_image_url'],
                    'user_name': tweet_obj['user']['name'],
                    'user_verified': tweet_obj['user']['verified']

                    }, ignore_index=True)

df.to_csv('tweets.csv')

一个显着的速度提升是 append 字典到 list 而不是使用 df.append 然后在循环外创建数据帧。类似于:

count = 0
l_tweets = []
for line in tweets:
    count += 1
    tweet_obj = json.loads(line)
    #append to a list
    l_tweets.append({'coordinates': tweet_obj['coordinates'],
                     # ... copy same as yours
                     'user_verified': tweet_obj['user']['verified']
                    })
df = pd.DataFrame(l_tweets, columns=columns)

关于 14M 推文是否可以由您的 RAM 处理,我真的不知道。在集群上通常是的,但关于如何处理数据取决于我认为集群的配置。

或者,如果您确保元素的顺序与列表 columns 中的顺序相同,那么 list 而不是字典也可以:

count = 0
l_tweets = []
for line in tweets:
    count += 1
    tweet_obj = json.loads(line)
    #append to a list
    l_tweets.append([tweet_obj['coordinates'], tweet_obj['created_at'], 
                     # ... copy just the values here in the right order
                     tweet_obj['user']['name'], tweet_obj['user']['verified']
                    ])
df = pd.DataFrame(l_tweets, columns=columns)