Python Setup for Data Science without Any Distributions

Pythonは書けるが、データサイエンスを囓ってみようと思ってセットアップをしようとすると、立ちはだかるのがAnacondaを始めとするdistributionである。適当に調べていると、いずれかのdistributionを使わないと本当にデータサイエンスが出来ないわけでは無さそうなのに、よく分かっていないにも関わらずとにかく何も考えずに入れろというような風潮が強い印象を受ける。includeをおまじないと言って誤魔化すような類の人達なんだろうか。よく分からないまま入れた挙げ句にdistributionに依存したトラブルが起きて、当然これを解決出来ず、そういうdistributionの現状に対する批判も出てたりするという、ドロドロとした界隈を覗き見ることが出来る。

ということで、pipと打てば済みそうなのにわざわざcondaとタイプさせる意味が分からないし(どうでもいいところで自己主張しなくていいよ。タイプ数増えてるし…)、使いもしなさそうなモジュールをてんこ盛りで入れられて汚染されるのも嫌だし、distributionへの依存性が高くなりすぎるのも嫌だったので、全部自力でセットアップしてみることにした。
言うまでもないけれど、Windows。

Python

3.6.3使用。インストーラでは、他にPython環境が入っておらず、今後もそんなに沢山入れるつもりが無いのならpath追加にチェックを入れる。組み込みとか他のソフトウェアでよくPythonをねじ込まれるので判断が難しいところだが。あとはお好みで。

Pythonは、バージョン間での互換性は重視しないくせに、バージョンが複数混在する場合の選択は、プロジェクト毎の設定を定義するものが無く、環境変数のみに強く依存する。そのため、仮想環境のような回りくどい方式が用いられる。これもdistributionと同じようにゴチャゴチャと乱立しているのだが、最小限の自力セットアップを目的とするのであれば、3.6に標準でパッケージされているvenvコマンドで良いと思う。

pathを追加した場合は、PCの再起動が必要。改めて自力でpathを追加したい場合は、Pythonインストール直下とそこにあるScriptsディレクトリを追加する。追加しないで、実行したい場合は、パス込みで実行すれば良いだけなのだが、pathに追加されていることが前提な処理が結構あるので、pathに足してしまうか、仮想環境を用いる方が良い。

Jupyter

なんでもいいが、この手の実行環境が無いと、グラフの確認すら困難なので入れる。

chcp 65001
pip install jupyter

最初のchcpコマンドは超重要で、コマンドプロンプトのコードページをUTF-8に変更するものだ。これを最初に実行しないとJupyterのインストールに失敗する。コマンドプロンプトのデフォルトの文字コードがSJISなのが駄目なのだが、その辺のプラットフォーム間の違いを吸収して適切にインストールするのはpipの役目ではないのか。

これは予備知識無しにやるとまず失敗するが、失敗した場合はコードページを正しく設定してインストールし直しても、それ以前の駄目なデータが残ってしまっていてまともに動作しないので、一旦Jupyterをアンインストールする必要がある。正しくインストール出来たなかったら元通りに戻すのはpipの役目ではないのか。
また、Jupyterは多数のモジュールの依存から成るのでただuninstallコマンドを入力するだけでは除去しきれない。手動で一つ一つ消して回るのは大変なので pip-autoremove を用いると楽である。依存性も考慮して完全なアンインストールを行うのはpipの役目ではないのか。

pip install pip-autoremove
pip-autoremove jupyter -y

で、再インストールはキャッシュを無効にしてやる必要がある。デフォルトのままキャッシュを有効にしていると、再び不完全なファイルを使用してインストールしやがるので失敗する。キャッシュデータの整合性を確認していないpipはゴミだと思う。

pip install --no-cache-dir jupyter

これでようやく、jupyterが動作する。

jupyter notebook

さて巷では、もてはやされているjupyter notebookだが、私はウェブベースの貧弱なエディタでコードを書かされるのは大変苦痛だと感じた。最低でもVSCodeで書きたいところである。

ということで、VSCodeでextensionをJupyterで検索するとそのまま出てくるのでそれをインストール。このextensionはpylintを要求するのだが、VSCodeの言うがままにインストールしようとすると、こいつもコードページがUTF-8前提なので失敗する。最早pipの欠陥じゃないか?
そのため別途インストールしてやる。

chcp 65001
pip install pylint

pylintを入れると、どうでもいいだろとか、個人の流儀だろみたいな書き方までケチをつけてきてとても五月蠅いので、適当にdisableする。
これで、VSCode上でjupyterを実行できるようになる。仮想環境上で実行する場合は一工夫いるのだが、後述。

Modules for Data Science

この辺は、必要になったタイミングでひたすらインストールするだけ。

pip install requests
pip install numpy
pip install pandas
pip install matplotlib
pip install scipy
pip install -U scikit-learn

上から順に…

  • HTTP通信。データサイエンスと直接的に関係ないのだが、ウェブデータをスクレイピングするときに使う。
  • 算術。Cでネイティブ実装されているのでパフォーマンスが悪くないらしい。
  • データフレーム。今のところ扱いやすいとは思わないのだが…
  • グラフ描画。
  • 科学演算。今のところ必要性を感じていないが、下のscikit-learnが要求する。
  • 機械学習フレームワーク。-Uをつけるのは何故…

venv with VSCode

仮想環境そのものは、適当に作ればいいが、VSCode上ではどの仮想環境を使うかという指定はできない。精々使用するpython.exeの場所を選べるくらいで何の役にも立たない。
以下のように、仮想環境を有効にしたコマンドプロンプト上でVSCodeをコマンドラインで起動させる。

activate
code

仮想環境を有効にすると、コマンドプロンプトウインドウが作り直されるので、バッチファイルを用意して叩くだけというのが出来ず不便である。

仮想環境上だとJupyterもVSCode上から適当に実行(’Jupyter: Start a new Jupyter Notebook’)させても動作しなくなる。自前でJupyter Notebookを起動しておいて、出てきたURLをトークン込みで ‘Jupyter: Enter the url of local/remote Jupyter Notebook’ に入力してから実行する。

VSCode settings

余談。
Jupyterは、以前のセルに入力した内容やimportが何時読み込まれるのか分かり難い。

"jupyter.languages": [
    {
        "languageId": "python",
        "startupCode": [
            "%load_ext autoreload",
            "%autoreload 2",
            "%matplotlib inline"
        ],
        "cellIdentificationPattern": "^(#\\s*%%|#\\s*\\<codecell\\>|#\\s*In\\[\\d*?\\]|#\\s*In\\[ \\])(.*)"
    },
    {
        "languageId": "javascript",
        "cellIdentificationPattern": "^(\\/\\/ %%|\\/\\/%%|\\/\\/ \\<codecell\\>|\\/\\/ In\\[\\d*?\\]|\\/\\/ In\\[ \\])(.*)"
    }
]

参考:IPython: autoreload

VSCodeの、startupCodeにこう書いておくと毎回リロードされそうなのだが、プラグインのバージョンで設定のフォーマットや挙動が変わったりするのでよく分からない。


コメントを残す

メールアドレスが公開されることはありません。