データ分析スクリプトの
ツール化入門
PyConJP 2016
どんあき @dondokono
自己紹介
なまえ :どんあき
@dondokono
何してる人 :金融機関でリスク管理
デリバティブ関連のデータ分析
バックグラウンド:素粒子理論やってました
プログラミング得意じゃないです…
Python歴 :1年とちょっと
社内で布教中
1
息子
可愛いです笑
本発表の内容は
個人の見解であり、
所属する組織・団体の
公式見解ではありません
また登場する人物は(ry
2
はじめに…
3
この分析業務効率化できそうだな
せっかくなのでPythonで書いてみよう
(豊富なパッケージですぐ作れるし)
4
こんなの作ってみたけど
どう?
え?もうできたんですか!!
でもこれどうやって
動くんですか?
私 同僚など
5
えっと、、、
Pythonをインストールして…
Python入ってませんよ
入れるの社内的に
結構面倒で…
私 同僚など
_人人人人人人人人_
> 入れるの面倒 <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
6
7
そのあと
コマンドラインから実行…
コマンドライン…?
あの黒い画面ですか?
なにそれ怖い!
私 同僚など
あの黒い画面
8
_人人人人人人人人_
> なにそれ怖い <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
9
10
お堅い社内で
Python布教するなんて
アカンかったんや…
その悩み(だいたい)解決できます!
11
本日の流れ
・Pythonがインストールされてない環境で動かす
Pyinstallerを主に使用します
・コマンドラインでなくGUI上から動かす
PySide, QtDesignerを主に使用します
12
注意点
(どの場合でも共通ですが)
各パッケージのバージョン情報に注意
ネット上の情報も古いものが多く、
記事や質問の日時をよく見ながら確認しましょう
13
Pythonが無い環境で動かす...?
Windowsの場合、EXEにしちゃいます = フリージング
こんな感じ
Pythonインストールしてない環境でも
Pythonで書いたものが動く!
14
Pyinstallerについて
15
• 最近でも頻繁にメンテされているフリージングパッケージ
• Github: https://github.com/pyinstaller/pyinstaller
• Python 2.7, 3.3-3.5まで対応
• Windows, Mac OSでも使用可能
フリージングしたプラットフォーム上でのみ動作
• メジャーなパッケージはバンドル
Libraries like PyQt5, PyQt4, PySide, wxPython, matplotlib or Django are fully
supported (公式より引用)
pandas, scipy, scikit-learn, seabornなども動作
• Stackoverflowなどでの情報が多い ←これ重要
他のPythonのフリージング関連パッケージ
• Py2exe (2.7, 3.4)
https://pypi.python.org/pypi/py2exe
元々Python2系で有名だったもの、軽量・高速
2014-10-21以降更新もなく辛い
エラーでまくる
• cx_freeze (2.7, 3.4)
http://cx-freeze.readthedocs.io/en/latest/index.html
2014-12-26が最後のアップデート
setup関連のscriptは頑張って書く必要がある印象
16
というわけで
Pyinstallerが
オススメです
17
欠点もあります…
• ファイルサイズがでかい…
Importするパッケージを全部取り込む
• 起動が遅い…
EXE実行後、解凍処理が内部で走る
importが多いと数十秒立ち上がるまでにかかることも…
18
インストール前準備
今回は下記環境での動作確認を行っています
Windows 10 64bit
Anaconda 4.1.1 (64bit)
condaで仮想的な作業環境を構築することを推奨します
あとnumpyとかscipy入れるの面倒
PySideの都合で3.4ですが3.5でもいけます…
Mac OSでもフリージングしてアプリにすることもできます
本発表では説明しません (発表者Macなくせに)
19
インストール時の諸注意(Windows)
環境が汚くなる可能性があるのでcondaで別環境構築推奨
Anaconda利用時のsetuptoolsのバージョンに注意
19.2にダウングレード
> conda install setuptools==19.2
ここではpipでなくcondaでやることがポイント
レジストリ書換え要求が出ることがありますがスルーしても使えます
20
インストール時の諸注意(pyenv)
Mac OS, Linux系でpyenvを使用されている場合
次でinstallしましょう
https://github.com/pyinstaller/pyinstaller/wiki/FAQ
> env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.5.X
21
Hello World!
Helloと返してくるだけのスクリプト
まずはこれをフリーズ!
22
hello.py
フリーズ3分クッキング
スクリプトを用意して以下のコマンドでチーン
> pyinstaller hello.py --onefile
23
ここに完成品
ほら、簡単でしょう
24
補足
• 気長に固まるのを待ちます
• import量によるけど数分から10分程
• exeが出来てても実行するとエラーが出たり…
根気よくエラー潰しが必要なパッケージも
25
便利なオプション
--onefile
単一のexeファイルになるようにまとめてくれる
かさばらないけど、デカイ
--noconsole
コマンドプロンプトがデフォルトで表示されなくなる
黒い画面恐怖症の人向けにも安心
--clean
前回のフリーズ関連ファイルがある場合はこちらを使用
もしくは手でdist, buildファイルを消しておきましょう
26
欠点:デカイ
27
• 先ほどのhelloスクリプト
• パッケージ追加時
import pandasだけ追記した場合
で、デカイ
なので手放しで使いまくれるわけでもなく…
閑話休題
28
せっかくなので流行り物を試したい!
よっしゃ!
TheanoとPymc3をフリージングできれば
Deep Learning でもMCMCでも
やりたい放題や!!
29
今回の調査で我々は…
30
何の成果も
得られませんでしたぁぁ!!
コンパイルを必要とするパッケージは鬼門…
31
誰か出来たら教えてください…
32
入門レベルらしく
Scikit-learn使います!
それでも幾つかハマるポイントが…
データ分析スクリプト
33
http://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_assumptions.html#example-
cluster-plot-kmeans-assumptions-py
k-meansのクラスタリングを行う例
• パラメータ:k
• 2次元のインプットCSV
を引数に取るスクリプト
sklearn_example.py
こんな感じの結果が出ます
34
• 黒い画面から実行
• cluster数 = 3の場合の例
色で3種類に区分けされた右図が出る
それではフリーズ実行!
35
こちらも同様に
> pyinstaller sklearn_example.py --onefile
で…
完成!?…のはずが
• EXEを実行してみると幾つかエラー
• typedefsモジュールが見つからない
scikit-learnのclusters/neighbors/typedefs.pydのことを指してるらしい
組み込むときは事前にsklearn.neighbors.typedefs.pydにリネーム
場所→ /anaconda3/env/<env_name>/Lib/site_packages/sklearn/neighbors/
• Intel MKL XXXが見つからない
以下にあるmkl_XXX.dllを組み込む
場所→ /anaconda3/env/<env_name>/Library/bin/
36
(よくある)エラー対策
• pyinstallerが見つけられないもの
• (自動で作られる)specファイルに明示的に記載
onefileにするときに一緒にまとめてくれる
• デバッグ時は--onedirオプションで確認するのをオススメ
• 以下は今回の例
37
sklearn_example.spec
無事起動
• specファイルに指定して実行する場合
> pyinstaller sklearn_example.spec
で実行
通常は自動生成されoptionもここに埋め込まれる
38
やりました!
39
40
何か忘れているような…
41
そのあと
コマンドラインから実行…
コマンドライン…?
あの黒い画面ですか?
なにそれ怖い!
私 同僚など
GUIをつけてあげましょう
• プログラミング出来ない人も安心!
• なんか見た目がまぁまぁなツールが簡単に!!
• Pyinstallerのnoconsoleオプションでもう怖くない!!!
• モテる!!!!(といいな
42
PythonのGUI関連パッケージ
• PySide
• PyQt
• Tkinter
• Kivy
などなど…
43
PySideについて
• QtのPythonバインディング
ただし、ライセンスが緩めてある
• GUIを作るGUIツール「Qt Designer」が使える!
プログラムからGUIをゴリゴリ書かなくて済む
オブジェクトの配置をこなれた感じに楽にできる
• Pyinstallerで固めることで使ってもらいやすい!
44
他のGUIツール
• PyQt
Qtそのものなので凝ったものを作れる
ライセンス・商業利用注意
• Tkinter
デフォルトでついてるやつ
標準感ある
• Kivy
現在発展中のGUI作成ライブラリ
スマホ向けのGUIも作れる
ドキュメント日本語化も進んでるみたいですよ!
45
PySideのインストール
• 動作確認環境
Windows10 64bit Anaconda 4.1.1 Python3.4.5
(前半と同じ)
• インストール方法(今回環境ではエラー)
> pip install PySide
• MSVC errorが出る場合
> pip install PySide –only-binary :all:
でインストール可能
46
PySideのインストール(Mac OS X)
• Macかつanacondaを使わない場合
> brew install qt
でQtを事前に入れてからPySideを入れましょう
47
Qt Designer
• 置いてある場所
PySideがインストールされた場所にあるはず
/Anaconda3/envs/<env_name>/Lib/site-packages/PySide
• 今回の使用バージョン
QtDesigner v4.8.5
48
こんな見た目(初期設定)
49
こんな見た目(初期設定)
50
Layouts
ベースと
なるもの
ボタンやら
箱やら
なんやら
かんやら
Property
各オブジェクトの
詳細をいじる
お手軽GUI作成の流れ
• Qt DesignerでWidgetを作る
• Qt DesignerでSlotを作る
• Pythonスクリプトを繋げる
51
ほら、簡単でしょう
52
お手軽GUI作成 –Widget編
① ベースのDialogを決める
② Layoutsをレイヤーのように重ねてオブジェクトを配置
Layoutsにポイポイっとオブジェクトを放り込む
spacerを入れるとそれっぽくなる
③ プロパティから細かいサイズや設定などは調整
53
って見た方が早いですね!
Qt Designer イメージ
54
こんな感じ
55
ボタン
テキストの箱
何となくのスペース
見栄えが
良くなる
レイヤー
お手軽GUI作成 –Slot編
① Edit Signal/Slotを選択
② ボタンなどから矢印を引っ張る
特に他のオブジェクトと連携しなければ何もない場所を終端に
③ このSlot名を呼び出す箇所にやりたい動作を書く
56
こんな感じ
57
ボタン押した時
動作設定
お手軽GUI作成 –接続編
① QtDesignerの.uiファイルを.pyファイルへ変換
> pyside-uic.exe -o hello_gui.py hello.ui
変換ツールが標準付属(pyside-uic.exe)
anaconda3/envs/<env_name>/Scripts
② mainのスクリプトを書く
③ Slotがある場合はSlotの動作を書く
58
安定のHello World
ボタンを押すと
コンソールに"hello”
と出すだけ!!
59
hello_gui.py
.uiから変換した
.pyファイルを呼ぶ
ちょっと修正
• 設置したオブジェクトに"hello"を出力
slotの箇所を変更
• 値の埋め込み・値の取得もで可能
GUI側を修正した際は.pyファイルへ要変換
60
実行!
61
押したら
こんにちは
実行!
62
押したら
こんにちは
まぁこんなもんです
Hello GUI tool!
• これをpyinstallerで固めればOK
> pyinstaller hello_gui.py --onefile – noconsole
• Python環境不要でEXEファイルとして動作!
63
完成!
64
先ほどのデータ分析スクリプトをTool化
65
• 次をGUIで選択可能にしてみる
• k-meansのcluster数
• inputのCSVファイル
• outputの出力先フォルダ
データ分析スクリプトと接続①
66
• importしているパッケージ
• これらを入れてもフリージング可能
sklearn_gui.py
データ分析スクリプトと接続②
• Input及びOutputのファイル・フォルダ取得ダイアログ設定
67
ファイルPath取得
ダイアログ
フォルダPath取得
ダイアログ
• k-meansクラスタリング部分
• 各パラメータ・ファイル関係をGUIから取得している
データ分析スクリプトと接続③
68
GUI上のテキスト
取得ダイアログ
さっきの
クラスタリング
スクリプトを
コピペ
データ分析スクリプトと接続④
• main部分
特に今回は変えてない
69
最後にフリージング
• 前半部で設定したspecファイルと同様に設定
• > pyinstaller sklearn_gui.spec
specファイル内にて--onefile, --noconsoleオプション使用
• フリーズ完成
70
実行フローイメージ
71
①
EXE実行
②
パラメータ
指定
③
Calculation
実行
④
結果出力
完成
Python環境不要
コマンドラインも出ない
Pythonスクリプトが動作!
72
【応用】さらにこじゃれた感じにするために
• import logging
各スクリプトにloggerを用意してログ出力する機能をつける
• import traceback
エラー時のtracebackを出力
• Sphinxを用いてツール全体のドキュメントを作る
ReadTheDocsのスタイルが個人的には好きです
73
今度こそ、やりました!
74
75
どこでも使える
このPythonツールどやー 素敵!
皆さん 同僚など
まとめ
• PyinstallerでPython環境無しでPython スクリプトを動作
特殊なパッケージを組み込む際は根気よく戦う
• PySideなどGUIパッケージで誰でも使いやすく
PySideだとQt Designerが使えてGUI初心者でも比較的楽
どちらも紹介した以上に豊富な機能を備えています
Python普及の一助に
76

データ分析スクリプトのツール化入門 - PyConJP 2016