前回からの続きです。
tweepy を使ってtweetの取得ができるようになったので、取得したtweetをpandasデータフレームとしてまとめ、matplotlibを用いて視覚化することを行ってみます。
pandas
pandasとは、pythonのエクセルのようなものです。
以下は、大変良いとっかかりになりました。
まずは、トランプ大統領のtweetを取得します。
>>> import tweepy >>> import credentials_twitter >>> auth = tweepy.OAuthHandler(credentials_twitter.API_KEY, credentials_twitter.API_SECRET_KEY) >>> auth.set_access_token(credentials_twitter.ACCESS_TOKEN, credentials_twitter.ACCESS_TOKEN_SECRET) >>> api = tweepy.API(auth) >>> tweets = api.user_timeline(screen_name='realDonaldTrump', count=20)
取得したtweetをデータフレームに変換してみます。
まずは空のデータフレームを作ります。
>>> import pandas as pd >>> df = pd.DataFrame() >>> df Empty DataFrame Columns: [] Index: []
次に、tweet本体を列としてデータフレームに追加します。列の名前は’tweets’にします。
>>> df['tweets'] = [tweet.text for tweet in tweets] >>> df tweets 0 Thank you Jason Chaffetz! #MAGA https://t.co/s... 1 Today we announced vital new actions that we a... 2 ....She is a very special person with extraord... 3 After 3 1/2 years, our wonderful Sarah Huckabe... 4 "It is the assessment of the U.S. government t... 5 While I very much appreciate P.M. Abe going to... 6 They’ve been wrong all along! https://t.co/z5t... 7 ....and other really bad people, SPIED ON MY C... 8 ....which he is a member. When @RepAdamSchiff ... 9 When Senator @MarkWarnerVA spoke at length, an... 10 ....call the FBI about these calls and meeting... 11 I meet and talk to “foreign governments” every... 12 The Dems fight us at every turn - in the meant... 13 ....is not Constitutionally Permissable.” Alan... 14 “Congress cannot Impeach President Trump (did ... 15 ....can to embarrass the Trump Administration ... 16 .....much tougher game than the Republicans di... 17 Unrelated to Russia, Russia, Russia (although ... 18 General Michael Flynn, the 33 year war hero wh...
無事に追加できているので、他の項目も適当に追加します。
>>> df['id'] = [tweet.id for tweet in tweets] >>> df['len'] = [len(tweet.text) for tweet in tweets] >>> df['date'] = [tweet.created_at for tweet in tweets] >>> df['likes'] = [tweet.favorite_count for tweet in tweets] >>> df['retweets'] = [tweet.retweet_count for tweet in tweets] >>> df tweets id ... likes retweets 0 Thank you Jason Chaffetz! #MAGA https://t.co/s... 1139330376009166851 ... 29109 8877 1 Today we announced vital new actions that we a... 1139277199180259328 ... 38464 10925 2 ....She is a very special person with extraord... 1139263782142787585 ... 102176 17684 3 After 3 1/2 years, our wonderful Sarah Huckabe... 1139263781144596486 ... 97872 19003 4 "It is the assessment of the U.S. government t... 1139246407267815430 ... 36315 14281 5 While I very much appreciate P.M. Abe going to... 1139236468365434880 ... 53407 13869 6 They’ve been wrong all along! https://t.co/z5t... 1139231431023046656 ... 53715 16166 7 ....and other really bad people, SPIED ON MY C... 1139164977271595010 ... 64148 17236 8 ....which he is a member. When @RepAdamSchiff ... 1139164973286985730 ... 56474 15309 9 When Senator @MarkWarnerVA spoke at length, an... 1139164968862015488 ... 63352 17930 10 ....call the FBI about these calls and meeting... 1139161443734106112 ... 79846 17114 11 I meet and talk to “foreign governments” every... 1139161442437992448 ... 84721 18244 12 The Dems fight us at every turn - in the meant... 1139143353445040129 ... 61301 15946 13 ....is not Constitutionally Permissable.” Alan... 1139126119440035842 ... 68311 14301 14 “Congress cannot Impeach President Trump (did ... 1139126117326045184 ... 84869 19213 15 ....can to embarrass the Trump Administration ... 1139123053219262466 ... 48460 10988 16 .....much tougher game than the Republicans di... 1139123051788980224 ... 43430 9681 17 Unrelated to Russia, Russia, Russia (although ... 1139123048748081153 ... 52015 12200 18 General Michael Flynn, the 33 year war hero wh... 1139115655532298240 ... 83285 20737 19 “It’s about peace and Prosperity, that’s how R... 1139017598744576001 ... 55174 13907 [20 rows x 6 columns]
トランプ大統領のtweetをデータフレームとしてまとめることができました。
describe()
メソッドを使うことで、データフレームの平均、標準偏差、最小値、25%、50%、75%、最大値を簡単に取得できます。
>>> df.describe() id len likes retweets count 2.000000e+01 20.000000 20.000000 20.000000 mean 1.139178e+18 128.100000 62822.200000 15180.550000 std 7.435411e+13 28.624428 20375.275431 3355.824073 min 1.139018e+18 53.000000 29109.000000 8877.000000 25% 1.139125e+18 139.000000 51126.250000 13451.750000 50% 1.139163e+18 140.000000 58887.500000 15627.500000 75% 1.139239e+18 140.000000 80705.750000 17745.500000 max 1.139330e+18 140.000000 102176.000000 20737.000000
matplotlib
matplotlibはpythonでグラフを描くライブラリです。
自分の思い通りのグラフを描くのは大変ですが、それっぽいグラフであれば非常に簡単に作成できます。公式のチュートリアルがお勧めです。
トランプ大統領のtweetを時系列で可視化してみます。
事前に200件取得して、データフレームに変換しておきます。
まずlikesの数を時系列に可視化してみます。
1次元の値を扱うので、pandasのseriesに変換して、日付をindexにした上で、可視化します。
>>> time_likes = pd.Series(data=df['likes'].values, index=df['date']) >>> time_likes.plot() <matplotlib.axes._subplots.AxesSubplot object at 0x00000261D06E1438> >>> plt.show()
横に詰まっている感じがあるので、広げます。
>>> time_likes = pd.Series(data=df['likes'].values, index=df['date']) >>> time_likes.plot(figsize=(9.6, 4.8)) <matplotlib.axes._subplots.AxesSubplot object at 0x00000261CFC4ECC0> >>> plt.show()
それっぽいグラフができあがりあました。
このグラフにretweetの数を重ねてみます。
showメソッドの前に、プロットするためのメソッドを複数回呼び出すことで、一つの図に複数のグラフを描画できます。
>>> time_likes = pd.Series(data=df['likes'].values, index=df['date']) >>> time_likes.plot(figsize=(9.6, 4.8), label='likes', legend=True) <matplotlib.axes._subplots.AxesSubplot object at 0x00000261D054F048> >>> time_retweets = pd.Series(data=df['retweets'].values, index=df['date']) >>> time_retweets.plot(figsize=(9.6, 4.8), label='retweets', legend=True) <matplotlib.axes._subplots.AxesSubplot object at 0x00000261D054F048> >>> plt.show()
グラフを重ねることができました。