Jupyter 進階教程

原題 | Tutorial: Advanced Jupyter Notebookshtml

做者 | Benjamin Prykepython

譯者 | kbsc13("算法猿的成長"公衆號做者)git

原文 | www.dataquest.io/blog/advanc…github

聲明 | 翻譯是出於交流學習的目的,歡迎轉載,但請保留本文出於,請勿用做商業或者非法用途算法

前言

上次介紹了Jupyter 入門教程,此次介紹更多 Jupyter notebook 的使用技巧。sql

本文主要介紹如下內容:shell

  • 介紹一些基本的 shell 命令和方便的魔法命令,包括 debug,計時以及執行多種語言;
  • 探索如 loggingmacros、運行外部代碼以及 Jupyter 的拓展插件;
  • 介紹如何增強 Seaborn 模塊的圖表,經過命令行運行,以及使用數據庫。

Shell 命令

在 notebook 中能夠直接採用 shell 命令,只須要在 code cell 中,以 ! 開頭的都會被當作一個 shell 命令,這在處理數據或者文件,管理 Python 包的時候很是有用。如下是一個簡單的示例:數據庫

此外,也能夠經過添加 $ 命令在 shell 命令中加入 Python 的變量,以下所示:編程

因爲 ! 開頭的命令在執行完成後就會被丟棄,所以像 cd 這樣的命令是沒有效果的。不過,IPython 的魔法命令提供了一個解決方法。bash

基本的魔法命令

魔法命令是內建於 IPython 核中的很是方便有用的命令,它們專門用於處理特定的任務。它們雖然看起來相似 unix 命令,但實際都是經過 Python 實現的。魔法命令很是多,但在本文中僅介紹其中一部分魔法命令。

魔法命令也分兩種:

  • 行魔法命令(line magics)
  • 單元魔法命令(cell magics)

從名字就能夠知道,主要是根據其做用範圍劃分,有的在單行內執行,有的能夠做用多行或者整個單元內。

想了解可用的魔法命令,能夠輸入命令 %lsmagic ,輸出結果以下所示,能夠看到確實分爲 linecell 兩類,而且分別給出命令的數量。

若是想具體瞭解這些命令的做用,能夠上官網查看--ipython.readthedocs.io/en/stable/i…

行魔法命令和單元魔法命令的使用形式也是不一樣的,行魔法命令是以 % 開頭,而單元魔法命令則是 %% 開頭

實際上 ! 開頭是用於 shell 命令的一種比較複雜的魔法語法,以前說的沒法採用相似 cd 的命令,能夠採用魔法命令實現,即 %cd%alias%env

下面介紹更多的例子。

自動保存(Autosaving)

首先是 %autosave 命令能夠決定 notebook 自動保存的時間間隔,使用例子以下所示,命令後添加時間間隔參數,單位是秒。

%autosave 60
複製代碼

輸出結果:

Autosaving every 60 seconds
複製代碼

顯示 Matplotlib 的圖表

在數據科學中最經常使用的一個行魔法命令就是 %matplotlib ,它能夠用於顯示 matplotlib 的圖表,使用例子以下:

%matplotlib inline
複製代碼

加上參數 inline 能夠確保在一個單元內顯示 Matplotlib 的圖表。一般須要在導入 Matplotlib 前就採用這個行魔法命令,一般都會放在第一個代碼單元內。

代碼執行時間(Timing Execution)

一般咱們都須要考慮代碼的執行時間,在 notebook 中能夠有兩個時間魔法命令 %time%timeit,它們都有行和單元兩種模式

對於 %time ,使用例子以下所示:

%timeit%time 的區別在於,它會對給定代碼運行屢次,並計算一個平均時間,能夠經過添加參數 -n 來指定運行的次數,若是沒有指定,則會自動選擇一個最佳的數量。例子以下所示:

執行不一樣編程語言

在 Jupyter notebook 中能夠執行不一樣的編程語言,儘管選擇的核有既定的語言,好比本文例子選擇的就是 Python3 ,但經過魔法命令能夠執行不一樣的編程語言,在 %lsmagic 的輸出結果也能夠找到。

下面是一些使用的例子,包括執行 HTML 語言,以及用於顯示數學公式的 LaTeX 語言。

固然還能夠執行其餘編程語言,包括 RubymarkdownJavaScriptR 等等。

配置日誌(Configuring Logging)

在 Jupyter 中有自定義瞭如何輸出錯誤信息的方法,它能夠經過導入 logging 模塊實現。

如上圖所示,對於錯誤信息,會高亮顯示。

另外,logging 模塊的輸出和 print 以及標準的單元輸出是分開的,以下圖所示:

之因此會出現上圖的緣由是 Jupyter notebook 會監聽標準的輸出流,stdoutstderr ,但 print 和單元輸出默認是輸出 stdout ,而 logging 則是經過 stderr 輸出。

所以,咱們能夠對 logging 進行配置來顯示 stderr 的其餘類型的信息,好比下圖就顯示了 INFODEBUG 類型的信息。

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

logging.info('This is some information')
logging.debug('This is a debug message')
複製代碼

還能夠自定義信息的輸出格式:

handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)

formater = logging.Formatter('%(levelname)s: %(message)s')
handler.setFormatter(formater)

logger.handlers = [handler]

logging.error('An error')
logging.warning('An warning')
logging.info('An info')
複製代碼

注意,若是每次運行一個單元內包含代碼 logger.addHandler(handler) 來添加一個新的 stream handler ,那麼每次輸出都會多一行額外的信息。咱們能夠將對日誌的配置放在單獨的一個單元內,或者就如同上述所示代碼,即直接代替全部如今的 handler ,不採用 addHandler ,而是 logger.handlers = [handler]。這種作法能夠移除默認的 handler

固然也能夠將日誌信息保存到文件中,代碼以下所示,採用 FileHandler 而非 StreamHandler

handler = logging.FileHandler(filename='important_log.log', mode='a')
複製代碼

最後,這裏採用的日誌跟經過 %config Application.log_level='INFO' 設置的日誌等級是不相同的,經過 %config 配置的是 Jupyter 輸出到當前運行 Jupyter 的終端上的日誌信息。

拓展

Jupyter 是一個開源的工具,所以有不少開發者開發了不少拓展插件,具體能夠查看:

github.com/ipython/ipy…

在後面介紹的使用數據庫,就採用了插件 ipython-sql,還有就是包含了拼寫檢查、代碼摺疊等等功能的一個拓展插件 Github:

github.com/ipython-con…

安裝這些插件能夠經過下面的命令

pip install ipython-sql
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable spellchecker/main
jupyter nbextension enable codefolding/main
複製代碼

增強 Seaborn 的圖表

Jupyter notebook 的最多見的一種應用就是用於繪製圖表。但 Python 的最多見繪圖庫 Matplotlib 在 Jupyter 中並未能給出很吸引人的結果,這能夠經過 Seaborn 進行美化並添加一些額外的功能。

若是沒有安裝 seaborn,能夠經過命令 pip install seaborn ,或者在 jupyter 中,根據開始介紹的 shell 命令執行方式--!pip install seaborn ,安裝完後,就能夠先導入必須的庫和數據:

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
data = sns.load_dataset("tips")
複製代碼

經過 seaborn 提供的簡單的數據集,這裏採用的 tips 是一個 pandasDataFrame 格式數據集,內容是來自一個酒吧或者飯店的帳單信息。

經過 data.head() 能夠展現前 5 條數據,並查看屬性信息。

採用 Matplotlib 繪製 total_billtip 的關係圖:

plt.scatter(data.total_bill, data.tip);
複製代碼

添加 Seaborn 也是很簡單,以下所示,經過 seaborn 設置了一個 darkgrid 的樣式

sns.set(style="darkgrid")
plt.scatter(data.total_bill, data.tip);
複製代碼

seaborn 總共有 5 種樣式:darkgrid, whitegrid, dark, white, and ticks

實際上咱們也能夠單獨採用 seaborn 的繪圖函數,以下所示:

sns.scatterplot(x="total_bill", y="tip", data=data);
複製代碼

上圖能夠添加每一個座標的標題信息以及對每一個數據點有一個提高的標記。Seaborn 還能夠自動根據數據的類型進行劃分,便可以再添加一個維度,這裏咱們能夠再添加屬性 smoker 做爲參數 hue ,表示數據點的顏色:

sns.scatterplot(x="total_bill", y="tip", hue="smoker", data=data);
複製代碼

添加 smoker 後,咱們能夠看到每一個數據點都根據是否劃分爲兩種顏色的數據點,展現的信息就更加豐富了。咱們再進一步,加入屬性 size 做爲顏色的劃分,而 smoker 做爲樣式,以下所示:

sns.scatterplot(x="total_bill", y="tip", hue="size", style="smoker", data=data);
複製代碼

seaborn 能夠繪製更多更好看的圖表,更多的例子能夠查看其官網:

seaborn.pydata.org/examples/in…

宏命令(Macros)

不少時候,咱們可能會重複作相同的任務,好比每次建立一個新的 notebook,都須要導入相同的一堆第三方庫,對每一個數據集都進行的統計方法,或者繪製相同類型的圖表。

在 Jupyter 裏能夠將一些代碼片斷保存爲可執行的宏命令,而且能用在全部的 notebooks 裏。這種操做可能對其餘閱讀使用你的 notebook 的人來講並非很友好的方式,但對你來講,確實會是很是方便以及減輕工做量的方法。

宏命令也是代碼,所以也能夠包含變量。下面開始介紹示例

首先是寫好一個代碼單元,主要做用就是輸出 Hello, name!,其中 name 也是定義好的一個變量,而後利用命令 %macro 來保存宏命令,名字是 __hello_world ,而 28 表示的就是上一個運行順序爲 28 的代碼單元,即 In [28] 對應的代碼單元,而後 %store 是保存宏命令。

載入宏命令的操做以下,仍是採用命令 %store ,但須要加上參數 -r ,以及宏命令的名字。

若是修改在宏命令中採用的變量,其輸出結果也會改變:

name = 'Ben'
__hello_world
複製代碼

輸出結果:

Hello, Ben!
複製代碼

宏命令還能夠實現更多的操做,具體仍是能夠查看官網。

執行外部代碼

在 Jupyter 還能夠加載和運行外部代碼,也就是 .py 代碼文件。這裏須要採用的命令分別是 %load%run

咱們先建立一個新的代碼文件--imports.py ,其包含內容以下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
複製代碼

而後在 jupyter 中加載該代碼文件:

%load imports.py
複製代碼

運行結果以下:

接着咱們建立一個新的代碼文件--triangle_hist.py ,代碼以下,繪製一個三角形直方圖。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")

if __name__ == '__main__':
    h = plt.hist(np.random.triangular(0, 5, 9, 1000), bins=100, linewidth=0)
    plt.show()
複製代碼

而後調用命令 %run 運行:

此外,還能夠傳遞參數給腳本,只須要在代碼文件名後添加便可,好比 %run my_file.py 0 "Hello, World!",或者是傳遞變量名,如 %run $filename {arg0} {arg1} ,還能夠添加 -p 來經過 Python 的分析器運行代碼,具體能夠參考下面兩個 stackoverflow 上的回答:

腳本運行

Jupyter notebook 最強大的做用是其交互式的流程,但它也能夠在非交互式的模式下運行,便可以經過腳本或者命令行形式運行 jupyter notebook。

命令行的基本語法以下:

jupyter nbconvert --to <format> notebook.ipynb
複製代碼

其中 nbconvert 是用於將 notebook 轉換爲其餘形式的一個 API 接口,好比 PDF、HTML、python 腳本(即 .py 文件),甚至 LaTeX 文件。

好比,須要將 notebook 轉換爲 PDF 形式:

jupyter nbconvert --to pdf notebook.ipynb
複製代碼

這個操做將生成一個 pdf 文件--notebook.pdf ,固然若是要實現轉換爲 PDF ,還須要安裝一些必須的庫--pandocLaTeX,安裝方法能夠查看:

stackoverflow.com/a/52913424/…

默認狀況下,nbconvert 並不會執行 notebook 裏的代碼,但能夠添加 --execute 來讓其運行代碼:

jupyter nbconvert --to pdf --execute notebook.ipynb
複製代碼

另外,還能夠添加 --allow-errors 來讓 nbconvert 會輸出代碼中的錯誤信息,而且不會由於出現錯誤而中斷轉換過程:

jupyter nbconvert --to pdf --execute --allow-errors notebook.ipynb
複製代碼

使用數據庫

要在 jupyter 中使用數據庫,首先須要安裝 ipython-sql :

pip install ipython-sql
複製代碼

安裝好後,首先輸入如下魔法命令來加載 ipython-sql

%load_ext sql
複製代碼

接着就是鏈接到一個數據庫:

%sql sqlite://
複製代碼

輸出:

'Connected: @None'
複製代碼

這裏是鏈接到一個臨時的數據庫,你也能夠指定鏈接到你的數據庫,能夠按照官網(docs.sqlalchemy.org/en/latest/c…)的語法進行鏈接:

dialect+driver://username:password@host:port/database
複製代碼

好比能夠是相似 postgresql://scott:tiger@localhost/mydatabase,也就是 driver 就是 postgresqlusenamescottpasswordtigerhostlocalhost ,而後 databasemydatabse .

接下來就是快速採用以前用 Seaborn 加載的 tips 的數據集來構建咱們的數據庫:

接下來就能夠對數據進行一些查詢的操做,以下所示,這裏須要用到多行魔法命令形式 %%

還能夠進行更復雜的查詢操做:

更多的例子能夠查看 github.com/catherinede…

小結

對比原文,其實刪除了部份內容,好比腳本運行 jupyter 部分,自定義 jupyter 的樣式,而後數據庫部分也有所刪減,主要是原文的代碼老是缺失一部份內容。


參考


最後本文的代碼都上傳到 Github 上了:

github.com/ccc013/Pyth…

歡迎關注個人微信公衆號--算法猿的成長,或者掃描下方的二維碼,你們一塊兒交流,學習和進步!

相關文章
相關標籤/搜索