擴展Jupyter生態系統的99種方法

每當有人在Jupyter生態系統中說“你可以通過擴展來實現它 ”時,你通常並不清楚他們在談論的是哪種擴展。Jupyter生態系統是非常模塊化和可擴展的,所以有很多方法去擴展它。這篇博客文章的目的是對擴展Jupyter的最常見方法進行一個快速總結,併為你提供一些鏈接來幫助你探索Jupyter擴展生態系統。

JupyterLab 擴展 (labextension)

擴展Jupyter生態系統的99種方法

在JupyterLab 中使用jupyterlab-drawio 擴展繪製矢量圖形

JupyterLab是一個流行的用於與Jupyter Notebook一起工作的“新”接口。它是一個用於處理notebook、代碼和數據的交互式開發環境,因此具有極強的可擴展性。使用JupyterLab擴展,你可以添加全新的功能,或者更改接口行為的幾乎任何方面。它們是用TypeScript或JavaScript編寫的,並運行在瀏覽器中。

JupyterLab文檔提供了關於如何安裝&使用擴展,以及如何編寫&分發它們的信息。你還可以通過在GitHubnpmjs.com上進行搜索來發現更多擴展。

我最喜歡的JupyterLab擴展是jupyterlab-vim ——它允許你在JupyterLab中完全使用Vim鍵綁定!

經典的notebook 擴展(nbextension)

擴展Jupyter生態系統的99種方法

nbextension目錄表

當人們想到“notebook界面”時,他們可能回想起經典的Jupyter Notebook。你可以使用nbextensions來擴展notebook用戶體驗的任何方面。這些是客戶端JavaScript的一小部分,它允許你隨意添加/更改功能。它們是經典notebook,相當於JupyterLab擴展。

Jupyter Notebook文檔中有關於如何安裝或開發擴展的信息。非官方的Jupyter Notebook擴展庫有很多流行的擴展和一個GUI擴展管理器,你可以使用它們來安裝nbextension。

我最喜歡的nbextension為你的notebook提供了一個可摺疊的目錄表。

Notebook 服務器擴展 (serverextension)

與JupyterLab或nbextension不同,Jupyter Notebook服務器擴展是用Python編寫的,以添加一些服務器端功能。服務器擴展有兩個主要用例。

擴展Jupyter生態系統的99種方法

LaTeX在JupyterLab中的 預覽

第一個用例是為特定的JupyterLab或經典的notebook擴展提供一個後端。一個例子是jupyterlab-latex JupyterLab擴展,它提供了在JupyterLab中對LaTeX文件的實時預覽。它有一個與JupyterLab文本編輯器集成的前端JupyterLab擴展,以及一個後端服務器擴展組件,後者實際運行LaTeX命令來生成顯示給你的輸出。

擴展Jupyter生態系統的99種方法

第二個用例是提供由任何類型的服務器端處理支持的任何用戶界面。服務器擴展可以作為任意的Tornado HTTP處理程序—因此,你可以將任何你能想到的web應用程序編寫為一個Jupyter serverextension。nbgitpuller就是一個例子,它提供了以透明的方式將git存儲庫中的notebook分發給用戶的UI的機制。

我最喜歡的是jupyter-rsession-proxy,它允許你在JupyterHub環境中運行RStudio !

Jupyter 內核

你可能對通過Python來使用Jupyter notebook非常熟悉,但是在編寫你的notebook時,你可以使用大量的其他語言:R、Julia、JavaScript、Octave、Scala/Spark、交互式C++、bash,甚至Matlab! 這些被稱為內核,它們在zeromq上使用語言無關的Jupyter協議。你可以通過直接實現Jupyter協議、使用metakernel項目對Jupyter協議進行包裝,或者通過Xeus使用C++綁定,為你的語言編寫一個新的內核。一旦一個內核已經存在,它就可以與任何Jupyter前端無縫運行——經典notebook、JupyterLab、nteract、終端jupyter控制檯、圖形Qt控制檯等等。

我最喜歡的內核是 linux 內核.

IPython 魔法

如果你在一個notebook中編寫了 %matplotlib inline,那麼你就已經使用了一個IPython魔法。這些宏幾乎與Python的宏類似——你可以編寫自定義代碼來解析行(或單元格)的其餘部分,並執行你想要的任何操作。

行魔法從一個%符號開始,並根據行的其餘部分採取一些操作。例如,%cd somedirectory會更改python進程的當前目錄。單元格魔法從%%開始,然後對它之後的整個單元格內容進行操作。%%timeit可能是最著名的——它會對代碼運行多次,並對運行時間的統計數據進行報告。

你還可以構建你自己的與IPython集成的魔法命令。例如,ipython-sql包提供了%%sql 魔法命令,用於與數據庫無縫運行。但是,請記住,與目前列出的擴展不同,IPython 魔法只適用於IPython內核。

我最喜歡使用的IPython 魔法是Matthias Bussonnier的這篇博客文章,它使用自定義的魔法命令將Python、R、C和Julia無縫地集成在同一個notebook中。

IPython 小部件 (ipywidgets)

擴展Jupyter生態系統的99種方法

使用下拉菜單選擇繪圖選項,來自Will Koehrsen《尊重數據科學》

IPython 小部件 (ipywidgets)為Jupyternotebook和IPython內核提供了交互式GUI小部件。它們允許你和與你共享你的notebook的人使用GUI元素來探索你的代碼中的各種選項,而不必修改代碼。加上像voila這樣的東西,你可以為創建類似於儀表板的應用程序供其他人使用,而不需要意識到它完全是用一個Jupyter Notebook創建的!

你可以構建自己的自定義小部件來提供特定於域的交互可視化。例如,你可以使用ipyleaflet來交互式地可視化地圖,使用itk-jupyter-widget交互式地探索圖像分割/配準問題,或者使用pythreejs建模3D對象。

查看vdom項目以獲得對相同問題領域的更多響應式看法,查看xwidgets以獲得一個C++實現

內容管理器

無論何時當你通過web界面打開或保存一個notebook或文件時,Contents Manager都會決定實際發生什麼。默認情況下,它從本地文件系統中加載和保存文件,但是一個自定義內容管理器可以做它想做的任何事情。它的一個流行的用例是從本地文件系統之外的其他地方(比如,Amazon S3 /谷歌雲存儲、PostgreSQL、HDFS等等)加載/保存內容。當使用其中之一時,你可以通過web界面加載/保存notebook和文件,就像它們在你的本地文件系統上一樣!如果你已經使用了其中任何一個來存儲數據,那麼這將非常有用。

我最喜歡的內容管理器是Jupytext。在保存/加載期間,它會施展一些魔法來為你提供一個與你的.ipynb等價的.py文件,並使它們保持同步。你可以交互式地在你的notebook中查看代碼,然後在一個IDE中打開.py文件進行一些繁重的文本編輯,內容管理器會在你再次打notebook時自動將所有更改返回到你的notebook中去。它很神奇。

擴展Jupyter生態系統的99種方法

Jupytext:.ipynb還是.py?為什麼不兩者同時使用!

擴展 JupyterHub

JupyterHub是一個多用戶應用程序,用於生成notebook和其他交互式web應用程序,被設計用於教室、研究實驗室和公司。這些組織可能正在使用其他系統,而JupyterHub需要與它們緊密集成。下面簡要列出了擴展JupyterHub的一些方法。

Authenticator(身份驗證器)

JupyterHub是一個多用戶應用程序,因此用戶需要以某種方式登錄—理想情況下,與登錄它們組織中的其他應用程序的方式相同。身份驗證器負責此操作。許多流行的身份驗證服務已經使用了Authenticator,如LDAP、OAuth(谷歌、GitHub、CILogon、Globus、Okta、Canvas等)、大多數帶有LTI的LMS、SAML、JWT、普通用戶名和密碼、linux用戶等等。你可以編寫自己的身份驗證器或非常容易地定製一個已經存在的,所以無論你的身份驗證需要什麼—JupyterHub都已經介紹過了。

進程生成程序

使用可插拔的進程生成程序,你可以通過許多不同的方式為每個用戶啟動一個JupyterNotebook服務器。你可能希望它們生成一個帶有docker容器的節點,使用Kubernetes擴展它們,在你的HPC集群上使用它們,讓它們運行在你的Hadoop / Spark集群上,使用systemd包含它們,簡單地以不同的linux用戶或其他許多可能的方式運行它們。進程生成程序本身通常是非常易配置的,當然你也可以編寫自己的進程生成程序。

服務

通常,你希望為你的JupyterHub用戶提供額外的服務——在空閒時殺死他們的服務器,或者允許他們發佈可共享的notebook。你可以運行一個JupyterHub服務來提供這些或類似的服務。用戶可以使用他們的JupyterHub身份向這些服務發出請求,服務也可以對JupyterHub進行API調用。這些可以是任意的進程或web服務——例如,BinderHub就被實現為一個JupyterHub服務。

NBConvert 輸出器

nbconvert會在notebook格式和各種其他格式之間進行轉換——如果你已經使用nbconvert將你的notebook輸出到PDF、 LaTeX或HTML,或者你也可以使用nbviewer。它為導出的每一種格式都有一個導出器,你也可以編寫自己的導出器來導出到一種新格式——或者只是大量定製一個現有的導出格式。如果你正在執行涉及notebook的複雜轉換操作,你可能會發現編寫一個導出器是實現你的目標的最簡潔的方法。

在對這篇博客文章進行研究時,我最開心的時刻就是發現還存在一個docx導出器。

Bundler 擴展


擴展Jupyter生態系統的99種方法

可發現的方式去啟用nbconvert 輸出器

Bundler擴展允許你在菜單欄中以項目的形式向Download添加條目。它們通常與nbconvert導出程序一起使用,以使導出程序更易於發現,不過你也可以編寫一個自定義的bundler擴展,以便在下載之前對一個notebook進行任何類型的自定義處理。例如,nbreport提供了一個bundler擴展,它以一個合適的方式來清理notebook以便將它視為一個報告,並將它輸出為 HTML。

Repo2Docker

repo2docker將git(和其他)存儲庫轉換成可複製的、以數據科學為重點的docker鏡像。mybinder.org(以及其他binderhub安裝包)依賴它從git存儲庫構建和啟動交互式Jupyter/RStudio會話。目前有兩種方法可以擴展repo2docker。

BuildPacks

repo2docker會查看存儲庫的內容來決定如何構建它。例如,如果有一個requirements.txt,它將設置一個miniconda環境來安裝python包,而如果有一個install.R文件的話,它會確保R/Rstudio已經安裝。編寫一個新的BuildPack允許你擴展此行為,以添加對你喜愛的語言的支持,或者自定義一個現有語言的構建方式。

ContentProviders(內容提供者)

repo2docker的repo部分是一個誤稱——你可以將任何東西轉換成一個docker鏡像。目前,它支持git、local folder和zenodo存儲庫——但是你可以通過創建一個新的ContentProvider來添加對你最喜愛的可重複代碼源的支持!

就這些嗎?

當然不是?Jupyter生態系統是巨大的,沒有一個博客文章可以涵蓋所有。這篇博客文章已經遺漏了一些——企業網關,TLJH插件,等等。隨著時間的推移,將會有更新的組件和更新的方法來擴展我們甚至還沒有想象到的東西。請在評論區告訴我這裡還遺漏了什麼。

期待看到你們所有人都創建了漂亮的擴展!

英文原文:https://qiniumedia.freelycode.com/vcdn/1/%E4%BC%98%E8%B4%A8%E6%96%87%E7%AB%A0%E9%95%BF%E5%9B%BE3/99-ways-to-extend-jupyter.pdf

譯者:一瞬

相關推薦

推薦中...