Python
python3
Jupyter

Jupyter 知っておくと少し便利なTIPS集

今まで仕事で使ってきた、メジャーなものからマイナーなものまで含めたJupyter NotebooksのTIPS集です。

入力補完

とりあえずこれが無いと生きていけません。

Nbextensions(Jupyterの拡張機能)自体が未設定であれば、一旦そちらをインストールして、その後にHinterlandという機能にチェックを入れると有効化されます。

AnacondaのJupyter notebookでnbextensionsを使う

※Nbextensionsインストール後、Jupyterのファイルリスト的な画面で、タブで「Nbextensions」という選択肢が追加されます。

image.png

Azure Notebooksなどだと、最初からインストール不要で選択できるようになっています。
Google Colaboratoryなどでは、そういった設定ができるのかまだよくわかっていません。(ご存じの方コメントなどでご教示ください。)

image.png

Hinterland にチェックを入れたあと、もし既にノートを開いているのであればF5などすると有効化します。

image.png

関数などであれば、アクセス時にdocstringも表示されます。

20180416_1.png

上記みたいな、docstringが表示されている状態で、Shift押しながらTABを1回押すと、docstringの表示の高さが増えます。

20180416_2.png

同様に、Shift押しながらTABを3回くらい押すと、画面下部にdocstringが表示されるようになります。

20180416_3.png

docstring見ながら作業したり・・など。
また、右上のアイコンクリックなどで、別ウインドウに持っていったりすることもできます。

image.png

目次を自動で作る

それなりにボリュームがあるノートなどでは大体使っています。

NbextensionsのTable of Contents (2)にチェックを入れて、ノートをF5などで再表示します。

image.png

そうするとメニューの右の方に、ハンバーガーメニュー的なアイコンが表示されるようになるのでクリックします。

20180416_4.png

そうすると、以下のスクショの左部分のように、画面が分割されてマークダウンの見出しに応じた目次が表示されます。
マークダウンを更新すると、自動でこちらも同期されます。
それぞれリンクになっており、クリックするとその部分に飛べます。(長いノートなどで便利)

OSによってはスクショのように画面分割されておらず、ノート上に乗る形になります。その場合には、「Contents」の辺りをドラッグしてウインドウの端の方に寄せたりすると、上記のスクショのように画面を分割する形で表示したり、ノート上に乗せる形で表示したりと切り替えできます。

image.png

メニューの、「Contents [-] n t」みたいになっている個所の、tの部分をクリックすると、ノート上部に見出しを作ってくれます。

image.png

こちらも、マークダウンを編集すると自動で同期されます。
HTML出力してもこの見出しのリンクは残るので、共有時などにも使えます。(ただし、HTMLだと小見出しのインデントが消えます)

検索と置換

ノート内検索

セル入力中の場合は、一旦Escキーを押してcommand mode(各キーボードショートカットなどが使える状態)にします。

その状態でFキーを押すと、検索と置換のダイアログを表示できます。

image.png

※基本的に↕のアイコンがクリックされていないと、循環検索にならないため、使う際は大体チェックした状態でいいと思います。

「Replace」となっている個所に入力していくと、どんな感じに置換されるのかが表示されます。(Replace Allを押すまでは置換は実行されません)

image.png

他のノートも含めた検索

IBMの拡張機能などでできるようです。なんだかんだインストールせずに過ごしてきてしまい、まだ使っていないので、詳細はリンク先をご確認ください。

IBMが超便利な拡張機能を作ってくれたのを忘れていました。
これを入れるとjupyterからnotebookファイル内の全文検索ができます。
データサイエンティストに向けたコーディング環境Jupyter Notebookの勧め

HTML自動保存

ノートを保存した際に、自動でHTMLが保存されるようにしておくと、共有の際に便利です。分析担当間であれば結構ノートのままチャットで展開したりすることもありますが、HTMLであれば特に環境やインストールなく共有ができます。
メニューからもHTMLが落とせるようになっていますが、そのあたりは自動化されていると快適です。

Jupyter notebook で HTML も自動作成
私は.pyファイルまで必要なケースが少ない(そういったケースには手動でエクスポート)ので、HTML側だけ仕事で自動出力しています。

目に優しくする

仕事で長時間使ったりしていると、白背景だと目が辛いときがあります。そのため、メインのPCでは黒ベースのテーマを反映してあります。

custom.cssというファイルを設置することで、テーマを反映することができます。

Jupyter Notebookを自分仕様に:背景,アイコンの変更

最初から全部自分で設定を書いていくのは大変なので、「jupyter css theme github」などとぐぐると色々出てくるので、合ったものをベースにするといいと思います。
ただし、公開されているものだと、jupyterのバージョンの差異によるもののせいなのか、私の時には満足いく感じに一通り変更されなかったので、web開発の要領で自分でCSSを調整・追記したりして最終的に落ち着いています。
ノート用のクラス・HTML用のクラスなどでコンテナー要素の部分で結構分かれているので、それらを参照してCSSを定義すれば、ノートだけに反映する、といったこともできます。

部分的にスクリプトの速度を計る

ローカルで数百万行程度のデータフレームを扱う必要があり、個別にapplyなどでデータに補正を入れたりする際に、事前に書いたスクリプトの速度を確認したいことがよくあります。

マジックコマンドと呼ばれる、%を先頭に記載する方法で、%timeit と記載することで、スクリプトの処理時間などを確認できます。

image.png

%timeit 1 + 1
27.6 ns ± 4.12 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

単位は、

  • ns -> ナノセカンド -> 1 / 1000 / 1000 / 1000秒
  • µs -> マイクロセカンド -> 1 / 1000 / 1000秒
  • ms -> ミリセカンド -> 1 / 1000秒

となります。日々、ちょっとした集計をしたりcronのコードを書いたりする際に、「これは〇〇〇万行だから、今の処理時間だとこの関数はもっとチューニングしないと集計が終わらなくなりそうだ・・」といった感じで、集計前などに使っています。

!マークを付けると、コマンドが使える

image.png

pipコマンドなどは、結構ノート上で使うこともあります。ただし、pipでライブラリ設定などを変えた際には、ノートのカーネルを一度再起動しないと反映されません。(ノートブックサーバーなどは起動したまま行えます)

引数に、ノート上の変数を指定したい場合なとには$の記号を変数の前に置くと使えます。

image.png

実は一部コマンドはそのまま実行できる

マジックコマンドや、!の記号をつけなくても、一部コマンドはそのままノート上で実行できます。

lsコマンドなど。引数も認識してくれます。

image.png

ノート上でHTMLやCSS・jsなどを扱う

HTMLモジュールを使います。

from IPython.display import HTML
HTML("""<s>Apple</s>""")

image.png

スタイルシートと組み合わせて、HTML要素をあとから編集したり・・

image.png

custom.cssが触れないサーバーのケースや、このノートだけスタイルを変えたい、といったケースで使える・・かもしれません。

そのほか、大分昔に無理やりGoogle Chart Toolsをノート上から扱って、データフレームを放り投げるとサンキーダイアグラムを表示してくれる・・的なことをしたこともあります。(matplotlibのものが扱いずらく、当時そういった暫定対応をしましたが、今落ち着いて振り返るとちゃんと綺麗なサンキーダイアグラムのPythonライブラリがいくつもありそうな印象・・)

スクリプトを非表示にする

共有用には、よく「余分な部分は消しておくこと」といったことがよく言われます。(大阪ガスの方の分析の本だったり、Googleの方の本だったり)

ノートからエクセルに集計結果やグラフだけ、別途貼り付けたり、といったのもいいですが、そこまで丁寧にやらなくても相手が納得してくれる場合には、スクリプト部分を非表示にしてしまってマークダウンとグラフ表示のみ、といった具合にしてもいいかもしれません。

前述の、HTMLモジュールを応用します。(jsなどは適当)

from IPython.display import HTML

HTML("""
<button id="code-show-switch-btn">スクリプトを非表示にする</button>

<script>
var code_show = true;

function switch_display_setting() {
    var switch_btn = $("#code-show-switch-btn");
    if (code_show) {
        $("div.input").hide();
        code_show = false;
        switch_btn.text("スクリプトを表示する");
    }else {
        $("div.input").show();
        code_show = true;
        switch_btn.text("スクリプトを非表示にする");
    }
}

$("#code-show-switch-btn").click(switch_display_setting);
</script>
""")

ボタン押下前 :

image.png

押下後 :

image.png

確かノートではなくHTML出力したときにも有効になったような気がするので、共有用のHTMLでは初期表示ではスクリプト非表示にしたり、など色々応用が効きます。

GUIを使う

ちょっとGUIがあると便利だけど、使い捨てなのでツール作るほどのことじゃない・・といったケースがあります。

ボタンだったり、スライダーだったりの基本的なUIであれば、ipywidgetsモジュールで色々用意されています。
jqueryを扱うような感覚で、ノート上でハンドラ設定などを行うことができます。

from ipywidgets import Button
from datetime import datetime

btn_A = Button(description='apple')

def on_btn_A_click(btn):
    """
    appleボタンが押された際に実行されるハンドラ。

    Parameters
    ----------
    btn : Button
        クリックされたボタンオブジェクト。
    """
    print(datetime.now(), "appleボタンが押されました。")

btn_A.on_click(on_btn_A_click)
btn_A

image.png

PILライブラリと組み合わせて、やむを得ず手動でデータセットの画像の精査を行う(学習データのクラス分けを調整したり)で仕事で使ったりしたことがあります。(ノート上に画像とクラスのボタンを複数表示して、選択したら次の画像へ・・といった具合に)

他にも、インタラクティブなグラフ設定などを行う際などに便利そうです。

ipywidgetsとbokehで『jupyter』の更なる高みへ 【インタラクティブなグラフ描画】

(一応、matplotlibにもインタラクティブ用の機能が色々あるようですが、癖があったので、上記のリンクのものなどの方が楽・・?かもしれません)

余談

  • JupyterLab、まだ触っていないため、本記事では触れませんでしたが、記事読んだ感じ便利そうなので、期待です・・!
  • 力尽きたので、他のマイナーなものなど省いてしまいました。機会があればまた書きたいところです。
  • 他にも探せば色々出てくると思いますので、「マイナーだけどこれ便利だよ!」といったものがあれはコメントでご教示ください・・!