快速入门 Jupyter notebook
2019 年第 64 篇文章,總第 88 篇文章
本文大約?6400?字,閱讀大約需要 17?分鐘
原文鏈接: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?jupyter2. 創建你的第一個 Notebook
這一部分將介紹如何運行和保存?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?,兩個都是非常重要的術語:
kernel?:表示計算引擎,用于執行 notebook 中的代碼塊
cell?:單元塊,用于展示文本或者是代碼。
單元(Cells)
首先介紹的是?Cells?,一個?Cell?就是上圖中綠色框部分,它是 notebook 的主要部分,通常有兩種主要的?cell?類似:
code cell?:包括需要執行的代碼,以及其運行結果
Markdown cell?:包含的是 Markdown 格式的文本并且其執行結果
下圖展示了一個簡單的例子,第一行?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?查看。下面簡單介紹一些快捷鍵:
編輯模式和命令模式可以通過?Esc?和?Enter?進行轉換,一般是按?Esc?進入命令模式,Enter?進入編輯模式
在命令模式下:
在?cell?之間上下瀏覽采用上下箭頭,或者?Up?和?Down?鍵
A?表示在當前?cell?上方插入一個新的?cell?,而?B?則是下方插入新的cell
M?表示變為?Markdown cell?,而?Y?是表示變為?code cell
連續按兩次?D?是刪除當前?cell
Z?是撤銷操作
Shift?加上?Up?或者?Down?可以一次選擇多個?cells?,接著采用?Shift + M?可以合并多個?cells
Markdown
Markdown?是一個輕量級的易于學習使用的標記語言,主要用于格式化文本文字。它的語法類似 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 后,上方會出現一行選項,包括:
Duplicate:復制
Shutdown:停止該 notebook 的 kernel
View:查看 notebook 內容
Edit?:編輯其?metadata?內容
以及還有一個刪除文件的選項。
注意,關閉 notebook 的界面并不會關掉 notebook 的 kernel,它會一直在后臺運行,在管理界面看到 notebook 還是綠色狀態,就表明其在運行,這需要選擇?Shutdown?選項,或者命令行里關掉?Jupyter notebook?的命令。
準備工作
首先導入一些需要用的第三方庫:
%matplotlib?inline import?pandas?as?pd import?matplotlib.pyplot?as?plt import?seaborn?as?sns sns.set()pandas?用于處理數據,Matplotlib?用于繪制圖表,而?seaborn?可以讓圖表更加漂亮。通常也需要導入?Numpy?,不過在本例中我們將通過?pandas?來使用。此外,%matplotlib inline?這并不是 python 的命令,它是 Jupyter 中獨有的魔法命令,它主要是讓 Jupyter 可以捕獲 Matplotlib 的圖片,并在單元輸出中渲染。
接著就是讀取數據:
df?=?pd.read_csv('fortune500.csv')保存和檢查點(checkpoint)
在開始前,要記得定時保存文件,這可以直接采用快捷鍵?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,這部分例子展示了如何分析探索數據,繪制數據的圖表。
參考
Markdown:https://www.markdownguide.org/getting-started
https://stackoverflow.com/a/47582329/604687
最后本文的代碼和教程可以公眾號后臺回復“Jupyter”獲取鏈接地址,或者點擊閱讀原文。
歡迎關注我的微信公眾號--算法猿的成長,或者掃描下方的二維碼,大家一起交流,學習和進步!
如果覺得不錯,在看、轉發就是對小編的一個支持!
總結
以上是生活随笔為你收集整理的快速入门 Jupyter notebook的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Could not mount the
- 下一篇: WebSocket基础知识笔记