AmbientのデーターをPythonで扱う


センサーデーターの可視化サービス[「Ambient」](https://ambidata.io/)のデーターをPythonで読み込み、pandasのDataFrameに変換してグラフ化などをおこなう事例を紹介します。事例として扱うデーターはESP8266 Arduinoで測定した気温、湿度、気圧などのデーターで、Ambientで[「ベランダ環境モニター＠世田谷桜丘」](https://ambidata.io/ch/channel.html?id=102)として公開しているものです。

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 structure](https://ambidata.io/wp/wp-content/uploads/2016/09/AmbientStructure.jpg)

Ambientの使い方については[「Ambientを使ってみる」](https://ambidata.io/docs/gettingstarted/)をご覧ください。また、事例として取り上げている環境モニターは[「ESPr Developer + Ambientで自宅の環境モニターを作る」](https://ambidata.io/samples/temphumid/weatherstation-1/)をご覧ください。


# AmbientのPythonライブラリーのインストール

AmbientのPythonライブラリーにはAmbientにデーターを送信する機能と、Ambientに蓄積されたデーターを読み込む機能があります。

ライブラリーはGithubから次のようにライブラリーをインストールできます。

```sh
$ pip install git+https://github.com/TakehikoShimojima/ambient-python-lib.git
```

ライブラリーの詳細は[「Pythonライブラリー」](http://ambidata.io/refs/python/)をご覧ください。


# ライブラリーの読み込み

ここから先はjupyter notebookで実行しています。ライブラリーの読み込みは次のようにおこないます。

![import](http://ambidata.io/wp/wp-content/uploads/2017/03/fig1.jpg)


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

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

![instance](http://ambidata.io/wp/wp-content/uploads/2017/03/fig2.jpg)

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

* 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形式)の配列が返されます。

```Python
[
    {'created': '2017-02-25T15:01:48.000Z', 'd1': 数値, 'd2': 数値, 'd3': 数値},
    {'created': '2017-02-25T15:06:47.000Z', 'd1': 数値, 'd2': 数値, 'd3': 数値},
    ...
]
```

データーの生成時刻’created’は協定世界時(UTC)で表示されます。データーは生成時刻の昇順(古いものから新しいものへ)で並びます。

![read](http://ambidata.io/wp/wp-content/uploads/2017/03/fig3.jpg)


# pandas DataFrameに変換する

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

![pandas](http://ambidata.io/wp/wp-content/uploads/2017/03/fig4.jpg)

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

![dataframe](http://ambidata.io/wp/wp-content/uploads/2017/03/fig5.jpg)

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

![type created](http://ambidata.io/wp/wp-content/uploads/2017/03/fig6.jpg)

![convert](http://ambidata.io/wp/wp-content/uploads/2017/03/fig7.jpg)

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

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


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

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

![matplotlib](http://ambidata.io/wp/wp-content/uploads/2017/03/fig8.jpg)

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

![temp graph](http://ambidata.io/wp/wp-content/uploads/2017/03/fig9.jpg)

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

![scatter](http://ambidata.io/wp/wp-content/uploads/2017/03/fig10.jpg)

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

![two axes](http://ambidata.io/wp/wp-content/uploads/2017/03/fig11.jpg)

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

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

![rolling](http://ambidata.io/wp/wp-content/uploads/2017/03/fig12.jpg)

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

![scattermatrix](http://ambidata.io/wp/wp-content/uploads/2017/03/fig13.jpg)

# まとめ

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