放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果
The following article is from 数据派THU Author 数据派THU
大数据文摘授权转载自数据派THU
作者:Stef Smeets
翻译:王闯(Chuck)
校对:欧阳锦
作为一名Python 爱好者,我几乎用 Jupyter Notebooks (https://jupyter.org/)处理一切工作。Notebooks集成了markdown标记语言、代码和inline模式绘图,使其成为探索性数据分析的绝佳工具。我使用这些Notebooks来开发和共享代码、开发原型、探索程序库、玩转数据以及绘图和可视化。Notebooks可以呈现为静态html和pdf,因此也非常适合用来编写报告、文档和教程……特别是当你想要同时共享数据和代码的时候。
然而,作为一名研究人员,我发现代码有时会妨碍我想要显示的数据。那么问题来了,当我们要与非技术受众分享数据时,有哪些选择?有比Notebooks更好的选择吗?
Notebooks的槽点
在我们继续往下之前,不妨退后一步,看看Jupyter Notebooks存在的一些问题。
不可否认,利用Jupyter notebooks来展示研究结果在过去的几年中已蔚然成风。这意味着Jupyter Notebooks 的问题也是众所周知的。我必须要吐槽的是:
1. 非线性执行模式。Notebooks通常包含难以名状的隐藏状态。这对初学者来说非常不友好。
2. Notebooks很难与非技术人员共享。他们需要知道如何设置 Python、安装库、管理环境和修改代码。
Notebooks可以托管在诸如binder之类的地方,从而使代码立即可复现。只有理解代码以及如何运行笔记本,才能复现。在这里,inline模式代码可能会给自己埋坑。我看到很多notebooks在顶部说明了每个变量的作用以及如何运行代码。你需要了解代码的工作原理才能使用notebooks。
仪表板
是时候请仪表板登场了。
仪表板是一个从数据科学世界引入的相对较新的概念,它利用了现代web的优点。从本质上讲,仪表板是用于快速浏览某些数据的简单web应用程序。就像一个用来呈现数据的迷你图形界面。
在荷兰eScience中心,我们喜欢使用仪表板来展示我们的数据:
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 万次下载)
以上都是非常棒的选择。如果你需要详细地比较他们之间的优缺点,请查看博客文章:
https://medium.datadriveninvestor.com/streamlit-vs-dash-vs-voil%C3%A0-vs-panel-battle-of-the-python-dashboarding-giants-177c40b9ea57
Streamlit
在这四个仪表板工具中,Streamlit最让我印象深刻,因为它简单易用。我有一个项目一直在用Streamlit开发出的简单的数据处理GUI。以下是我整理的早先的使用心得:
1. 使用一周后,我发现它非常容易上手。
2. 线性执行模式使得对代码的理解变得容易(稍后会详细介绍)。
3. 无需了解任何web开发,因为该库的目的之一就是开箱即用(剧透警告:确实如此)。
4. API设计得非常好,易于管理,Python风格明显。你可以在一天内掌握全部 API。有人会说 API 提供得选项很有限,但在我看来恰好,刚好适合我的大脑容量。它的文档结构也不错,提供了清晰的解释和示例。
5. Streamlit开发人员声称这是用Python构建数据应用程序的最快方法。
这听起来像是一种推销,但它可能是真的。你可以在几分钟内将任何Python脚本变成交互式仪表板。
从一个正常的绘图过程......
让我们来看一个例子。作为一名研究人员,我有很多Python脚本或notebooks,它们在做如下事情:
1. 加载或生成数据
2. 数据处理
3. 绘图
我会无休止地调整参数并重新运行脚本以获得正确的绘图。这对我来说不是问题。但是,当与不太精通软件的同事共享脚本时,这意味着我就要扮演技术支持的角色。想想就头痛,需要帮忙设置 Python、管理环境、修复错误、满足功能需求等……
听起来很耳熟?
下面的代码片段生成一些数据(正态分布),对其进行拟合,并从中创建一个 matplotlib图。它需要三个参数,mu_in、std_in 和 size。
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
mu_in = 5
std_in = 5.0
size = 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 distribution
mu, std = norm.fit(data)
# Make some plots
x = 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脚本。
…再到酷炫的仪表板
让我们通过四个简单的步骤将其变成交互式仪表板:
1. import streamlist as st
2. 用st.title添加标题
3. 用st.slider将输入参数转换为交互式滑块
4. 用st.pyplot绘图
注意,此时我们不必更改任何数据生成、拟合或绘图相关的代码!
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
import 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
这会开启一个服务器端,然后利用浏览器就可以访问仪表板了(就像用Jupyter Notebook一样)
酷炫的仪表板
Streamlit是如何工作的的?
Streamlit 的工作方式非常有趣。每次移动滑块、选中一个框或按下一个按钮时,Streamlit 都会触发脚本的重新运行。每当输入值被更新,javascript 后端都会跟踪这些值。
这意味着代码本身是线性执行的。在我看来,这种简单性是它与众不同的地方。不需要任何回调或复杂的流控制。你的python脚本从上到下运行。这使得理解代码变得容易。python代码只需经过最少的修改,任何代码脚本都可以变成仪表板。
有什么缺点吗?当然。因为streamlit在每次更新时都会重新运行整个脚本,所以感觉有点慢,尤其是在更新大量绘图时,它也可能卡在长时间运行的函数上。Streamlit提供了一些选项来缓存中间结果,从而优化性能。
https://docs.streamlit.io/library/apireference/performance
绘图库
上面的示例使用matplotlib进行绘图。Matplotlib一直是Python的首选绘图库。它已经存在了近二十年,并且紧密集成在Python科学计算技术栈中。
如果你熟悉matplotlib,你就知道它适合绘制达到出版刊物质量的图,但与此同时,交互式绘图可能很麻烦。
Streamlit 支持以下库:
matplotlib
altair
bokeh
plotly
seaborn
PyDeck
GraphViz
更加现代的绘图库,如 plotly(https://plotly.com/python/)、bokeh(https://bokeh.org) 和 altair(https://altair-viz.github.io)可以直接渲染到 javascript。这意味着它们天然是为Web而生的,并且内置了交互性。这使它们更适合web应用程序。如果你要制作仪表板,我建议你尝试下这些可替代方案。
共享仪表板
好的,现在我们已经制作了一个外观精美的仪表板,以便任何人都可以上手把玩数据。那么如何部署呢?
Streamlit 使用主机/服务器模型,这意味着你可以在自己的服务器上运行它。
更简单的办法是使用streamlit云(https://streamlit.io/cloud)来托管你的仪表板(对学生和开源项目免费)。我发现这也很容易设置。我所要做的就是在 github上创建一个包含代码和需求文档的repository。
然后我使用Github SSO登录到streamlit云,并启动了一个指向我的repo和代码的新应用程序。
点击这里
(https://share.streamlit.io/stefsmeets/dashboard_blog/main)查看结果!
尾声
在这篇博文中,我介绍了streamlit ,并展示了如何利用它将python脚本转换为仪表板,以及如何在线托管。在我看来,这是向非技术受众展示研究成果的绝佳方式。线性执行模式会让调整现有脚本变得简单。代码不会成为阻碍,结果看起来也很棒。
因此,下次当你想在notebook中显示一些数据时,请考虑改用仪表板。
这篇博文中的所有代码都可以从Github获得
https://github.com/stefsmeets/dashboard_blog
原文标题:
Forget about Jupyter Notebooks — showcase your research using Dashboards
原文链接: