新闻  |   论坛  |   博客  |   在线研讨会
放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果
数据派THU | 2022-09-26 08:07:13    阅读:295   发布文章

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


图片图片 正态分布图


…再到酷炫的仪表板 


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


1. import streamlist as st

2. 用st.title添加标题

3. 用st.slider将输入参数转换为交互式滑块

4. 用st.pyplot绘图


注意,此时我们不必更改任何数据生成、拟合或绘图相关的代码!

























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


这会开启一个服务器端,然后利用浏览器就可以访问仪表板了(就像用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 

原文链接:

https://medium.com/escience-center/forget-about-jupyter-notebooks-showcase-your-research-using-dashboards-5d13451ba374



*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客