作為一個數(shù)據(jù)科學(xué)工作者,小白也好,大神也好,Jupyter notebook或者jupyter lab
是必備的工具。相比VS, pycharm等IDE(集成開發(fā)環(huán)境), notebook足夠簡單,可以讓你把所有的精力放在數(shù)據(jù)探索和算法開發(fā)上面。因為其代碼結(jié)構(gòu)是以單元格來組織和分割。一個單元格可以有一行或者若干行代碼,完成一個單元格后可以立馬運(yùn)行查看中間結(jié)果并以及可視化。
這種代碼組織和運(yùn)行方式非常符合我們的思維習(xí)慣。我們可以一邊做,然后考然后根據(jù)運(yùn)行的中間結(jié)果在思考下一步的操作。因為我們的大腦容量有限,很難去計算很多程序的中間結(jié)果。而在IDE里面,每次要想知道中間結(jié)果需要打斷點(diǎn)調(diào)試或者用print函數(shù)打印出來,每次都需要從頭運(yùn)行,沒有notebook方便。
在日常工作中,我經(jīng)常是用notebook做一些數(shù)據(jù)探索或者思路演示。等確認(rèn)這么做能夠?qū)崿F(xiàn)業(yè)務(wù)需求后才轉(zhuǎn)向Pycharm進(jìn)行工程化開發(fā)打包等。很多時候向別人講解你的開發(fā)思路時,使用notebook配合markdown筆記,可以做出媲美教科書的效果。因為其易用和可擴(kuò)展,現(xiàn)在很多大學(xué)都用來作上課的課件工具。另外你寫完的notebook也可以發(fā)給別人(.ipynb文件),在Anaconda中可以直接運(yùn)行。
下面我就總結(jié)一下日常使用notebook中的一些奇技淫巧。這些技巧掌握了,可以直接讓你的notebook起飛,讓你從小白變大神,從此菜鳥是路人!體驗飛起來的暢快感!
- 單元格內(nèi)執(zhí)行shell命令
很多時候別人開發(fā)的腳本是以.py文件形式保存的,這樣的腳本一般需要在終端或者IDE環(huán)境中執(zhí)行。其實(shí)用notebook也完全沒問題。只要把終端執(zhí)行的命令前加個" ! "號即可。
例如下面我們寫一個小腳本輸出當(dāng)前的工作環(huán)境目錄以及該目錄下的所有文件:
# 以下為demo.py腳本文件的內(nèi)容
import os
print("this is a demo")
print('------' * 10)
print('當(dāng)前的目錄為:')
print(os.getcwd())
print('------' * 10)
print('當(dāng)前目錄下的文件:')
print(os.listdir())
print('------' * 10)
把該文件保存在當(dāng)前notebook的環(huán)境下,直接在單元格中輸入‘!python demo.py’即可運(yùn)行腳本,和終端一樣。這樣我們就不用來回切換了,方便!結(jié)果如下:

既然在加個‘!’就可以執(zhí)行shell命令,很多大聰明是不是就想到了可以直接在單元格內(nèi)執(zhí)行"!pwd", "!ls" 等Linux里面的命令呢?答案是可以的,但是windows環(huán)境中不行,但是windows環(huán)境中,把"!"改成魔法命令“%”即可執(zhí)行,如下:
# "!pwd", "!ls"等可以在Linux環(huán)境中執(zhí)行,改成%即可在windows環(huán)境中執(zhí)行
%pwd #輸出當(dāng)前環(huán)境目錄, 等同于os.getcwd()
>>>'C:\\Users\\11_25\\10_sucai'
%ls # #輸出當(dāng)前環(huán)境目錄下所有目錄和文件
>>> Volume in drive C has no label.
Volume Serial Number is 8E14-AF13
Directory of C:\Users\11_25\10_sucai
2021/11/26 17:41 <DIR> .
2021/11/26 17:41 <DIR> ..
2021/11/26 17:25 <DIR> .ipynb_checkpoints
2021/11/23 09:14 7,746 demo.csv
2021/11/23 09:55 203 demo.py
2021/11/26 17:41 27,711 Notebook使用技巧.ipynb
3 File(s) 35,660 bytes
3 Dir(s) 69,066,891,264 bytes free
- 一個單元格多輸出
Notebook一個好用的特點(diǎn)就是一個單元格內(nèi)的代碼執(zhí)行后立馬輸出中間結(jié)果。但是有個缺點(diǎn)就是默認(rèn)情況下只有單元格內(nèi)最后一行的代碼結(jié)果會輸出。例如我們使用pandas讀取一個文件生成dataframe后,想了解這個df的size, columns, 前5行等信息,正常情況下df.head, df.shape, df.info等內(nèi)容要分成三個單元格來完成。但其實(shí)有更好的方法,可以讓一個單元格內(nèi)輸出多個內(nèi)容。具體方法是增加一個單元格執(zhí)行下面兩行代碼即可:
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
效果如下:

- 查看當(dāng)前notebook中的所有變量和變量值
在MATLAB中,直接有一個窗口可以顯示當(dāng)前所有的變量及其相應(yīng)的值,這個功能非常強(qiáng)大。Anaconda中Spyder也有類似的功能。其實(shí)notebook也可以,直接使用%who和%whos魔法命令即可。其中:
- %who會輸出當(dāng)前notebook中已經(jīng)存在的變量
- %whos除了輸出變量外,變量的類型以及當(dāng)前值也會顯示
效果如下:

- 運(yùn)行時間統(tǒng)計,這個比較常用。主要有time,和timeit兩個魔法,命令,在結(jié)合行模式和單元格模式就有4種用法,具體如下:
- %time:在行模式下,統(tǒng)計代碼運(yùn)行一次所花費(fèi)的時間
- %%time:在單元模式下,統(tǒng)計整個單元格內(nèi)的代碼運(yùn)行一次所花費(fèi)的時間
- %timeit:在行模式下,執(zhí)行代碼塊若干次,統(tǒng)計出平均時間。結(jié)果以mean+/-std的形式給出
- %%timeit:在單元模式下,執(zhí)行代碼塊若干次,統(tǒng)計出平均時間。結(jié)果以mean+/-std的形式給出
所以time只統(tǒng)計執(zhí)行一次的時間;而timeit會反復(fù)執(zhí)行很多次統(tǒng)計平均時間,這個比只執(zhí)行一次要準(zhǔn)確一點(diǎn)。舉例如下:
首先看行模式,即代碼只有一行,放在%time或者%timeit之后:我們用一個列表解析式來輸出100以內(nèi)可以被7整除的數(shù):

在看看單元格模式,使用帶兩個%%的魔法命令。我們分別使用for循環(huán)和矩陣模式來實(shí)現(xiàn)矩陣的相加,看看基于numpy的矩陣運(yùn)算是不是比for循環(huán)更高效:
# 1. 先定義兩個二維列表
import numpy as np
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
n = [[2, 2, 2], [3, 3, 3], [4, 4, 4]]
m_, n_ = np.array(m), np.array(n)
m_,n_
m_.shape
>>>(array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]),
array([[2, 2, 2],
[3, 3, 3],
[4, 4, 4]]))
(3, 3)
# 2. 分別使用for循環(huán)和numpy完成矩陣相加
# for循環(huán)版本
def v1():
res = np.zeros((3,3))
for row in range(m_.shape[0]):
for col in range(m_.shape[1]):
res[row,col] = int(m_[row,col] + n_[row,col])
return res
# 矩陣版本
def v2():
return m_+ n_
# 查看兩個版本的結(jié)果是否相同
v1()
v2()
>>>
array([[ 3., 4., 5.],
[ 7., 8., 9.],
[11., 12., 13.]])
array([[ 3, 4, 5],
[ 7, 8, 9],
[11, 12, 13]])
在進(jìn)行時間統(tǒng)計:

可以看到v2的矩陣運(yùn)算用時和for循環(huán)不在一個數(shù)量級上,要快10倍以上!
- 進(jìn)度條功能
這個在之前的文章里提過, 參考 5分鐘搞定幾百張表格轉(zhuǎn)換,Python辦公自動化就是這么6! - 簡書 (jianshu.com)
主要就是使用tqdm這個工具給循環(huán)語句增加個進(jìn)度插件,顯示循環(huán)體進(jìn)行到那個階段了。這個功能在處理耗時比較大的循環(huán)的時候是非常必要的!效果如下:
image.png
具體使用方法可以參考上面的文章
好了,本次就介紹這么多,希望對你有所幫助!
