csv データをIoT Analyticsに入れてQuickSightで可視化 （東京の天気）

# やりたいこと
IoT Analyticsでは、AWS IoT Coreで取得したデータ以外に、`BatchPutMessage` を使って、データを取り込むことができます。
「実運用ではIoT Coreからのデータを解析したいが、すでにある過去のCSVデータを取り込んで、どういった可視化や解析が可能かを試してみたい」といったときに使えます。
今回、気象庁から東京の天気をCSVで取得して、それをQuickSightで可視化することを試します。
https://docs.aws.amazon.com/iotanalytics/latest/APIReference/API_BatchPutMessage.html

# 元データを入手
今回は、気象庁の過去の気象データを取得
https://www.data.jma.go.jp/gmd/risk/obsdl/
<img width="764" alt="Screenshot 2019-05-27 23.06.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/64a2ef7a-9f88-f07b-8ad6-cbdab8cec188.png">
東京にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/e2902281-8ea8-c1ca-f212-378f4e9fec17.png)
日別の平均気温
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/48ae989c-38d1-5583-f0d4-1569e5fd089c.png)
３０年分ゲット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/a6cdad0d-1674-1233-696e-f1670a044200.png)
CSVをダウンロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/9c7b1cf0-4d57-9cec-a0e8-5f2a09c229d7.png)

sjisのようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/c9af16e5-4dee-3e3a-645b-5d0752c9bab6.png)

# IoT Analyticsにデータを送る
### Channel、Pipeline、Data Storeを作る
今回は入力データをそのまま使うので、Pipelineでは特に処理を行わない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/582d73e0-b205-df73-9fc5-f8df6be16d75.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/917c37d8-5191-ed33-8666-d89b16f0d61b.png)
Channel ID: `tokyo_temperature`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/a7e25cb4-73c2-84fb-6586-37fb0264ec94.png)
Create Channel を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/f359ff0e-8089-6c63-9fef-9ea2aa314aa8.png)

チャネルからパイプラインを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/0250f080-491b-0158-75cc-7b3e44835e46.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/29f2901f-9031-8df5-5791-7ddd3873262e.png)

Attribute をセットする。次のアクティビティはそのまま。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/e0bef286-9d34-ea86-b127-8471a9624eb0.png)

`tokyo_temperature_store` というData store nameにして、Create。

### データのPost
手元のPCで以下を実行します。

``` python
import csv
import json
import datetime
import boto3

channelName = "tokyo_temperature"
with open('data.csv', encoding='shift_jis') as csvfile:
    reader = csv.reader(csvfile)
    messages = []
    for row in reader:
        if len(row) > 3:
            format_str = '%Y/%m/%d'
            try:
                date = datetime.datetime.strptime(row[0], format_str)
                temperature = row[1]
                blob = {
                        "date": date.isoformat(),
                        "temperature": float(row[1])
                    }
                obj = {
                    "messageId": date.strftime("%Y-%m-%d"),
                    "payload": json.dumps(blob).encode()
                }
                messages.append(obj)
            except:
                continue

    client = boto3.client('iotanalytics', region_name='us-east-1')
    i = 0
    while i < len(messages):
        client.batch_put_message(
            channelName=channelName,
            messages=messages[i:i+99]
        )
        i += 100


```


payloadのサイズ上限があるため、100個ずつ分割して送っています。
また、`region_name` は適宜変更が必要です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/b43004ff-94fe-d508-5979-c17c27ebf2a6.png)

IoT AnalyticsのChannelを見ると、メッセージが受信出来ていることが分かります。

# データの可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/9c0a1c83-186b-ab11-0b52-859f6996db64.png)

Create a data set を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/e463c8d2-a4ff-7d2e-0fd1-17fe3cf592d1.png)
データストアからデータセットを作ります。今回はすべてのデータを使ってデータ・セットを作ります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/724e0d77-15de-0438-fb9e-f0a556afd391.png)
IDは、`tokyo_temperature_dataset`　という名前にしました。
source は、先程作ったものを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/3d327cb2-ce54-696b-b43e-acfd6f2f034a.png)

すべてを取得するので、クエリはそのまま。残りの項目はすべてデフォルトのままで、Data setを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/3e9c276b-0198-076a-93de-b07e4add725d.png)

出来たデータ・セットを選択し、Action⇨Run nowを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/8b6bceb9-7f84-cb26-cc77-ead98b00a395.png)
しばらく待ってからContentを押すと、作成されたデータセットがプレビューできます。

# データを可視化する
作成したデータ・セットをQuickSightにそのままインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/a7e0968b-e211-2565-49c8-5d916dd43564.png)

サービスからQuickSightを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/d9cd83ec-df3a-fcf0-b9d4-7a5a12b23ad4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/12c45d8b-df65-52c0-5cb2-9ee8a24a9ff6.png)

Standardを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/63873fd7-010b-670c-7e02-5c2e7ef89aaa.png)
任意のアカウント名、メアドを入力し、AWS IoT AnalyticsにチェックをいれてFinish。

QuickSightにて、New Analysis⇨New data set⇨IoT Analyticsを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/3e764234-021f-2f1b-8222-c4a6dd5c9196.png)

作成済みのData source nameを選んで、Visualize.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/3dd579db-d2e1-f245-ecbb-6f6c641374ac.png)

date, temperature を選択するとグラフが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/c32cca3f-d3c4-6bb0-c5f3-33e3e846ce20.png)

Visual typesから、棒グラフを選んで、X axisに date(YEAR)をセット、ValueにTemperature(Average)をセットし、30年間の年平均を出してみました。大きな気温変化は無いですね。。