处理大量推文以进行探索性数据分析,例如独特推文的数量和每个用户的推文计数直方图
Posted
技术标签:
【中文标题】处理大量推文以进行探索性数据分析,例如独特推文的数量和每个用户的推文计数直方图【英文标题】:Processing a large amount of tweets for exploratory data analysis such as number of unique tweets, and histogram of tweet counts per user 【发布时间】:2020-10-09 06:00:19 【问题描述】:我在一个单独的 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')
【问题讨论】:
【参考方案1】:一个显着的速度提升是将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)
关于你的 RAM 是否可以处理 1400 万条推文,我真的不知道。在集群上通常是的,但是关于如何处理数据取决于我认为集群的配置。
或者,如果您确保元素的顺序与列表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)
【讨论】:
以上是关于处理大量推文以进行探索性数据分析,例如独特推文的数量和每个用户的推文计数直方图的主要内容,如果未能解决你的问题,请参考以下文章
Twitter 流式处理脚本在推文的位置字段上抛出一个 keyerror