[譯] 給初學者的 Jupyter Notebook 教程

Uncho發表於2018-05-14

給初學者的 Jupyter Notebook 教程

Jupyter Notebook 是一個非常強大的工具,常用於互動式地開發和展示資料科學專案。它將程式碼和它的輸出整合到一個文件中,並且結合了可視的敘述性文字、數學方程和其他豐富的媒體。它直觀的工作流促進了迭代和快速的開發,使得 notebook 在當代資料科學、分析和越來越多的科學研究中越來越受歡迎。最重要的是,作為開源專案的一部分,它們是完全免費的。

Jupyter 專案是早期 IPython Notebook 的繼承者,它在 2010 年首次作為原型釋出。儘管在 Jupyter Notebook 中可以使用許多不同的程式語言,但本文將重點介紹 Python,因為在 Jupyter Notebook 中 python 是最常見的。

為了充分理解本教程,你應該熟悉程式設計,特別是 Python 和 pandas(譯者注:Pandas 是python的一個資料分析包)。也就是說,如果你有程式設計經驗,這篇文章中的 Python 不會太陌生,而 pandas 也是容易理解的。Jupyter Notebooks 也可以作為一個靈活的平臺來執行 pandas 甚至是 Python,這將在這篇文章中體現。

我們將會:

  • 介紹一些安裝 Jupyter 和建立你的第一個 notebook 的基本知識。
  • 深入鑽研,學習所有重要的術語。
  • 探索筆記是如何輕鬆地在網上共享和釋出。事實上,這篇文章就是一個 Jupyter notebook!這裡的一切都是在 Jupyter notebook 環境中編寫的,而你正在以只讀的形式檢視它。

Jupyter Notebook 資料分析例項

我們將通過一個樣本分析,來回答一個真實的問題,這樣你就可以看到一個 notebook 的工作流是如何使任務直觀地完成的,當我們分享給其他人時也可以讓其他人更好地理解。

假設你是一名資料分析師,你的任務是弄清楚美國最大公司的利潤變化歷史。你會發現自從 1955 年第一次發表這個名單以來,已有超過 50 年的財富 500 強企業的資料集,這些資料都是從《財富》的公共檔案中收集來的。我們已經建立了一個可用資料的 CSV 檔案(你可以在這裡獲取它)。

正如我們將要演示的,Jupyter Notebooks 非常適合這項調查。首先,讓我們安裝 Jupyter。

安裝

初學者開始使用 Jupyter Notebooks 的最簡單方法是安裝 Anaconda。Anaconda 是最廣泛使用的用於資料科學的 Python 發行版,並且預裝了所有常用的庫和工具。除了 Jupyter 之外,Anaconda 中還封裝了一些 Python 庫,包括 NumPypandasMatplotlib,並且這完整的1000+列表是詳盡的。這使你可以在自己完備的資料科學研討會中執行,而不需要管理無數的安裝包或擔心依賴項和特定作業系統的安裝問題。

安裝 Anaconda:

  1. 下載支援 Python 3 (就不用 Python 2.7 了)的最新版本 Anaconda。
  2. 按照下載頁面或可執行檔案中的說明安裝 Anaconda。

如果你是已經安裝了 Python 的更高階的使用者,並且更喜歡手動管理你的軟體包,那麼你可以使用pip:

pip3 install jupyter
複製程式碼

建立你的第一個 Notebook

在本節中,我們將看到如何執行和儲存 notebooks,熟悉它們的結構,並理解介面。我們將會熟悉一些核心術語,這些術語將引導你對如何使用 Jupyter notebooks 進行實際的理解,併為下一節做鋪墊,該部分將通過示例資料分析,並將我們在這裡學到的所有東西帶到生活中。

執行 Jupyter

在 Windows 上,你可以通過將 Anaconda 快捷方式新增到你的開始選單來執行 Jupyter,它將在你的預設網頁瀏覽器中開啟一個新的標籤,看起來就像下面的截圖一樣。

Jupyter control panel

這是 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 (或者你喜歡的版本)。

New notebook menu

我們馬上能看到成果了!你的第一個 Jupyter Notebook 將在新標籤頁開啟 - 每個 notebook 使用它自己的標籤,因為你可以同時開啟多個 notebook。如果您切換回儀表板,您將看到新檔案 Untitled 。你應該看到一些綠色的文字告訴 notebook 正在執行。

什麼是 ipynb 檔案?

理解這個檔案到底是什麼是很有用的。每一個 .ipynb 檔案是一個文字檔案,它以一種名為 JSON 的格式描述你的 notebook 的內容。每個單元格及其內容,包括已被轉換成文字字串的影象附件,都與一些後設資料一起列出。你可以自己編輯這個 -- 如果你知道你在做什麼! -- 通過在 notebook 的選單欄中選擇 "Edit > Edit Notebook Metadata"。

你還可以通過在儀表板上的控制元件中選擇 Edit 來檢視你的 notebook 檔案的內容,但是重要的是可以;除了好奇之外沒有理由這樣做,除非你真的知道你在做什麼。

notebook 的介面

既然你面前有一個開啟的 notebook,它的介面就不會看起來完全陌生;畢竟,Jupyter 實際上只是一個高階的文書處理器。為什麼不看一看?檢視選單以瞭解它,尤其是花點時間瀏覽命令選項板(這是帶鍵盤圖示的小按鈕(或 Ctrl + Shift + P))下滾動命令列表。

New Jupyter Notebook

您應該注意到兩個非常重要的術語,這對您來說可能是全新的:單元格核心。它們是理解 Jupyter 和區分 Jupyter 不只是一個文書處理器的關鍵。幸運的是,這些概念並不難理解。

  • 核心是一個“計算引擎”,它執行一個 notebook 文件中包含的程式碼。
  • 單元格是一個容器,用於裝載在 notebook 中顯示的文字或是會被 notebook 核心執行的程式碼。

單元格

稍後我們再討論核心,在這之前我們先來了解一下單元格。單元格構成一個筆記本的主體。在上面一節的新建的 notebook 螢幕截圖中,帶有綠色輪廓的盒子是一個空的單元格。我們將介紹兩種主要的單元格型別:

  • 程式碼單元包含要在核心中執行的程式碼,並在下面顯示它的輸出。
  • Markdown 單元包含使用 Markdown 格式化的文字,並在執行時顯示其輸出。

新的 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 的鍵盤快捷鍵列表。你可能不會馬上熟悉它們,但是這份清單應該讓你對這些快捷鍵有了瞭解。

  • 在編輯和命令模式之間切換,分別使用 EscEnter
  • 在命令列模式下:
    • UpDown 鍵向上和向下滾動你的單元格。
    • AB 在活動單元上方或下方插入一個新單元。
    • M 將會將活動單元格轉換為 Markdown 單元格。
    • Y 將啟用的單元格設定為一個程式碼單元格。
    • D + D(按兩次 D)將刪除活動單元格。
    • Z將撤銷單元格刪除。    * 按住 Shift,同時按 UpDown ,一次選擇多個單元格。
      • 選擇了 multple,Shift + M 將合併你的選擇。
  • Ctrl + Shift + -,在編輯模式下,將在游標處拆分活動單元格。
  • 你也可以在你的單元格的左邊用 Shift + Click 來選擇它們。

你可以在自己的 notebook 上試試這些。一旦你有了嘗試,建立一個新的 Markdown 單元,我們將學習如何在我們的 notebook 中格式化文字。

Markdown

Markdown 是一種輕量級的、易於學習的標記語言,用於格式化純文字。它的語法與 HTML 標記有一對一的對應關係,所以這裡的一些經驗是有用的,但絕對不是先決條件。請記住,這篇文章是在一個 Jupyter notebook 上寫的,所以你所看到的所有的敘述文字和圖片都是在 Markdown 完成的。讓我們用一個簡單的例子來介紹基礎知識。

# 這是一級標題。
## 這是一個二級標題。
這是一些構成段落的純文字。
通過 **粗體**__bold__ ,或 *斜體*_italic_ 新增重點。

段落必須用空行隔開。

* 有時我們想要包含列表。
  * 可以縮排。

1. 列表也可以編號。
2. 有序列表。

[有可能包括超連結](https://www.example.com)

內聯程式碼使用單個倒引號:`foo()`,程式碼塊使用三個倒引號:

\```
\bar()
\```

或可由4個空格組成:

    foo()

最後,新增圖片也很簡單:![Alt](https://www.example.com/image.jpg)
複製程式碼

當附加影象時,你有三個選項:

  • 使用一個在 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
複製程式碼

一旦我們執行了上面的單元格,我們就可以在任何其他單元中引用 npsquare

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。資料科學家可能特別感興趣的是 RJulia,以及 imatlabCalysto MATLAB核心SoS 核心在一個 notebook 中提供多語言支援。每個核心都有自己的安裝指令,但可能需要您在計算機上執行一些命令。

例項分析

現在我們已經看了一個 Jupyter Notebook,是時候看看它們在實踐中使用了,這應該會讓你更清楚地瞭解它們為什麼那麼受歡迎。現在是時候開始使用前面提到的財富 500 資料集了。請記住,我們的目標是瞭解美國最大公司的利潤在歷史上是如何變化的。

值得注意的是,每個人都會有自己的喜好和風格,但是一般原則仍然適用,如果你願意,你可以在自己的 notebook 上跟隨這一段,這也給了你自由發揮空間。

命名你的 notebook

在開始編寫專案之前,你可能想要給它一個有意義的名稱。也許有點讓人困惑,你不能從 Notebook 的應用程式中命名或重新命名你的 notebook,而必須使用儀表盤或你的檔案瀏覽器來重新命名 .ipynb 檔案。我們將返回到儀表板,以重新命名你之前建立的檔案,它將有預設的 notebook 的檔名是 Untitled.ipynb

你不能在 notebook 執行時重新命名它,所以你首先要關閉它。最簡單的方法就是從 notebook 選單中選擇 “File > Close and Halt”。但是,您也可以通過在筆記本應用程式內 “Kernel > Shutdown” 或在儀表板中選擇 notebook 並點選 “Shutdown” (見下圖)來關閉核心。

A running notebook

然後你可以選擇你的 notebook,並在儀表板控制元件中點選 “Rename”。

A running notebook

注意,在你的瀏覽器中關閉筆記的標籤頁將不會像在傳統的應用程式中關閉文件的方式一樣關閉你的 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))
複製程式碼

Missing value distribution

粗略地看,我們可以看到,在一年中無效值最多的情況也小於 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 的工作流,合併相關單元格(請參閱下面的高階功能部分)並建立一個資料集設定單元格。這意味著如果我們把我們的資料放在別處,我們可以重新執行安裝單元來恢復它。

使用 matplotlib 進行繪圖

接下來,我們可以通過計算年平均利潤來解決這個問題。我們不妨把收入也畫出來,所以首先我們可以定義一些變數和一種方法來減少我們的程式碼。

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)')
複製程式碼

Increase in mean Fortune 500 company profits from 1955 to 2005

它看起來像一個指數,但它有一些大的凹陷。它們一定是對應於上世紀 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)')
複製程式碼

Increase in mean Fortune 500 company revenues from 1955 to 2005

這為故事增添了另一面。收入幾乎沒有受到嚴重打擊,財務部門的會計工作做得很好。

藉助 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()
複製程式碼

jupyter-notebook-tutorial_48_0

這是驚人的,標準偏差是巨大的。一些財富 500 強的公司賺了數十億,而另一些公司卻損失了數十億美元,而且隨著這些年來利潤的增長,風險也在增加。也許有些公司比其他公司表現更好;前 10% 的利潤是否或多或少會比最低的10%穩定一些?

接下來我們有很多問題可以看,很容易看到在 notebook 上的工作流程是如何與自己的思維過程相匹配的,所以現在是時候為這個例子畫上句號了。這一流程幫助我們在無需切換應用程式的情況下輕鬆地研究我們的資料集,並且我們的工作可以立即共享和重現。如果我們希望為特定的目標人群建立一個更簡潔的報告,我們可以通過合併單元和刪除中間程式碼來快速重構我們的工作。

分享你的 notebook

當人們談論分享他們的 notebook 時,他們通常會考慮兩種模式。大多數情況下,個人共享其工作的最終結果,就像本文字身一樣,這意味著共享非互動式的、預渲染的版本的 notebook;然而,也可以在 notebook 上藉助諸如 Git 這樣的輔助版本控制系統進行協作。

也就是說,有一些新興的公司在 web 上提供了在雲中執行互動式 Jupyter Notebook 的能力。

在你分享之前

當你匯出或儲存它時,共享的 notebook 將會以被匯出或儲存的那一刻的狀態顯示,包括所有程式碼單元的輸出。因此,為了確保你的 notebook 是共享的,你可以在分享之前採取一些步驟:

  1. 點選 "Cell > All Output > Clear"
  2. 點選 "Kernel > Restart & Run All"
  3. 等待您的程式碼單元完成執行,並檢查它們是否按預期執行。

這將確保你的 notebook 不包含中間輸出,不包含陳舊的狀態,並在共享時按順序執行。

匯出你的 notebook

Jupyter 內建支援匯出 HTML 和 PDF 以及其他幾種格式,你可以在 File > Download As 選單下找到。如果你希望與一個小型的私有組共享你的 notebook,這個功能很可能是你所需要的。事實上,許多學術機構的研究人員都有一些公共或內部的網路空間,因為你可以將一個 notebook 匯出到一個 HTML 檔案中,Jupyter notebook 可以成為他們與同行分享成果的一種特別方便的方式。

但是,如果共享匯出的檔案並不能讓你滿意,那麼還有一些更直接的非常流行的共享 .ipynb 檔案到網上的方法。

GitHub

截止到 2018 年初,GitHub 上的公共 notebook 數量超過了 180 萬,它無疑是最受歡迎的與世界分享 Jupyter 專案的獨立平臺。GitHub 已經整合了對 .ipynb 的檔案渲染的支援,你可以直接將其儲存在其網站的倉庫和 gists 中。如果你還不知道,GitHub 是一個程式碼託管平臺,用於為使用 Git 建立的儲存庫進行版本控制和協作。你需要建立一個帳戶來使用他們的服務,同時 Github 標準帳戶是免費的。

當你有了 GitHub 賬戶,在 GitHub 上共享一個 notebook 最簡單的方法甚至都不需要 Git。自 2008 年以來, GitHub 為託管和共享程式碼片段提供了Gist 服務,每個程式碼段都有自己的儲存庫。使用 Gists 共享一個 notebook:

  1. 登入並且瀏覽 gist.github.com
  2. 用檔案編輯器開啟 .ipynb 檔案, 全選並且拷貝里面的 JSON 。
  3. 將筆記的 JSON 貼上到中 gist 中。
  4. 給你的 Gist 命名, 記得新增 .iypnb 字尾,否則不能正常工作。
  5. 點選 "Create secret gist"或者 "Create public gist."

這看起來應該是這樣的:

Creating a Gist

如果你建立了一個公共的 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 的知識嗎?我們有一個有指導的專案,你可能會感興趣。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章