Jupyter notebook, 前身是 IPython notebook, 它是一個非常靈活的工具,有助於幫助你構建很多可讀的分析,你可以在里面同時保留代碼,圖片,評論,公式和繪制的圖像。
Jupyter具有非常強的可擴展性,支持很多編程語言,並且易於部署到你的個人電腦和幾乎所有的服務器上 -- 你只需要使用ssh或http接入即可。最重要的是,它完全免費。
Jupyter默認設置使用 Python kernel,正因此以前叫做 IPython notebook. Jupyter notebook 源自於 Jupyter 項目, Jupyter這個名字是它被設計所支持三個核心編程語言的縮寫詞:JUlia,PYThon, 和 R, 啟發自木星這個詞:Jupiter.
接下來的內容將向你展示27個讓 Jupyter 用的更加舒心的建議與技巧。
1. Keyboard Shortcuts
每一個進階用戶都知道,鍵盤快捷鍵將會為我們節省許多時間。Jupyter在頂部的菜單里保留了許多快捷鍵:Help > keyboard Shortcuts
. 每次更新Jupyter時,都值得再次進行查看,因為新的快捷鍵總是不斷被添加進來。
另一個查看快捷鍵的方式是使用命令面板:Cmd + Shift + P
(或者Linux和Windows上 Ctrl + Shift + P
)。這個對話框將會幫助你通過名稱運行任何命令 -- 這非常有用,尤其當你不知道一個命令的快捷鍵或者你想要執行的命令沒有快捷鍵時。這個功能非常類似與Mac上的Spotlight搜索,一旦你開始使用這個功能,你就會發現沒有它的日子該怎么辦!
這里是一些我喜歡的快捷鍵:
-
Esc + F
查找和替換你的代碼,但不包括代碼的輸出內容。 -
Esc + o
打開代碼塊輸出。 -
選擇多個 cell。
Shift + J
或Shift + Down
向下選中下一個cell. 你可以通過Shift + K
或Shift + Up
向上選中 cell。(譯者:jk,與vim的移動方式一致)-
一旦 cell 被選中,接着你可以進行批量刪除/復制/剪切/粘貼.當你需要移動一部分notebook時,這非常有用。
-
你也可以執行
Shift + M
(譯者:m記為merge)對多個cell進行合並。
-
line1 = "this is from line 1" line2 = "this is from line 2" line1 line2
from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all"
line1
line2
如果你想要所有的Jupyter實例(Notebook和Console)都設置該選項,只需創建 ~/.ipython/profile_default/ipython_config.py
文件並寫入一下內容:
c = get_config() # Run all nodes interactively c.InteractiveShell.ast_node_interactivity = "all"
?sum()
4. Plotting in notebooks
在 notebook 中生成繪圖有許多選項:
-
matplotlib, 使用
%matplotlib inline
進行激活。 -
%matplotlib notebook
提供了一些交互性,不過可能會有點慢,因為渲染由服務器端完成。 -
mpld3為matplotlib代碼提供了另一個渲染器(使用d3)。非常漂亮,不過尚不完備還有待發展。
-
bokeh是構建交互性繪圖的一個更好的選擇。
-
plot.ly也可以生成漂亮的繪圖,不過是付費服務。
%lsmagic
推薦閱讀the documentation for all Jupyter magic commands,你會發現這非常有用。下面是一些我所喜愛的魔法命令:
6. Jupyter Magic - %env:Set Environment Variables
你可以管理notebook的環境變量而無需重啟jupyter server. 一些庫(比如theano)使用環境變量來控制行為,%env是最方便的一個途徑。
# 單獨運行 %env 會列出所有環境變量
# 帶參數的話則會設置該變量 比如 OMP_NUM_THREADS=4 %env OMP_NUM_THREADS=4
7. Jupyter Magic - %run:Excute python code
%run
可以從.py文件執行Python代碼. 更少的人知道的是它也可以執行其他的Jupyter notebook,這也非常有用。
注意使用%run
並不等同於導入一個Python模塊.
# this will execute and show the output from
# all code cells of the specified notebook %run ./LinearRegression.ipynb
8. Jupyter Magic - %load:Insert the code from an external script
這將會使用外部腳本來代替cell的內容。你可以使用本地機器上的文件也可以使用一個URL.
9. Jupyter Magic - %store:Pass variables between notebooks
%store
命令可以讓你在兩個不同的notebook間傳遞變量。
10. Jupyter Magic - %who:List all variables of global scope.
不帶參數的%who
命令將會列出全局范圍內存在的所有變量。如果傳入參數,比如str
,將會列出指定類型的所有變量。
%who
11. Jupyter Magic - Timing
對於計時有兩個十分有用的魔法命令:%%time
和 %timeit
. 如果你有些代碼運行地十分緩慢,而你想確定是否問題出在這里,這兩個命令將會非常方便。
%%time
將會給出cell的代碼運行一次所花費的時間。
%%time import time for _ in range(1000): time.sleep(0.01)# sleep for 0.01 seconds
%timeit
使用Python的timeit模塊,它將會執行一個語句100,000次(默認情況下),然后給出運行最快3次的平均值。
import numpy %timeit numpy.random.normal(size=100)
12. Jupyter Magic - %%writefile and %pycat:Export the contents of a cell/Show the contents of an external script
使用%%writefile
魔法保存cell的內容到一個外部文件。%pycat
則剛好相反,並且會向你展示高亮后的外部文件。
13. Jupyter Magic - %prun:Show how much time your program spent in each function
使用%prun statement_name
將會產生一個有序表格來展示在該語句中所調用的每個內部函數調用的次數,每次調用的時間與該函數累計運行的時間。
%prun print('hello')
14. Jupyter Magic - Debugging with %pdb
Jupyter有一個自己的python調試器接口(pdb
),這使得我們能夠進入函數內部看看到底發生了什么。
你可以在這里查看pdb的命令列表
%matplotlib inline from matplotlib import pyplot as plt import numpy x = numpy.linspace(0, 1, 1000)**1.5
# Here you get the output of the function
plt.hist(x)
# By adding a semicolon at the end, the output is suppressed.
plt.hist(x);
!ls
或是檢查或管理包.
!pip list | grep pandas
17. Using LaTeX for formulas
當你在 markdown cell 中書寫LaTeX時,它會被 MathJax 渲染成一個公式。(譯者:下文中介紹的Jupyter插件中有個插件關於LaTeX,提供了更多LaTeX功能)
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
會被渲染成為:
markdown 是 notebook 中十分重要的一部分,別忘了使用它來傳達你的想法!
%%bash
for i in {1..5} do echo "$i" done
19. Install other kernels for Jupyter
Jupyter 其中的一個重要特色就是能夠運行不同語言,你只需安裝相關的 kernel 即可。比如,下面的例子是如何安裝 R kernel.
- 快捷選擇:使用anaconda安裝 R kernel
如果你使用 anaconda 安裝你的環境,這會相當簡單。你只需要在 terminal 中運行下面的命令:
conda install -c r r-essentials
- 不那么快捷的方式:手動安裝 R kernel
如果你不是使用 anaconda, 這個過程可能稍顯復雜。如果你還沒有安裝的話, 你需要從 CRAN安裝。(譯者: 也可使用 brew cask install r-gui
)
安裝 R 完畢后,打開 R console 並運行如下命令:
-
install.packages(c( 'repr', 'IRdisplay', 'crayon', 'pbdZMQ', 'devtools'))
-
devtools::install_github( 'IRkernel/IRkernel')
-
IRkernel::installspec() # to register the kernel in the current R installation
20. Running R and Python in the same notebook
對於此最好的解決方案是安裝 rpy2(需要安裝一個可以工作的 R ), 通過 pip 可以很容易安裝:
pip install rpy2
你可以同時使用這兩種語言,甚至在它們之間傳遞變量:
一個很好的示例 Revolutions Blog
21. Writing functions in other languages
有時候 numpy 的速度仍舊不夠快,我們需要自己寫一些更快的代碼。
原則上,你可以以動態鏈接庫的方式編譯函數,然后用 python 進行包裝。
不過如果有人能夠幫你完成這部分煩人的工作是不是非常棒呢?
你可以用 cython 或 fortran 寫函數並直接從 Python 代碼進行調用。
首先你需要安裝:
pip install cython fortran-magic
個人來說我更喜歡使用 fortran, 我發現它對數值統計函數十分方便。更多用法上的細節可以在這里找到.
也有一些其他方式可以加速你的Python代碼。更多示例可以在這里找到/
23. Jupyter-contrib extensions
Jupyter-contrib extensions 是一系列能夠給 Jupyter 帶來許多功能的擴展,比如 jupyter spell-checker
和 code-formatter
.
譯者:使用conda安裝是最方便的,更多安裝與使用信息可以看Jupyter-contrib extensions. 啟用插件可以使用jupyter_nbextensions_configurator , 通過打開 http://localhost:8888/nbextensions/
進行設置,里面有很多實用的插件,具體自行發現。
conda install -c conda-forge jupyter_contrib_nbextensions
24. Create a presentation from a Jupyter notebook
Damian Avila的 RISE 允許你從已有的一個 notebook 創建一個 powerpoint 風格的報告。
你可以通過 conda 安裝 RISE:
conda install -c damianavila82 rise
或通過 pip:
pip install RISE
然后執行下面的代碼安裝並啟用擴展:
jupyter-nbextension install rise --py --sys-prefix
jupyter-nbextension enable rise --py --sys-prefix
import os from IPython.display import display, Image names = [f for f in os.listdir('../images/') if f.endswith('.png')] for name in names[:5]: display(Image('../images/' + name, width=100))
26. 'Big data' analysis
對於大規模數據樣本的查詢/處理也有一些解決方案:
-
ipyparallel(以前叫ipython cluster)是使用 Python 進行簡單 map-reduce 操作的一個很好的選擇。
-
spark-sql 魔法 %%sql
27. Sharing notebooks
分享 notebook 最簡單的方式是直接使用 notebook 文件(.ipynb).不過對於那些不使用 Jupyter 的人來說,你也可以這么做:
-
使用菜單項
File > Download as > HTML
將 notebook 轉換成 HTML。 -
使用 gist 或 github 分享 notebook,它們都會對 notebook 進行渲染展示。
- 如果你上傳 notebook 到一個 github 倉庫,你可以使用十分便利的mybinder服務來允許第三者半小時時間以交互性身份訪問你的倉庫。
-
安裝jupyterhub, 當你組織一個小型課程或研討會沒有心思關心學生的機器狀況時,這是非常方便的。
-
將 notebook 保存到比如 dropbox 中,然后將鏈接放到nbviewer. nbviewer將會渲染你存儲在任何地方的notebook.
-
使用
File > Download as > PDF
菜單將 notebook 保存為一個 PDF。如果你打算這么做,強烈推薦你閱讀 Julius Schulz 非常棒的一篇文章Making publication ready Python notebooks. -
使用 Pelican 搭建一個關於數據科學博客( 譯者注:可在這里查看譯文 )