Jupyter notebook 是什么师郑?
歡迎學(xué)習(xí)本課程——如何使用 Jupyter notebook。Jupyter notebook 是一種 Web 應(yīng)用漫蛔,能讓用戶將說明文本嗜愈、數(shù)學(xué)方程、代碼和可視化內(nèi)容全部組合到一個易于共享的文檔中莽龟。例如蠕嫁,不久前我共享了我最愛的一個 Jupyter notebook ,它分析了 LIGO 實驗探測到的兩個碰撞的黑洞所發(fā)出的引力波毯盈。你可以下載數(shù)據(jù)剃毒,運行 notebook 中的代碼,重復(fù)整個分析搂赋,實際上等于你自己探測引力波赘阀!
Jupyter Notebook 已迅速成為處理數(shù)據(jù)的必備工具。其用途包括數(shù)據(jù)清理和探索脑奠、可視化基公、機器學(xué)習(xí)和大數(shù)據(jù)分析。我為我的個人博客創(chuàng)建了一個 notebook 示例宋欺,它展示了 notebook 的許多特點轰豆。這項工作通常在終端中完成胰伍,也即使用普通的 Python shell 或 IPython 完成∶胱桑可視化在單獨的窗口中進行喇辽,而文字資料以及各種函數(shù)和類腳本包含在獨立的文檔中。但是雨席,notebook 能將這一切集中到一處,讓用戶一目了然吠式。
GitHub 上也直接支持 Jupyter notebook 的渲染陡厘。借助此出色的功能,你可以輕松地共享工作特占。http://nbviewer.jupyter.org/ 也會提供 GitHub 代碼庫中的 notebook 糙置,以及存儲在其他地方的 notebook。
文學(xué)化編程
notebook 是 Donald Knuth 在 1984 年提出的文字表達化編程的一種形式是目。在文字表達化編程中谤饭,直接在代碼旁寫出敘述性文檔,而不是另外編寫單獨的文檔懊纳。用 Donald Knuth 的話來說:
讓我們集中精力向人們解釋我們希望計算機做什么揉抵,而不是指示計算機做什么。
歸根到底嗤疯,代碼是寫給人看到冤今,不是寫給計算機看的。notebook 恰恰提供了這種能力茂缚。你能夠直接在代碼旁寫出敘述性文檔戏罢。這不僅對閱讀 notebook 的人很有用,而且對你將來回頭分析代碼也很有用脚囊。
說點題外話:最近龟糕,文字表達化編程這個概念已經(jīng)發(fā)展成為一門完整的編程語言,即 Eve悔耘。
notebook 如何工作
Jupyter notebook 源自 Fernando Perez 發(fā)起的 IPython 項目讲岁。IPython 是一種交互式 shell,與普通的 Python shell 相似淮逊,但具有一些很好的功能(例如語法高亮顯示和代碼補全)催首。最初,notebook 的工作方式是泄鹏,將來自 Web 應(yīng)用(你在瀏覽器中看到的 notebook)的消息發(fā)送給 IPython 內(nèi)核(在后臺運行的 IPython 應(yīng)用程序)郎任。內(nèi)核執(zhí)行代碼,然后將結(jié)果發(fā)送回 notebook备籽。當(dāng)前架構(gòu)與之相似舶治,具體見下圖分井。
核心是 notebook 的服務(wù)器。你通過瀏覽器連接到該服務(wù)器霉猛,而 notebook 呈現(xiàn)為 Web 應(yīng)用尺锚。你在 Web 應(yīng)用中編寫的代碼通過該服務(wù)器發(fā)送給內(nèi)核,內(nèi)核運行代碼惜浅,并將結(jié)果發(fā)送回該服務(wù)器瘫辩。之后,任何輸出都會返回到瀏覽器中坛悉。保存 notebook 時伐厌,它將作為 JSON 文件(文件擴展名為 .ipynb
)寫入到該服務(wù)器中。
此架構(gòu)的一個優(yōu)點是裸影,內(nèi)核無需運行 Python挣轨。由于 notebook 和內(nèi)核分開,因此可以在兩者之間發(fā)送任何語言的代碼轩猩。例如卷扮,早期的兩個非 Python 內(nèi)核分別是 R 語言和 Julia 語言。使用 R 內(nèi)核時均践,用 R 編寫的代碼將發(fā)送給執(zhí)行該代碼的 R 內(nèi)核晤锹,這與在 Python 內(nèi)核上運行 Python 代碼完全一樣。IPython notebook 已被改名浊猾,因為 notebook 變得與編程語言無關(guān)抖甘。新的名稱 Jupyter 由 Julia、Python 和 R 組合而成葫慎。如果有興趣衔彻,不妨看看可用內(nèi)核的列表。
另一個優(yōu)點是偷办,你可以在任何地方運行 notebook 服務(wù)器艰额,并且可通過互聯(lián)網(wǎng)訪問服務(wù)器。通常椒涯,你會在存儲所有數(shù)據(jù)和 notebook 文件的自有計算機上運行服務(wù)器柄沮。但是,你也可以在遠程計算機或云實例(如 Amazon 的 EC2)上設(shè)置服務(wù)器废岂。之后祖搓,你就可以在世界上任何地方通過瀏覽器訪問 notebook。
安裝 Jupyter notebook
目前湖苞,安裝 Jupyter 的最簡單方法是使用 Anaconda拯欧。該發(fā)行版附帶了 Jupyter notebook。你能夠在默認環(huán)境下使用 notebook财骨。
要在 conda 環(huán)境中安裝 Jupyter notebook镐作,請使用 conda install jupyter notebook藏姐。
也可以通過 pip 使用 pip install jupyter notebook 來獲得 Jupyter notebook。
啟動 notebook 服務(wù)器
要啟動 notebook 服務(wù)器该贾,請在終端或控制臺中輸入 jupyter notebook
羔杨。服務(wù)器會在你運行此命令的目錄中啟動。這意味著任何 notebook 文件都會保存在該目錄下杨蛋。你通常希望在 notebook 文件所在的目錄中啟動服務(wù)器兜材,不過你也可以在文件系統(tǒng)中導(dǎo)航到 notebook 文件所在的位置。
運行此命令時(請自己試一下A摹)护姆,服務(wù)器主頁會在瀏覽器中打開。默認情況下掏击,notebook 服務(wù)器的運行地址是 http://localhost:8888
。該地址的含義是:localhost
表示你的計算機秩铆,而 8888
是服務(wù)器的通信端口砚亭。只要 notebook 服務(wù)器仍在運行,你隨時都能通過在瀏覽器中輸入 http://localhost:8888 返回到 web 頁面中殴玛。
如果同時啟動了另一個 notebook 服務(wù)器捅膘,新服務(wù)器會嘗試使用端口 8888
,但由于此端口已被占用滚粟,因此新服務(wù)器會在端口 8889
上運行寻仗。之后,你可以通過 http://localhost:8889
連接到新服務(wù)器凡壤。每個額外的 notebook 服務(wù)器都會像這樣增大端口號署尤。
如果你嘗試啟動自己的服務(wù)器,它應(yīng)類似以下所示:
你可能會看到上面列表中的一些文件和文件夾亚侠,具體取決于你在哪里啟動服務(wù)器曹体。
在右側(cè),你可以點擊“New”(新建)硝烂,創(chuàng)建新的 notebook箕别、文本文件、文件夾或終端滞谢〈。“Notebooks”下的列表顯示了你已安裝的內(nèi)核。由于我在 Python 3 環(huán)境中運行服務(wù)器狮杨,因此列出了 Python 3 內(nèi)核母截。你在這里看到的可能是 Python 2。我還安裝了用于 Scala 2.10 和 2.11 的內(nèi)核禾酱,因此它們出現(xiàn)在列表中微酬。
如果在 conda 環(huán)境中運行 Jupyter notebook 服務(wù)器绘趋,則你還能選擇環(huán)境中任何其他的內(nèi)核(見下圖)。要創(chuàng)建新的 notebook颗管,請點擊你要使用的內(nèi)核陷遮。
頂部的選項卡是 Files(文件)、Running(運行)和 Cluster(集群)垦江。Files(文件)顯示當(dāng)前目錄中的所有文件和文件夾帽馋。點擊 Running(運行)選項卡會列出所有正在運行的 notebook”瓤裕可以在該選項卡中管理這些 notebook绽族。
過去,在 Clusters(集群)中創(chuàng)建多個用于并行計算的內(nèi)核●锰伲現(xiàn)在吧慢,這項工作已經(jīng)由 ipyparallel 接管,因此該選項卡如今用處不多赏表。
如果在 conda 環(huán)境中運行 notebook 服務(wù)器检诗,則你還能訪問以下所示的“Conda”選項卡∑敖耍可以通過該選項卡管理 Jupyter 中的環(huán)境逢慌。你可以執(zhí)行多種操作,例如創(chuàng)建新的環(huán)境间狂、安裝包攻泼、更新包、導(dǎo)出環(huán)境鉴象。
關(guān)閉 Jupyter
通過在服務(wù)器主頁上選中 notebook 旁邊的復(fù)選框忙菠,然后點擊“Shutdown”(關(guān)閉),你就可以關(guān)閉各個 notebook炼列。但是只搁,在這樣做之前,請確保你保存了工作俭尖!否則氢惋,在你上次保存后所做的任何更改都會丟失。下次運行 notebook 時稽犁,你還需要重新運行代碼焰望。
通過在終端中按兩次 Ctrl + C,可以關(guān)閉整個服務(wù)器已亥。再次提醒熊赖,這會立即關(guān)閉所有運行中的 notebook,因此虑椎,請確保你保存了工作震鹉!
notebook 界面
創(chuàng)建新的 notebook 時俱笛,你會看到如下所示的界面:
請隨意嘗試和四處瀏覽一下。
你會看到外框為綠色的一個小方框传趾。它稱為單元格迎膜。單元格是你編寫和運行代碼的地方。你也可以更改其類型浆兰,以呈現(xiàn) Markdown(一種常用于編寫 Web 內(nèi)容的格式化語法)磕仅。我會在后面更詳細地介紹 Markdown。在工具欄中點擊“Code”簸呈,將其改為 Markdown榕订,然后改回來。小型的播放按鈕用于運行單元格蜕便,而向上和向下的箭頭用于上下移動單元格劫恒。
運行代碼單元格時,單元格下方會顯示輸出轿腺。單元格還會被編號(左側(cè)會顯示 In [1]:
)兼贸。這能讓你知道運行的代碼和運行順序(如果運行了多個單元格的話)。在 Markdown 模式下運行單元格會將 Markdown 呈現(xiàn)為文本吃溅。
工具欄
從左側(cè)開始,工具欄上的其他控件是:
- 軟盤符號表示“保存”鸯檬。請記得保存 notebook决侈!
-
+
按鈕用于創(chuàng)建新的單元格 - 然后是用于剪切、復(fù)制和粘貼單元格的按鈕喧务。
- 運行赖歌、停止、重新啟動內(nèi)核
- 單元格類型:代碼功茴、Markdown庐冯、原始文本和標(biāo)題
- 命令面板(見下文)
- 單元格工具欄,提供不同的單元格選項(例如將單元格用作幻燈片)
命令面板
小鍵盤符號代表命令面板坎穿。點擊它會彈出一個帶有搜索欄的面板展父,供你搜索不同的命令。這能切實幫助你加快工作速度玲昧,因此你將無需使用鼠標(biāo)翻查各個菜單栖茉。你只需打開命令面板,然后鍵入要執(zhí)行的操作孵延。例如吕漂,如果要合并兩個單元格:
更多事項
頂部顯示了標(biāo)題。點擊它可以將 notebook 重命名尘应。
右側(cè)是內(nèi)核類型(在我的例子中是 Python 3)惶凝,旁邊是一個小圓形吼虎。在內(nèi)核運行單元格時,會填充這個小圓形苍鲜。對于大多數(shù)快速運行的操作思灰,并不會填充它。它是一個小型指示器坡贺,在代碼會運行較久時讓你知道其實際是在運行中的官辈。
工具欄包含了保存按鈕,但 notebook 也會定期自動保存遍坟。標(biāo)題右側(cè)會注明最近一次的保存拳亿。你可以使用保存按鈕手動進行保存,也可以按鍵盤上的 Esc
愿伴,然后按 s
肺魁。按 Esc
鍵會變?yōu)槊钅J剑?s
是“保存”的快捷鍵隔节。我會在后面介紹命令模式和快捷鍵鹅经。
在“File”(文件)菜單中,你可以選擇多種格式進行 notebook 的下載怎诫。通常瘾晃,你會希望將它作為 HTML 文件下載,以便與不使用 Jupyter 的其他人共享幻妓。也可以將 notebook 作為普通的 Python 文件下載蹦误,此時所有代碼都會像平常一樣運行。要在博客或文檔中使用 notebook肉津,Markdown 和 reST 格式很合適强胰。
代碼單元格
notebook 中的大部分工作均在代碼單元格中完成。這是編寫和執(zhí)行代碼的地方妹沙。在代碼單元格中可以執(zhí)行多種操作偶洋,例如編寫代碼、給變量賦值距糖、定義函數(shù)和類玄窝、導(dǎo)入包等。在一個單元格中執(zhí)行的任何代碼在所有其他單元格中均可用肾筐。
我創(chuàng)建了一個 notebook哆料,你可以將它當(dāng)作練習(xí)來完成。請在下面下載此 notebook Working With Code Cells吗铐,然后從你自己的 notebook 服務(wù)器運行它(在你的終端中东亦,轉(zhuǎn)到包含此 notebook 文件的目錄,然后輸入 jupyter notebook
)。瀏覽器可能會嘗試不下載就打開此 notebook 文件典阵。如果是這樣奋渔,請右擊鏈接并選擇“鏈接另存為...”。
Markdown 單元格
如前所述壮啊,單元格也可用于以 Markdown 編寫的文本嫉鲸。Markdown 是格式化語法,可讓你加入鏈接歹啼、將文本樣式設(shè)為粗體或斜體和設(shè)置代碼格式玄渗。像代碼單元格一樣,按 Shift + Enter 或 Ctrl + Enter 可運行 Markdown 單元格狸眼,這會將 Markdown 呈現(xiàn)為格式化文本藤树。加入文本可讓你直接在代碼旁寫出敘述性文檔,以及為代碼和思路編寫文檔拓萌。
你可以在此處查找文檔岁钓,但我會提供簡短的入門文檔。
標(biāo)題
要編寫標(biāo)題微王,可在文本前放置井號屡限,即 #
(英文讀作 pound、hash 或 octothorpe)炕倘。一個 #
呈現(xiàn)為 h1
標(biāo)題钧大,兩個 #
是 h2 標(biāo)題,依此類推罩旋。類似以下所示:
# Header 1
## Header 2
### Header 3
呈現(xiàn)為
Header 1
Header 2
Header 3
鏈接
要在 Markdown 中添加鏈接拓型,請在文本兩側(cè)加上方括號,并在 URL 兩側(cè)加上圓括號瘸恼,例如:[Udacity's home page](https://www.udacity.com)
表示指向 Udacity's home page 的鏈接。
強調(diào)效果
可以使用星號或下劃線(*
或 _
)來表示粗體或斜體册养,從而添加強調(diào)效果东帅。對于斜體,在文本兩側(cè)加上一個星號或下劃線球拦,例如 _gelato_
或 *gelato*
會呈現(xiàn)為 gelato靠闭。
粗體文本使用兩個符號,例如 **aardvark**
或 __aardvark__
會呈現(xiàn)為 aardvark坎炼。
只要在文本兩側(cè)使用相同的符號愧膀,星號和下劃線的作用都一樣。
代碼
可以通過兩種不同的方式顯示代碼谣光,一種是與文本內(nèi)聯(lián)檩淋,另一種是將代碼塊與文本分離。要將代碼變?yōu)閮?nèi)聯(lián)格式萄金,請在文本兩側(cè)加上反撇號蟀悦。例如媚朦,``string.punctuation會呈現(xiàn)為
string.punctuation
。
要創(chuàng)建代碼塊日戈,請另起一行并用三個反撇號(一般在鍵盤數(shù)字 1 左邊)將文本包起來:
import requests
response = requests.get('https://www.udacity.com')
或者將代碼塊的每一行都縮進四個空格询张。
import requests
response = requests.get('https://www.udacity.com')
數(shù)學(xué)表達式
在 Markdown 單元格中,可以使用 LaTeX 符號創(chuàng)建數(shù)學(xué)表達式浙炼。notebook 使用 MathJax 將 LaTeX 符號呈現(xiàn)為數(shù)學(xué)符號份氧。要啟動數(shù)學(xué)模式,請在 LaTeX 符號兩側(cè)加上美元符號(例如 $y = mx + b$
)弯屈,以創(chuàng)建內(nèi)聯(lián)的數(shù)學(xué)表達式蜗帜。對于數(shù)學(xué)符號塊,請使用兩個美元符號:
$$
y = \frac{a}{b+c}
$$
此功能的確很有用季俩,因此钮糖,如果你沒有用過 LaTeX,請閱讀這篇入門文檔酌住,它介紹了如何使用 LaTeX 來創(chuàng)建數(shù)學(xué)表達式店归。
小結(jié)
在編寫 Markdown 時,可以參考這個速查指南酪我。我建議使用 Markdown 單元格消痛,與使用一堆代碼塊相比,這使 notebook 變得更易于閱讀都哭。
快捷鍵
notebook 自帶一組快捷鍵秩伞,能讓你使用鍵盤與單元格交互,而無需使用鼠標(biāo)和工具欄欺矫。熟悉這些快捷鍵需要花費一點時間纱新,但如果能熟練掌握,將大大加快你在 notebook 中的工作速度穆趴。要詳細了解這些快捷鍵和練習(xí)它們的用法脸爱,請在下面下載 notebook Keyboard Shortcuts。再次提醒未妹,瀏覽器可能會嘗試打開它簿废,但請將它保存到計算機中。請右擊鏈接并選擇“鏈接另存為...”络它。
輔助材料
Magic 關(guān)鍵字
Magic 關(guān)鍵字是可以在單元格中運行的特殊命令族檬,能讓你控制 notebook 本身或執(zhí)行系統(tǒng)調(diào)用(例如更改目錄)。例如化戳,在 notebook 中可以使用 %matplotlib
將 matplotlib 設(shè)置為以交互方式工作单料。
Magic 命令的前面帶有一個或兩個百分號(%
或 %%
),分別對應(yīng)行 Magic 命令和單元格 Magic 命令。行 Magic 命令僅應(yīng)用于編寫 Magic 命令時所在的行看尼,而單元格 Magic 命令應(yīng)用于整個單元格递鹉。
注意:這些 Magic 關(guān)鍵字是特定于普通 Python 內(nèi)核的關(guān)鍵字。如果使用其他內(nèi)核藏斩,這些關(guān)鍵字很有可能無效躏结。
代碼計時
有時候,你可能要花些精力優(yōu)化代碼狰域,讓代碼運行得更快媳拴。在此優(yōu)化過程中,必須對代碼的運行速度進行計時兆览∏龋可以使用 Magic 命令 timeit
測算函數(shù)的運行時間,如下所示:
如果要測算整個單元格的運行時間抬探,請使用 %%timeit
子巾,如下所示:
在 notebook 中嵌入可視化內(nèi)容
如前所述,notebook 允許你將圖像與文本和代碼一起嵌入小压。這在你使用 matplotlib
或其他繪圖包創(chuàng)建可視化內(nèi)容時最為有用线梗。在 notebook 中可以使用 %matplotlib
將 matplotlib
設(shè)置為以交互方式工作。默認情況下怠益,圖形呈現(xiàn)在各自的窗口中仪搔。但是,你可以通過命令傳遞參數(shù)蜻牢,以選擇特定的“后端”(呈現(xiàn)圖像的軟件)烤咧。要直接在 notebook 中呈現(xiàn)圖形,應(yīng)將通過命令 %matplotlib inline
內(nèi)聯(lián)后端一起使用抢呆。
提示:在分辨率較高的屏幕(例如 Retina 顯示屏)上煮嫌,notebook 中的默認圖像可能會顯得模糊”埃可以在
%matplotlib inline
之后使用%config InlineBackend.figure_format = 'retina'
來呈現(xiàn)分辨率較高的圖像立膛。
在 notebook 中進行調(diào)試
對于 Python 內(nèi)核,可以使用 Magic 命令 %pdb
開啟交互式調(diào)試器梯码。出錯時,你能檢查當(dāng)前命名空間中的變量好啰。
[[圖片上傳失敗...(image-115ac1-1516811581121)]
在 notebook 中進行調(diào)試]
在上圖中轩娶,可以看到我嘗試對字符串求和,這造成了錯誤框往。調(diào)試器指出了該錯誤鳄抒,并提示你檢查代碼。
要詳細了解 pdb
,請閱讀此文檔许溅。要退出調(diào)試器瓤鼻,在提示符中輸入 q
即可。
補充讀物
Magic 命令還有很多贤重,我只是介紹了你將會用得最多的一些命令茬祷。要了解更多信息,請查看此列表并蝗,它列出了所有可用的 Magic 命令祭犯。
轉(zhuǎn)換 notebook
Notebook 只是擴展名為 .ipynb
的大型 JSON 文件。
在文本編輯器中打開的 notebook 文件顯示 JSON 數(shù)據(jù)]
由于 notebook 是 JSON 文件滚停,因此沃粗,可以輕松將其轉(zhuǎn)換為其他格式。Jupyter 附帶了一個名為 nbconvert
的實用程序键畴,可將 notebook 轉(zhuǎn)換為 HTML最盅、Markdown、幻燈片等格式起惕。
例如涡贱,要將 notebook 轉(zhuǎn)換為 HTML 文件,請在終端中使用
jupyter nbconvert --to html notebook.ipynb
要將 notebook 與不使用 notebook 的其他人共享疤祭,轉(zhuǎn)換為 HTML 很有用盼产。而要在博客和其他接受 Markdown 格式化的文本編輯器中顯示 notebook,Markdown 很合適勺馆。
像平常一樣戏售,要詳細了解 nbconvert
,請閱讀相關(guān)文檔草穆。
創(chuàng)建幻燈片
通過 notebook 創(chuàng)建幻燈片是我最愛的功能之一灌灾,你可以在瀏覽器中直接打開它,它介紹了用于處理數(shù)據(jù)的 Pandas悲柱。
在 notebook 中創(chuàng)建幻燈片的過程像平常一樣锋喜,但需要指定作為幻燈片的單元格和單元格的幻燈片類型。在菜單欄中豌鸡,點擊“View”(視圖)>“Cell Toolbar”(單元格工具欄)>“Slideshow”(幻燈片)嘿般,以便在每個單元格上彈出幻燈片單元格菜單。
[[圖片上傳失敗...(image-d7601f-1516812175796)]
打開單元格的幻燈片工具欄]
這會在每個單元格上顯示一個下拉菜單涯冠,讓你選擇單元格在幻燈片中的顯示方式炉奴。
[[圖片上傳失敗...(image-293327-1516812175796)]
選擇幻燈片類型]
Slides(幻燈片)是你從左向右移動的完整幻燈片。按向上或向下的箭頭時蛇更,Sub-slides(子幻燈片)會出現(xiàn)在幻燈片中瞻赶。Fragments(片段)最初是隱藏的赛糟,在你按下按鈕時會出現(xiàn)。選擇 Skip(忽略)會忽略幻燈片中的單元格砸逊,而選擇 Notes(備注)會將為演講者保留備注璧南。
運行幻燈片
要通過 notebook 文件創(chuàng)建幻燈片,需要使用 nbconvert
:
jupyter nbconvert notebook.ipynb --to slides
這只是將 notebook 轉(zhuǎn)換為幻燈片必需的文件师逸,你需要向其提供 HTTP 服務(wù)器才能真正看到演示文稿司倚。
要轉(zhuǎn)換它并立即看到它,請使用
jupyter nbconvert notebook.ipynb --to slides --post serve
這會在瀏覽器中打開幻燈片字旭,讓你可以演示它对湃。