27 Jan 2018, 10:42

Elasticsearch と kibanaで fitbitのデータを可視化する

はじめに

今まで収集されたデータを分析して、よい精度を出すことに躍起になっていたのだけれども、世の中そんなに簡単にデータが集まっているわけではない。データを集めることは結構大変なのではと思った。なので、データ分析の前にデータ収集を自前でやってみようと思ったのだった。

何がデータ収集の対象がいいだろうと考えたのだけれども、自分のライフログを収集するのがまずは取っ掛かりとしては面白そうだ。これを英語ではQuantified Self というらしい。自分の行動履歴をマッシュアップで表示できると楽しいのではないか??

そんな空想を実現するOSSを調べていると、どうやらElasticsearch と kibanaというツールが使えそうだ。というわけで、このツールをいじってみることにした。

Elasticsearchとkibanaについて

まずは、2つのツールの関係と機能について。Elasticsearchとは、データの全文検索エンジン。そして、kibanaは そのフロントエンドツール。どちらも同じ会社 elastic が開発しているOSS。

Elasticsearchのインストールと実行

ダウンロードは以下から。

Ubuntuなのでdebを選択してDownloadします。

$ sudo dpkg -i elasticsearch-6.1.2.deb
$ systemctl start elasticsearch.service

これで、http://localhost:9200 にアクセスして、以下のレスポンスを受ければOK.

{
  "name" : "6UGX_mB",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Ih-924HvSr6AxH7CMfWlZg",
  "version" : {
    "number" : "6.1.2",
    "build_hash" : "5b1fea5",
    "build_date" : "2018-01-10T02:35:59.208Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

kibanaのインストールと実行

kibanaのインストールは以下から。

Ubuntuなのでdebを選択してDownloadします。

$ sudo dpkg -i kibana-6.1.2-amd64.deb
$ systemctl start kibana.service

これで、http://localhost:5601 にアクセスして、welcome画面がでればOK.

CSV データを elasticsearchに投入する

理想的にはリアルタイムでデータ収集したいが、まずは手元にある静的なデータを使う。まずはじめは、fitbitから得た心拍数をグラフ化してみよう。

Fitbit Apiとpythonで心拍数の取得をする | Futurismo

kibanaからCSVデータを投入する機能は、一時保留になっている。そこで、logstashを利用する。

設定ファイルを以下のように書く。

input {
  file {
    path => "/home/tsu-nera/repo/python-scripts/heartbeat.csv"
    type => "csv"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

filter {
  csv {
    columns => ["time","value"]
    separator => ","
  }
  date{
    match => ["time" , "yyyy-MM-dd HH:mm:ss"]
    target => "time"
  }
  mutate {
    convert => { "value" => "integer" }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "heartbeat"
  }
}

コマンドラインから実行。

$ logstash -f conf.conf 

これで、elasticsearchにcsvのデータが投入された。Webから確認してみよう。

kibanaでfitbitの心拍数をグラフ化

kibanaにアクセスして、index patterns を作成する。 作成が完了すると、Management > Index Patterns から作成した name を持つ データが並んでいるのが確認できる。

タブから Visualize を選択し、 Lineを選択。折れ線グラフを作成する。以下のようにY軸とX軸を設定。

すると、以下のような折れ線グラフができる。素晴らしい。

おわりに

この記事を書いた背景は、以下の記事にとても影響を受けている。

この記事みたいに、自分もライフログを収集してみたい。心拍数はつまらないな。まずは、睡眠と体重からかなー。

27 Jan 2018, 07:41

Fitbit Apiとpythonで心拍数の取得をする

はじめに

fitbit ionicを購入しました! fitbit Charge, altaに続いて、3台目の購入となります。ここまでくると私もfitbit マニア??

購入の動機は、睡眠の深度を測る機能が欲しかったから。てっきり、浅い睡眠で起こしてくれる機能がついたと思ったのだけれども、それはなかった(T_T)。

別の理由は、fitbit初のスマートウォッチということで、ディベロッパーとしてなにか応援できないかと思ったから。というわけで、このHackableなガジェットをハックします! Let’s Hack begin。

Fitbit APIをつかってみる

データの取得をするために、Fitbit APIを利用する。

まずは、API の IDを取得する。

https://dev.fitbit.com/login からログインして、 REGISTER AN APP を選択。情報を入力する。

  • Application Name 適当
  • Description 適当
  • Application Website 適当
  • Organization 適当
  • Organization Website 適当
  • OAuth 2.0 Application Type Personalを選択
  • Callback URL http://127.0.0.1:8080/ と入力
  • Default Access Type Read & Write を選択

次に、Access Tokenを取得する。取得するために、Pythonのツール、python-fitbitを利用する。

Access Tokenと Refresh Tokenをメモする。以下の4つはプログラムで必要になるのでメモする。

  • Client ID
  • Client Secret
  • Access Token
  • Refresh Token

スクリプトの作成

心拍数を取得するスクリプト。

import fitbit
import pandas as pd

CLIENT_ID =  "xxx"
CLIENT_SECRET  = "xxxx"
ACCESS_TOKEN =  "xxxx"
REFRESH_TOKEN =  "xxxx"

DATE = "2018-01-26"
client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET,
                       access_token=ACCESS_TOKEN,
                       refresh_token=REFRESH_TOKEN)

stats = client.intraday_time_series('activities/heart', DATE, detail_level='1min')
heart_beat = stats["activities-heart-intraday"]["dataset"]

heart_df = pd.DataFrame.from_dict(heart_beat)
heart_df.index = pd.to_datetime([DATE + " " + t for t in heart_df.time])
heart_df.drop(["time"], axis=1, inplace=True)
heart_df.plot(y="value", figsize=(20,5))
import fitbit
import pandas as pd

CLIENT_ID = #
CLIENT_SECRET  = #
ACCESS_TOKEN =  #
REFRESH_TOKEN =  # 

DATE = "2018-01-26"
client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET,
                       access_token=ACCESS_TOKEN,
                       refresh_token=REFRESH_TOKEN)

stats = client.intraday_time_series('activities/heart', DATE, detail_level='1min')
heart_beat = stats["activities-heart-intraday"]["dataset"]

heart_df = pd.DataFrame.from_dict(heart_beat)
heart_df.index = pd.to_datetime([DATE + " " + t for t in heart_df.time])
heart_df.drop(["time"], axis=1, inplace=True)

# plot
heart_df.plot(y="value", figsize=(20,5))

# export csv
heart_df.to_csv("heartbeat.csv")

以下のような時系列グラフが出力される。寝ている時間は心拍数が低い。