notebook

都内でWEB系エンジニアやってます。

ローカル実行用のJupyterNotebook環境を整える

統計、分析とかそっちの分野の勉強をはじめました

それに先駆けてインタラクティブな実行環境は必要だよねということで形から入っていきます!

今回はJupyterNotebookをdockerで立ち上げて使えるようにするところまでやってみました

docker

公式にDockerのイメージがあるのでそれを使います (jupyter/datascience-notebook)

結果的には下記ファイルでdocker-compose upすればOKという感じにしました

  • Dockerfile
FROM jupyter/datascience-notebook

USER root

# GoogleAnalyticsClient のインストール
RUN pip install --upgrade google-api-python-client redash-dynamic-query ipython-sql jupytext

# vimキーバインドのプラグインインストール
RUN jupyter labextension install jupyterlab_vim

# 黒背景設定を追加
RUN mkdir -p /home/jovyan/.jupyter/lab/user-settings/@jupyterlab/apputils-extension
RUN echo '{"theme":"JupyterLab Dark"}' > \
  /home/jovyan/.jupyter/lab/user-settings/@jupyterlab/apputils-extension/themes.jupyterlab-settings

RUN echo 'c.ContentsManager.default_jupytext_formats = "ipynb,py"' >> \
  /home/jovyan/.jupyter/jupyter_notebook_config.py

RUN mkdir /home/jovyan/notebooks
RUN chown jovyan:users /home/jovyan/notebooks

USER jovyan
WORKDIR /home/jovyan
  • docker-compose.yml
version: '3'
services:
  jupyterlab:
    build: .
    ports:
      - '8888:8888'
    volumes:
      - "./notebooks:/home/jovyan/notebooks:z"
    environment:
      GRANT_SUDO: "yes"
    command: start.sh jupyter lab --NotebookApp.token='' --NotebookApp.iopub_data_rate_limit=100000000 --NotebookApp.contents_manager_class='jupytext.TextFileContentsManager'

設定とplugin

設定やいれたプラグインなど

黒背景

Dockerfileの'{"theme":"JupyterLab Dark"}'の部分で黒背景に変更しています

単純に黒背景にしたいってだけですがモチベーション的には大事ですよね、ということで黒背景にしました

jupytext

.ipynbのファイル.pyと一緒に管理できるプラグインです

ノートブックを保存すると自動的に処理をまとめた.pyファイルも生成されます

両方のファイルで同期を保ってくれるのとソースコードをgit管理したいときは基本的には.pyを上げておけば良い感じですね

今の所.ipynbも上げてしまっていますが。。。

vim

入力欄をvimのキーバインドで入力できるようにするプラグイン

移動に関しては入力欄の中ではvimキーバインドでいつもどおり移動できます

新しく次の入力欄を生成したい場合はctrl+_ で次の入力欄を生成してカーソルを移すことができます

起動オプション

いじったオプションなど

docker-composeでの起動時にオプションとして渡して設定を変えられるのでその方法でやっています

  • --NotebookApp.token=''

ローカルで実行する前提なのでtoken入力を省くようにオプションをわたしています

  • --NotebookApp.iopub_data_rate_limit=100000000

外部へのリクエストを発生させたときにひっかかったのですが扱えるデータ量に制限がかかっているようです

なので上限を上げて対応しました

RedashとかGoogleAnalyticsのデータをAPI経由で取ってきてそれをごにょごにょするみたいな時用です

個人的にはRedashにいろんなデータソースを接続させてJupyterからはRedashのAPIを叩くようにすればデータソースごとにクライアント使ってデータ取得用のコードを書かなくて済むのでとてもコスパが良さそうに思いました

Redash経由でデータ取れることは確認したもののまだ分析まではしてないです。。。w

  • --NotebookApp.contents_manager_class='jupytext.TextFileContentsManager'

jupytextを使う設定

まとめ

今の所こんな感じで使うことにしました

サンプルを実行しただけですがスクリーンショットも貼っておきます

f:id:swfz:20190208074537p:plain

notebooksディレクトリにファイルをどんどん入れていってgitで管理する使い方をしています

pythonもあまり書いたことないのでこれから勉強ですね