LoginSignup
5
11

More than 5 years have passed since last update.

AmbientのデーターをPythonで扱う

Last updated at Posted at 2017-03-05

センサーデーターの可視化サービス「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 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で分析する場合の参考になればうれしいです。

5
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
11