LoginSignup
1068
1081

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-04-16

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

他にもPythonなどを中心に色々記事を書いています。そちらもどうぞ!
今までに投稿した主な記事たち

1068
1081
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1068
1081