初學者的 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 庫,包括 NumPy,pandas 和 Matplotlib,並且這完整的1000+列表是詳盡的。這使你可以在自己完備的數據科學研討會中運行,而不需要管理無數的安裝包或擔心依賴項和特定作業系統的安裝問題。
安裝 Anaconda:
1. 下載支援 Python 3 (就不用 Python 2.7 了)的最新版本 Anaconda。
2. 按照下載頁面或可執行文件中的說明安裝 Anaconda。
如果你是已經安裝了 Python 的更高級的用戶,並且更喜歡手動管理你的軟體包,那麼你可以使用pip:
1. pip3 install jupyter
2. 複製程式碼
創建你的第一個 Notebook
在本節中,我們將看到如何運行和保存 notebooks,熟悉它們的結構,並理解介面。我們將會熟悉一些核心術語,這些術語將引導你對如何使用 Jupyter notebooks 進行實際的理解,並為下一節做鋪墊,該部分將通過示例數據分析,並將我們在這裡學到的所有東西帶到生活中。
運行 Jupyter
在 Windows 上,你可以通過將 Anaconda 快捷方式添加到你的開始菜單來運行 Jupyter,它將在你的默認網頁瀏覽器中打開一個新的標籤,看起來就像下面的截圖一樣。
這是 Notebook Dashboard,專門用於管理 Jupyter Notebooks。把它看作是探索,編輯和創建 notebooks 的啟動面板。你可以把它看作是探索、編輯和創造你的 notebook 的發射台。
請注意,儀錶板將只允許您訪問 Jupyter 啟動目錄中包含的文件和子文件夾;但是,啟動目錄是可以更改的。還可以通過輸入 jupyter notebook 命令在任何系統上啟動指示板(或在Unix系統上的終端);在這種情況下,當前工作目錄將是啟動目錄。
聰明的讀者可能已經注意到,儀錶板的 URL 類似於 //localhost:8888/tree。Localhost 不是一個網站,而是表示從你的本地機器(你自己的電腦)中服務的內容。Jupyter notebook 和儀錶板都是 web 應用程式,Jupyter 啟動了一個本地的 Python 伺服器,將這些應用程式提供給你的 web 瀏覽器,使其從根本上獨立於平台,並打開了更容易在 web 上共享的大門。
儀錶板的介面大部分是不言自明的 —— 儘管我們稍後會簡要介紹它。我們還在等什麼?瀏覽到你想要創建你的第一個 notebook 的文件夾,點擊右上角的 New 下拉按鈕,選擇 Python 3 (或者你喜歡的版本)。
我們馬上能看到成果了!你的第一個 Jupyter Notebook 將在新標籤頁打開 - 每個 notebook 使用它自己的標籤,因為你可以同時打開多個 notebook。如果您切換回儀錶板,您將看到新文件 Untitled 。你應該看到一些綠色的文字告訴 notebook 正在運行。
什麼是 ipynb 文件?
理解這個文件到底是什麼是很有用的。每一個 .ipynb 文件是一個文本文件,它以一種名為 JSON 的格式描述你的 notebook 的內容。每個單元格及其內容,包括已被轉換成文本字元串的影像附件,都與一些元數據一起列出。你可以自己編輯這個 -- 如果你知道你在做什麼! -- 通過在 notebook 的菜單欄中選擇 "Edit > Edit Notebook Metadata"。
你還可以通過在儀錶板上的控制項中選擇 Edit 來查看你的 notebook 文件的內容,但是重要的是可以;除了好奇之外沒有理由這樣做,除非你真的知道你在做什麼。
notebook 的介面
既然你面前有一個打開的 notebook,它的介面就不會看起來完全陌生;畢竟,Jupyter 實際上只是一個高級的文字處理器。為什麼不看一看?查看菜單以了解它,尤其是花點時間瀏覽命令選項板(這是帶鍵盤圖標的小按鈕(或 Ctrl + Shift + P))下滾動命令列表。
您應該注意到兩個非常重要的術語,這對您來說可能是全新的:單元格和內核。它們是理解 Jupyter 和區分 Jupyter 不只是一個文字處理器的關鍵。幸運的是,這些概念並不難理解。
· 內核是一個「計算引擎」,它執行一個 notebook 文檔中包含的程式碼。
· 單元格是一個容器,用於裝載在 notebook 中顯示的文本或是會被 notebook 內核執行的程式碼。
單元格
稍後我們再討論內核,在這之前我們先來了解一下單元格。單元格構成一個筆記型電腦的主體。在上面一節的新建的 notebook 螢幕截圖中,帶有綠色輪廓的盒子是一個空的單元格。我們將介紹兩種主要的單元格類型:
· 程式碼單元包含要在內核中執行的程式碼,並在下面顯示它的輸出。
· Markdown 單元包含使用 Markdown 格式化的文本,並在運行時顯示其輸出。
新的 notebook 中的第一個單元總是一個程式碼單元。讓我們用一個經典的 hello world 示例來測試它。輸入 print('Hello World!') 到單元格中,點擊上面工具欄中的 run 按鈕,或者按下 Ctrl + Enter 鍵。結果應該是這樣的:
1. print('Hello World!')2. 複製程式碼
1. Hello World!
2. 複製程式碼
當你運行這個單元格時,它的輸出將會顯示在它的下面,而它左邊的標籤將會從 In [ ] 變為 In [1]。程式碼單元的輸出也是文檔的一部分,這就是為什麼你可以在本文中看到它的原因。你總是可以區分程式碼和 Markdown 單元,因為程式碼單元格在左邊有標籤,而 Markdown 單元沒有。標籤的「In」部分僅僅是「輸入」的縮寫,而標籤號表示在內核上執行單元格時的順序 —— 在這種情況下,單元格被第一個執行。再次運行單元格,標籤將更改為 In[2],因為此時單元格是在內核上運行的第二個單元格。這讓我們在接下來對內核的深入將非常有用。
從菜單欄中,單擊插入並選擇在下方插入單元格,創建你新的程式碼單元,並嘗試下面的程式碼,看看會發生什麼。你注意到有什麼不同嗎?
1. import time
2. time.sleep(3)
3. 複製程式碼
這個單元不產生任何輸出,但執行需要 3 秒。請注意,Jupyter 將標籤更改為 In[*] 來表示單元格當前正在運行。
一般來說,單元格的輸出來自於單元執行過程中指定列印的任何文本數據,以及單元格中最後一行的值,無論是單獨變數,函數調用還是其他內容。例如:
1. def say_hello(recipient):
2. return 'Hello, {}!'.format(recipient)3.
4. say_hello('Tim')5. 複製程式碼
1. 'Hello, Tim!'
2. 複製程式碼
你會發現自己經常在自己的項目中使用它,以後我們會看到更多。
鍵盤快捷鍵
在運行單元格時,你可能經常看到它們的邊框變成了藍色,而在編輯的時候它是綠色的。總是有一個「活動」單元格突出顯示其當前模式,綠色表示「編輯模式」,藍色表示「命令模式」。
到目前為止,我們已經看到了如何使用 Ctrl + Enter 來運行單元格,但是還有很多。鍵盤快捷鍵是 Jupyter 環境中非常流行的一個方面,因為它們促進了快速的基於單元格的工作流。許多這些都是在命令模式下可以在活動單元上執行的操作。
下面,你會發現一些 Jupyter 的鍵盤快捷鍵列表。你可能不會馬上熟悉它們,但是這份清單應該讓你對這些快捷鍵有了了解。
· 在編輯和命令模式之間切換,分別使用 Esc 和 Enter。
· 在命令行模式下:
· 用 Up 和 Down 鍵向上和向下滾動你的單元格。
· 按 A 或 B 在活動單元上方或下方插入一個新單元。
· M 將會將活動單元格轉換為 Markdown 單元格。
· Y 將激活的單元格設置為一個程式碼單元格。
· D + D(按兩次 D)將刪除活動單元格。
· Z將撤銷單元格刪除。 * 按住 Shift,同時按 Up 或 Down ,一次選擇多個單元格。
· 選擇了 multple,Shift + M 將合併你的選擇。
· Ctrl + Shift + -,在編輯模式下,將在游標處拆分活動單元格。
· 你也可以在你的單元格的左邊用 Shift + Click 來選擇它們。
你可以在自己的 notebook 上試試這些。一旦你有了嘗試,創建一個新的 Markdown 單元,我們將學習如何在我們的 notebook 中格式化文本。
Markdown
Markdown 是一種輕量級的、易於學習的標記語言,用于格式化純文本。它的語法與 HTML 標記有一對一的對應關係,所以這裡的一些經驗是有用的,但絕對不是先決條件。請記住,這篇文章是在一個 Jupyter notebook 上寫的,所以你所看到的所有的敘述文本和圖片都是在 Markdown 完成的。讓我們用一個簡單的例子來介紹基礎知識。
1. # 這是一級標題。
2. ## 這是一個二級標題。
3. 這是一些構成段落的純文本。
4. 通過 **粗體** 和 __bold__ ,或 *斜體* 和 _italic_ 添加重點。
5.
6. 段落必須用空行隔開。
7.
8. * 有時我們想要包含列表。
9. * 可以縮進。
10.
11. 1. 列表也可以編號。
12. 2. 有序列表。
13.
14. [有可能包括超鏈接](//www.example.com)
15.
16. 內聯程式碼使用單個倒引號:`foo()`,程式碼塊使用三個倒引號:
17.
18. \```
19. \bar()
20. \```
21.
22. 或可由4個空格組成:
23.
24. foo()
25.
26. 最後,添加圖片也很簡單:
27. 複製程式碼
當附加影像時,你有三個選項:
· 使用一個在 web 上的影像的 URL。
· 使用一個與你的 notebook 一起維護的本地 URL,例如在同一個 git 倉庫中。
· 通過 "Edit > Insert Image" 添加附件;這將把影像轉換成字元串並存儲在你的 notebook 中的 .ipynb 文件。
· 注意這將使你的 .ipynb 的文件更大!
Markdown 有很多細節,特別是在超鏈接的時候,也可以簡單地包括純 HTML。一旦你發現自己突破了上述基礎的限制,你可以參考 Markdown 創造者 John Gruber 的官方指南。
內核
每個 notebook 後台都運行一個內核。當你運行一個程式碼單元時,該程式碼在內核中執行,任何輸出都會返回到要顯示的單元格。在單元格間切換時內核的狀態保持不變 —— 它與文檔有關,而不是單個的單元格。
例如,如果你在一個單元中導入庫或聲明變數,那麼它們將在另一個單元中可用。通過這種方式,你可以將 notebook 文檔看作是與腳本文件相當的,除了它是多媒體。讓我們試著去感受一下。首先,我們將導入一個 Python 包並定義一個函數。
1. import numpy as np
2.
3. def square(x):
4. return x * x
5. 複製程式碼
一旦我們執行了上面的單元格,我們就可以在任何其他單元中引用 np和 square。
1. x = np.random.randint(1, 10)
2. y = square(x)
3.
4. print('%d squared is %d' % (x, y))5. 複製程式碼
1. 1 squared is 1
2. 複製程式碼
不管你的 notebook 里的單元格順序如何,這都是可行的。你可以自己試一下,讓我們再把變數列印出來。
1. print('Is %d squared is %d?' % (x, y))2. 複製程式碼
1. Is 1 squared is 1?
2. 複製程式碼
答案毫無疑問。讓我們嘗試改變 y。
1. y = 10
2. 複製程式碼
如果我們再次運行包含 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 的應用程式中命名或重命名你的 notebook,而必須使用儀錶盤或你的文件瀏覽器來重命名 .ipynb 文件。我們將返回到儀錶板,以重命名你之前創建的文件,它將有默認的 notebook 的文件名是 Untitled.ipynb 。
你不能在 notebook 運行時重命名它,所以你首先要關閉它。最簡單的方法就是從 notebook 菜單中選擇 「File > Close and Halt」。但是,您也可以通過在筆記型電腦應用程式內 「Kernel > Shutdown」 或在儀錶板中選擇 notebook 並點擊 「Shutdown」 (見下圖)來關閉內核。
然後你可以選擇你的 notebook,並在儀錶板控制項中點擊 「Rename」。
注意,在你的瀏覽器中關閉筆記的標籤頁將不會像在傳統的應用程式中關閉文檔的方式一樣關閉你的 notebook。notebook 的內核將繼續在後台運行,需要在真正「關閉」之前停止運行 —— 不過如果你不小心關掉了你的標籤或瀏覽器,這就很方便了!如果內核被關閉,你可以關閉該選項卡,而不用擔心它是否還在運行。
如果你給你的 notebook 起了名字,打開它,我們就可以開始實踐了。
設置
通常一開始就使用一個專門用於導入和設置的程式碼單元,因此如果你選擇添加或更改任何內容,你可以簡單地編輯和重新運行該單元,而不會產生任何副作用。
1. %matplotlib inline
2.
3. import pandas as pd
4. import matplotlib.pyplot as plt
5. import seaborn as sns
6.
7. sns.set()
8. 複製程式碼
我們導入 pandas 來處理我們的數據,Matplotlib 繪製圖表,Seaborn 使我們的圖表更美。導入 NumPy 也是很常見的,但是在這種情況下,雖然我們使用的是 pandas,但我們不需要顯式地使用它。第一行不是 Python 命令,而是使用一種叫做行魔法的東西來指示 Jupyter 捕獲 Matplotlib 圖並在單元輸出中呈現它們;這是超出本文範圍的一系列高級特性之一。
讓我們來載入數據。
1. df = pd.read_csv('fortune500.csv')2. 複製程式碼
在單個單元格中這樣做也是明智的,因為我們需要在任何時候重新載入它。
保存和檢查點
現在我們已經開始了,最好的做法是定期存儲。按 Ctrl + S 鍵可以通過調用「保存和檢查點」命令來保存你的 notebook,但是這個檢查點又是什麼呢?
每當你創建一個新的 notebook 時,都會創建一個檢查點文件以及你的 notebook 文件;它將位於你保存位置的隱藏子目錄中稱作 .ipynb_checkpoints,也是一個 .ipynb 文件。默認情況下,Jupyter 將每隔 120 秒自動保存你的 notebook,而不會改變你的主 notebook 文件。當你「保存和檢查點」時,notebook 和檢查點文件都將被更新。因此,檢查點使你能夠在發生意外事件時恢復未保存的工作。你可以通過 「File > Revert to Checkpoint「 從菜單恢復到檢查點。
調查我們的數據集
我們正在穩步前進!我們的筆記已經被安全保存,我們將數據集 df 載入到最常用的 pandas 數據結構中,這被稱為 DataFrame ,看起來就像一張表格。那我們的數據集會是怎樣的?
1. df.head()
2. 複製程式碼
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 |
1. df.tail()
2. 複製程式碼
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 |
看上去不錯。我們有需要的列,每一行對應一個公司一年的財務數據。
讓我們重命名這些列,以便稍後引用它們。
1. df.columns = ['year', 'rank', 'company', 'revenue', 'profit']
2. 複製程式碼
接下來,我們需要探索我們的數據集,它是否完整? pandas 是按預期讀的嗎?缺少值嗎?
1. len(df)
2. 複製程式碼
1. 25500
2. 複製程式碼
好吧,看起來不錯 —— 從 1955 年到 2005 年,每年都有 500 行。
讓我們檢查我們的數據集是否如我們預期的那樣被導入。一個簡單的檢查就是查看數據類型(或 dtypes)是否被正確地解釋。
1. df.dtypes
2. 複製程式碼
1. year int64
2. rank int64
3. company object
4. revenue float64
5. profit object
6. dtype: object
7. 複製程式碼
看起來利潤欄有點問題 —— 我們希望它像收入欄一樣是 float64。這表明它可能包含一些非整數值,所以讓我們看一看。
1. non_numberic_profits = df.profit.str.contains('[^0-9.-]')2. df.loc[non_numberic_profits].head()
3. 複製程式碼
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. |
就像我們猜測的那樣!其中一些值是字元串,用於表示丟失的數據。還有其他缺失的值么?
1. set(df.profit[non_numberic_profits])
2. 複製程式碼
1. {'N.A.'}2. 複製程式碼
這很容易解釋,但是我們應該怎麼做呢?這取決於缺失了多少個值。
1. len(df.profit[non_numberic_profits])
2. 複製程式碼
1. 369
2. 複製程式碼
它只是我們數據集的一小部分,雖然不是完全無關緊要,因為它仍然在 1.5% 左右。如果包含 N.A. 的行是簡單地、均勻地按年分布的,那最簡單的解決方案就是刪除它們。所以讓我們瀏覽一下分布。
1. bin_sizes, _, _ = plt.hist(df.year[non_numberic_profits], bins=range(1955, 2006))
2. 複製程式碼
粗略地看,我們可以看到,在一年中無效值最多的情況也小於 25,並且由於每年有 500 個數據點,刪除這些值在最糟糕的年份中只佔不到 4% 的數據。事實上,除了 90 年代的激增,大多數年份的缺失值還不到峰值的一半。為了我們的目的,假設這是可以接受的,然後移除這些行。
1. df = df.loc[~non_numberic_profits]
2. df.profit = df.profit.apply(pd.to_numeric)
3. 複製程式碼
我們看看有沒有生效。
1. len(df)
2. 複製程式碼
1. 25131
2. 複製程式碼
1. df.dtypes
2. 複製程式碼
1. year int64
2. rank int64
3. company object
4. revenue float64
5. profit float64
6. dtype: object
7. 複製程式碼
不錯!我們已經完成了數據集的設置。
如果你要將 notebook 做成一個報告,你可以不使用我們創建的研究的單元格,包括這裡的演示使用 notebook 的工作流,合併相關單元格(請參閱下面的高級功能部分)並創建一個數據集設置單元格。這意味著如果我們把我們的數據放在別處,我們可以重新運行安裝單元來恢復它。
使用 matplotlib 進行繪圖
接下來,我們可以通過計算年平均利潤來解決這個問題。我們不妨把收入也畫出來,所以首先我們可以定義一些變數和一種方法來減少我們的程式碼。
1. group_by_year = df.loc[:, ['year', 'revenue', 'profit']].groupby('year')2. avgs = group_by_year.mean()
3. x = avgs.index
4. y1 = avgs.profit
5.
6. def plot(x, y, ax, title, y_label):
7. ax.set_title(title)
8. ax.set_ylabel(y_label)
9. ax.plot(x, y)
10. ax.margins(x=0, y=0)
11. 複製程式碼
現在讓我們開始畫圖。
1. fig, ax = plt.subplots()
2. plot(x, y1, ax, 'Increase in mean Fortune 500 company profits from 1955 to 2005', 'Profit (millions)')
3. 複製程式碼
它看起來像一個指數,但它有一些大的凹陷。它們一定是對應於上世紀 90 年代初的經濟衰退和 互聯網泡沫。在數據中能看到這一點非常有趣。但為什麼每次經濟衰退後,利潤都能恢復到更高的水平呢?
也許收入能告訴我們更多。
1. y2 = avgs.revenue
2. fig, ax = plt.subplots()
3. plot(x, y2, ax, 'Increase in mean Fortune 500 company revenues from 1955 to 2005', 'Revenue (millions)')
4. 複製程式碼
這為故事增添了另一面。收入幾乎沒有受到嚴重打擊,財務部門的會計工作做得很好。
藉助 Stack Overflow 上的幫助,我們可以用 +/- 它們的標準偏移來疊加這些圖。
1. def plot_with_std(x, y, stds, ax, title, y_label):
2. ax.fill_between(x, y - stds, y + stds, alpha=0.2)
3. plot(x, y, ax, title, y_label)
4.
5. fig, (ax1, ax2) = plt.subplots(ncols=2)
6. title = 'Increase in mean and std Fortune 500 company %s from 1955 to 2005'
7. stds1 = group_by_year.std().profit.as_matrix()
8. stds2 = group_by_year.std().revenue.as_matrix()
9. plot_with_std(x, y1.as_matrix(), stds1, ax1, title % 'profits', 'Profit (millions)')
10. plot_with_std(x, y2.as_matrix(), stds2, ax2, title % 'revenues', 'Revenue (millions)')
11. fig.set_size_inches(14, 4)
12. fig.tight_layout()
13. 複製程式碼
這是驚人的,標準偏差是巨大的。一些財富 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."
這看起來應該是這樣的:
如果你創建了一個公共的 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 末尾唯一的數字;例如,在 //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、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。
轉載於://juejin.im/post/5af8d3776fb9a07ab7744dd0
jupyter notebook 基本使用
如果按照上面的操作進行配置後,啟動notebooks後的首頁應該是這個樣子的

下面對首頁上的功能按鈕進行基本說明:

第一部分介紹:
Files:列出所有文件
Running:展示你當前打開的終端和筆記型電腦
Clusters:由 IPython 並行提供的(emmmmm,暫時也沒使用過)
第二部分介紹:
點擊右側的New按鈕可展開如圖的下拉列表按鈕,其內包括了可創建的四種工作環境:
Python3:創建一個可以執行python程式碼的文件(後面詳細介紹)
Text File:創建文本類型的文件,後綴名為.txt
Folder:創建一個文件夾
Teminal:在瀏覽器中打開一的命令窗口
第三部分介紹:
這裡的按鈕其實就是對當前工作空間內的文件進行複製、重命名等的一系列操作:
Duplicate:複製文件
Rename:重命名
Move:移動文件
Download:下載文件
View:在瀏覽器中預覽文件內容
Edit:編輯文件
Delete(小圖標):刪除選中的文件
jupyter notebook 中編寫並執行python程式碼
在首頁右側點擊New,選擇點擊Python3,頁面即跳轉到一個新的窗口,此時已經創建了一個新的文件,紅色區域為該文件的名稱(默認為Untitled),點擊即可修改文件名,此處我們命名為test,如下所示,

在In [ ] :後面的輸入框中我們可以輸入一段python程式碼進行測試,點擊Run按鈕執行,也可以快捷鍵Ctrl+Enter執行程式碼,結果如下

Jupyter Notebooks 的強大之處在於除了能夠輸入程式碼之外,你還可以用 Markdown 添加敘述性和解釋性文本。比如我想添加一個文字說明,在程式碼上面添加了一個單元格,並以 Markdown 輸入了一個文本。按下Ctrl+Enter,效果如下:

jupyter notebook 中的快捷鍵介紹
當你熟練使用notebooks的基本功能後,掌握他的快捷鍵是十分必要的,這樣可以大大提高你的工作效率。下面是一些比較常用的快捷鍵:
編輯模式:點擊單元格按下Enter
命令模式(退出編輯模式):Esc
進入命令模式之後(此時你沒有活躍單元),有以下快捷鍵:
A:在所選單元之上插入一個新的單元
B:在所選單元之下插入一個新的單元
D:連續按兩次刪除所選的單元
Z:撤銷被刪除的單元
Y:將當前選中的單元變成一個程式碼單元
F:查找和替換
Shift +上或下箭頭:可選擇多個單元。
Shift + M:在多選模式時,可合併你的選擇。
處於編輯模式時(在命令模式時按 Enter 會進入編輯模式),下列快捷鍵很有用:
Ctrl + Home :到達單元起始位置
Ctrl + S :保存進度
Ctrl + Enter :會運行你的整個單元塊
Alt + Enter :不止會運行你的單元塊,還會在下面添加一個新單元
Ctrl + Shift + F :打開命令面板
可在命令模式按 H 或進入Help > Keyboard Shortcuts。可以查看鍵盤快捷鍵完整列表。如下:

總結
關於notebooks的安裝和基本用法就先介紹到這裡了,有興趣的朋友不妨動手安裝一個試試。
參考和感謝
//baijiahao.baidu.com/s?id=1601883438842526311&wfr=spider&for=pc