センサーデーターの可視化サービス「Ambient」のデーターをPythonで読み込み、pandasのDataFrameに変換してグラフ化などをおこなう事例を紹介します。事例として扱うデーターはESP8266 Arduinoで測定した気温、湿度、気圧などのデーターで、Ambientで「ベランダ環境モニター@世田谷桜丘」として公開しているものです。
Pythonを実行した環境は
* Mac OS X 10.11.6
* Python 3.5.2 :: Anaconda 4.2.0
* jupyter 4.2.0
です。
Ambient
Ambientはマイコンなどから送られるセンサーデーターを受信し、蓄積し、可視化(グラフ化)するIoTデーター可視化サービスです。Arduino、mbed、Raspberry Piなどからセンサーデーターを簡単にAmbientに送信し、グラフ化することが出来ます。
Ambientの使い方については「Ambientを使ってみる」をご覧ください。また、事例として取り上げている環境モニターは「ESPr Developer + Ambientで自宅の環境モニターを作る」をご覧ください。
AmbientのPythonライブラリーのインストール
AmbientのPythonライブラリーにはAmbientにデーターを送信する機能と、Ambientに蓄積されたデーターを読み込む機能があります。
ライブラリーはGithubから次のようにライブラリーをインストールできます。
$ pip install git+https://github.com/TakehikoShimojima/ambient-python-lib.git
ライブラリーの詳細は「Pythonライブラリー」をご覧ください。
ライブラリーの読み込み
ここから先はjupyter notebookで実行しています。ライブラリーの読み込みは次のようにおこないます。
Ambientからのデーター読み込み
最初にチャネルIdとライトキー、リードキーを指定してAmbientのインスタンスを作ります。読み込みしかしない場合、ライトキーは”を指定しても大丈夫です。公開チャネルの場合はリードキーは省略可能です。今回事例として扱うデーターは「ベランダ環境モニター@世田谷桜丘」として公開しているもので、チャネルIdは102ですので、下記のようにインスタンスを作ることができます。
データーの読み込みにはデーター件数を指定する方法、日付を指定する方法、期間を指定する方法があります。
- d = am.read(n=100, skip=100) # 最新から100件スキップして100件のデーターを読み込む
- d = am.read(date='2017-03-02') # 2017年3月2日のデーターを読み込む
- d = am.read(start='2017-03-02 00:00:00', end='2017-03-02 01:00:00') # 2017年3月2日0時から1時までのデーターを読み込む
どの方法でも次のような辞書形式(JSON形式)の配列が返されます。
[
{'created': '2017-02-25T15:01:48.000Z', 'd1': 数値, 'd2': 数値, 'd3': 数値},
{'created': '2017-02-25T15:06:47.000Z', 'd1': 数値, 'd2': 数値, 'd3': 数値},
...
]
データーの生成時刻’created’は協定世界時(UTC)で表示されます。データーは生成時刻の昇順(古いものから新しいものへ)で並びます。
pandas DataFrameに変換する
この先で必要になるモジュールを読み込みます。
次にこのデーターをpandasのDataFrameに変換します。これは実に簡単で、次のようにするだけです。
データーの生成時刻df['created']が文字列です。このままだと後の処理が不便なので、これをpandasのTimestampに変換しておきます。
strptime()で文字列をDatetimeに変換し、タイムゾーンとして日本('Asia/Tokyo')を設定しています。
pandasのread_csvだと文字列形式の時刻をパースしてTimestampに変換する機能があるので、辞書形式の配列からDataFrameを作る時も同じような機能があるように思うのですが、見つけられなかったため、上記のように自力で変換しました。この部分、もっと簡単な方法をご存じの方がいらしたら、是非教えてください。
データーをmatplotlibでグラフ化する
次にmatplotlibでデーターをグラフ化してみます。
まず、読み込んだ3月3日の温度を折れ線グラフにしてみます。
次に温度と湿度の相関をグラフ化してみます。
一日の温度と湿度の変化を温度を左軸、湿度を右軸にしてグラフにしてみます。
このあたりまではAmbientの機能でもグラフ化できますが、Python+pandas+matplotlibだともっと柔軟なグラフ化が可能です。
上記と同じ温度と湿度の移動平均を計算してグラフ化してみます。データーとしてdf['d1']の代わりにdf['d1'].rolling(window=7, min_period=1).mean()とすることで幅7の移動平均を計算することができます。
気温、湿度、気圧、電源電圧、照度の散布図行列を作ってみます。
まとめ
AmbientとPython、pandas、matplotlibを組み合わせることで、マイコンで制御したセンサーデーターを蓄積し、簡単な可視化(グラフ化)はAmbientでおこない、さらに柔軟な分析、可視化をPythonでおこなえるようになります。実際のセンサーデーターをPythonで分析する場合の参考になればうれしいです。