原文連結:https://www.dataquest.io/blog/jupyter-notebook-tutorial/
Jupyter notebook 是一個很強大的交互式和展示數據科學項目的工具,它可以作為一個開發文檔,包含代碼、解釋說明文字、代碼運行結果、數學公式等等,功能非常強大,也是現在非常流行的工具。
本文會通過一個簡單的數據分析例子來介紹 Jupyter notebook 的使用方法。這裡的例子就是給定一個自 1955 年發布以來,一共 50 年時間的美國 500 家公司的數據,任務是分析這些公司的利潤變化過程。
1. 安裝最簡單的安裝方式就是通過 Anaconda 進行安裝,Anaconda 是使用最廣泛的環境管理工具,並且它可以預先安裝很多常用的第三方庫,包括 numpy 、pandas 、matplotlib 等。
具體的 Anaconda 可以查看之前公眾號發表過的一篇文章--Python 基礎入門--簡介和環境配置。
除了通過 Anaconda 安裝,也可以直接採用 pip
pip install jupyter
這一部分將介紹如何運行和保存 notebooks,熟悉 Jupyter notebook 的結構和交互界面。這裡將通過一個例子來熟悉一些核心的用法,更好的了解 Jupyter notebook 的使用。
運行 Jupyter在 Windows,可以通過添加到開始菜單的快捷方式運行 Jupyter ,當然也可以通過在命令行輸入命令 jupyter notebook 開始運行,然後會在默認瀏覽器中打開一個新的窗口,窗口內容如下:
當然上述還不是一個 notebook,它是 Notebook 的管理界面,用於管理當前文件夾的所有 Notebooks。
注意,這裡僅僅展示 Jupyter 運行時候的所在文件夾內的文件和文件夾,也就是在命令行運行 jupyter notebook 時所在的文件夾,當然這個也可以改變,運行命令的時候可以指定文件夾位置,即輸入:
jupyter notebook filepath
此外,這裡在瀏覽器上的 URL 地址是類似 http://localhost:8888/tree,其中 localhost 是表示本地地址,然後 8888 是埠。
接下來就是創建一個新的 notebook,可以如下圖所示,在管理界面的右上角位置,點擊 New 菜單,這裡就可以選擇 Python 3 (或者其他的版本),然後就可以創建成功,並且是在新的窗口打開這個 notebook,在默認命名就是 Untitled.ipynb。
ipynb 文件每個 ipynb 文件都是通過 JSON 格式來描述 notebook 的內容,包括每個單元及其內容,都是通過 metadata 的格式展示。這裡可以在打開 ipynb 文件後,菜單中選擇 Edit->Edit Notebook Metadata ,進行編輯。
notebook 界面現在開始介紹下 notebook 的界面信息,一個新的 notebook 界面如下圖所示。
這裡有兩個術語需要知道--cells 和 kernels ,兩個都是非常重要的術語:
單元(Cells)首先介紹的是 Cells ,一個 Cell 就是上圖中綠色框部分,它是 notebook 的主要部分,通常有兩種主要的 cell 類似:
下圖展示了一個簡單的例子,第一行 Jupyter 入門教程 這個就是一個 Markdown cell ,這裡展示的是執行這個 cell 的結果,如果需要執行一個 cell ,可以點擊 Run 按鈕,或者快捷鍵 Ctrl + Enter 即可,然後下方兩個都是 code cell ,第一個是導入第三方庫,第二個則是列印一段話以及其運行結果。
可以注意到 code cell 的左側會有一個標籤 In [1] ,這裡的數字表示該代碼塊運行的次序,即在該 notebook 中,如果沒有執行,顯示的是 In [ ] ,如果是該 notebook 第一個運行的代碼塊,則是 In [1] ,如果再次運行,則顯示 In [2],依次類推,同個代碼塊多次執行,這個數字也是會改變的。而 In 是 Input 的縮寫。如果代碼塊運行時間有點久,它會顯示 In [*] ,表示當前代碼塊正在運行中。
對於 notebook,還可以直接展示變量的數值,或者是函數的返回值,不需要調用 print 函數,如下圖所示,當然它只會列印當前單元的最後一行的內容。
還需要注意的一件事情就是,對於一個單元,如果正在編輯,其邊界框顯示的是綠色,而運行時候則顯示藍色。這裡展示的就是兩種模式,即綠色表示編輯模式,藍色表示命令模式。
快捷鍵notebook 有很多快捷鍵,可以通過菜單中的 Help->Keyboard Shortcuts 查看,也可以直接用快捷鍵 Ctrl+Shift+P 查看。下面簡單介紹一些快捷鍵:
在命令模式下:
在 cell 之間上下瀏覽採用上下箭頭,或者 Up 和 Down 鍵
A 表示在當前 cell 上方插入一個新的 cell ,而 B 則是下方插入新的cell
M 表示變為 Markdown cell ,而 Y 是表示變為 code cell
連續按兩次 D 是刪除當前 cell
Z 是撤銷操作
Shift 加上 Up 或者 Down 可以一次選擇多個 cells ,接著採用 Shift + M 可以合併多個 cells
MarkdownMarkdown 是一個輕量級的易於學習使用的標記語言,主要用于格式化文本文字。它的語法類似 HTML 語言,是一個非常有幫助的語言,可以用於添加注釋說明或者添加圖片。
可以嘗試在 Jupyter notebook 中輸入下面的文字,記住是在 Markdown cell中:
# This is a level 1 heading
## This is a level 2 heading
This is some plain text that forms a paragraph.
Add emphasis via **bold** and __bold__, or *italic* and _italic_.
Paragraphs must be separated by an empty line.
* Sometimes we want to include lists.
* Which can be indented.
1. Lists can also be numbered.
2. For ordered lists.
[It is possible to include hyperlinks](https://www.example.com)
Inline code uses single backticks: `foo()`, and code blocks use triple backticks:
```
bar()
```
Or can be indented by 4 spaces:
foo()
And finally, adding images is easy: 
得到的結果如下圖所示:
如果想添加圖片,有三種做法:
使用網絡上的圖片,添加其網絡連結 URL,比如上述例子就是這種做法,URL 是 https://www.example.com/image.jpg
採用一個本地 URL,那麼圖片就只能使用在該 notebook 中,比如在同一個 git 倉庫中
菜單欄選擇 「Edit->Insert Image",這種做法會將圖片轉換為字符串形式並存儲在 .ipynb 文件中,這種做法會增加 ipynb 文件的大小
Markdown 的使用方法可以參考其發明者 John Gruber 的官方教程:
https://daringfireball.net/projects/markdown/syntax
Kernels每個 notebook 都有一個 kernel。當執行一個單元內的代碼的時候,就是採用 kernel 來運行代碼,並將結果輸出顯示在單元內。同時 kernel 的狀態會保留,並且不止局限在一個單元內,即一個單元內的變量或者導入的第三方庫,也是可以在另一個單元內使用的,並不是相互獨立的。
某種程度來說,notebook 可以看做是一個腳本文件,除了增加了更多輸入方式,比如說明文字、圖片等等。
這裡同樣用一個代碼例子進行介紹 kernel 的這種特性,如下圖所示,分別在兩個單元內輸入兩段代碼,第一個單元內時導入 numpy 並定義函數 square(),而第二個單元內就調用了這個函數 square() ,並成功運行輸出結果。
大部分情況下都是自頂向下的運行每個單元的代碼,但這並不絕對,實際上是可以重新回到任意一個單元,再次執行這段代碼,因此每個單元左側的 In [ ] 就非常有用,其數字就告訴了我們它是運行的第幾個單元。
此外,我們還可以重新運行整個 kernel,這裡介紹菜單 Kernel 中的幾個選項:
Restart :重新開始 kernel,這會清空 notebook 中所有的變量定義
Restart & Clear Output: 和第一個選項相同,但還會將所有輸出都清除
Restart & Run All: 重新開始,並且會自動從頭開始運行所有的單元內的代碼
通常如果 kernel 陷入某個單元的代碼運行中,希望停止該代碼的運行,則可以採用 Interupt 選項。
選擇一個 kernel在 Kernel 菜單中同樣提供了一個更換 kernel 的選項,最開始創建一個 notebook 的時候,就是選擇了一個 kernel ,當然這裡能否選擇其他的 kernel ,取決於是否有安裝,比如 Python 的版本,當你同時安裝了 python3.6 和 python2.7 ,那麼就有這兩個選擇,除了 Python 語言,Juypter notebook 支持的 kernel 還包括其他超過一百種語言,比如 Java、C、R、Julia 等等。
3. 數據分析例子現在就開始文章開始說的數據分析例子,即從一份公司財富數據中分析公司的利潤變化情況。
命名 notebooks首先,給 notebook 命名一個有意義的名字,比如 jupyter-notebook-tuorial,可以直接在 notebook 界面直接點擊上方文件名,如果未命名,那就是 Untitle.ipynb ,當然也可以返回管理界面進行命名,如下所示,選擇 notebook 後,上方會出現一行選項,包括:
以及還有一個刪除文件的選項。
注意,關閉 notebook 的界面並不會關掉 notebook 的 kernel,它會一直在後臺運行,在管理界面看到 notebook 還是綠色狀態,就表明其在運行,這需要選擇 Shutdown 選項,或者命令行裡關掉 Jupyter 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 來使用。此外,%matplotlib inline 這並不是 python 的命令,它是 Jupyter 中獨有的魔法命令,它主要是讓 Jupyter 可以捕獲 Matplotlib 的圖片,並在單元輸出中渲染。
接著就是讀取數據:
df = pd.read_csv('fortune500.csv')
在開始前,要記得定時保存文件,這可以直接採用快捷鍵 Ctrl + S 保存文件,它是通過一個命令--「保存和檢查點」實現的,那麼什麼是檢查點呢?
每次創建一個新的 notebook,同時也創建了一個 checkpoint 文件,它保存在一個隱藏的子文件夾 .ipynb_checkpoints 中,並且也是一個 .ipynb 文件。默認 Jupyter 會每隔 120 秒自動保存 notebook 的內容到 checkpoint 文件中,而當你手動保存的時候,也會更新 notebook 和 checkpoint 文件。這個文件可以在因為意外原因關閉 notebook 後恢復你未保存的內容,可以在菜單中 File->Revert to Checkpoint 中恢復。
對數據集的探索現在開始處理我們的數據集,通過 pandas 讀取後得到的是稱為 DataFrame 的數據結構,首先就是先查看下數據集的內容,輸入以下兩行代碼,分別表示輸出數據的前五行,和最後五行的內容。
df.head()
df.tail()
輸出內容如下所示:
通過查看,我們了解到每行就是一個公司在某一年的數據,然後總共有 5 列,分別表示年份、排名、公司名字、收入和利潤。
接著,為了方便,可以對列重命名:
df.columns = ['year', 'rank', 'company', 'revenue', 'profit']
然後,還可以查看數據量,如下所示:
len(df)
如下圖所示,總共有 25500 條數據,剛好就是 500 家公司從 1955 到 2005 的數據量。
接著,我們再查看數據集是否和我們希望導入的一樣,一個簡單的檢查方法就是查看數據類型是否正確:
這裡可以發現 profit 數據類型居然是 object 而不是和收入 revenue 一樣的float64 類型,這表示其中可能包含一些非數字的數值,因此我們需要檢查一下:
輸出結果表明確實存在非整數的數值,而是是 N.A,然後我們需要確定是否包含其他類型的數值:
輸出結果表示只有 N.A ,那麼該如何處理這種缺失情況呢,這首先取決有多少行數據缺失了 profit :
369 條數據缺失,相比於總共 25500 條數據,僅佔據 1.5% 左右。如果缺失的數據隨著年份的變化符合正態分布,那麼最簡單的方法就是直接刪除這部分數據集,代碼如下所示
從結果看,缺失數據最多的一年也就是 25 條也不到,相比每年 500 條數據,最多佔據 4%,並且只有在 90 年代的數據缺失會超過 20 條,其餘年份基本在 10 條以下,因此可以接受直接刪除缺失值的數據,代碼如下:
刪除數據後,profit 就是 float64 類型了。
簡單的數據探索完成了,接下來進行圖表的繪製。
採用 matplotlib 進行繪製圖表首先繪製隨著年份變化的平均利潤表,同時也會繪製收入隨年份的變化情況,如下圖所示:
結果看起來有點類似指數式增長,但出現兩次巨大的下降情況,這其實和當時發生的事件有關係,接下來可以看看收入的變化情況,如下圖所示:
從收入看,變化並沒有像利潤一樣出現兩次波動。
參考 https://stackoverflow.com/a/47582329/604687,我們添加了利潤和收入的標準差情況,用於反饋同一年不同公司的收入或者利潤差距,如下圖所示:
結果表明了不同公司的差距還是很大的,存在有收入幾十億,也有虧損幾十億的公司。
其實還有很多問題可以深入探討,但目前給出的例子已經足夠入門 Jupyter notebook,這部分例子展示了如何分析探索數據,繪製數據的圖表。
參考