放棄Jupyter Notebooks吧,教你如何用儀表板展示研究成果
作為一名Python 愛(ài)好者,我幾乎用 Jupyter Notebooks (https://jupyter.org/)處理一切工作。Notebooks集成了markdown標記語(yǔ)言、代碼和inline模式繪圖,使其成為探索性數據分析的絕佳工具。我使用這些Notebooks來(lái)開(kāi)發(fā)和共享代碼、開(kāi)發(fā)原型、探索程序庫、玩轉數據以及繪圖和可視化。Notebooks可以呈現為靜態(tài)html和pdf,因此也非常適合用來(lái)編寫(xiě)報告、文檔和教程……特別是當你想要同時(shí)共享數據和代碼的時(shí)候。
然而,作為一名研究人員,我發(fā)現代碼有時(shí)會(huì )妨礙我想要顯示的數據。那么問(wèn)題來(lái)了,當我們要與非技術(shù)受眾分享數據時(shí),有哪些選擇?有比Notebooks更好的選擇嗎?
Notebooks的槽點(diǎn)
在我們繼續往下之前,不妨退后一步,看看Jupyter Notebooks存在的一些問(wèn)題。
不可否認,利用Jupyter notebooks來(lái)展示研究結果在過(guò)去的幾年中已蔚然成風(fēng)。這意味著(zhù)Jupyter Notebooks 的問(wèn)題也是眾所周知的。我必須要吐槽的是:
1. 非線(xiàn)性執行模式。Notebooks通常包含難以名狀的隱藏狀態(tài)。這對初學(xué)者來(lái)說(shuō)非常不友好。
2. Notebooks很難與非技術(shù)人員共享。他們需要知道如何設置 Python、安裝庫、管理環(huán)境和修改代碼。
Notebooks可以托管在諸如binder之類(lèi)的地方,從而使代碼立即可復現。只有理解代碼以及如何運行筆記本,才能復現。在這里,inline模式代碼可能會(huì )給自己埋坑。我看到很多notebooks在頂部說(shuō)明了每個(gè)變量的作用以及如何運行代碼。你需要了解代碼的工作原理才能使用notebooks。
儀表板
是時(shí)候請儀表板登場(chǎng)了。
儀表板是一個(gè)從數據科學(xué)世界引入的相對較新的概念,它利用了現代web的優(yōu)點(diǎn)。從本質(zhì)上講,儀表板是用于快速瀏覽某些數據的簡(jiǎn)單web應用程序。就像一個(gè)用來(lái)呈現數據的迷你圖形界面。
在荷蘭eScience中心,我們喜歡使用儀表板來(lái)展示我們的數據
(https://blog.esciencecenter.nl/https-blog-esciencecenter-nl-spot-visual-scientific-data-analytics-made-easy-62e03a895bae)。
如果你是 Python用戶(hù),你可以試試下面這些儀表板工具:
Dash(https://plotly.com/dash/,2017 年,每月 88.3 萬(wàn)次下載)
Panel(https://panel.holoviz.org/, 2018 年,每月 38.7 萬(wàn)次下載)
Streamlit(https://streamlit.io/, 2019 年,每月 93 萬(wàn)次下載)
voila(https://voila.readthedocs.io/en/stable/, 2019 年,每月 5.6 萬(wàn)次下載)
以上都是非常棒的選擇。如果你需要詳細地比較他們之間的優(yōu)缺點(diǎn),請查看博客文章(https://medium.datadriveninvestor.com/streamlit-vs-dash-vs-voil%C3%A0-vs-panel-battle-of-the-python-dashboarding-giants-177c40b9ea57)。
Streamlit
在這四個(gè)儀表板工具中,Streamlit最讓我印象深刻,因為它簡(jiǎn)單易用。我有一個(gè)項目一直在用Streamlit開(kāi)發(fā)出的簡(jiǎn)單的數據處理GUI。以下是我整理的早先的使用心得:
1. 使用一周后,我發(fā)現它非常容易上手。
2. 線(xiàn)性執行模式使得對代碼的理解變得容易(稍后會(huì )詳細介紹)。
3. 無(wú)需了解任何web開(kāi)發(fā),因為該庫的目的之一就是開(kāi)箱即用(劇透警告:確實(shí)如此)。
4. API設計得非常好,易于管理,Python風(fēng)格明顯。你可以在一天內掌握全部 API。有人會(huì )說(shuō) API 提供得選項很有限,但在我看來(lái)恰好,剛好適合我的大腦容量。它的文檔結構也不錯,提供了清晰的解釋和示例。
5. Streamlit開(kāi)發(fā)人員聲稱(chēng)這是用Python構建數據應用程序的最快方法。這聽(tīng)起來(lái)像是一種推銷(xiāo),但它可能是真的。你可以在幾分鐘內將任何Python腳本變成交互式儀表板。
從一個(gè)正常的繪圖過(guò)程......
讓我們來(lái)看一個(gè)例子。作為一名研究人員,我有很多Python腳本或notebooks,它們在做如下事情:
1. 加載或生成數據
2. 數據處理
3. 繪圖
我會(huì )無(wú)休止地調整參數并重新運行腳本以獲得正確的繪圖。這對我來(lái)說(shuō)不是問(wèn)題。但是,當與不太精通軟件的同事共享腳本時(shí),這意味著(zhù)我就要扮演技術(shù)支持的角色。想想就頭痛,需要幫忙設置 Python、管理環(huán)境、修復錯誤、滿(mǎn)足功能需求等……
聽(tīng)起來(lái)很耳熟?
下面的代碼片段生成一些數據(正態(tài)分布),對其進(jìn)行擬合,并從中創(chuàng )建一個(gè) matplotlib圖。它需要三個(gè)參數,mu_in、std_in 和 size。
import numpy as npfrom scipy.stats import normimport matplotlib.pyplot as plt
mu_in = 5std_in = 5.0size = 100
def norm_dist(mu, std, size=100):"""Generate normal distribution."""return norm.rvs(mu, std, size=size)
data = norm_dist(mu_in, std_in, size=size)
# Fit the normal distributionmu, std = norm.fit(data)
# Make some plotsx = np.linspace(-40, 40, 100)y = norm.pdf(x, mu, std)
title = f"Fit results: {mu=:.2f}, {std=:.2f}"
fig, ax = plt.subplots()ax.hist(data, bins=50, density=True)ax.plot(x, y, 'k', linewidth=2)ax.set_title(title)
plt.show()
我酷斃了的Python腳本。
正態(tài)分布圖
…再到酷炫的儀表板
讓我們通過(guò)四個(gè)簡(jiǎn)單的步驟將其變成交互式儀表板:
1. import streamlist as st
2. 用st.title添加標題
3. 用st.slider將輸入參數轉換為交互式滑塊
4. 用st.pyplot繪圖
注意,此時(shí)我們不必更改任何數據生成、擬合或繪圖相關(guān)的代碼!
import numpy as npfrom scipy.stats import normimport matplotlib.pyplot as pltimport streamlit as st
st.title('Normal distribution')
mu_in = st.slider('Mean', value=5, min_value=-10, max_value=10)std_in = st.slider('Standard deviation', value=5.0, min_value=0.0, max_value=10.0)size = st.slider('Number of samples', value=100, max_value=500)
def norm_dist(mu, std, size=100): """Generate normal distribution.""" return norm.rvs(mu, std, size=size) data = norm_dist(mu_in, std_in, size=size) # Fit the normal distributio mu, std = norm.fit(data) # Make some plots st.pyplot(fig)
現在變成儀表板了
運行儀表板程序,輸入如下命令行:
streamlit run my_dashboard.py
這會(huì )開(kāi)啟一個(gè)服務(wù)器端,然后利用瀏覽器就可以訪(fǎng)問(wèn)儀表板了(就像用Jupyter Notebook一樣)
酷炫的儀表板
Streamlit是如何工作的的?
Streamlit 的工作方式非常有趣。每次移動(dòng)滑塊、選中一個(gè)框或按下一個(gè)按鈕時(shí),Streamlit 都會(huì )觸發(fā)腳本的重新運行。每當輸入值被更新,javascript 后端都會(huì )跟蹤這些值。
這意味著(zhù)代碼本身是線(xiàn)性執行的。在我看來(lái),這種簡(jiǎn)單性是它與眾不同的地方。不需要任何回調或復雜的流控制。你的python腳本從上到下運行。這使得理解代碼變得容易。python代碼只需經(jīng)過(guò)最少的修改,任何代碼腳本都可以變成儀表板。
有什么缺點(diǎn)嗎?當然。因為streamlit在每次更新時(shí)都會(huì )重新運行整個(gè)腳本,所以感覺(jué)有點(diǎn)慢,尤其是在更新大量繪圖時(shí),它也可能卡在長(cháng)時(shí)間運行的函數上。Streamlit提供了一些選項來(lái)緩存中間結果,從而優(yōu)化性能。
(https://docs.streamlit.io/library/apireference/performance)
繪圖庫
上面的示例使用matplotlib進(jìn)行繪圖。Matplotlib一直是Python的首選繪圖庫。它已經(jīng)存在了近二十年,并且緊密集成在Python科學(xué)計算技術(shù)棧中。
如果你熟悉matplotlib,你就知道它適合繪制達到出版刊物質(zhì)量的圖,但與此同時(shí),交互式繪圖可能很麻煩。
Streamlit 支持以下庫:
matplotlib
altair
bokeh
plotly
seaborn
PyDeck
GraphViz
更加現代的繪圖庫,如 plotly(https://plotly.com/python/)、bokeh(https://bokeh.org) 和 altair(https://altair-viz.github.io)可以直接渲染到 javascript。這意味著(zhù)它們天然是為Web而生的,并且內置了交互性。這使它們更適合web應用程序。如果你要制作儀表板,我建議你嘗試下這些可替代方案。
共享儀表板
好的,現在我們已經(jīng)制作了一個(gè)外觀(guān)精美的儀表板,以便任何人都可以上手把玩數據。那么如何部署呢?
Streamlit 使用主機/服務(wù)器模型,這意味著(zhù)你可以在自己的服務(wù)器上運行它。
更簡(jiǎn)單的辦法是使用streamlit云(https://streamlit.io/cloud)來(lái)托管你的儀表板(對學(xué)生和開(kāi)源項目免費)。我發(fā)現這也很容易設置。我所要做的就是在 github上創(chuàng )建一個(gè)包含代碼和需求文檔的repository。
然后我使用Github SSO登錄到streamlit云,并啟動(dòng)了一個(gè)指向我的repo和代碼的新應用程序。
點(diǎn)擊這里
(https://share.streamlit.io/stefsmeets/dashboard_blog/main)查看結果!
尾聲
在這篇博文中,我介紹了streamlit ,并展示了如何利用它將python腳本轉換為儀表板,以及如何在線(xiàn)托管。在我看來(lái),這是向非技術(shù)受眾展示研究成果的絕佳方式。線(xiàn)性執行模式會(huì )讓調整現有腳本變得簡(jiǎn)單。代碼不會(huì )成為阻礙,結果看起來(lái)也很棒。
因此,下次當你想在notebook中顯示一些數據時(shí),請考慮改用儀表板。
這篇博文中的所有代碼都可以從Github獲得(https://github.com/stefsmeets/dashboard_blog)。
原文標題:
Forget about Jupyter Notebooks — showcase your research using Dashboards
原文鏈接:
https://medium.com/escience-center/forget-about-jupyter-notebooks-showcase-your-research-using-dashboards-5d13451ba374
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。
c++相關(guān)文章:c++教程
通信相關(guān)文章:通信原理
藍牙技術(shù)相關(guān)文章:藍牙技術(shù)原理