你也用 Python 玩資料科學嗎?你的程式碼是否總是會有這麼一塊落落長的 import 呢:
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
from pathlib import Path
import pickle
只要使用 pyforest 套件,以上這麼多行程式碼可以全部簡化成僅僅一行!
import pyforest
在這則 Python 的資料科學筆記,將分享 pyforest 這個簡單好用的套件,它幫我們省略了很多寫 import 的麻煩,以下文章將快速介紹 pyforest 的用法,還有它之所以能維持程式良好效能的 Lazy Import 技巧,並且補充適合與不適合使用 pyforest 的場景。
如果你是整天使用 pandas
、numpy
、xgboost
等等超熱門套件的資料科學家,這個 pyforest 套件非常值得你學來用用看!
目錄
pyforest 簡介與用法
pyforest 是一個開源的 Python 套件,幫助我們「自動」import 資料科學與機器學習常用的套件。它的核心是使用 Lazy Import 技巧,在你真正需要某個函式才幫你 import,而不是從一開始就真的通通 import,我們下個小節會仔細介紹這個技巧。在此,我們只需要知道:
pyforest 套件幫助我們在資料科學任務可以少寫一大堆 import 程式碼
程式碼變得更簡潔、還不會佔用不必要的記憶體空間!
pyforest 的用法非常簡單,僅僅是一行程式碼:import pyforest
。當你需要某個函式功能的時候,可以直接著手寫出該函式,不用再專程為它回頭去寫 import!
假設我們有個常見的資料視覺化任務,要把某個連續型資料 標準化 然後畫出直方圖(histogram),其程式碼如下:
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('diamonds')
df['price'] = np.log(df['price'])
df[['price']] = StandardScaler().fit_transform(df[['price']])
counts, bins = np.histogram(df['price'])
plt.stairs(counts, bins)
plt.hist(bins[:-1], bins, weights=counts)
總共寫了 11 行程式,其中有 5 行都只是為了 import 而寫。
現在我們有 pyforest,import 可以全部精簡成:
import pyforest
df = sns.load_dataset('diamonds')
df['price'] = np.log(df['price'])
df[['price']] = StandardScaler().fit_transform(df[['price']])
counts, bins = np.histogram(df['price'])
plt.stairs(counts, bins)
plt.hist(bins[:-1], bins, weights=counts)
提醒:之前沒有使用過 pyforest 的話,需要先安裝此套件,以 Google Colab 的安裝為例,可以在 Notebook 執行以下指令來安裝 pyforest:
%pip install --upgrade pyforest
!python -m pyforest install_extensions
(%
與 !
是在 Google Colab 執行 Command Line 的 魔法指令)
當然,pyforest 沒辦法幫我們自動 import 所有的套件,而是開發者精選出資料科學常用的 30 多個套件,像是資料分析與視覺化必備的:
pandas
numpy
matplotlib
scikit-learn
- 深度學習必備的
TensorFlow
與PyTorch
- 等等
連一些 Python 好用的標準函式庫也在裡面,例如:
pyforest 支援的完整 package 清單,可以在 官方 Github 程式碼 一目瞭然地看到;在 Python 程式內也可以用 lazy_imports()
這個函式來列出所有支援的 packages:
>>> import pyforest
>>> lazy_imports()
['import re',
'from sklearn.feature_extraction.text import TfidfVectorizer',
'from sklearn.linear_model import Ridge',
'import plotly.graph_objs as go',
'from sklearn.preprocessing import RobustScaler',
... 部分輸出內容省略 ...
'import fbprophet',
'import datetime as dt',
'from sklearn.model_selection import RandomizedSearchCV',
'import matplotlib as mpl']
pyforest 的核心:Lazy Import
你是否會懷疑,pyforest 一次就幫你在 import 了 30 以上個套件,會讓記憶體被佔用一堆不見得會用到的空間?這個問題不會發生!
pyforest 的特色不只是簡化寫 import 的麻煩,更重要的是它不會因為方便性就過度佔用記憶體、影響程式效能,pyforest 透過 Lazy Import 技巧來達成這項特點。
用白話來說,Lazy Import 的意思是當你真的使用某個特定功能的時候,程式才會 import 。換言之,pyforest 像是在助跑、而還沒真的起跑,pyforest 只是事先知道你常用的 packages,而不是如 pyforest 字面上的介紹:從一開始就實際 import 所有 packages。
在 Python 實現 Lazy Import 有兩大好處:
- 程式啟用時間更快,不會一開始只為了 import 就要執行很多時間
- 記憶體使用更有效率,程式要用到的時候才實際 import、沒用到就擱置
以上兩個好處尤其會彰顯在程式與程式之間 相依性(Dependency)很高 的時候,當你的程式需要 import 另一支程式,而那支程式自己也 import 了許多其他套件,最後導致你現在要用的程式 import 了一大堆套件,但大多數不見得會立刻用到,徒然佔據記憶體、並拖慢一開始 import 花費的時間,Lazy Import 能解決此類問題。深度學習套件 TensorFlow
裡面的 LazyLoader
類別,正是發揮 Lazy Import 能力的好範例,如果你有興趣進一步了解 Lazy Import,推薦你閱讀:
- 史丹佛大學的 TensorFlow 課堂講義,介紹了
LazyLoader
的特點與限制 - Python 官方的 Lazy Import 指南:PEP 690
額外知識:不只在 Python,其他程式語言也有「Lazy」的應用,像是 R 語言函式存在 Lazy Evaluation,函式的引數只有在實際呼叫函數才會運算、宣告的時候則不會。
pyforest 的使用時機
pyforest 縱然創造了不少方便,但筆者好豪必須提醒:
pyforest 只適合用在探索資料的實驗階段(prototype)程式碼
正式上線的產品(Production Code)不適合使用 pyforest
因為,pyforest 並不是好的程式碼寫作風格!就如 Python 之禪(The Zen of Python)所說:「明示勝於暗示」(Explicit is better than implicit),明確寫出你的程式與誰相依、import 了什麼 packages,其他共同維護程式的開發者(包括未來的你自己)才能更容易讀懂你寫的程式、程式才更好維護。例如以下程式:
import pyforest
... 部份省略 ...
sns.load_dataset('diamonds')
如果是第一眼看到你的程式碼的人,看到 sns
,卻又看不出來它來自 import 的什麼,可能會搔著頭苦想:這究竟是一個變數?還是一個套件的別名(alias)?如果是套件它究竟是來自哪支程式?
所以,pyforest 最好只在自己獨自工作、恣意徜徉資料科學任務的時候使用;為了避免其他人看不懂你的程式而苦惱,將要正式上線的產品、或是與其他人協作的程式碼,還是要乖乖明確寫出每一行 import,不能為了省力、過分犧牲程式的可讀性。更多關於 import 的寫作風格好習慣可以參考 PEP8 的 import 小節。
結語
pyforest 是個有趣的 Python 資料科學套件,幫助我們省了很多寫 import 的工夫。我覺得 pyforest 最大的貢獻是減低我們的 認知負荷(cognitive load),我們大腦運作是會消耗能量跟心力的,寫個 import 即使不難,但是反反覆覆一直寫、或是程式寫到一半才想起來忘記 import 而回頭改,也是會消耗大腦能量到「心累」的!
如果你是實踐派的資料科學家,會為了驗證資料內的不同假設,總是會產生一大堆零碎、反覆塗改的程式碼,非常推薦你試試看 pyforest 套件,少寫點 import、也少一點點心累。
還想認識更多 Python 套件用法嗎?推薦你閱讀我寫過的更多 Python 教學文章,學會更多實用的 Python 套件用法:
- Python Enum 枚舉教學:有條理管理常數集合的好工具
- Python pathlib 教學:檔案路徑操作超簡單,不再煩惱前斜線或後斜線!
- 《Python 神乎其技》免費教學文章
- Python 從入門到進階自學資源分享
最後,若這篇文章有幫助到你,歡迎追蹤 好豪的粉絲專頁,我會持續分享 Python 技巧、資料科學等知識;也歡迎點選下方按鈕將本文加入書籤、或者分享給更多正在學 Python 的朋友。