Pythonライブラリcesiumpyでバブルチャート、３D棒グラフを描画

# cesiumpy の紹介
　cesiumpyとは、Jupyter Notebook上でCesiumを表示・制御を実現するライブラリです。sinhrks 様が作成し,HatenaBlogに詳細な説明が御座います。

- 紹介Blog [Cesium.js を Python から使うパッケージを作った](http://sinhrks.hatenablog.com/entry/2016/01/09/231740)
- githubリポジトリ [sinhrks/cesiumpy](https://github.com/sinhrks/cesiumpy)
- 英語ドキュメント [Welcome to cesiumpy’s documentation!](http://cesiumpy.readthedocs.io/en/latest/)

　Jupyter Notebook上で地図表示を行うライブラリは、Leafletをベースとした[Folium](http://python-visualization.github.io/folium/installing.html)があります。手軽に地図上にデータを手軽に表示したい場合には非常に便利です。

- [Folium: Pythonでデータを地図上に可視化](https://qiita.com/nanakenashi/items/824c0cb16860ca59a424) 
@nanakenashi 

## Jupyter Notebookについて
　Webブラウザ上にプログラムコードと実行結果の表示が可能で、データサイエンスに関わる人に広く使われています。有名なものなので、説明と環境構築手順は割愛させていただきます。
 
- 紹介記事 [データ分析の必需品「Jupyter Notebook」の魅力とは](https://deepage.net/machine_learning/2016/12/13/jupyter_notebook.html)
- 導入手順 [Jupyter Noteook を使ってみよう](https://pythondatascience.plavox.info/python%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/jupyter-notebook%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)

# cesiumpyの導入

#### 1.インストール
python のライブラリ管理ツールである、pipコマンドで簡単にインストール可能です。

```shell-session
$ pip install cesiumpy
```
#### ２. Jupyter NotebookでCesiumの表示

コマンドライン上で、Jupyter Notebookを起動します。

```shell-session
$ jupyter notebook
```

Webブラウザ上に、Jupyter Notebookが表示されたら、新しいNotebookを作成します。
![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/53918/c2238241-0321-8952-7657-ce8661e04e35.png)

地図の表示
 ライブラリのインポートしビューワの表示コマンド` cesiumpy.Viewer()`を実行します。
<img width="758" alt="スクリーンショット 2017-12-03 7.45.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/a1047b20-2711-216a-aec0-fcec2cf0f3c6.png">

私のPython 2.7.10 では、エラーが初回だけ表示されます。
もう一度実行すると、問題なく地図が表示されます。

<img width="749" alt="スクリーンショット 2017-12-03 7.52.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/7d5a521b-ebc5-eddf-5edc-e3d0bbc03498.png">
※ 著作権が怖い為、地図をOpenStreetMapに差し替えてあります

# CSVデータからバブルチャートの作成
CSVデータを読み込み、地図上に位置情報と値を半径で表示してみます。
今回は、埼玉県のオープンデータサイトから、埼玉県朝霞市の「[【朝霞市】保育園・幼稚園情報](https://opendata.pref.saitama.lg.jp/data/dataset/asakahoikuen/resource/e2d31889-b457-48aa-8c16-8c4befb29aa4)」を用いて、地図上に施設位置と、収容人数を表現します。

## 下準備

このデータは、文字コードがShift-JISなのですが、pythonの文字コード変換でエラーが出たため、予めUTF-８に変換します。

CSVファイルのダウンロード

```shell-session
$ wget https://opendata.pref.saitama.lg.jp/data/dataset/69f4f927-221c-45f9-a4c1-cab5e073abce/resource/e2d31889-b457-48aa-8c16-8c4befb29aa4/download/07hoikuennyoutien-asakashi.csv
```
文字コードの変換

```shell-session
$ nkf -Sw 07hoikuennyoutien-asakashi.csv > 07hoikuennyoutien-asakashi_utf-8.csv 
```

## CSVデータの読み込み
　データ解析を支援する機能を提供するライブラリであるpandasと、データを簡単に取り扱うためのライブラリである、numpyというライブラリを利用します。
 pandasの`pd.read_csv("ファイルパス")`関数でCSVファイルを、読み込みデータフレーム形式として、保存します。デフォルトでは、１行目がヘッダ行として列名として利用されます。下記のサイトが参考になります。
[Pandas で CSV ファイルやテキストファイルを読み込む](https://pythondatascience.plavox.info/pandas/csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF)

```py3
import pandas as pd
import numpy as np
filename = '07hoikuennyoutien-asakashi_utf8.csv'
df = pd.read_csv( filename )
```

## データの登録と地図表示
　最初の行でcesiumpyを初期化した後に、`for i, row in df.iterrows():`で、CSVから取り込んだデータの行数だけ繰り返し処理を実施します。
 `row['カラム名']`で該当行のカラムの値をアクセスしています。

```py3
v = cesiumpy.Viewer()
for i, row in df.iterrows():
    l = row['施設_収容人数［総定員］人数']
    p = cesiumpy.Point(position=[row['施設_経度'], row['施設_緯度'], 0] 
                       ,  pixelSize=l/10, color='blue')
    v.entities.add(p)
v
```
<img width="694" alt="スクリーンショット 2017-12-03 16.12.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/7a75ac95-fbfa-765e-051c-7290f1187238.png">

## 表示
<img width="617" alt="スクリーンショット 2017-12-03 16.40.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/c2af3399-de3a-e316-8fa0-1bd02c4a016f.png">

# 3D棒グラフの描画

円柱（Cylinder)オブジェクトを追加し、３次元棒グラフを作成します。
データは、先程読み込んだデータを用います。

```py3

v = cesiumpy.Viewer()
for i, row in df.iterrows():
    l = row['施設_収容人数［総定員］人数']
    cyl = cesiumpy.Cylinder(position=[row['施設_経度'], row['施設_緯度'] ],  
                            length=l*10,topRadius=50, bottomRadius=50, material='aqua')
    v.entities.add(cyl)
v
```


<img width="625" alt="スクリーンショット 2017-12-03 18.33.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/53918/a769d3a3-087f-744f-8e61-3cdbcdc24d69.png">


# まとめ

jupyter notebookの基本である、データの読み込みから、可視化まで実施してみました。
3D地図を簡単に表示出来るcesiumpyはとても魅力的に思えました。

　今回のコードは、[github](https://github.com/tkama/hello_cesiumpy)に公開しておりますので、参考にして下さい。