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