AmbientのデーターをPythonで扱う

  • 2
    いいね
  • 0
    コメント

センサーデーターの可視化サービス「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はマイコンなどから送られるセンサーデーターを受信し、蓄積し、可視化(グラフ化)するクラウドサービスです。Arduino、mbed、Raspberry Piなどからセンサーデーターを簡単にAmbientに送信し、グラフ化することが出来ます。

Ambient structure

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で実行しています。ライブラリーの読み込みは次のようにおこないます。

import

Ambientからのデーター読み込み

最初にチャネルIdとライトキー、リードキーを指定してAmbientのインスタンスを作ります。読み込みしかしない場合、ライトキーは”を指定しても大丈夫です。公開チャネルの場合はリードキーは省略可能です。今回事例として扱うデーターは「ベランダ環境モニター@世田谷桜丘」として公開しているもので、チャネルIdは102ですので、下記のようにインスタンスを作ることができます。

instance

データーの読み込みにはデーター件数を指定する方法、日付を指定する方法、期間を指定する方法があります。

  • 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)で表示されます。データーは生成時刻の昇順(古いものから新しいものへ)で並びます。

read

pandas DataFrameに変換する

この先で必要になるモジュールを読み込みます。

pandas

次にこのデーターをpandasのDataFrameに変換します。これは実に簡単で、次のようにするだけです。

dataframe

データーの生成時刻df['created']が文字列です。このままだと後の処理が不便なので、これをpandasのTimestampに変換しておきます。

type created

convert

strptime()で文字列をDatetimeに変換し、タイムゾーンとして日本('Asia/Tokyo')を設定しています。

pandasのread_csvだと文字列形式の時刻をパースしてTimestampに変換する機能があるので、辞書形式の配列からDataFrameを作る時も同じような機能があるように思うのですが、見つけられなかったため、上記のように自力で変換しました。この部分、もっと簡単な方法をご存じの方がいらしたら、是非教えてください。

データーをmatplotlibでグラフ化する

次にmatplotlibでデーターをグラフ化してみます。

matplotlib

まず、読み込んだ3月3日の温度を折れ線グラフにしてみます。

temp graph

次に温度と湿度の相関をグラフ化してみます。

scatter

一日の温度と湿度の変化を温度を左軸、湿度を右軸にしてグラフにしてみます。

two axes

このあたりまではAmbientの機能でもグラフ化できますが、Python+pandas+matplotlibだともっと柔軟なグラフ化が可能です。

上記と同じ温度と湿度の移動平均を計算してグラフ化してみます。データーとしてdf['d1']の代わりにdf['d1'].rolling(window=7, min_period=1).mean()とすることで幅7の移動平均を計算することができます。

rolling

気温、湿度、気圧、電源電圧、照度の散布図行列を作ってみます。

scattermatrix

まとめ

AmbientとPython、pandas、matplotlibを組み合わせることで、マイコンで制御したセンサーデーターを蓄積し、簡単な可視化(グラフ化)はAmbientでおこない、さらに柔軟な分析、可視化をPythonでおこなえるようになります。実際のセンサーデーターをPythonで分析する場合の参考になればうれしいです。