2020 5/2文章修正
2020 5/3 誤字修正
2020 5/4タイトル修正
2020 5/5 文章修正
2020 5/7 導入部分の文章と構成を変更
初心者向け解説記事第3弾の今回は、急速に普及が進んでいるjupyter notebookの導入と基礎的な使い方について説明します。Jupiter notebookというのは、簡単に言うと、pythonを使ったデータ分析を行ったり、手順をmarkdownでまとめることができるデジタルノートです。2014年、Project Jupyterと呼ばれるIPythonのスピンオフプロジェクトから始まりました(開発したFernando Perezさんのスライド)。2020年現在、Project Jupyterは非営利団体によって維持されており、JupyterはGitHub上で保守・開発されています(*2)。修正BSDライセンス(link)の100%オープンソースのソフトウェアです。このJupyterという言葉ですが、これはJupyterがサポートする3つのコアプログラミング言語(Julia、Python、R)を意味します。また、木星の4つの衛星(ガリレオ衛星)を発見したガリレオのガリレオノートブック(画像検索)へのオマージュにもなってるそうです(*1)。普及が進んでいるのは、オープンソースであることも大きく影響しているのでしょう。
ではなぜこのノートブックが開発されたのでしょうか?Jupyter Notebooksの論文として引用される事が多い次の論文を読んで、開発の動機を確認してみましょう。下に翻訳したIntroductionを載せました。
Jupyter Notebooks—a publishing format for reproducible computational workflows
doi:10.3233/978-1-61499-649-1-87
1. Introduction
今日、あらゆる学問分野の研究者は、データを収集して処理したり、統計的検定を行ったり、シミュレーションを実行したり、図を描いたりするために、しばしばコンピュータコードを書く必要がある。そのために広く利用できるライブラリやツールはオープンソースプロジェクト(NumPy、Julia、FEniCSなど)として開発されていることが多いが、研究者が特定の作業のために書いた特定のコードは未発表のままになっていることが多く、再現性の妨げになっている。著者の中には、研究方法の一般的な説明の一部として、計算方法を文章で記述する人もいるかもしれない。しかし、人の言語はコードの精度に欠けており、そのような方法を再現することは、本来あるべきほど迅速ではないし、信頼性も高くはない。また、コードを別途補足資料として提供しているものもあるが、コードと文章の相互参照が困難な場合があり、著者が作業を進めていくうちに両者の整合性が取れなくなる危険性がある。
Notebooks—documents integrating prose, code and resultsは、読みやすく複製可能な計算方法を公開する方法を提供する。
という事です。
論文上でin silicoの実験手順を正確に記述するのは難しく、記述はしばしば不完全になります。人間が使う言語はコンピュータ言語ほど厳密ではないので、分析手順や方法の記述が不完全であったとしても、文章構造に破綻がない限り、文章が成立してしまうためです(コンピュータから見ると論理の飛躍があったとしても)。このような背景から、実験・データ分析の再現性を担保するために登場したノートブックがJupiter notebookという事です。jupyter notebookを使うと、コードを直接表記したり、コードをその場で実行して視覚的な結果を得ることができます。生データが手に入りやすい機械学習の分野での相性が高く、よく使われている印象です(書籍や動画を見ればわかります)。
さて、前置きはこのくらいにして始めましょう。順番に説明していきますが、説明すべき内容が多いので4回に分けます。今日はJupiter notebookのインストールと基本的な操作方法について説明します。実際に何ができるのか、どのような使い方が想定されるのかは4回目の記事を読んでください。
1、Jupiter notebookのインストール
まずはJupiter notebookを使えるようにします。注意点として、2回目の記事で書いている通り、anacondaを導入済みの方はJupiter notebookもJupiter labもすでにインストールされてるはずです(minicondaでは導入されない)。anacondaを導入済みの方は本ステップを飛ばし、ステップ2に行ってください。そもそもcondaを使ってないという方は、pipコマンドを使ってJupiter notebookをインストールしてください。
#anaconda (link)
conda install -c anaconda jupyter
#または2020/05時点で最新のpython3.8の仮想環境を作って導入(使うツールとの整合性を考えると枯れたpython3.6-3.7あたりの方がいいかもしれません)
conda create -n jupyter python=3.8 -y
conda activate jupyter
conda install -c anaconda jupyter -y
#condaを使ってないならpipで導入する(参考記事)
pip install --upgrade pip setuptools
pip install numpy scipy matplotlib Pillow ipython[all]
pip install jupyter
(インストールしないで使う方法もありますが今回は触れません)
正常にインストールされたかどうか確認するためhelpを表示します。
> jupyter-notebook -h
$ jupyter-notebook -h
The Jupyter HTML Notebook.
This launches a Tornado based HTML Notebook Server that serves up an
HTML5/Javascript Notebook client.
Subcommands
-----------
Subcommands are launched as `jupyter-notebook cmd [args]`. For information on
using subcommand 'cmd', do: `jupyter-notebook cmd -h`.
list
List currently running notebook servers.
stop
Stop currently running notebook server for a given port
password
Set a password for the notebook server.
Options
-------
Arguments that take values are actually convenience aliases to full
Configurables, whose aliases are listed on the help line. For more information
on full configurables, see '--help-all'.
--debug
set log level to logging.DEBUG (maximize logging output)
--generate-config
generate default config file
-y
Answer yes to any questions instead of prompting.
--no-browser
Don't open the notebook in a browser after startup.
--pylab
DISABLED: use %pylab or %matplotlib in the notebook to enable matplotlib.
--no-mathjax
Disable MathJax
MathJax is the javascript library Jupyter uses to render math/LaTeX. It is
very large, so you may want to disable it if you have a slow internet
connection, or for offline use of the notebook.
When disabled, equations etc. will appear as their untransformed TeX source.
--allow-root
Allow the notebook to be run from root user.
--script
DEPRECATED, IGNORED
--no-script
DEPRECATED, IGNORED
--log-level=<Enum> (Application.log_level)
Default: 30
Choices: (0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
Set the log level by value or name.
--config=<Unicode> (JupyterApp.config_file)
Default: ''
Full path of a config file.
--ip=<Unicode> (NotebookApp.ip)
Default: 'localhost'
The IP address the notebook server will listen on.
--port=<Int> (NotebookApp.port)
Default: 8888
The port the notebook server will listen on.
--port-retries=<Int> (NotebookApp.port_retries)
Default: 50
The number of additional ports to try if the specified port is not
available.
--transport=<CaselessStrEnum> (KernelManager.transport)
Default: 'tcp'
Choices: ['tcp', 'ipc']
--keyfile=<Unicode> (NotebookApp.keyfile)
Default: ''
The full path to a private key file for usage with SSL/TLS.
--certfile=<Unicode> (NotebookApp.certfile)
Default: ''
The full path to an SSL/TLS certificate file.
--client-ca=<Unicode> (NotebookApp.client_ca)
Default: ''
The full path to a certificate authority certificate for SSL/TLS client
authentication.
--notebook-dir=<Unicode> (NotebookApp.notebook_dir)
Default: ''
The directory to use for notebooks and kernels.
--browser=<Unicode> (NotebookApp.browser)
Default: ''
Specify what command to use to invoke a web browser when opening the
notebook. If not specified, the default browser will be determined by the
`webbrowser` standard library module, which allows setting of the BROWSER
environment variable to override it.
--pylab=<Unicode> (NotebookApp.pylab)
Default: 'disabled'
DISABLED: use %pylab or %matplotlib in the notebook to enable matplotlib.
--gateway-url=<Unicode> (GatewayClient.url)
Default: None
The url of the Kernel or Enterprise Gateway server where kernel
specifications are defined and kernel management takes place. If defined,
this Notebook server acts as a proxy for all kernel management and kernel
specification retrieval. (JUPYTER_GATEWAY_URL env var)
To see all available configurables, use `--help-all`
Examples
--------
jupyter notebook # start the notebook
jupyter notebook --certfile=mycert.pem # use SSL/TLS certificate
jupyter notebook password # enter a password to protect the server
O.K!
2、Jupiter notebookのテーマ変更
Jupiter notebook起動前に、jupyterthemesを使って少し外観をカスタマイズします(*3)。デフォルトの方が良い方はステップ3に飛んで下さい。
#anaconda (link)
conda install -c conda-forge jupyterthemes -y
#不要になったらアンインストール
conda uninstall jupyterthemes
#pip
pip install jupyterthemes
> jt -h #help
$ jt -h
usage: jt [-h] [-l] [-t THEME] [-f MONOFONT] [-fs MONOSIZE] [-nf NBFONT]
[-nfs NBFONTSIZE] [-tf TCFONT] [-tfs TCFONTSIZE] [-dfs DFFONTSIZE]
[-ofs OUTFONTSIZE] [-mathfs MATHFONTSIZE] [-m MARGINS]
[-cursw CURSORWIDTH] [-cursc CURSORCOLOR] [-cellw CELLWIDTH]
[-lineh LINEHEIGHT] [-altp] [-altmd] [-altout] [-P] [-T] [-N] [-kl]
[-vim] [-r] [-dfonts]
optional arguments:
-h, --help show this help message and exit
-l, --list list available themes
-t THEME, --theme THEME
theme name to install
-f MONOFONT, --monofont MONOFONT
monospace code font
-fs MONOSIZE, --monosize MONOSIZE
code font-size
-nf NBFONT, --nbfont NBFONT
notebook font
-nfs NBFONTSIZE, --nbfontsize NBFONTSIZE
notebook fontsize
-tf TCFONT, --tcfont TCFONT
txtcell font
-tfs TCFONTSIZE, --tcfontsize TCFONTSIZE
txtcell fontsize
-dfs DFFONTSIZE, --dffontsize DFFONTSIZE
pandas dataframe fontsize
-ofs OUTFONTSIZE, --outfontsize OUTFONTSIZE
output area fontsize
-mathfs MATHFONTSIZE, --mathfontsize MATHFONTSIZE
mathjax fontsize (in %)
-m MARGINS, --margins MARGINS
fix margins of main intro page
-cursw CURSORWIDTH, --cursorwidth CURSORWIDTH
set cursorwidth (px)
-cursc CURSORCOLOR, --cursorcolor CURSORCOLOR
cursor color (r, b, g, p)
-cellw CELLWIDTH, --cellwidth CELLWIDTH
set cell width (px or %)
-lineh LINEHEIGHT, --lineheight LINEHEIGHT
code/text line-height (%)
-altp, --altprompt alt input prompt style
-altmd, --altmarkdown
alt markdown cell style
-altout, --altoutput set output bg color to notebook bg
-P, --hideprompt hide cell input prompt
-T, --toolbar make toolbar visible
-N, --nbname nb name/logo visible
-kl, --kernellogo kernel logo visible
-vim, --vimext toggle styles for vim
-r, --reset reset to default theme
-dfonts, --defaultfonts
force fonts to browser default
jupyterthemesを使い、開発者お勧めの設定に変更してみます。ここではlightの方を選択しました (”-N”フラグを追加)。
# dark
jt -t onedork -fs 95 -altp -tfs 11 -nfs 115 -cellw 88% -T -N
# light
jt -t grade3 -fs 95 -altp -tfs 11 -nfs 115 -cellw 88% -T -N
#default
jt
#reset
jt -r
- -fs code font-size
- -altp alt input prompt style
- -tfs txtcell fontsize
- -nfs notebook fontsize
- -cellw set cell width (px or %)
- -T make toolbar visible
- -N nb name/logo visible
3、Jupiter notebookの起動
準備ができたら起動してみましょう。分析対象のデータがあるディレクトリに移動してから起動します。練習なら、適当なディレクトリを作成してその中で起動しましょう。
cd ~/<change>/<to>/<your>/<datadir>
#または
mkdir ~/Desktop/jupyter && cd ~/Desktop/jupyter
#起動(jupyter notebookでもO.K)
jupyter-notebook
自動でデフォルトブラウザのhttp://localhost:8888/tree がロードされます。
(補足;頻繁に使うならこのアドレスをブックマークするか、"jupiter"などでhttp://localhost:8888/treeに変換されるように辞書登録するのはどうでしょうか)
Jupiterが起動しました。ノートを新しく作る場合は右上のNewボタン=> python3を選択します。少し頑張ればここでR、Go、Ruby、Juliaなども選択できたりします(詳細)。
新しいタブに切り替わります。python3のノートを使えるようになりました。
テーマは一度リセットしてます(コンソールで"jt")。
4、基本操作1 ~ セルへの入力(コーディング)と実行
Jupiter notebookはショートカットキーを使うことを前提に設計されています。そのため、快適に操作するには、ショートカットを覚える必要があります。操作方法を説明しつつ、ショートカットキーも順番に紹介していきます。
では始めましょう!なるべく真似しながら進めて下さい。操作をしないと忘れてしまいます。
まずインターフェイスの説明です。下の写真をみて下さい。Code cellという場所にpython3のコードを打って進めていきます。
Jupiter notebook user interface. マニュアルより転載。
コードセルの中にコードを記入するにはEnterを押します。
入力モードになりました。この状態を編集モードと言います。print関数を使い文字列を表示させてみましょう。python3なのでprint("test")と打って下さい。
タイプしたらコードを実行します。メニューにあるRunボタンをクリックするか、shift + Enterのショートカットキーを使います(Enterだけ押すとセル内改行)。このshift + Enterは多用します。必ず覚えてください。
実行結果です。コードセルの下にtestという文字が表示されました。同時に次のセルも自動生成され、そちらが緑線で囲まれました。これはそのセルが選択状態である事を意味します。
(補足; 実行済みのセルはIn[ ]: =>In[1]:に変わってます(後述)。)
Enterを押すことで選択中のセルが編集モードになります。次は変数に数値を代入して、shift + Enterで実行しました(セル内で改行するにはshiftを押さずにEnterを押す)。
a + bの結果の3が表示されました。このような感じです。簡単ですね。
注意
1つのセルは1つの出力のみ求めるようにして下さい。複数出力させると最後の出力以外表示されません。
5、基本操作2 ~ セルの編集
次にセル間の移動方法です。まずは編集モードを抜けます。Escキーかctrl + Mを押して下さい。セルを実行せずに編集モードから抜けることができます。 編集モードから抜けると枠が青く変わりました。枠が青いこの状態をコマンドモードと言います。十字キーを押して上下に移動してみて下さい。
(ここでは一番上のセルに移動しました。コマンドモードなので枠線は青いままです。)
繰り返しになりますが、選択中のセルでEnterを押せば編集モードに入ります。編集モードに入ると枠が緑になります。print("test")からprint("Hello")に書き換えて下さい。
下の写真は編集後にctrl + Enterで再実行した結果です。再実行すると前の出力が完全に消え、新しい出力だけが表示されました。
今回はshift + Enterではなくctrl + Enterで実行しました。ctrl + Enterで実行すると、次のセルが自動で選択状態にはなりません(一番下のセルで実行した場合も新規セルが下に追加されない)。
コマンドモード状態でもう一度移動してみましょう。移動は十字キーの上下以外にK(上)、D(下)でもできます。
コマンドモードでは移動するだけでなくセルの削除、追加・複製、並び替えなどセルの編集全般が行えます。またマークダウンへの切り替えなども可能です(2回目参照)。ここではセルの編集について説明します。順番に見ていきましょう!
・セルの追加 - セルを選択した状態でAまたはB。Aで選択中のセルの上にセル追加。Bで下にセル追加(間違って編集モードにしてしまったらEscキーかctrl + Mで戻して下さい。)
・セルの削除 - セルを選択した状態でDD(vi、vimなどと同じキーバインド)。
(上の写真は挿入した不要なセルを消したところ)
・セルのカット&ペースト- Xでカット、Cでコピー、Vで下にペースト、Shift + V で上にペースト。
(上の写真はprint("golden week")と書いたセルを作り、適当にカット&ペーストしたところ)
・複数セルの選択とマージ - shift + 十字キー上下で複数セル選択。その状態でshift + Mでセルのマージ。
(上の写真はprint("golden week")セルと上下の空セルをマージしたところ)
・undo - Zでundoになる。押した分だけコマンドモードの操作を戻れる。
これらの操作は上のEditからも実行できます。
このように、コマンドモードではセル自体を編集できます。ところでセルを途中に追加したりして順番がどんどん変わっていっていますが、途中に挿入して定義した変数はどうゆう扱いになるのでしょうか?これを実感するため少しコードを書いてみましょう。
その前に環境をリセットします。セルを全て削除してrestart & Clear outoutを選択します。カーネルをリセットして出力や変数定義などを初期化します。セルは消えないので安心して下さい。
では始めます。以下のコードを見て下さい。最初のセルでa=1と定義して、次のセルでa=2と上書き定義しています。それから上から3番目のセルを実行してaの値を出力させましった。出力は2になりました。
では次にIn [1]の下にセルを追加します(type A)。
そのセルでa=10 と定義します。そのまま実行しましょう(=> In [4])。
再び一番下のIn [3] に移動して実行します。再実行する場合、編集モードに切り替える必要はありません。コマンドモードのままセルを選択してCtrl + Enterを押すとコードが実行されます。さて、aの値はいくつになるでしょうか?
答え
10になりました(Out [5])。
これは、Jupiter notebookがセルを実行した順番に定義を更新しているためです。定義された変数はグローバル定数であり、セルがどこにあっても、解釈された順番にグローバル定数として上書き定義されます。上から下に順番に流れているとは限らない事を覚えておきましょう。
順番についてはセルの左端にあるIn [number] を見て下さい(数値がないのは未実行のセル)。数値がセルを実行した順番を表しています。
では改めて質問します。下の図のIn[17]セルでのaの値はいくらでしょうか?
In[16]でa=10としているので、In[17]の答えは10です。
このInとかoutは何でしょうか?これらは Jupiter notebook がこれまでのコードを変数(配列)に記録したものです。こんな感じで呼び出せます。
一旦実行したセルを書き換えて再実行しても、Inは新しい数値が割り振られます。このため、セルを上書きしてしまっても、最初のセルの内容や出力内容はいつでも呼び出せます(数値を覚えていれば)。
6、ショートカットキーのまとめ
Jupiter notebookはショートカットを多用して進めるため、コマンドモード、編集モードともに様々なショートカットキーが存在します。忘れた時はHelpのKeyboead Shortcutsを開いて下さい。
様々なショートカットが存在します。まずは使うものだけ覚えましょう。
QIitaのチートシート記事へのリンクです。とても見やすくて参考になります。
【完全版】Jupyter Notebook ショートカット - Qiita
補足
実はlsやpwdなどのシェルコマンドにそっくりなマジックコマンドというものがあり、Jupiter notebook内でもこれらコマンドは実行できます。つまり!pwdなどと” ! ”をつけて実行しなくても良いと言うことです。詳細は次回説明します。
マジックコマンドがない外部コマンドは!をつけて実行します。上の写真ではcondaを使ってJupiter notebookの仮装環境にもsamtools1.10を導入、helpを表示してます(=> Jupiter notebook上でHTSのデータ解析は可能ということ)。
7、ノートの保存
ではノートブック名を決めて保存します。その前にFinderから作成したフォルダの中を見てみましょう。Untitled.ipynbというノートブックがすでに保存されていますね。この.ipynbはipython notebookを意味します。中身はjsonファイルです。
すでに作成されているのは、デフォルトで自動セーブ機能がONになっているためです(autosave 120)。その瞬間に保存するにはコマンドモードでSを押します。
ファイル名はノートの一番上に表示されています。現在はUntitledです。文字をダブルクリックして名前を変更しましょう。
ここではtestとします。Renameをクリック。
自動でtest.ipynbに更新され、リネーム前のUntitled.ipynbは消えました。
実際につける名前ですが、例えば何かのパイプラインの実行手順をまとめたノートなら、"2020 5/1 GATK best practice tutorial"など、ドライ実験内容やまとめ内容がわかる名前が良いのではないでしょうか。
終了します。ターミナルでCtrl + Cを押します。メッセージ表示後、5秒以内にyで終了します。
終了しました。
このディレクトリから移動せずにJupiter notebookを再起動してみましょう。
どうですか?test.ipynbがちゃんと見えているはずです。これをクリックすればノートを再開できます。
長くなってきたので今日はこれくらいにします。明日以降、マークダウンモードと数式の表示、外部コマンドの実行など、より実践的なJupiter notebookの操作方法についてまとめていく予定です。よろしくお願いします。
追記
引用
Jupyter Notebooks – a publishing format for reproducible computational workflows
Kluyver, Thomas, Ragan-Kelley, Benjamin, Pérez, Fernando, Granger, Brian, Bussonnier, Matthias, Frederic, Jonathan, Kelley, Kyle, Hamrick, Jessica, Grout, Jason, Corlay, Sylvain, Ivanov, Paul, Avila, Damián, Abdalla, Safia, Willing, Carol and Jupyter development team, (2016) Jupyter Notebooks – a publishing format for reproducible computational workflows. Loizides, Fernando and Scmidt, Birgit (eds.)
In Positioning and Power in Academic Publishing: Players, Agents and Agendas. IOS Press. pp. 87-90 . (doi:10.3233/978-1-61499-649-1-87)
参考
*1 Project Jupyter wiki
https://en.wikipedia.org/wiki/Project_Jupyter#cite_note-2
*2
Jupiter notebook HP
*3
アカデミアでのJupiter notebookの活用方法について興味があれば、Nature toolbox(Natureのデジタルツールを紹介する社説)の記事を読んでみて下さい。
https://www.nature.com/articles/d41586-018-07196-1
補足
この”初めてコマンドを使う人向けの解説”シリーズは今回で3回目です。1回目、2回目のリンクを張っておきます。
・1回目
問い合わせをいただき、その質問に答える形でまとめた記事です。目的ありきで書いたため、初めてコマンドを扱う人が参考にすると突飛な内容になってしまっています。リンクは載せてますが、見てない方もこの記事はスキップしていただいて構いません。
・2回目
バイオインフォマティクスのツールのランに適したmacの選び方と、ツールのインストールに活躍するcondaコマンドの導入・使用方法についてまとめた記事です。condaをどうやって使えばバイオインフォマティクスのツールが導入できるのか分からないという方は読んでみて下さい。内容的にこちらを1回目とすべきでした。