JupyterでHello Worldするまでの長い道のり

Excelを撲滅したい！

##Excel撲滅したい


###データ分析のWeb対応
売上のデータや営業社員の売り上げ実績とか何でもExcelで表示。
それをWebに上げてダウンロードして見せている。
iPadやExcelを搭載していないPCでは見ることは出来ない。
Webでスマートに見せられないだろうか？

###Excelの属人化
DBからのデータ取得。
VLOOKUPでゴニョゴニョ。
更にはVBAも絡めてと。
グラフもデータも手作業で丁寧に成型
ExcelのExpertな僕でも解読に時間が掛かる。

###タヒすべしExcel
確かにExcelは便利なツールだ。
Excelのデータ分析は我々のような情シス以外のものがやることはない。
Excelに拘る必要はない。
もう素人には分からんPython、PowerShell、PHPなんかで書いても何も困ることは無いだろう。
これらの弊害は解決されるに違いない。

###Pythonはどう？
Pythonにはいろんな分析ツールがあるらしい。
Machine Learningまでは行かないがcsvのinner joinやグラフを出すぐらいはできるんじゃないかな。
データもピボットテーブルの表示以上のことはしていない。
しかし、下記のような懸念があって僕の心は動かなかった。

- PivotTable
- メインDB,informixに接続できるか？
- Pythonを動かす環境
- Webで簡単に表示できるか？

この全てが後に解決されてしまう。

- pivot_table
    - それ、Pandasにあるよ。
- informix
    - JayDeBeApiを使ってJDBC Driverできるよ。
- Python環境
    - WSLで動くよ。
- Web表示
    - Jupyter notebookならWeb表示されるよ。

マジか！
「乗るしかない！このビックウェーブに (w」

##Pythonでテータ分析入門勉強してみた

「乗るしかない。Pythonデータ分析というビックウェーブに。」
乗るにしても一つずつ証明していかなければいけない。
問題点を整理しよう。

- Pythonの環境
- pandas pivot_table
- JayDeBeApi
- Jupyter

##Pythonの環境

イケてるWebプログラマーは別として我々社畜のメインOSはWindowsとExcelであります。(´;ω;｀)
WindowsでPythonを動かすには、

- Windows版Python3インストーラー
- Anaconda 64bit版
- Windows Subsystem for Linux (かつてのBash on Ubuntu)

この3つが考えられます。
勿論、PythonはPython3以外認めません。
32bit版も認めません。

一般的にWindowsでPOSIX由来のScript系言語をするのは苦労します。
Pythonも例外ではありません。

###Windows版Python3インストーラー
Windows版Python3インストーラーを使う場合、
データサイエンス界隈で絶対に使う各種ライブラリーはpip一発では入らないそうです。
高速化の為C/C++で書かれたソースがあるからです。

プリコンパイルされたDll入りのNumPy等のパッケージを落としてくるか、
[Visual C++ 2015 Build Tools](http://landinghub.visualstudio.com/visual-cpp-build-tools)というWindowsのビルドツールを別途用意するかしないといけません。

正直どちらも面倒くさいです。
「Python3でpip一発、漢は黙ってCompile,Buildだろうが！」という気持ちは分からなくもない。
後日、試してみたい気はします。
却下。

###Anaconda
データサイエンス界隈では強く奨励されております。
Jupyterのサイトにも **strongly recommend** と書いてあります。
何か辛いことあったんでしょうか？
Data Science業界、Python遅いからCでAPI書いてコンパイル上等の世界じゃないの？

Python界隈の偉い人は嫌いなようです。
それに新規性もなく面白くない。
却下。

###Windows Subsystem for Linux(WSL)

かつてBash on Windowsと呼ばれていたWSLです。
Windows 10 Fall Creators Updateで正式版になりました。
なんと、Windows10 Home 64bit版でも使えました！！

WSLのUbuntuを使ってPythonを動かせば、MacやLinuxを使っているかのような快適さで使えるに違いない。

未来を感じる。
面白い。

採用！

僕のPCではすでに導入済みなので新規で使いたい方は下記のサイトを参考に

- [Windows Subsystem for Linuxをインストールしてみよう！](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)
- [WSLを導入してみた - heruwakameのブログ](http://heruwakame.hatenablog.com/entry/2017/10/21/020001)

より細かい詳細を知りたい方は下記のサイトをどうぞ。
[Windows Subsystem for Linuxとは？ そのインストールと使い方](http://www.buildinsider.net/enterprise/wsl/01)
取り敢えず使うだけならここまで見る必要はないかもしれません。
トラブった時に見る程度でいいです。

WSLでUbuntuを導入したものとして次に行きます。

###WSL内でのPython環境

- Python3
- Python仮想環境は使わない
- pip
- ある程度はaptに頼る

これで行きます。

Python2を覚えるには僕の人生が短すぎます。
下手に仮想環境で嵌らないようにするために使いません。
Libraryが多くてヤバそうなときだけvenvを使うスタイルにします。
Jupyter程度なら問題ないはず。(;´･ω･)
UbuntuはpipもPythonもapt一発で入ります。
下手にコンパイルビルドするよりはスマートなのでaptに頼ります。
pipでないとダメな時にpipを使うスタイルが鉄板。

Ubuntu環境ではPython3はプリインストールされているはずです。
入っていない場合は下記の作業でインストール。

###WSL内のPython環境の設定

```bash:python3
$ sudo apt install python3
```
pipが入っていないのでインストールします。
Ubuntuの場合、Python3のpipはpip3です。

```bash:pipをインストール
$ sudo apt install python3-pip

```

```bash:pip3をupdate
$ sudo -H pip3 install -U pip 

```

これで環境はバッチリ。


##Pandas pivot_table

pandaぐらいの小さなライブラリであればスグに試せるだろう。
Windows内でExcelを使わずにデータをピボットテーブル出来るだけでも使える。
先ずはpandasを攻める。

```bash:install_pands
$ sudo -H pip3 install pandas
```

一緒にnumpyもインストールされる。
InteractiveにPythonを触るにはiPythonがあった方が便利。

```bash:ipython_install
$ sudo -H pip3 install ipython
```

このpc.csvで支店ごとのPCの台数をpivot_tableで出そうと思う。

pc.csv 

|IP|HOST|OS|model|Branch|
|---|---|---|---|---|
|192.168.0.1|Router|FortiOS|FortiGate 30e|Kyoto|
|192.168.0.2|kyo01|win10|mouse MPPro590C-SSD|Kyoto|
|192.168.0.3|kyo02|win10|mouse MPPro590C-SSD|Kyoto|
|192.168.0.4|PR|PR|Canon iR-ADV C5030|Kyoto|
|192.168.1.1|Router|FortiOS|FortiGate 30e|Tokyo|
|192.168.1.1|tky01|win10|mouse MPPro590C-SSD|Tokyo|

iPythonからPC,Printer,Routerの台数を集計してみました。
下記の通りです。

```py3:台数をクロス集計してみる
~$ ipython
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: df=pd.read_csv("pc.csv")
In [4]: df.pivot_table(index=['branch','OS'],aggfunc='count',va
    ...: lues=['IP'])
Out[4]:
                IP
branch OS
Kyoto  FortiOS   1
       PR        1
       win10     2
Tokyo  FortiOS   1
       win10     1

```


参考サイト
[Pandas Pivot Table Explained](http://pbpython.com/pandas-pivot-table-explained.html)
正直、これだけやっていればPandasのpivot_tableは完璧。
更に最後のCheetSheetが素晴らしい。

やった！
出来た。
これをJupyterで表示できないかな。

##Jupyter
実はWSL上ではZeroMQがまともに動かず立ち上がらないという話があった。
[Jupyter+AnsibleをBash on Ubuntu on Windowsにインストール](https://qiita.com/yacchin1205/items/8e5f6d312686a80f8af8)
参考サイトではZeroMQにパッチを当てたZeroMQが入るようにppaを登録していたが、
Github Issueを眺めるうちに別にそれも要らないんじゃないかと思えてきた。
WSLも内部のUbuntuのバージョンが上がっている。

試しにpython3-zmqをインストールしてみる

```bash:python3-zmqとlibzmq5をインストール
$ sudo apt install python3-zmq
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libsodium18 libzmq5
以下のパッケージが新たにインストールされます:
  libsodium18 libzmq5 python3-zmq
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
496 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,920 kB のディスク容量が消費されます。
続行しますか? [Y/n]Y
```

Ubuntu16.04の場合はlibzmq5を使うみたいだ。
python3-zmqとlibzmq5,libsoium18がインストールされた。

次はJupyterを入れてみるか。
pipでJupyterをインストールする

```bash:WSLにJupyterをインストール
$ sudo -H pip3 install Jupyter

```

さてと動くかな…。

```bash:start_jupyter
$ jupyter notebook --no-browser

```

お、動いた。

##JayDeBeApi

僕は下記の記事を見て目を疑った。
[Access data in relational databases - IBM](https://datascience.ibm.com/docs/content/local/createconnectionsdirect.html)
JayDeBeApiを使えばJDBC DriverからPython3でinformixに繋がる！

これは試すしかない。

下記からJDBC Driverを取得する
[Informix JDBC Driver](https://www-01.ibm.com/marketing/iwm/tnd/search.jsp?go=y&rs=ifxjdbc)
ユーザー登録やアンケートは必要ではあるが無料で手に入る。

```bash:java
$ sudo apt install openjdk-8-jre
```

```bash:version_check
$ java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.
16.04.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
```

```bash:informix_jdbc_driver_install
$ sudo java - jar setup.jar - i console

=============== 
 インストール完了 
--------

JDBC Driver が次の場所に正常にインストールされました。

   /opt/IBM/Informix_JDBC_Driver

<ENTER> キーを押すと、インストーラーが終了します。:
```

```py3:データ取得
import jaydebeapi
conn=jaydebeapi.connect(
 "com.informix.jdbc.IfxDriver",
 "jdbc:informix-sqli://ipaddress/dbname:INFORMIXSERVER=servername;
 DB_locale=ja_JP.932",
 ["user","password"],
 "/opt/IBM/Informix_JDBC_Driver/lib/ifxjdbc.jar"
)

cur=conn.cursor()
curs.execute("select 得意先名 from 得意先m where 得意先cd=1")

curs.fetchAll()

curs.close()
```

```py3:pandasを使って取得してみる
import jaydebeapi
conn=jaydebeapi.connect(
 "com.informix.jdbc.IfxDriver"
,"jdbc:informix-sqli://ipaddress/dbname:INFORMIXSERVER=servername;
 DB_locale=ja_JP.932"
,["user","password"]
,"/opt/IBM/Informix_JDBC_Driver/lib/ifxjdbc.jar"
)

import pandas as pd
import pandas.io.sql as psql

df=psql.read_sql("select 得意先名 from 得意先m where 得意先cd=1",conn)

Out[19]:
                                 得意先名
0  僕の株式会社

```

お、取得できた！

Jupyterでも

```py3:Jupyterに入力
IN[0]:
import jaydebeapi
conn=jaydebeapi.connect(
 "com.informix.jdbc.IfxDriver"
,"jdbc:informix-sqli://ipaddress/dbname:INFORMIXSERVER=servername;
 DB_locale=ja_JP.932"
,["user","password"]
,"/opt/IBM/Informix_JDBC_Driver/lib/ifxjdbc.jar"
)

import pandas as pd
import pandas.io.sql as psql

df=psql.read_sql("select 得意先名 from 得意先m where 得意先cd=1",conn)

display(df)
```
Out[0]:

| |得意先名
|---|---|
|0|僕の株式会社


よし！

##終わりに

Jupyterで表示できてもPythonのコードが邪魔なんだよね。
一般社員はPythonコードなんて見ない。

PandasのDataframeやグラフがいい感じにWeb表示できるだけのものが無いかな？

Flaskに食わせてPython CGIで頑張ってみるかな？

戦いは終わらない。

つづく