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