原文連接:www.dataquest.io/blog/jupyte…python
Jupyter notebook 是一個很強大的交互式和展現數據科學項目的工具,它能夠做爲一個開發文檔,包含代碼、解釋說明文字、代碼運行結果、數學公式等等,功能很是強大,也是如今很是流行的工具。git
本文會經過一個簡單的數據分析例子來介紹 Jupyter notebook 的使用方法。這裏的例子就是給定一個自 1955 年發佈以來,一共 50 年時間的美國 500 家公司的數據,任務是分析這些公司的利潤變化過程。算法
最簡單的安裝方式就是經過 Anaconda
進行安裝,Anaconda
是使用最普遍的環境管理工具,而且它能夠預先安裝不少經常使用的第三方庫,包括 numpy
、pandas
、matplotlib
等。shell
具體的 Anaconda
能夠查看以前公衆號發表過的一篇文章--Python 基礎入門--簡介和環境配置。瀏覽器
除了經過 Anaconda
安裝,也能夠直接採用 pip
bash
pip install jupyter
複製代碼
這一部分將介紹如何運行和保存 notebooks
,熟悉 Jupyter notebook
的結構和交互界面。這裏將經過一個例子來熟悉一些核心的用法,更好的瞭解 Jupyter notebook
的使用。微信
在 Windows,能夠經過添加到開始菜單的快捷方式運行 Jupyter
,固然也能夠經過在命令行輸入命令 jupyter notebook
開始運行,而後會在默認瀏覽器中打開一個新的窗口,窗口內容以下:markdown
固然上述還不是一個 notebook,它是 Notebook 的管理界面,用於管理當前文件夾的全部 Notebooks。網絡
注意,這裏僅僅展現 Jupyter 運行時候的所在文件夾內的文件和文件夾,也就是在命令行運行 jupyter notebook
時所在的文件夾,固然這個也能夠改變,運行命令的時候能夠指定文件夾位置,即輸入:數據結構
jupyter notebook filepath
複製代碼
此外,這裏在瀏覽器上的 URL 地址是相似 http://localhost:8888/tree
,其中 localhost
是表示本地地址,而後 8888
是端口。
接下來就是建立一個新的 notebook,能夠以下圖所示,在管理界面的右上角位置,點擊 New
菜單,這裏就能夠選擇 Python 3
(或者其餘的版本),而後就能夠建立成功,而且是在新的窗口打開這個 notebook,在默認命名就是 Untitled.ipynb
。
每一個 ipynb
文件都是經過 JSON
格式來描述 notebook 的內容,包括每一個單元及其內容,都是經過 metadata
的格式展現。這裏能夠在打開 ipynb
文件後,菜單中選擇 Edit->Edit Notebook Metadata
,進行編輯。
如今開始介紹下 notebook 的界面信息,一個新的 notebook 界面以下圖所示。
這裏有兩個術語須要知道--cells
和 kernels
,兩個都是很是重要的術語:
kernel
:表示計算引擎,用於執行 notebook 中的代碼塊cell
:單元塊,用於展現文本或者是代碼。首先介紹的是 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
是一個輕量級的易於學習使用的標記語言,主要用於格式化文本文字。它的語法相似 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: 
複製代碼
獲得的結果以下圖所示:
若是想添加圖片,有三種作法:
.ipynb
文件中,這種作法會增長 ipynb
文件的大小Markdown 的使用方法能夠參考其發明者 John Gruber 的官方教程:
daringfireball.net/projects/ma…
每一個 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
的選項,最開始建立一個 notebook
的時候,就是選擇了一個 kernel
,固然這裏可否選擇其餘的 kernel
,取決因而否有安裝,好比 Python
的版本,當你同時安裝了 python3.6
和 python2.7
,那麼就有這兩個選擇,除了 Python
語言,Juypter notebook 支持的 kernel
還包括其餘超過一百種語言,好比 Java、C、R、Julia 等等。
如今就開始文章開始說的數據分析例子,即從一份公司財富數據中分析公司的利潤變化狀況。
首先,給 notebook 命名一個有意義的名字,好比 jupyter-notebook-tuorial
,能夠直接在 notebook 界面直接點擊上方文件名,若是未命名,那就是 Untitle.ipynb
,固然也能夠返回管理界面進行命名,以下所示,選擇 notebook 後,上方會出現一行選項,包括:
Duplicate
:複製Shutdown
:中止該 notebook 的 kernelView
:查看 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(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
類型了。
簡單的數據探索完成了,接下來進行圖表的繪製。
首先繪製隨着年份變化的平均利潤表,同時也會繪製收入隨年份的變化狀況,以下圖所示:
結果看起來有點相似指數式增加,但出現兩次巨大的降低狀況,這其實和當時發生的事件有關係,接下來能夠看看收入的變化狀況,以下圖所示:
從收入看,變化並無像利潤同樣出現兩次波動。
參考 stackoverflow.com/a/47582329/…
結果代表了不一樣公司的差距仍是很大的,存在有收入幾十億,也有虧損幾十億的公司。
其實還有不少問題能夠深刻探討,但目前給出的例子已經足夠入門 Jupyter notebook,這部分例子展現瞭如何分析探索數據,繪製數據的圖表。
參考
最後本文的代碼和數據能夠公衆號後臺回覆「Jupyter」獲取連接地址。
歡迎關注個人微信公衆號--算法猿的成長,或者掃描下方的二維碼,你們一塊兒交流,學習和進步!