天天看點

n 款好用的 Jupyter 插件,建議收藏

當有人說:「你可以用 Jupyter 擴充解決這個問題」,他們可能沒有說清楚是什麼樣的擴充。Jupyter 生态系統是非常子產品化且具有擴充性的,是以有很多種擴充方式。這個部落格希望能總結最常用的 Jupyter 擴充,并幫助你發掘生态系統中的新功能。

JupyterLab 擴充

n 款好用的 Jupyter 插件,建議收藏

在 JupyterLab 中用 jupyterlab-drawio 擴充繪圖

JupyterLab 是廣受歡迎的 Jupyter Notebook「新」界面。它是一個互動式的開發環境,可用于筆記本、代碼或資料,是以它的擴充性非常強。使用相關的擴充,可以添加一整套新功能,或者完全改變界面的運作方式。這些擴充是基于 TypeScript 或 JavaScript 寫的,它們在浏覽器裡運作。

經典的 Jupyter Notebook 擴充

n 款好用的 Jupyter 插件,建議收藏

Jupyter Notebook 中的内容清單擴充

人們總是會想到經典的 Jupyter 筆記本界面,但實際上,你可擴充它的各個子產品。這些 JavaScript 用戶端可以讓你按照自己的想法添加或改變功能,它們和 JupyterLab 擴充是一樣的。

筆記本伺服器擴充(serverextention)

和前兩種擴充不同,Jupyter 筆記本的伺服器擴充使用 Python 語言編寫,并加入了很多服務端的功能,以下有兩個主要的例子。

n 款好用的 Jupyter 插件,建議收藏

在 JupyterLab 中預覽 LaTeX 内容

預覽 LaTeX

第一個是一個為 JupyterLab 或經典的 Jupyter 筆記本提供的後端擴充——jupyterlab-latex。它可以在 JupyterLab 中預覽 LaTeX 檔案。它有一個和 JupyterLab 文本編輯器內建的擴充,以及一個後端伺服器擴充,可以運作 LaTeX 指令,并在前端顯示效果。

內建網絡應用

第二個則是為提供服務端處理提供使用者界面的擴充。因為服務網擴充可以作為任意 TornadoHTTP handler,是以任何你想得到的網絡應用都可以寫成一個 Jupyter 服務擴充。這裡的例子是 npgipuller,提供了使用者界面,可以将 git 代碼倉庫釋出給使用者。

Jupyter 核心

你可能已經很熟悉在 Jupyter 筆記本中使用 Python 語言了,其實你可以在其中運作很多語言:R、Julia、JavaScript、Octave、Scala/Spark、C++、bash,甚至是 Matlab。這些都被稱作核心。你可以為自己常用的程式設計語言寫一個核心,将 Jupyter 協定直接用在上面,用 metakernel 項目打包,或者用 Xeus 打包成 C++依賴。核心制作好以後,它可以在任何一個 Jupyter 前端運作,包括經典筆記本、JupyterLab、 nteract、Jupyter 指令行等。

IPython Magics

如果你在筆記本裡寫過如%matplotlib inline 這樣的指令,那麼你已經嘗試過 IPython 功能了。這些指令就像是 Python 中的宏(macro)——你可以寫定制化的代碼,将剩餘的代碼塊獨立出來,然後做自己想做的事情。

這種魔術函數從% 開始,然後通過% 後面的代碼發揮功能。例如%cd somedirectory 可以切換 Python 運作中的檔案目錄。代碼塊功能從%% 開始,并運作後面的整個塊。%%timeit 應該是最著名的,它可以提供運作代碼塊的時間。

你也可以建構自己的魔術函數。例如,ipython-sql (https://github.com/catherinedevlin/ipython-sql) 包提供%%sql 指令,可以和 sql 資料庫無縫工作。然而,和之前列出的擴充不同,IPython 的指令隻能在有 IPython 核心的環境工作。

IPython 小工具

n 款好用的 Jupyter 插件,建議收藏

用 drop down 玩轉繪圖功能。

IPython 小工具為 Jupyter 筆記本和 IPython 核心提供了 GUI 工具。這些工具可以讓你在共享筆記本時,使用 GUI 調試,而非使用代碼。如果和其他工具,如 voila 聯用,你可以制作一個類似儀表盤一樣的應用,其他人可以直接使用,甚至都不知道這是一個 Jupyter 筆記本。

你可以自己定制一些工具,為其他人提供領域内的動态可視化。例如,你可以用 ipyleaflet 制作動态地圖,用 itk-jupyter-widget 動态地研究圖像分割/配準任務,或者用 pythreejs 模組化 3D 目标。

内容管理器

内容管理器決定了你讀寫檔案時的操作。預設情況下,管理器從本地檔案系統中讀寫檔案,但是一個定制化的管理器可以從其它地方讀寫檔案,如 Amazon S3 / Google Cloud Storage、PostgreSQL、HDFS 等。你可以通過 web 界面讀寫它們,就好像檔案在本地一樣。

我最喜歡的内容管理器是 Jupytext。在你讀寫.ipynb 的檔案時,它會将其轉換為.py 檔案,并保持檔案同步。在你 IDE 中對一個.py 檔案進行了很多編輯後,可以自動在筆記本中看到這些更新,這是很神奇的事情。

n 款好用的 Jupyter 插件,建議收藏

Jupytext: .ipynb 或者 .py? 我全都要

擴充 JupyterHub

JupyterHub 是多使用者應用,可以使用于教學、實驗室或者生産中。這些組織很可能有其它系統,是以 Jupyter 需要和這些系統內建到一起。以下是一些擴充 JupyterHub 的簡單方法。

認證器

JupyterHub 是一個多使用者應用,是以使用者需要登入,認證器的工作是對登入使用者進行身份驗證。現在已經有許多流行的驗證器了,如 LDAP、OAuth(Google、GitHub、CILogon、Globus、Okta、Canvas 等)。你可以寫一個自己需要的認證器,是以 JupyterHub 可以覆寫各種使用場景。

生成器(Spawner)

如果使用一個可插拔的生成器,你可以用很多方法給每個使用者提供 Jupyter 筆記本伺服器。你可能讓他們從一個節點生成 Docker 容器、将它們連接配接到 Kubernetes 上、讓它們使用你的 HPC 叢集、或者使用你的 Hadoop 或者 Spark 叢集、用 systemd 提供服務、或者直接将這些伺服器視為不同的 Linux 使用者。這些生成器一般都很容易定制參數,當然你也可以自己寫一個。

服務

你有時希望給 JupyterHub 使用者提供額外服務——在閑置時回收資源,或者讓他們釋出筆記本。你可以運作一個 JupyterHub Service 來提供這些服務。使用者可以發起請求,而服務也可以向 JupyterHub 發起 API 請求。這些可以是直接的請求,或者網絡服務。例如,BinderHub (https://github.com/jupyterhub/binderhub) 是 JupyterHub 服務中的一種。

NBConvert Exporter

Nbconvert 擴充可以令筆記本格式的檔案和其他格式互相轉換。如果你導出筆記本到 PDF、LaTeX、HTML 或者 nbviwer 的話,你已經使用了這個擴充。在這個擴充裡,對應每一個格式都有一個導出器,你也可以寫一個針對自己格式的導出器,或者可以利用已有的定制一個。

在寫這篇部落格時,我最開心的時刻是發現有 docx 文檔(word)導出器。

word 導出器:https://github.com/m-rossi/jupyter-docx-bundler

Bundler 擴充

n 款好用的 Jupyter 插件,建議收藏

很容易就能找到 nbconvert 導出器的方法

Bundler 擴充使你可以在菜單欄添加「下載下傳為」按鈕。這個按鈕和 nbconvert 導出器聯用,使得導出器更容易被找到,盡管你可以寫一個定制化的擴充,使筆記本在下載下傳前進行任何操作。例如,nbreport 擴充提供一個 bundler 擴充,可以将筆記本格式導出為 HTML。

Repo2Docker

Repo2Docker 擴充将 git 或者其他倉庫轉換為可重新使用、适合于資料科學的 docker 鏡像。網站 mybinder.org(和其他 binderhub 安裝包)使用這個擴充建構和運作 Jupyter/RStudio 程序。如下所示,現在有兩種擴充 repo2docker 的方式。

BuildPacks

Repo2docker 會檢視代碼庫中的内容,并決定如何去建構它。例如,如果裡面有 requirements.txt 檔案,它會設定一個小型 conda 環境,并把 Python 包安裝進去。如果裡面有 install.R 檔案,擴充則會保證 R/RStudio 已經安裝。寫一個 BuildPack (https://repo2docker.readthedocs.io/en/latest/architecture.html#buildpacks) 使你可以将這個功能擴充到你喜歡的程式設計語言中。

ContentProviders

Repo2docker 中的 repo 部分有點用詞不當——實際上你可以将任何程式打包進一個 Docker 鏡像中。現在,它支援 git 本地檔案夾和 zenodo (https://zenodo.org/) 代碼倉庫,但是你可以為自己喜歡的代碼源添加支援,并制作一個新的 ContentProvider。

隻有這些了嗎?

n 款好用的 Jupyter 插件,建議收藏