作為一個(gè)數(shù)據(jù)科學(xué)工作者,小白也好被济,大神也好偷崩,Jupyter notebook或者jupyter lab
是必備的工具谴古。相比VS, pycharm等IDE(集成開(kāi)發(fā)環(huán)境), notebook足夠簡(jiǎn)單认罩,可以讓你把所有的精力放在數(shù)據(jù)探索和算法開(kāi)發(fā)上面箱蝠。因?yàn)槠浯a結(jié)構(gòu)是以單元格來(lái)組織和分割。一個(gè)單元格可以有一行或者若干行代碼垦垂,完成一個(gè)單元格后可以立馬運(yùn)行查看中間結(jié)果并以及可視化宦搬。
這種代碼組織和運(yùn)行方式非常符合我們的思維習(xí)慣。我們可以一邊做劫拗,然后考然后根據(jù)運(yùn)行的中間結(jié)果在思考下一步的操作间校。因?yàn)槲覀兊拇竽X容量有限,很難去計(jì)算很多程序的中間結(jié)果页慷。而在IDE里面憔足,每次要想知道中間結(jié)果需要打斷點(diǎn)調(diào)試或者用print函數(shù)打印出來(lái)聂渊,每次都需要從頭運(yùn)行,沒(méi)有notebook方便四瘫。
在日常工作中汉嗽,我經(jīng)常是用notebook做一些數(shù)據(jù)探索或者思路演示。等確認(rèn)這么做能夠?qū)崿F(xiàn)業(yè)務(wù)需求后才轉(zhuǎn)向Pycharm進(jìn)行工程化開(kāi)發(fā)打包等找蜜。很多時(shí)候向別人講解你的開(kāi)發(fā)思路時(shí)饼暑,使用notebook配合markdown筆記,可以做出媲美教科書(shū)的效果洗做。因?yàn)槠湟子煤涂蓴U(kuò)展弓叛,現(xiàn)在很多大學(xué)都用來(lái)作上課的課件工具。另外你寫(xiě)完的notebook也可以發(fā)給別人(.ipynb文件)诚纸,在Anaconda中可以直接運(yùn)行撰筷。
下面我就總結(jié)一下日常使用notebook中的一些奇技淫巧。這些技巧掌握了畦徘,可以直接讓你的notebook起飛毕籽,讓你從小白變大神,從此菜鳥(niǎo)是路人井辆!體驗(yàn)飛起來(lái)的暢快感关筒!
- 單元格內(nèi)執(zhí)行shell命令
很多時(shí)候別人開(kāi)發(fā)的腳本是以.py文件形式保存的,這樣的腳本一般需要在終端或者IDE環(huán)境中執(zhí)行杯缺。其實(shí)用notebook也完全沒(méi)問(wèn)題蒸播。只要把終端執(zhí)行的命令前加個(gè)" ! "號(hào)即可。
例如下面我們寫(xiě)一個(gè)小腳本輸出當(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)行腳本袍榆,和終端一樣。這樣我們就不用來(lái)回切換了塘揣,方便包雀!結(jié)果如下:
既然在加個(gè)‘!’就可以執(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
- 一個(gè)單元格多輸出
Notebook一個(gè)好用的特點(diǎn)就是一個(gè)單元格內(nèi)的代碼執(zhí)行后立馬輸出中間結(jié)果。但是有個(gè)缺點(diǎn)就是默認(rèn)情況下只有單元格內(nèi)最后一行的代碼結(jié)果會(huì)輸出檀头。例如我們使用pandas讀取一個(gè)文件生成dataframe后轰异,想了解這個(gè)df的size, columns, 前5行等信息岖沛,正常情況下df.head, df.shape, df.info等內(nèi)容要分成三個(gè)單元格來(lái)完成。但其實(shí)有更好的方法搭独,可以讓一個(gè)單元格內(nèi)輸出多個(gè)內(nèi)容婴削。具體方法是增加一個(gè)單元格執(zhí)行下面兩行代碼即可:
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
效果如下:
- 查看當(dāng)前notebook中的所有變量和變量值
在MATLAB中,直接有一個(gè)窗口可以顯示當(dāng)前所有的變量及其相應(yīng)的值牙肝,這個(gè)功能非常強(qiáng)大唉俗。Anaconda中Spyder也有類(lèi)似的功能。其實(shí)notebook也可以配椭,直接使用%who和%whos魔法命令即可虫溜。其中:
- %who會(huì)輸出當(dāng)前notebook中已經(jīng)存在的變量
- %whos除了輸出變量外,變量的類(lèi)型以及當(dāng)前值也會(huì)顯示
效果如下:
- 運(yùn)行時(shí)間統(tǒng)計(jì)股缸,這個(gè)比較常用衡楞。主要有time,和timeit兩個(gè)魔法敦姻,命令瘾境,在結(jié)合行模式和單元格模式就有4種用法,具體如下:
- %time:在行模式下替劈,統(tǒng)計(jì)代碼運(yùn)行一次所花費(fèi)的時(shí)間
- %%time:在單元模式下寄雀,統(tǒng)計(jì)整個(gè)單元格內(nèi)的代碼運(yùn)行一次所花費(fèi)的時(shí)間
- %timeit:在行模式下,執(zhí)行代碼塊若干次陨献,統(tǒng)計(jì)出平均時(shí)間。結(jié)果以mean+/-std的形式給出
- %%timeit:在單元模式下懂更,執(zhí)行代碼塊若干次眨业,統(tǒng)計(jì)出平均時(shí)間。結(jié)果以mean+/-std的形式給出
所以time只統(tǒng)計(jì)執(zhí)行一次的時(shí)間沮协;而timeit會(huì)反復(fù)執(zhí)行很多次統(tǒng)計(jì)平均時(shí)間龄捡,這個(gè)比只執(zhí)行一次要準(zhǔn)確一點(diǎn)。舉例如下:
首先看行模式慷暂,即代碼只有一行聘殖,放在%time或者%timeit之后:我們用一個(gè)列表解析式來(lái)輸出100以?xún)?nèi)可以被7整除的數(shù):
在看看單元格模式,使用帶兩個(gè)%%的魔法命令行瑞。我們分別使用for循環(huán)和矩陣模式來(lái)實(shí)現(xiàn)矩陣的相加奸腺,看看基于numpy的矩陣運(yùn)算是不是比f(wàn)or循環(huán)更高效:
# 1. 先定義兩個(gè)二維列表
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_
# 查看兩個(gè)版本的結(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)行時(shí)間統(tǒng)計(jì):
可以看到v2的矩陣運(yùn)算用時(shí)和for循環(huán)不在一個(gè)數(shù)量級(jí)上,要快10倍以上血久!
- 進(jìn)度條功能
這個(gè)在之前的文章里提過(guò)突照, 參考 5分鐘搞定幾百?gòu)埍砀褶D(zhuǎn)換,Python辦公自動(dòng)化就是這么6氧吐! - 簡(jiǎn)書(shū) (jianshu.com)
主要就是使用tqdm這個(gè)工具給循環(huán)語(yǔ)句增加個(gè)進(jìn)度插件讹蘑,顯示循環(huán)體進(jìn)行到那個(gè)階段了末盔。這個(gè)功能在處理耗時(shí)比較大的循環(huán)的時(shí)候是非常必要的!效果如下:
image.png
具體使用方法可以參考上面的文章
好了座慰,本次就介紹這么多陨舱,希望對(duì)你有所幫助!