我用Python

用Python分析川普的推文

2018-07-31  本文已影响33人  弃用中

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


准备工作

在分析之前,需要安装好Python。如果您不太了解的话,百度一下,按步骤来就行啦!

准备好Python后,还需要安装以下几个库:

把上面的库都安装好了后,就可以开始啦!

获取twitter数据

为了获取到推文,需要登录你的twitter账户并创建一个app,网址是https://apps.twitter.com/

当你创建好了之后,可以获取到4个参数:

我们将它们保存到一个名为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发!

上一篇下一篇

猜你喜欢

热点阅读