新知一下
海量新知
6 5 1 6 1 8 8

独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果

数据派 | 传播数据知识。 2022/09/23 17:34

作者:Stef Smeets

翻译:王闯(Chuck)

校对:欧阳锦

本文介绍了streamlit ,并展示了如何利用它将 python 脚本转换为仪表板,以及如何在线托管。相比于Jupyter Notebooks,仪表板更有利于向非技术受众展示研究成果。

标签: 数据科学、可视化、仪表板、JupyterNo tebook、Dashboard

新知达人, 独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果 新知达人, 独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果 图片源自Unsplash,由Arie Wubben上传

作为一名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脚本。

新知达人, 独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果 新知达人, 独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果 正态分布图

…再到 酷炫的仪表板

让我们通过四个简单的步骤将其变成交互式仪表板:

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一样)

新知达人, 独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果

新知达人, 独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果

酷炫的仪表板

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)

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

更多“仪表板”相关内容

更多“仪表板”相关内容

新知精选

更多新知精选