🎉

PythonでTableau用にTwitter APIのデータを整形する

2020/12/04に公開

取得

Twitter APIの登録には申請が必要→https://developer.twitter.com/ja

APIを用いてユーザーのタイムラインを取得する

下記コードにて実施。
同階層にconfig.pyを作成し、そこに環境変数を記述して、2つ目のスクリプトでインポート。これで、config.pyを.gitignoreに買いとけば、APIキーなどがGithubにアップロードされることを防げます。

config.py

# これらは、Twitter APIを操作する上で必要。Developerダッシュボードで作成できます。
CONSUMER_KEY=""
CONSUMER_SECRET=""
ACCESS_TOKEN=""
ACCESS_TOKEN_SECRET=""

run.py

import json
import config
import csv
from requests_oauthlib import OAuth1Session

def my_timeline():
    url = "https://api.twitter.com/1.1/statuses/user_timeline.json"
    params ={'screen_name': 'hirasawa','count' : 200}# JoeBiden
    header = ['id','User Name','User ID','Follows','Followers','User Location','content','time']
    req = twitter.get(url, params = params)
    if req.status_code == 200:
        with open('my_timeline.csv', 'w') as f:
            writer = csv.writer(f)
            writer.writerow(header)
            timeline = json.loads(req.text)
            for tweet in timeline:
                tmp = []
                tmp.append(tweet['id'])
                tmp.append(tweet['user']['name'])
                tmp.append(tweet['user']['screen_name'])
                tmp.append(tweet['user']['friends_count'])
                tmp.append(tweet['user']['followers_count'])
                tmp.append(tweet['user']['location'])
                tmp.append(tweet['text'])
                tmp.append(tweet['created_at'])
                writer.writerow(tmp)
    else:
        print("ERROR: %d" % req.status_code)

if __name__ == '__main__':
    CK = config.CONSUMER_KEY
    CS = config.CONSUMER_SECRET
    AT = config.ACCESS_TOKEN
    ATS = config.ACCESS_TOKEN_SECRET
    twitter = OAuth1Session(CK, CS, AT, ATS)
    my_timeline()

Tableau試行録

Twitter APIから帰ってくる日付のフォーマットは

EEE MMM dd HH:mm:ss X yyyy
ですが、これだとTableauで扱うときに詰まりました。

生データのままだと

文字列になってしまい、グラフのソート時などに困ります。

Tableauの機能で日付に変換したい


するとnullになってしまう

Tableauの計算フィールドでフォーマット指定してもダメっぽい

Tableauの計算フィールドでDATEPARSEを使って認識させようとしてもダメでした。
https://help.tableau.com/current/pro/desktop/ja-jp/data_dateparse.htm#dateparse

DATEPARSE('EEE MMM dd HH:mm:ss X yyyy',Content['Created_at'])

フォーマットの詳細をみても、間違って無さそうなのに、、
http://userguide.icu-project.org/formatparse/datetime

Pythonで解決

tmp.appennd(tweet['created_at'])の行を、下記に書き換える

date = datetime.strptime(tweet['created_at'],'%a %b %d %H:%M:%S %z %Y')
                tmp.append(f"{date.year}-{date.month}-{date.day} {date.hour}:{date.minute}:{date.second}")

Pythonのdatetimeのパーサ記号は以下を参考に
https://docs.python.org/ja/3.5/library/datetime.html

これで無事、NULLにならずに日付と認識されたので、文字列のままではできなかった年→四半期→月→日→時→分→秒までできるようになりました。

Discussion