用Python分析川普的推文
本文将简单介绍如何使用Python分析川普在twitter上发布的推文。

准备工作
在分析之前,需要安装好Python。如果您不太了解的话,百度一下,按步骤来就行啦!
准备好Python后,还需要安装以下几个库:
- Tweepy
- Matplotlib
- NumPy
- Pandas
把上面的库都安装好了后,就可以开始啦!
获取twitter数据
为了获取到推文,需要登录你的twitter账户并创建一个app,网址是https://apps.twitter.com/。

当你创建好了之后,可以获取到4个参数:
- Consumer Key (API Key)
- Consumer Secret (API Secret)
- Access Token
- Access Token Secret
我们将它们保存到一个名为config.py的文件中,如下所示:
CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_SECRET = ''
创建这个py文件的原因是,我们可以把变量导入到notebook中使用,但又不会在代码中出现这些变量的真实值(毕竟这个比较私密嘛)。
然后,我们导入需要用到的库:
import tweepy
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
之后,我们再添加一个函数,用于通过密钥认证:
# 导入在config.py文件中填写的四个参数
from config import *
def twitter_extrctor():
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth, proxy='http://127.0.0.1:1080')
return api
注意,在这里使用了代理,至于原因嘛,你懂的。
推文提取
现在,我们可以使用之前定义的twitter_extrctor
函数创建一个名为extractor的对象,并用Tweepy的user_timeline
函数提取用户的推文。
我们自然提取的是川普(@realDonaldTrump)的推文,那就开始吧~
我们按照下面的方式提取推文
extractor = twitter_extrctor()
# 用以下方式获取推文对象列表
tweets = extractor.user_timeline(screen_name="realDonaldTrump", count=200)
print("获取到的推文数量: {}\n".format(len(tweets)))
print("最近的的5条推文:")
for tweet in tweets[:5]:
print(tweet.text + '\n')
代码运行后,可以得到类似下图所示的结果:

创建DataFrame
DataFrame可以让我们非常方便对数据进行分析。为此,需要创建一个DataFrame用于之后的分析工作,我们不妨先把每篇推文的文本内容构建成DataFrame的一列:
data = pd.DataFrame(data=[tweet.text for tweet in tweets], columns=['Tweets'])
data.head() # 查看前5条数据
结果如下:

我们提取到的推文都保存在tweets这个变量中,我们不妨看一看每个tweet包含一些什么属性和方法:

原来每个tweet中包含了很多其他信息,比如创建时间、来源等等。如果我们想获取这些信息,自然可以通过tweet的属性得到,如下所示:
print(tweets[0].id)
print(tweets[0].favorite_count)
print(tweets[0].retweet_count)
print(tweets[0].created_at)
print(tweets[0].source)
print(tweets[0].geo)
print(tweets[0].coordinates)
print(tweets[0].entities)
输出结果如下:

如之前所看到的,每条“推文”包含了很多其他信息,而不只是正文内容。我们可以按照下面的方式加到我们的DataFrame中,
data['ID'] = np.array([tweet.id for tweet in tweets])
data['Date'] = np.array([tweet.created_at for tweet in tweets])
data['Source'] = np.array([tweet.source for tweet in tweets])
data['Likes'] = np.array([tweet.favorite_count for tweet in tweets])
data['RTs'] = np.array([tweet.retweet_count for tweet in tweets])
data['Len'] = np.array([len(tweet.text) for tweet in tweets])
查看一下效果,如下图所示:

数据分析
首先,可以计算一下川普推文的平均长度
mean = np.mean(data['Len'])
print("推文的平均长度为: {}".format(mean))
结果是:

接下来,再做进一步的分析,比如喜欢数最多的推文
data.sort_values(by='Likes', ascending=False).head(1)
结果如下:

转推数最多的推文:
data.sort_values(by='RTs', ascending=False).head(1)
结果如下:

我们的DataFrame中有一列是时间,因此我们可以分析推文长度,喜欢数和转推数和时间的关系:
tlen = pd.Series(data=data['len'].values, index=data['Date'])
tfav = pd.Series(data=data['Likes'].values, index=data['Date'])
tret = pd.Series(data=data['RTs'].values, index=data['Date'])
绘制成图:
tlen.plot(figsize=(16,4), color='r');
结果如下:

我们将喜欢数和转推数的情况一起画出来
tfav.plot(figsize=(16,4), label="Likes", legend=True)
tret.plot(figsize=(16,4), label="Retweets", legend=True);
结果如下:

然后,我们可以统计一下川普每日发推的数量:
date = data['Date'].dt.date
date.value_counts().plot(figsize=(16,4), color='g')

川普的推文来源并不是相同的,不妨研究一下
for item in data['Source'].unique():
print(item)
结果如下:

正如上图所示,有3个来源。
那么具体情况是怎样呢?不妨绘制成图。
data['Source'].value_counts().plot.pie(fontsize=11, autopct='%.2f', figsize=(6, 6))
结果如下:

由此,我们可以得到一个结论:川普真的很爱发推,而且是用iPhone发!