Jupyter Notebookの小ネタ (display, tqdm, SSHポート転送)

この記事は jupyter notebook Advent Calendar 2016 の12月13日の記事です。

qiita.com

Jupyter Notebookを使う上で,この機能を知らない人を見つけたら教えてあげたくなるような小ネタをいくつか紹介します。

IPython.display.display

Jupyter Notebook上でpandasのDataFrameを表示すると,HTMLのtable要素として見やすく表示してくれます。活用している方も多いかと思います。

df[df['f'] == 'C']df[df['f'] == 'T'] を表示したいのですが,Jupyter Notebookで表示されるのはそれぞれのセルで最後に評価されたものだけです。そのため,表示したいDataFrameごとにセルを分ける必要があります。

gist.github.com

しかしながら,このように複数のセルに分けてしまうと,DataFrameに前処理を行った場合などにいくつものセルを再実行するのは面倒です。このような場合には IPython.display.display を使うのが便利です。

gist.github.com

以下のページで存在を知りました。

stackoverflow.com

tqdm

Iterableを渡すだけでプログレスバーを表示してくれるtqdmというPythonのライブラリがあります。

https://tqdm.github.io/

コマンドライン上で使うとこんな感じです。

import time
from tqdm import tqdm

s = 0
for i in tqdm(range(20)):
    s += i
    time.sleep(0.1)
print(s)

www.youtube.com

このライブラリはコマンドライン上でしか使えないと思い込んでいたのですが,ドキュメントをよく読むとIPython/Jupyter Integrationなるものが追加されていました。これは以下のように使えます。

import time
from tqdm import tqdm_notebook as tqdm

s = 0
for i in tqdm(range(20)):
    s += i
    time.sleep(0.1)
print(s)

www.youtube.com

SSHポート転送

知っている人にとっては「それ当たり前じゃん!」となってしまうかもしれませんが,小ネタが2つだけだと物足りなかったので紹介させてください。

手元のコンピュータの性能が貧弱な場合には,クラウド上のサーバーや研究室の計算機などでJupyter Notebookを使いたいことがあります。

しかしながら,何も設定していない状態だと,Jupyter Notebookを起動したサーバーのIPアドレスの8888ポートをブラウザに打ち込んでも接続できないと思います。

これはJupyter Notebookのデフォルト設定で127.0.0.1以外に8888ポートを公開していないことが原因なのですが,これを公開設定にするだけではセキュリティ的に問題があります。そのため,接続元のIPアドレスに制限をかけたり,パスワードをかけたりするための設定が必要です。扱っているデータによってはSSL/TLSの設定も必要かもしれません。これらの設定については以下のページで解説されています。

Running a notebook server — Jupyter Notebook 5.0.0.dev documentation

しかしながら,これらの設定を行うのはちょっと面倒です。もっと簡単な方法として,SSHのポート転送機能を使う方法があります。私はSSHでサーバに接続するとき,以下のようにしています。

$ ssh -L8888:localhost:8888 username@hostname

-L8888:localhost:8888 の部分は,手元のコンピュータの8888ポートへの接続を,SSHでの接続先から見てlocalhostの8888ポートに転送するという設定です。SSHでの接続先でJupyter Notebookを起動してから,ブラウザで手元のコンピュータのlocalhost:8888に接続すれば繋がります。Jupyter Notebookから見ればlocalhostからのアクセスとなるためアクセス制限にも引っかかりません。

サーバー上でJupyter Notebookを使う際には,ほかにも以下のようなことに気をつけています。

  • 「ブラウザが起動できませんでした」という警告が出るのが目障りなので,jupyter notebook --no-browser としてブラウザが起動しないようにしています。
  • SSHの接続が切断されてしまうとJupyter Notebookが停止してしまい,再接続しても復活しないので,何かしらの工夫が必要です。私の場合はターミナルマルチプレクサとしてtmuxを使うことでこれを防いでいます。tmuxをインストールすることが難しい環境では nohup & を使うのが良いでしょう(参考: http://www.glamenv-septzen.net/view/854)。