处理大量推文以进行探索性数据分析,例如唯一推文的数量以及每个用户的推文计数直方图
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)
我在一个 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)