Jupyter notebook 2018-01-24

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 變得與編程語言無關。新的名稱 JupyterJulia、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 服務器都會像這樣增大端口號。

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

image.png

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

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


image.png

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

頂部的選項卡是 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,MarkdownreST 格式很合適。

代碼單元格

notebook 中的大部分工作均在代碼單元格中完成。這是編寫和執行代碼的地方。在代碼單元格中可以執行多種操作,例如編寫代碼、給變量賦值、定義函數和類、導入包等。在一個單元格中執行的任何代碼在所有其他單元格中均可用。

我創建了一個 notebook,你可以將它當作練習來完成。請在下面下載此 notebook Working With Code Cells,然后從你自己的 notebook 服務器運行它(在你的終端中,轉到包含此 notebook 文件的目錄,然后輸入 jupyter notebook)。瀏覽器可能會嘗試不下載就打開此 notebook 文件。如果是這樣,請右擊鏈接并選擇“鏈接另存為...”。

Markdown 單元格

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

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

標題

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

# Header 1
## Header 2
### Header 3

呈現為

Header 1

Header 2

Header 3

鏈接

要在 Markdown 中添加鏈接,請在文本兩側加上方括號,并在 URL 兩側加上圓括號,例如:[Udacity's home page](https://www.udacity.com) 表示指向 Udacity's home page 的鏈接。

強調效果

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

粗體文本使用兩個符號,例如 **aardvark**__aardvark__ 會呈現為 aardvark

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

代碼

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

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

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


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

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

數學表達式

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

$$
y = \frac{a}{b+c}
$$

此功能的確很有用,因此,如果你沒有用過 LaTeX,請閱讀這篇入門文檔,它介紹了如何使用 LaTeX 來創建數學表達式。

小結

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

快捷鍵

notebook 自帶一組快捷鍵,能讓你使用鍵盤與單元格交互,而無需使用鼠標和工具欄。熟悉這些快捷鍵需要花費一點時間,但如果能熟練掌握,將大大加快你在 notebook 中的工作速度。要詳細了解這些快捷鍵和練習它們的用法,請在下面下載 notebook Keyboard Shortcuts。再次提醒,瀏覽器可能會嘗試打開它,但請將它保存到計算機中。請右擊鏈接并選擇“鏈接另存為...”。

輔助材料

keyboard-shortcuts_cn.ipynb

Magic 關鍵字

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

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

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

代碼計時

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

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

在 notebook 中嵌入可視化內容

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

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

在 notebook 中進行調試

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

[[圖片上傳失敗...(image-115ac1-1516811581121)]

在 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”(幻燈片),以便在每個單元格上彈出幻燈片單元格菜單。

[[圖片上傳失敗...(image-d7601f-1516812175796)]

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

[[圖片上傳失敗...(image-293327-1516812175796)]

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

運行幻燈片

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

    jupyter nbconvert notebook.ipynb --to slides

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

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

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容