読者です 読者をやめる 読者になる 読者になる

toricago

Toricago Lifehack Research

タイム管理アプリTogglの蓄積データをAPI取得し、Pythonで分析する話

PDCA 時短術

 タイムマネジメントは仕事をする上で欠かせないスキルの一つである。仕事だけではなく、限られたプライベートの時間を満喫するためにも威力を発揮する。だが、自分が何にどれぐらいの時間を投入しているのかというのは、意識的に計測し、定期的に振り返らない限り、ほとんど認識することはできないだろう。「このぐらいだろう」と心のなかで思っていても、実態とかけ離れている可能性が大きい。そこでこのブログでは、タイムマネジメント関連の記事をいくつか公開してきた。

 上記の記事の主な内容は、タイム管理アプリのTogglを使って、日々記録を行い、週ごとに、月ごとに蓄積したデータを分析することで、どんどんタイムマネジメントスキルを向上させるとともに、日々の行いを振り返るというPDCAのC(チェック)の精度を上げていこう、というものだ。

 (ちなみにTogglとは、何かしらの行動・作業・仕事などを開始する時に、スタートを押して内容のメモを書くだけのウェブサービス・アプリ。終わったときにもストップを押す。非常にシンプルな仕組みなので私は結構気に入って使っている。)

 最初の関門はTogglでの記録を習慣化させることであるが、1ヶ月弱もすれば、違和感なく記録を継続できるようになるだろう。しかし第2の関門は、溜まったデータを振り返ることである。せっかくデータを溜めても、それを分析しなければTogglの意味がない。

 そこで次の記事では、Togglのサイトにログインし、csvファイルをダウンロードし、それをエクセルで開いて、色々と列や行を整理し、データの欠損を補完し、ピボットテーブルで整理・分析する方法を以前に紹介した。

 だが、これが結構面倒なのだ。一回限りならこの一連の流れを通せるかもしれないが、今後、ずっとPDCAを回していく度にこの作業を行うのであれば、なんとか効率的に集計できないものだろうか。そんな時に、TogglにはAPIがあることに気付く。きっかけは次の記事。

 ココまでのことができるのであれば、「プログラミング言語Pythonで集計まで含めて自動化できないだろうか?」ということを考えてみて、実際に試してみた。今日はその話をしよう。なので今回の記事は、以前の「『鬼速PDCA』と『7つの習慣』マトリックスの組み合わせ技を紹介するぜ!」の続編として捉えてもらえると良いかもしれない。

Toggl集計の自動化をAPIPythonでやってみる

 先程のQiitaの記事を参考にしながら取り組んでみた。大変だったことはTogglのAPIの件数取得上限が50件に設定されていたことである。ここは、ループを使って、取得したデータが空になるまで、無理やりデータを取り続ける方法で実装。データを整えていく部分はQiitaの記事のコードをかなり借りた。公式のドキュメントもサラッと見てみた。

 私の場合はGoogle Sheetsに取り込みたくないので、代わりにデータ分析ライブラリのpandasのdata frameを利用。そして最後にpandasのpivot table機能を用いて、月ごとに、各カテゴリに投入した時間の集計を行うようにした。カテゴリとは、食事、移動、勉強、前倒しシート、お風呂、仕事A、仕事B、ブログなどの項目のことだ。

 data frameの表示は、コーディング環境として便利なjupyter notebookを使うとキレイに表示でき、タイムマネジメントの振り返りがスムーズに行えるはずだ。例えば、こんな感じになる。今年の1月から今日までのデータを集計してみた。(カテゴリ名は赤色で隠してある。)

f:id:toricago:20170311213033p:plain:w350

 もちろん、既にTogglのサイトで、簡単な集計機能は紹介されているので、それで充分という人はここまでやる必要がないかもしれない。ただ、公式サイトでは機能が限られていることや、分析期間をマウスでいちいち設定するのに結構時間がかかる。自分がどういう項目を見るかが毎週または毎月決まっているのであれば、そこまで含めて実装しておけば、あとはクリック一つで、欲しい表やチャートが手に入るので、時短効果も期待できる。

 以下、コードを紹介しておくので、実装してみたい人の参考になればと思う。前提としてPythonを使ったことがある、APIって聞いたことがある、というレベルが好ましい。

実際のコードの紹介

 こちらが実際のコード。

# -*- coding: utf-8 -*-
import requests
from requests.auth import HTTPBasicAuth
import json
from datetime import datetime as dt
import pandas as pd
import numpy as np
pd.set_option('display.max_colwidth', 20)
df = pd.DataFrame([[0], [0], [0], [0], [0]]).T
df.columns = ["description", "category", "date", "month", "duration"]

 まずは上記のように、準備を行う。

_api_token = '(ここにAPIキーを入れる)'

 ここではAPIキーを利用している。これはTogglのサイトを開き、ログイン後、左下の顔マークからProfile Settingsをクリック。開いたページの一番下に、「API Token」とあるので、それをここにコピペすれば良い。

for pagenumber in range(1000):
    pn = np.str(pagenumber + 1)
    _params = {
        'user_agent': '(Togglに登録しているメールアドレス)',
        'workspace_id': '(workspace idを入れる)',
        'since': '2016-10-01',
        'until': '2017-03-11',
        'page': pn}
    r = requests.get('https://toggl.com/reports/api/v2/details', auth=HTTPBasicAuth(_api_token, 'api_token'), params=_params)

 ここで、Togglに登録しているメールアドレス、workspace id、さらにはいつからいつまでのデータがほしいか、というパラメータの情報を設定していく。最後の行でデータを取得している。

 ループの1000回は、どれだけデータが蓄積されているかに依存する。一回に取得するのが50件なので、自分の蓄積件数 < 50 × ループ数を満たしていれば良い。ループする度に、最後のpnが増えていくので、別のページを参照することになる。

    data = r.json()
    Data = data['data']
    if len(Data) == 0:
        break
    row = 0
    for i in Data:
        dataset = Data[row]
        data01 = dataset['description']
        data02 = dataset['project']
        start = dataset['start']
        sd = start[0:10]
        st = start[11:19]
        s = sd + ' ' + st
        tdatetime = dt.strptime(s, '%Y-%m-%d %H:%M:%S')
        date_s = dt.strptime(s, '%Y-%m-%d %H:%M:%S')
        end = dataset['end']
        ed = end[0:10]
        et = end[11:19]
        e = ed + ' ' + et
        date_e = dt.strptime(e, '%Y-%m-%d %H:%M:%S')
        dur = date_e - date_s
        print date_e
        data03 = sd
        data04 = tdatetime.month
        data05 = dur

ここまでで、データの準備が整う。

        series_add = pd.Series([data01, data02, data03, data04, data05], index=["description", "category", "date", "month", "duration"], name=row + 1)
        df = df.append(series_add)
        row += 1
df = df.drop(0)  # erase dummy row

ここでは、データをdataframeに格納し、今までのデータと結合している。ループが終われば、ダミー行を削除している。

monthly_sheet = df.pivot_table("duration", aggfunc="sum", fill_value=0, index="month", columns="category").T

最後にpandasのピボットテーブル機能を利用して、それぞれの月について、カテゴリごとの集計を行っている。

終わりに

 ということで、Togglのデータをエクセルから集計するのではなく、APIPythonを用いて集計する方法を紹介してみた。タイムマネジメントノウハウの開発は一旦ここまでとし、これからはモチベマネジメントのノウハウへとと重心を移行していきたいなぁ!

広告を非表示にする