- 原文地址:Jupyter Notebook for Beginners: A Tutorial
- 原文做者:dataquest
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:SergeyChang
- 校對者:sunhaokk,陸塵
Jupyter Notebook 是一個很是強大的工具,經常使用於交互式地開發和展現數據科學項目。它將代碼和它的輸出集成到一個文檔中,而且結合了可視的敘述性文本、數學方程和其餘豐富的媒體。它直觀的工做流促進了迭代和快速的開發,使得 notebook 在當代數據科學、分析和愈來愈多的科學研究中愈來愈受歡迎。最重要的是,做爲開源項目的一部分,它們是徹底免費的。html
Jupyter 項目是早期 IPython Notebook 的繼承者,它在 2010 年首次做爲原型發佈。儘管在 Jupyter Notebook 中可使用許多不一樣的編程語言,但本文將重點介紹 Python,由於在 Jupyter Notebook 中 python 是最多見的。前端
爲了充分理解本教程,你應該熟悉編程,特別是 Python 和 pandas(譯者注:Pandas 是python的一個數據分析包)。也就是說,若是你有編程經驗,這篇文章中的 Python 不會太陌生,而 pandas 也是容易理解的。Jupyter Notebooks 也能夠做爲一個靈活的平臺來運行 pandas 甚至是 Python,這將在這篇文章中體現。python
咱們將會:android
咱們將經過一個樣本分析,來回答一個真實的問題,這樣你就能夠看到一個 notebook 的工做流是如何使任務直觀地完成的,當咱們分享給其餘人時也可讓其餘人更好地理解。ios
假設你是一名數據分析師,你的任務是弄清楚美國最大公司的利潤變化歷史。你會發現自從 1955 年第一次發表這個名單以來,已有超過 50 年的財富 500 強企業的數據集,這些數據都是從《財富》的公共檔案中收集來的。咱們已經建立了一個可用數據的 CSV 文件(你能夠在這裏獲取它)。git
正如咱們將要演示的,Jupyter Notebooks 很是適合這項調查。首先,讓咱們安裝 Jupyter。github
初學者開始使用 Jupyter Notebooks 的最簡單方法是安裝 Anaconda。Anaconda 是最普遍使用的用於數據科學的 Python 發行版,而且預裝了全部經常使用的庫和工具。除了 Jupyter 以外,Anaconda 中還封裝了一些 Python 庫,包括 NumPy,pandas 和 Matplotlib,而且這完整的1000+列表是詳盡的。這使你能夠在本身完備的數據科學研討會中運行,而不須要管理無數的安裝包或擔憂依賴項和特定操做系統的安裝問題。web
安裝 Anaconda:編程
若是你是已經安裝了 Python 的更高級的用戶,而且更喜歡手動管理你的軟件包,那麼你可使用pip:後端
pip3 install jupyter
複製代碼
在本節中,咱們將看到如何運行和保存 notebooks,熟悉它們的結構,並理解接口。咱們將會熟悉一些核心術語,這些術語將引導你對如何使用 Jupyter notebooks 進行實際的理解,併爲下一節作鋪墊,該部分將經過示例數據分析,並將咱們在這裏學到的全部東西帶到生活中。
在 Windows 上,你能夠經過將 Anaconda 快捷方式添加到你的開始菜單來運行 Jupyter,它將在你的默認網頁瀏覽器中打開一個新的標籤,看起來就像下面的截圖同樣。
這是 Notebook Dashboard,專門用於管理 Jupyter Notebooks。把它看做是探索,編輯和建立 notebooks 的啓動面板。你能夠把它看做是探索、編輯和創造你的 notebook 的發射臺。
請注意,儀表板將只容許您訪問 Jupyter 啓動目錄中包含的文件和子文件夾;可是,啓動目錄是能夠更改的。還能夠經過輸入 jupyter notebook
命令在任何系統上啓動指示板(或在Unix系統上的終端);在這種狀況下,當前工做目錄將是啓動目錄。
聰明的讀者可能已經注意到,儀表板的 URL 相似於 http://localhost:8888/tree
。Localhost 不是一個網站,而是表示從你的本地機器(你本身的計算機)中服務的內容。Jupyter notebook 和儀表板都是 web 應用程序,Jupyter 啓動了一個本地的 Python 服務器,將這些應用程序提供給你的 web 瀏覽器,使其從根本上獨立於平臺,並打開了更容易在 web 上共享的大門。
儀表板的界面大部分是不言自明的 —— 儘管咱們稍後會簡要介紹它。咱們還在等什麼?瀏覽到你想要建立你的第一個 notebook 的文件夾,點擊右上角的 New
下拉按鈕,選擇 Python 3
(或者你喜歡的版本)。
咱們立刻能看到成果了!你的第一個 Jupyter Notebook 將在新標籤頁打開 - 每一個 notebook 使用它本身的標籤,由於你能夠同時打開多個 notebook。若是您切換回儀表板,您將看到新文件 Untitled
。你應該看到一些綠色的文字告訴 notebook 正在運行。
理解這個文件究竟是什麼是頗有用的。每個 .ipynb
文件是一個文本文件,它以一種名爲 JSON 的格式描述你的 notebook 的內容。每一個單元格及其內容,包括已被轉換成文本字符串的圖像附件,都與一些元數據一塊兒列出。你能夠本身編輯這個 -- 若是你知道你在作什麼! -- 經過在 notebook 的菜單欄中選擇 "Edit > Edit Notebook Metadata"。
你還能夠經過在儀表板上的控件中選擇 Edit
來查看你的 notebook 文件的內容,可是重要的是能夠;除了好奇以外沒有理由這樣作,除非你真的知道你在作什麼。
既然你面前有一個打開的 notebook,它的界面就不會看起來徹底陌生;畢竟,Jupyter 實際上只是一個高級的文字處理器。爲何不看一看?查看菜單以瞭解它,尤爲是花點時間瀏覽命令選項板(這是帶鍵盤圖標的小按鈕(或 Ctrl + Shift + P
))下滾動命令列表。
您應該注意到兩個很是重要的術語,這對您來講多是全新的:單元格和內核。它們是理解 Jupyter 和區分 Jupyter 不僅是一個文字處理器的關鍵。幸運的是,這些概念並不難理解。
稍後咱們再討論內核,在這以前咱們先來了解一下單元格。單元格構成一個筆記本的主體。在上面一節的新建的 notebook 屏幕截圖中,帶有綠色輪廓的盒子是一個空的單元格。咱們將介紹兩種主要的單元格類型:
新的 notebook 中的第一個單元老是一個代碼單元。讓咱們用一個經典的 hello world 示例來測試它。輸入 print('Hello World!')
到單元格中,點擊上面工具欄中的 run 按鈕,或者按下 Ctrl + Enter 鍵。結果應該是這樣的:
print('Hello World!')
複製代碼
Hello World!
複製代碼
當你運行這個單元格時,它的輸出將會顯示在它的下面,而它左邊的標籤將會從 In [ ]
變爲 In [1]
。代碼單元的輸出也是文檔的一部分,這就是爲何你能夠在本文中看到它的緣由。你老是能夠區分代碼和 Markdown 單元,由於代碼單元格在左邊有標籤,而 Markdown 單元沒有。標籤的「In」部分僅僅是「輸入」的縮寫,而標籤號表示在內核上執行單元格時的順序 —— 在這種狀況下,單元格被第一個執行。再次運行單元格,標籤將更改成 In[2]
,由於此時單元格是在內核上運行的第二個單元格。這讓咱們在接下來對內核的深刻將很是有用。
從菜單欄中,單擊插入並選擇在下方插入單元格,建立你新的代碼單元,並嘗試下面的代碼,看看會發生什麼。你注意到有什麼不一樣嗎?
import time
time.sleep(3)
複製代碼
這個單元不產生任何輸出,但執行須要 3 秒。請注意,Jupyter 將標籤更改成 In[*]
來表示單元格當前正在運行。
通常來講,單元格的輸出來自於單元執行過程當中指定打印的任何文本數據,以及單元格中最後一行的值,不管是單獨變量,函數調用仍是其餘內容。例如:
def say_hello(recipient):
return 'Hello, {}!'.format(recipient)
say_hello('Tim')
複製代碼
'Hello, Tim!'
複製代碼
你會發現本身常常在本身的項目中使用它,之後咱們會看到更多。
在運行單元格時,你可能常常看到它們的邊框變成了藍色,而在編輯的時候它是綠色的。老是有一個「活動」單元格突出顯示其當前模式,綠色表示「編輯模式」,藍色表示「命令模式」。
到目前爲止,咱們已經看到了如何使用 Ctrl + Enter
來運行單元格,可是還有不少。鍵盤快捷鍵是 Jupyter 環境中很是流行的一個方面,由於它們促進了快速的基於單元格的工做流。許多這些都是在命令模式下能夠在活動單元上執行的操做。
下面,你會發現一些 Jupyter 的鍵盤快捷鍵列表。你可能不會立刻熟悉它們,可是這份清單應該讓你對這些快捷鍵有了瞭解。
Esc
和 Enter
。Up
和 Down
鍵向上和向下滾動你的單元格。A
或 B
在活動單元上方或下方插入一個新單元。M
將會將活動單元格轉換爲 Markdown 單元格。Y
將激活的單元格設置爲一個代碼單元格。D + D
(按兩次 D
)將刪除活動單元格。Z
將撤銷單元格刪除。 * 按住 Shift
,同時按 Up
或 Down
,一次選擇多個單元格。
Shift + M
將合併你的選擇。Ctrl + Shift + -
,在編輯模式下,將在光標處拆分活動單元格。Shift + Click
來選擇它們。你能夠在本身的 notebook 上試試這些。一旦你有了嘗試,建立一個新的 Markdown 單元,咱們將學習如何在咱們的 notebook 中格式化文本。
Markdown 是一種輕量級的、易於學習的標記語言,用於格式化純文本。它的語法與 HTML 標記有一對一的對應關係,因此這裏的一些經驗是有用的,但絕對不是先決條件。請記住,這篇文章是在一個 Jupyter notebook 上寫的,因此你所看到的全部的敘述文本和圖片都是在 Markdown 完成的。讓咱們用一個簡單的例子來介紹基礎知識。
# 這是一級標題。
## 這是一個二級標題。
這是一些構成段落的純文本。
經過 **粗體** 和 __bold__ ,或 *斜體* 和 _italic_ 添加劇點。
段落必須用空行隔開。
* 有時咱們想要包含列表。
* 能夠縮進。
1. 列表也能夠編號。
2. 有序列表。
[有可能包括超連接](https://www.example.com)
內聯代碼使用單個倒引號:`foo()`,代碼塊使用三個倒引號:
\``` \bar() \``` 或可由4個空格組成: foo() 最後,添加圖片也很簡單: 複製代碼
當附加圖像時,你有三個選項:
使用一個在 web 上的圖像的 URL。
使用一個與你的 notebook 一塊兒維護的本地 URL,例如在同一個 git 倉庫中。
經過 "Edit > Insert Image" 添加附件;這將把圖像轉換成字符串並存儲在你的 notebook 中的 .ipynb
文件。
注意這將使你的 .ipynb
的文件更大!
Markdown 有不少細節,特別是在超連接的時候,也能夠簡單地包括純 HTML。一旦你發現本身突破了上述基礎的限制,你能夠參考 Markdown 創造者 John Gruber 的官方指南。
每一個 notebook 後臺都運行一個內核。當你運行一個代碼單元時,該代碼在內核中執行,任何輸出都會返回到要顯示的單元格。在單元格間切換時內核的狀態保持不變 —— 它與文檔有關,而不是單個的單元格。
例如,若是你在一個單元中導入庫或聲明變量,那麼它們將在另外一個單元中可用。經過這種方式,你能夠將 notebook 文檔看做是與腳本文件至關的,除了它是多媒體。讓咱們試着去感覺一下。首先,咱們將導入一個 Python 包並定義一個函數。
import numpy as np
def square(x):
return x * x
複製代碼
一旦咱們執行了上面的單元格,咱們就能夠在任何其餘單元中引用 np
和 square
。
x = np.random.randint(1, 10)
y = square(x)
print('%d squared is %d' % (x, y))
複製代碼
1 squared is 1
複製代碼
無論你的 notebook 裏的單元格順序如何,這都是可行的。你能夠本身試一下,讓咱們再把變量打印出來。
print('Is %d squared is %d?' % (x, y))
複製代碼
Is 1 squared is 1?
複製代碼
答案毫無疑問。讓咱們嘗試改變 y
。
y = 10
複製代碼
若是咱們再次運行包含 print
語句的單元格,你認爲會發生什麼?咱們獲得的結果是 Is 4 squared is 10?
!
大多數狀況下,你的 notebook 上的工做流將會從上到下,可是返回上文作一些改變是很正常的。在這種狀況下,每一個單元的左側的執行順序,例如 In [6]
,將讓你知道你的任何單元格是否有陳舊的輸出。若是你想要重置一些東西,從內核菜單中有幾個很是有用的選項:
若是你的內核一直在計算中,但你但願中止它,你能夠選擇 Interupt
選項。
你可能已經注意到,Jupyter 提供了更改內核的選項,實際上有許多不一樣的選項可供選擇。當你經過選擇 Python 版本從儀表板中建立一個新的筆記時,你其實是在選擇使用哪一個內核。
不只有不一樣版本的 Python 的內核,還有(超過 100 種語言),包括 Java 、C ,甚至 Fortran。數據科學家可能特別感興趣的是 R 和 Julia,以及 imatlab 和 Calysto MATLAB內核 。SoS 內核在一個 notebook 中提供多語言支持。每一個內核都有本身的安裝指令,但可能須要您在計算機上運行一些命令。
如今咱們已經看了一個 Jupyter Notebook,是時候看看它們在實踐中使用了,這應該會讓你更清楚地瞭解它們爲何那麼受歡迎。如今是時候開始使用前面提到的財富 500 數據集了。請記住,咱們的目標是瞭解美國最大公司的利潤在歷史上是如何變化的。
值得注意的是,每一個人都會有本身的喜愛和風格,可是通常原則仍然適用,若是你願意,你能夠在本身的 notebook 上跟隨這一段,這也給了你自由發揮空間。
在開始編寫項目以前,你可能想要給它一個有意義的名稱。也許有點讓人困惑,你不能從 Notebook 的應用程序中命名或重命名你的 notebook,而必須使用儀表盤或你的文件瀏覽器來重命名 .ipynb
文件。咱們將返回到儀表板,以重命名你以前建立的文件,它將有默認的 notebook 的文件名是 Untitled.ipynb
。
你不能在 notebook 運行時重命名它,因此你首先要關閉它。最簡單的方法就是從 notebook 菜單中選擇 「File > Close and Halt」。可是,您也能夠經過在筆記本應用程序內 「Kernel > Shutdown」 或在儀表板中選擇 notebook 並點擊 「Shutdown」 (見下圖)來關閉內核。
而後你能夠選擇你的 notebook,並在儀表板控件中點擊 「Rename」。
注意,在你的瀏覽器中關閉筆記的標籤頁將不會像在傳統的應用程序中關閉文檔的方式同樣關閉你的 notebook。notebook 的內核將繼續在後臺運行,須要在真正「關閉」以前中止運行 —— 不過若是你不當心關掉了你的標籤或瀏覽器,這就很方便了!若是內核被關閉,你能夠關閉該選項卡,而不用擔憂它是否還在運行。
若是你給你的 notebook 起了名字,打開它,咱們就能夠開始實踐了。
一般一開始就使用一個專門用於導入和設置的代碼單元,所以若是你選擇添加或更改任何內容,你能夠簡單地編輯和從新運行該單元,而不會產生任何反作用。
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")
複製代碼
咱們導入 pandas 來處理咱們的數據,Matplotlib 繪製圖表,Seaborn 使咱們的圖表更美。導入 NumPy 也是很常見的,可是在這種狀況下,雖然咱們使用的是 pandas,但咱們不須要顯式地使用它。第一行不是 Python 命令,而是使用一種叫作行魔法的東西來指示 Jupyter 捕獲 Matplotlib 圖並在單元輸出中呈現它們;這是超出本文範圍的一系列高級特性之一。
讓咱們來加載數據。
df = pd.read_csv('fortune500.csv')
複製代碼
在單個單元格中這樣作也是明智的,由於咱們須要在任什麼時候候從新加載它。
如今咱們已經開始了,最好的作法是按期存儲。按 Ctrl + S
鍵能夠經過調用「保存和檢查點」命令來保存你的 notebook,可是這個檢查點又是什麼呢?
每當你建立一個新的 notebook 時,都會建立一個檢查點文件以及你的 notebook 文件;它將位於你保存位置的隱藏子目錄中稱做 .ipynb_checkpoints
,也是一個 .ipynb
文件。默認狀況下,Jupyter 將每隔 120 秒自動保存你的 notebook,而不會改變你的主 notebook 文件。當你「保存和檢查點」時,notebook 和檢查點文件都將被更新。所以,檢查點使你可以在發生意外事件時恢復未保存的工做。你能夠經過 「File > Revert to Checkpoint「 從菜單恢復到檢查點。
咱們正在穩步前進!咱們的筆記已經被安全保存,咱們將數據集 df
加載到最經常使用的 pandas 數據結構中,這被稱爲 DataFrame
,看起來就像一張表格。那咱們的數據集會是怎樣的?
df.head()
複製代碼
Year | Rank | Company | Revenue (in millions) | Profit (in millions) | |
---|---|---|---|---|---|
0 | 1955 | 1 | General Motors | 9823.5 | 806 |
1 | 1955 | 2 | Exxon Mobil | 5661.4 | 584.8 |
2 | 1955 | 3 | U.S. Steel | 3250.4 | 195.4 |
3 | 1955 | 4 | General Electric | 2959.1 | 212.6 |
4 | 1955 | 5 | Esmark | 2510.8 | 19.1 |
df.tail()
複製代碼
Year | Rank | Company | Revenue (in millions) | Profit (in millions) | |
---|---|---|---|---|---|
25495 | 2005 | 496 | Wm. Wrigley Jr. | 3648.6 | 493 |
25496 | 2005 | 497 | Peabody Energy | 3631.6 | 175.4 |
25497 | 2005 | 498 | Wendy's International | 3630.4 | 57.8 |
25498 | 2005 | 499 | Kindred Healthcare | 3616.6 | 70.6 |
25499 | 2005 | 500 | Cincinnati Financial | 3614.0 | 584 |
看上去不錯。咱們有須要的列,每一行對應一個公司一年的財務數據。
讓咱們重命名這些列,以便稍後引用它們。
df.columns = ['year', 'rank', 'company', 'revenue', 'profit']
複製代碼
接下來,咱們須要探索咱們的數據集,它是否完整? pandas 是按預期讀的嗎?缺乏值嗎?
len(df)
複製代碼
25500
複製代碼
好吧,看起來不錯 —— 從 1955 年到 2005 年,每一年都有 500 行。
讓咱們檢查咱們的數據集是否如咱們預期的那樣被導入。一個簡單的檢查就是查看數據類型(或 dtypes)是否被正確地解釋。
df.dtypes
複製代碼
year int64
rank int64
company object
revenue float64
profit object
dtype: object
複製代碼
看起來利潤欄有點問題 —— 咱們但願它像收入欄同樣是 float64
。這代表它可能包含一些非整數值,因此讓咱們看一看。
non_numberic_profits = df.profit.str.contains('[^0-9.-]')
df.loc[non_numberic_profits].head()
複製代碼
year | rank | company | revenue | profit | |
---|---|---|---|---|---|
228 | 1955 | 229 | Norton | 135.0 | N.A. |
290 | 1955 | 291 | Schlitz Brewing | 100.0 | N.A. |
294 | 1955 | 295 | Pacific Vegetable Oil | 97.9 | N.A. |
296 | 1955 | 297 | Liebmann Breweries | 96.0 | N.A. |
352 | 1955 | 353 | Minneapolis-Moline | 77.4 | N.A. |
就像咱們猜想的那樣!其中一些值是字符串,用於表示丟失的數據。還有其餘缺失的值麼?
set(df.profit[non_numberic_profits])
複製代碼
{'N.A.'}
複製代碼
這很容易解釋,可是咱們應該怎麼作呢?這取決於缺失了多少個值。
len(df.profit[non_numberic_profits])
複製代碼
369
複製代碼
它只是咱們數據集的一小部分,雖然不是徹底可有可無,由於它仍然在 1.5% 左右。若是包含 N.A. 的行是簡單地、均勻地按年分佈的,那最簡單的解決方案就是刪除它們。因此讓咱們瀏覽一下分佈。
bin_sizes, _, _ = plt.hist(df.year[non_numberic_profits], bins=range(1955, 2006))
複製代碼
粗略地看,咱們能夠看到,在一年中無效值最多的狀況也小於 25,而且因爲每一年有 500 個數據點,刪除這些值在最糟糕的年份中只佔不到 4% 的數據。事實上,除了 90 年代的激增,大多數年份的缺失值還不到峯值的一半。爲了咱們的目的,假設這是能夠接受的,而後移除這些行。
df = df.loc[~non_numberic_profits]
df.profit = df.profit.apply(pd.to_numeric)
複製代碼
咱們看看有沒有生效。
len(df)
複製代碼
25131
複製代碼
df.dtypes
複製代碼
year int64
rank int64
company object
revenue float64
profit float64
dtype: object
複製代碼
不錯!咱們已經完成了數據集的設置。
若是你要將 notebook 作成一個報告,你能夠不使用咱們建立的研究的單元格,包括這裏的演示使用 notebook 的工做流,合併相關單元格(請參閱下面的高級功能部分)並建立一個數據集設置單元格。這意味着若是咱們把咱們的數據放在別處,咱們能夠從新運行安裝單元來恢復它。
接下來,咱們能夠經過計算年平均利潤來解決這個問題。咱們不妨把收入也畫出來,因此首先咱們能夠定義一些變量和一種方法來減小咱們的代碼。
group_by_year = df.loc[:, ['year', 'revenue', 'profit']].groupby('year')
avgs = group_by_year.mean()
x = avgs.index
y1 = avgs.profit
def plot(x, y, ax, title, y_label):
ax.set_title(title)
ax.set_ylabel(y_label)
ax.plot(x, y)
ax.margins(x=0, y=0)
複製代碼
如今讓咱們開始畫圖。
fig, ax = plt.subplots()
plot(x, y1, ax, 'Increase in mean Fortune 500 company profits from 1955 to 2005', 'Profit (millions)')
複製代碼
它看起來像一個指數,但它有一些大的凹陷。它們必定是對應於上世紀 90 年代初的經濟衰退和 互聯網泡沫。在數據中能看到這一點很是有趣。但爲何每次經濟衰退後,利潤都能恢復到更高的水平呢?
也許收入能告訴咱們更多。
y2 = avgs.revenue
fig, ax = plt.subplots()
plot(x, y2, ax, 'Increase in mean Fortune 500 company revenues from 1955 to 2005', 'Revenue (millions)')
複製代碼
這爲故事增添了另外一面。收入幾乎沒有受到嚴重打擊,財務部門的會計工做作得很好。
藉助 Stack Overflow 上的幫助,咱們能夠用 +/- 它們的標準偏移來疊加這些圖。
def plot_with_std(x, y, stds, ax, title, y_label):
ax.fill_between(x, y - stds, y + stds, alpha=0.2)
plot(x, y, ax, title, y_label)
fig, (ax1, ax2) = plt.subplots(ncols=2)
title = 'Increase in mean and std Fortune 500 company %s from 1955 to 2005'
stds1 = group_by_year.std().profit.as_matrix()
stds2 = group_by_year.std().revenue.as_matrix()
plot_with_std(x, y1.as_matrix(), stds1, ax1, title % 'profits', 'Profit (millions)')
plot_with_std(x, y2.as_matrix(), stds2, ax2, title % 'revenues', 'Revenue (millions)')
fig.set_size_inches(14, 4)
fig.tight_layout()
複製代碼
這是驚人的,標準誤差是巨大的。一些財富 500 強的公司賺了數十億,而另外一些公司卻損失了數十億美圓,並且隨着這些年來利潤的增加,風險也在增長。也許有些公司比其餘公司表現更好;前 10% 的利潤是否或多或少會比最低的10%穩定一些?
接下來咱們有不少問題能夠看,很容易看到在 notebook 上的工做流程是如何與本身的思惟過程相匹配的,因此如今是時候爲這個例子畫上句號了。這一流程幫助咱們在無需切換應用程序的狀況下輕鬆地研究咱們的數據集,而且咱們的工做能夠當即共享和重現。若是咱們但願爲特定的目標人羣建立一個更簡潔的報告,咱們能夠經過合併單元和刪除中間代碼來快速重構咱們的工做。
當人們談論分享他們的 notebook 時,他們一般會考慮兩種模式。大多數狀況下,我的共享其工做的最終結果,就像本文自己同樣,這意味着共享非交互式的、預渲染的版本的 notebook;然而,也能夠在 notebook 上藉助諸如 Git 這樣的輔助版本控制系統進行協做。
也就是說,有一些新興的公司在 web 上提供了在雲中運行交互式 Jupyter Notebook 的能力。
當你導出或保存它時,共享的 notebook 將會以被導出或保存的那一刻的狀態顯示,包括全部代碼單元的輸出。所以,爲了確保你的 notebook 是共享的,你能夠在分享以前採起一些步驟:
這將確保你的 notebook 不包含中間輸出,不包含陳舊的狀態,並在共享時按順序執行。
Jupyter 內置支持導出 HTML 和 PDF 以及其餘幾種格式,你能夠在 File > Download As
菜單下找到。若是你但願與一個小型的私有組共享你的 notebook,這個功能極可能是你所須要的。事實上,許多學術機構的研究人員都有一些公共或內部的網絡空間,由於你能夠將一個 notebook 導出到一個 HTML 文件中,Jupyter notebook 能夠成爲他們與同行分享成果的一種特別方便的方式。
可是,若是共享導出的文件並不能讓你滿意,那麼還有一些更直接的很是流行的共享 .ipynb
文件到網上的方法。
截止到 2018 年初,GitHub 上的公共 notebook 數量超過了 180 萬,它無疑是最受歡迎的與世界分享 Jupyter 項目的獨立平臺。GitHub 已經集成了對 .ipynb
的文件渲染的支持,你能夠直接將其存儲在其網站的倉庫和 gists 中。若是你還不知道,GitHub 是一個代碼託管平臺,用於爲使用 Git 建立的存儲庫進行版本控制和協做。你須要建立一個賬戶來使用他們的服務,同時 Github 標準賬戶是免費的。
當你有了 GitHub 帳戶,在 GitHub 上共享一個 notebook 最簡單的方法甚至都不須要 Git。自 2008 年以來, GitHub 爲託管和共享代碼片斷提供了Gist 服務,每一個代碼段都有本身的存儲庫。使用 Gists 共享一個 notebook:
.ipynb
文件, 全選而且拷貝里面的 JSON 。.iypnb
後綴,不然不能正常工做。這看起來應該是這樣的:
若是你建立了一個公共的 Gist,你如今就能夠和任何人分享它的 URL,其餘人將可以 fork 和 clone 你的工做。
建立本身的 Git 存儲庫並在 GitHub 上共享,這超出了本教程的範圍,可是 GitHub 提供了大量的指南可供你參考。
對於那些使用 git 的人來講,一個額外的技巧是在 .gitignore
中爲 Jupyter 建立的 .ipynb_checkpoints
目錄添加例外,由於咱們不須要將檢查點文件提交給到倉庫。
從 2015 年起,NBViewer 每一個星期都會渲染成千上萬的 notebook,它已然成了最受歡迎的 notebook 渲染器。若是你已經在某個地方把你的 Jupyter Notebook 放在網上,不管是 GitHub 仍是其餘地方,NBViewer 均可以讀取你的 notebook,並提供一個可共享的 URL。做爲項目 Jupyter 的一部分提供的免費服務,你能夠在 nbview.jupyter.org 找到相關服務。
最初是在 GitHub 的 Jupyter Notebook 集成以前開發的,NBViewer 容許任何人輸入 URL、Gist ID 或 GitHub username/repo/filename
,並將其做爲網頁呈現。一個 Gist 的 ID 是其 URL 末尾惟一的數字;例如,在 https://gist.github.com/username/50896401c23e0bf417e89e1de
中最後一個反斜槓後的字符串。若是你輸入了 GitHub username/repo/filename
,你將看到一個最小的文件瀏覽器,它容許你訪問用戶的倉庫及其內容。
NBViewer 顯示的 notebook 的 URL 是基於正在渲染的 notebook 的 URL 的而且不會改變,因此你能夠和任何人分享它,只要原始文件保持在線 —— NBViewer 不會緩存文件很長時間。
從基礎知識入手,咱們已經掌握了 Jupyter Notebook 的工做流程,深刻研究了IPython 的更多高級功能,並最終學會如何與朋友、同事和世界分享咱們的工做。咱們從一個筆記上完成了這一切!
能夠看到,notebook 是如何經過減小上下文切換和在項目中模擬天然的思惟發展的方式來提升工做經驗的。Jupyter Notebook。Jupyter Notebook 的功能也應該是顯而易見的,咱們已經介紹了大量的資源,讓你開始在本身的項目中探索更高級的特性。
若是你想爲本身的 Notebooks 提供更多的靈感,Jupyter 已經整理好了(一個有趣的 Jupyter Notebook 圖庫),你可能會發現它有幫助,而且你會發現 Nbviewer 的主頁連接到一些真正的高質量筆記本的例子。也能夠查看咱們的 Jupyter Notebooks 提示列表。
想了解更多關於 Jupyter Notebooks 的知識嗎?咱們有一個有指導的項目,你可能會感興趣。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。