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

fitbitエクササイズデータ (TCX) をPandas.DataFrameに入れてプロットする

ジョギングデータが入手できたので、次はプロット。

  • XMLオブジェクトのままでは扱いにくいので、Pandas.DataFrameの手習いも兼ねてDataFrameに入れる。
  • matplotlibでプロットする。

まず、Pandasをざっと勉強。知ってはいたがいじっていなかったので。numpyのndarrayを直接利用したときに自分でも拡張していたのと同様に時系列データを扱うときに便利なようなDataFrameが提供されていて、納得。

10 Minutes to pandas — pandas 0.19.2 documentation

以下のようにして、TCXからDataFrameを構築した。

def get_activity_tcx(auth2_client, log_id):
    """
    get TCX data with log_id.

    Parameters
    ----------
    auth2_client : fitbit.Fitbit
        web API client object
    log_id : str
        Activity log ID.

    Return
    ------
    df : pandas.DataFrame
        data frame containing the Activity.
    """
    fitbit_tcx = auth2_client.activity_tcx(log_id=log_id)
    # convert XML elements into DataFrame
    rows = []
    for tp in fitbit_tcx.iter(TCX_NAMESPACE + 'Trackpoint'):
        time_text = tp.find(TCX_NAMESPACE + 'Time').text
        time = pd.to_datetime(time_text, utc=True)
        hr_body = tp.find(TCX_NAMESPACE + 'HeartRateBpm')
        hr_text = hr_body.find(TCX_NAMESPACE+'Value').text
        hr = float(hr_text)
        dist_text = tp.find(TCX_NAMESPACE + 'DistanceMeters').text
        dist = float(dist_text)
        rows.append((time, [dist, hr]))
    df = pd.DataFrame.from_items(rows, orient='index',
                                 columns=['distance_meters', 'heartrate_bpm'])
    return df

あとは、pandasのplotを利用して簡単にプロットできた。

# get TCX data and plot it.
df = get_activity_tcx(auth2_client, LOG_ID)

# replace index with elapsed seconds.
df.index = (df.index - df.index[0]) / pd.Timedelta(1, unit='s')
df.plot(subplots=True, sharex=True)

f:id:ken_miyashita:20170103233053p:plain

ちなみに、同じデータをfitbit.comのWebサイトで表示させると下図のようになり同一データがプロットできていることがわかる。

f:id:ken_miyashita:20170103233228p:plain