14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

〇〇勉強してみたAdvent Calendar 2017

Day 3

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

Last updated at Posted at 2017-12-02

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という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とは? そのインストールと使い方
取り敢えず使うだけならここまで見る必要はないかもしれません。
トラブった時に見る程度でいいです。

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

###WSL内でのPython環境

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

これで行きます。

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

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

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

python3
$ sudo apt install python3

pipが入っていないのでインストールします。
Ubuntuの場合、Python3のpipはpip3です。

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

pip3をupdate
$ sudo -H pip3 install -U pip 

これで環境はバッチリ。

##Pandas pivot_table

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

install_pands
$ sudo -H pip3 install pandas

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

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の台数を集計してみました。
下記の通りです。

台数をクロス集計してみる
~$ 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
正直、これだけやっていればPandasのpivot_tableは完璧。
更に最後のCheetSheetが素晴らしい。

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

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

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

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をインストールする

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

さてと動くかな…。

start_jupyter
$ jupyter notebook --no-browser

お、動いた。

##JayDeBeApi

僕は下記の記事を見て目を疑った。
Access data in relational databases - IBM
JayDeBeApiを使えばJDBC DriverからPython3でinformixに繋がる!

これは試すしかない。

下記からJDBC Driverを取得する
Informix JDBC Driver
ユーザー登録やアンケートは必要ではあるが無料で手に入る。

java
$ sudo apt install openjdk-8-jre
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)
informix_jdbc_driver_install
$ sudo java - jar setup.jar - i console

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

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

   /opt/IBM/Informix_JDBC_Driver

<ENTER> キーを押すと、インストーラーが終了します。:
データ取得
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()
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でも

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で頑張ってみるかな?

戦いは終わらない。

つづく

14
9
4

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
14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?