Jupyter notebook 搭建和使用





Jupyter notebook 是什麼?

歡迎學習本課程——如何使用 Jupyter notebook。Jupyter notebook 是一種 Web 應用,能讓用戶將說明文本、數學方程、代碼和可視化內容全部組合到一個易於共享的文檔中。例如,不久前我共享了我最愛的一個 Jupyter notebook ,它分析了 LIGO 實驗探測到的兩個碰撞的黑洞所發出的引力波。你可以下載數據,運行 notebook 中的代碼,重複整個分析,實際上等於你自己探測引力波!

Jupyter Notebook 已迅速成爲處理數據的必備工具。其用途包括數據清理和探索、可視化、機器學習大數據分析。我爲我的個人博客創建了一個 notebook 示例,它展示了 notebook 的許多特點。這項工作通常在終端中完成,也即使用普通的 Python shell 或 IPython 完成。可視化在單獨的窗口中進行,而文字資料以及各種函數和類腳本包含在獨立的文檔中。但是,notebook 能將這一切集中到一處,讓用戶一目瞭然。

GitHub 上也直接支持 Jupyter notebook 的渲染。藉助此出色的功能,你可以輕鬆地共享工作。http://nbviewer.jupyter.org/ 也會提供 GitHub 代碼庫中的 notebook ,以及存儲在其他地方的 notebook。

文學化編程

notebook 是 Donald Knuth 在 1984 年提出的文字表達化編程的一種形式。在文字表達化編程中,直接在代碼旁寫出敘述性文檔,而不是另外編寫單獨的文檔。用 Donald Knuth 的話來說:

讓我們集中精力向人們解釋我們希望計算機做什麼,而不是指示計算機做什麼。

歸根到底,代碼是寫給人看到,不是寫給計算機看的。notebook 恰恰提供了這種能力。你能夠直接在代碼旁寫出敘述性文檔。這不僅對閱讀 notebook 的人很有用,而且對你將來回頭分析代碼也很有用。

說點題外話:最近,文字表達化編程這個概念已經發展成爲一門完整的編程語言,即 Eve

notebook 如何工作

Jupyter notebook 源自 Fernando Perez 發起的 IPython 項目。IPython 是一種交互式 shell,與普通的 Python shell 相似,但具有一些很好的功能(例如語法高亮顯示和代碼補全)。最初,notebook 的工作方式是,將來自 Web 應用(你在瀏覽器中看到的 notebook)的消息發送給 IPython 內核(在後臺運行的 IPython 應用程序)。內核執行代碼,然後將結果發送回 notebook。當前架構與之相似,具體見下圖。

核心是 notebook 的服務器。你通過瀏覽器連接到該服務器,而 notebook 呈現爲 Web 應用。你在 Web 應用中編寫的代碼通過該服務器發送給內核,內核運行代碼,並將結果發送回該服務器。之後,任何輸出都會返回到瀏覽器中。保存 notebook 時,它將作爲 JSON 文件(文件擴展名爲 .ipynb)寫入到該服務器中。

此架構的一個優點是,內核無需運行 Python。由於 notebook 和內核分開,因此可以在兩者之間發送任何語言的代碼。例如,早期的兩個非 Python 內核分別是 R 語言和 Julia 語言。使用 R 內核時,用 R 編寫的代碼將發送給執行該代碼的 R 內核,這與在 Python 內核上運行 Python 代碼完全一樣。IPython notebook 已被改名,因爲 notebook 變得與編程語言無關。新的名稱 Jupyter 由 Julia、Python 和 R 組合而成。如果有興趣,不妨看看可用內核的列表

另一個優點是,你可以在任何地方運行 notebook 服務器,並且可通過互聯網訪問服務器。通常,你會在存儲所有數據和 notebook 文件的自有計算機上運行服務器。但是,你也可以在遠程計算機或雲實例(如 Amazon 的 EC2)上設置服務器。之後,你就可以在世界上任何地方通過瀏覽器訪問 notebook。


安裝 Jupyter notebook

目前,安裝 Jupyter 的最簡單方法是使用 Anaconda。該發行版附帶了 Jupyter notebook。你能夠在默認環境下使用 notebook。

要在 conda 環境中安裝 Jupyter notebook,請使用 conda install jupyter notebook

也可以通過 pip 使用 pip install jupyter notebook 來獲得 Jupyter notebook。


啓動 notebook 服務器

要啓動 notebook 服務器,請在終端或控制檯中輸入 jupyter notebook。服務器會在你運行此命令的目錄中啓動。這意味着任何 notebook 文件都會保存在該目錄下。你通常希望在 notebook 文件所在的目錄中啓動服務器,不過你也可以在文件系統中導航到 notebook 文件所在的位置。

運行此命令時(請自己試一下!),服務器主頁會在瀏覽器中打開。默認情況下,notebook 服務器的運行地址是 http://localhost:8888。該地址的含義是:localhost 表示你的計算機,而 8888 是服務器的通信端口。只要 notebook 服務器仍在運行,你隨時都能通過在瀏覽器中輸入 http://localhost:8888 返回到 web 頁面中。

如果同時啓動了另一個 notebook 服務器,新服務器會嘗試使用端口 8888,但由於此端口已被佔用,因此新服務器會在端口 8889 上運行。之後,你可以通過 http://localhost:8889 連接到新服務器。每個額外的 notebook 服務器都會像這樣增大端口號。

如果你嘗試啓動自己的服務器,它應類似以下所示:

你可能會看到上面列表中的一些文件和文件夾,具體取決於你在哪裏啓動服務器。

在右側,你可以點擊“New”(新建),創建新的 notebook、文本文件、文件夾或終端。“Notebooks”下的列表顯示了你已安裝的內核。由於我在 Python 3 環境中運行服務器,因此列出了 Python 3 內核。你在這裏看到的可能是 Python 2。我還安裝了用於 Scala 2.10 和 2.11 的內核,因此它們出現在列表中。

如果在 conda 環境中運行 Jupyter notebook 服務器,則你還能選擇環境中任何其他的內核(見下圖)。要創建新的 notebook,請點擊你要使用的內核


Jupyter 中的 Conda 環境

頂部的選項卡是 Files(文件)、Running(運行)和 Cluster(集羣)。Files(文件)顯示當前目錄中的所有文件和文件夾。點擊 Running(運行)選項卡會列出所有正在運行的 notebook。可以在該選項卡中管理這些 notebook。

過去,在 Clusters(集羣)中創建多個用於並行計算的內核。現在,這項工作已經由 ipyparallel 接管,因此該選項卡如今用處不多。

如果在 conda 環境中運行 notebook 服務器,則你還能訪問以下所示的“Conda”選項卡。可以通過該選項卡管理 Jupyter 中的環境。你可以執行多種操作,例如創建新的環境、安裝包、更新包、導出環境。

關閉 Jupyter

通過在服務器主頁上選中 notebook 旁邊的複選框,然後點擊“Shutdown”(關閉),你就可以關閉各個 notebook。但是,在這樣做之前,請確保你保存了工作!否則,在你上次保存後所做的任何更改都會丟失。下次運行 notebook 時,你還需要重新運行代碼。


通過在終端中按兩次 Ctrl + C,可以關閉整個服務器。再次提醒,這會立即關閉所有運行中的 notebook,因此,請確保你保存了工作!

notebook 界面

創建新的 notebook 時,你會看到如下所示的界面:

請隨意嘗試和四處瀏覽一下。

你會看到外框爲綠色的一個小方框。它稱爲單元格。單元格是你編寫和運行代碼的地方。你也可以更改其類型,以呈現 Markdown(一種常用於編寫 Web 內容的格式化語法)。我會在後面更詳細地介紹 Markdown。在工具欄中點擊“Code”,將其改爲 Markdown,然後改回來。小型的播放按鈕用於運行單元格,而向上和向下的箭頭用於上下移動單元格。

運行代碼單元格時,單元格下方會顯示輸出。單元格還會被編號(左側會顯示 In [1]:)。這能讓你知道運行的代碼和運行順序(如果運行了多個單元格的話)。在 Markdown 模式下運行單元格會將 Markdown 呈現爲文本。


工具欄

從左側開始,工具欄上的其他控件是:

  • 軟盤符號表示“保存”。請記得保存 notebook!
  • + 按鈕用於創建新的單元格
  • 然後是用於剪切、複製和粘貼單元格的按鈕。
  • 運行、停止、重新啓動內核
  • 單元格類型:代碼、Markdown、原始文本和標題
  • 命令面板(見下文)
  • 單元格工具欄,提供不同的單元格選項(例如將單元格用作幻燈片)

命令面板

小鍵盤符號代表命令面板。點擊它會彈出一個帶有搜索欄的面板,供你搜索不同的命令。這能切實幫助你加快工作速度,因此你將無需使用鼠標翻查各個菜單。你只需打開命令面板,然後鍵入要執行的操作。例如,如果要合併兩個單元格

更多事項

頂部顯示了標題。點擊它可以將 notebook 重命名。

右側是內核類型(在我的例子中是 Python 3),旁邊是一個小圓形。在內核運行單元格時,會填充這個小圓形。對於大多數快速運行的操作,並不會填充它。它是一個小型指示器,在代碼會運行較久時讓你知道其實際是在運行中的。

工具欄包含了保存按鈕,但 notebook 也會定期自動保存。標題右側會註明最近一次的保存。你可以使用保存按鈕手動進行保存,也可以按鍵盤上的 Esc,然後按 s。按 Esc 鍵會變爲命令模式,而 s 是“保存”的快捷鍵。我會在後面介紹命令模式和快捷鍵。

在“File”(文件)菜單中,你可以選擇多種格式進行 notebook 的下載。通常,你會希望將它作爲 HTML 文件下載,以便與不使用 Jupyter 的其他人共享。也可以將 notebook 作爲普通的 Python 文件下載,此時所有代碼都會像平常一樣運行。要在博客或文檔中使用 notebook,Markdown 和 reST 格式很合適。


Markdown 單元格

如前所述,單元格也可用於以 Markdown 編寫的文本。Markdown 是格式化語法,可讓你加入鏈接、將文本樣式設爲粗體或斜體和設置代碼格式。像代碼單元格一樣,按 Shift + Enter 或 Ctrl + Enter 可運行 Markdown 單元格,這會將 Markdown 呈現爲格式化文本。加入文本可讓你直接在代碼旁寫出敘述性文檔,以及爲代碼和思路編寫文檔。

你可以在此處查找文檔,但我會提供簡短的入門文檔。

標題

要編寫標題,可在文本前放置井號,即 #(英文讀作 pound、hash 或 octothorpe)。一個 # 呈現爲 h1 標題,兩個 # 是 h2 標題,依此類推。類似以下所示:

# Header 1

Header 2

Header 3

呈現爲

Header 1

Header 2

Header 3


鏈接

要在 Markdown 中添加鏈接,請在文本兩側加上方括號,並在 URL 兩側加上圓括號,例如:baidu home page 表示指向 baidu 的鏈接。

強調效果

可以使用星號或下劃線( 或 _)來表示粗體或斜體,從而添加強調效果。對於斜體,在文本兩側加上一個星號或下劃線,例如 _gelato_ 或 *gelato 會呈現爲 gelato

粗體文本使用兩個符號,例如 aardvark 或 aardvark 會呈現爲 aardvark

只要在文本兩側使用相同的符號,星號和下劃線的作用都一樣。

代碼

可以通過兩種不同的方式顯示代碼,一種是與文本內聯,另一種是將代碼塊與文本分離。要將代碼變爲內聯格式,請在文本兩側加上反撇號。例如,string.punctuation 會呈現爲 string.punctuation

要創建代碼塊,請另起一行並用三個反撇號(一般在鍵盤數字 1 左邊)將文本包起來:

```

import requests
response = requests.get('https://www.baidu.com')
`<span class="javascript" style="margin:0px;padding:0px;border:0px;font-family:inherit;font-style:inherit;line-height:inherit;vertical-align:baseline;"></span>

或者將代碼塊的每一行都縮進四個空格。

import requests 
response = requests.get('https://www.baidu.com')

數學表達式

在 Markdown 單元格中,可以使用 LaTeX 符號創建數學表達式。notebook 使用 MathJax 將 LaTeX 符號呈現爲數學符號。要啓動數學模式,請在 LaTeX 符號兩側加上美元符號(例如 $y = mx + b$),以創建內聯的數學表達式。對於數學符號塊,請使用兩個美元符號:

$$</span>
y = \frac{a}{b+c}
<span class="hljs-variable" style="margin:0px;padding:0px;border:0px;font-family:inherit;font-style:inherit;line-height:inherit;vertical-align:baseline;color:#008080;">$$
此功能的確很有用,因此,如果你沒有用過 LaTeX,請閱讀這篇入門文檔,它介紹瞭如何使用 LaTeX 來創建數學表達式。

在編寫 Markdown 時,可以參考這個速查指南。我建議使用 Markdown 單元格,與使用一堆代碼塊相比,這使 notebook 變得更易於閱讀。

Magic 關鍵字

Magic 關鍵字是可以在單元格中運行的特殊命令,能讓你控制 notebook 本身或執行系統調用(例如更改目錄)。例如,在 notebook 中可以使用 %matplotlib 將 matplotlib 設置爲以交互方式工作。

Magic 命令的前面帶有一個或兩個百分號(% 或 %%),分別對應行 Magic 命令和單元格 Magic 命令。行 Magic 命令僅應用於編寫 Magic 命令時所在的行,而單元格 Magic 命令應用於整個單元格。

注意:這些 Magic 關鍵字是特定於普通 Python 內核的關鍵字。如果使用其他內核,這些關鍵字很有可能無效。

代碼計時

有時候,你可能要花些精力優化代碼,讓代碼運行得更快。在此優化過程中,必須對代碼的運行速度進行計時。可以使用 Magic 命令 timeit 測算函數的運行時間,如下所示:

如果要測算整個單元格的運行時間,請使用 %%timeit,如下所示:

在 notebook 中嵌入可視化內容

如前所述,notebook 允許你將圖像與文本和代碼一起嵌入。這在你使用 matplotlib 或其他繪圖包創建可視化內容時最爲有用。在 notebook 中可以使用 %matplotlib 將 matplotlib 設置爲以交互方式工作。默認情況下,圖形呈現在各自的窗口中。但是,你可以通過命令傳遞參數,以選擇特定的“後端”(呈現圖像的軟件)。要直接在 notebook 中呈現圖形,應將通過命令 %matplotlib inline 內聯後端一起使用。

提示:在分辨率較高的屏幕(例如 Retina 顯示屏)上,notebook 中的默認圖像可能會顯得模糊。可以在 %matplotlib inline 之後使用 %config InlineBackend.figure_format = 'retina' 來呈現分辨率較高的圖像。

notebook 中的圖形示例

在 notebook 中進行調試

對於 Python 內核,可以使用 Magic 命令 %pdb 開啓交互式調試器。出錯時,你能檢查當前命名空間中的變量。

在 notebook 中進行調試

在上圖中,可以看到我嘗試對字符串求和,這造成了錯誤。調試器指出了該錯誤,並提示你檢查代碼。

要詳細瞭解 pdb,請閱讀此文檔。要退出調試器,在提示符中輸入 q 即可。

補充讀物

Magic 命令還有很多,我只是介紹了你將會用得最多的一些命令。要了解更多信息,請查看此列表,它列出了所有可用的 Magic 命令。


轉換 notebook

Notebook 只是擴展名爲 .ipynb 的大型 JSON 文件。

在文本編輯器中打開的 notebook 文件顯示 JSON 數據

由於 notebook 是 JSON 文件,因此,可以輕鬆將其轉換爲其他格式。Jupyter 附帶了一個名爲 nbconvert 的實用程序,可將 notebook 轉換爲 HTML、Markdown、幻燈片等格式。

例如,要將 notebook 轉換爲 HTML 文件,請在終端中使用

jupyter nbconvert --to html notebook.ipynb 

要將 notebook 與不使用 notebook 的其他人共享,轉換爲 HTML 很有用。而要在博客和其他接受 Markdown 格式化的文本編輯器中顯示 notebook,Markdown 很合適。

像平常一樣,要詳細瞭解 nbconvert,請閱讀相關文檔


創建幻燈片

通過 notebook 創建幻燈片是我最愛的功能之一,你可以在瀏覽器中直接打開它,它介紹了用於處理數據的 Pandas。

在 notebook 中創建幻燈片的過程像平常一樣,但需要指定作爲幻燈片的單元格和單元格的幻燈片類型。在菜單欄中,點擊“View”(視圖)>“Cell Toolbar”(單元格工具欄)>“Slideshow”(幻燈片),以便在每個單元格上彈出幻燈片單元格菜單。

打開單元格的幻燈片工具欄

這會在每個單元格上顯示一個下拉菜單,讓你選擇單元格在幻燈片中的顯示方式。

選擇幻燈片類型

Slides(幻燈片)是你從左向右移動的完整幻燈片。按向上或向下的箭頭時,Sub-slides(子幻燈片)會出現在幻燈片中。Fragments(片段)最初是隱藏的,在你按下按鈕時會出現。選擇 Skip(忽略)會忽略幻燈片中的單元格,而選擇 Notes(備註)會將爲演講者保留備註。

運行幻燈片

要通過 notebook 文件創建幻燈片,需要使用 nbconvert

    jupyter nbconvert notebook.ipynb --to slides 

這只是將 notebook 轉換爲幻燈片必需的文件,你需要向其提供 HTTP 服務器才能真正看到演示文稿。

要轉換它並立即看到它,請使用

jupyter nbconvert notebook.ipynb --to slides --post serve 

這會在瀏覽器中打開幻燈片,讓你可以演示它。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章