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


    15ddf09a13b158a6deb766476e247b96.png

    1. 作者:Stef Smeets翻译:王闯(Chuck)校对:欧阳锦
    2. 本文约2500字,建议阅读5分钟本文介绍了streamlit ,并展示了如何利用它将 python 脚本转换为仪表板,以及如何在线托管。相比于Jupyter Notebooks,仪表板更有利于向非技术受众展示研究成果。

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

    9e593cf2167c6451e24c3d42bcbbfa90.png55d68fa2b38368b15d89d12419ebf2a9.jpeg 图片源自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。

    1. import numpy as np
    2. from scipy.stats import norm
    3. import matplotlib.pyplot as plt
    4. mu_in = 5
    5. std_in = 5.0
    6. size = 100
    7. def norm_dist(mu, std, size=100):
    8. """Generate normal distribution."""
    9. return norm.rvs(mu, std, size=size)
    10. data = norm_dist(mu_in, std_in, size=size)
    11. # Fit the normal distribution
    12. mu, std = norm.fit(data)
    13. # Make some plots
    14. x = np.linspace(-40, 40, 100)
    15. y = norm.pdf(x, mu, std)
    16. title = f"Fit results: {mu=:.2f}, {std=:.2f}"
    17. fig, ax = plt.subplots()
    18. ax.hist(data, bins=50, density=True)
    19. ax.plot(x, y, 'k', linewidth=2)
    20. ax.set_title(title)
    21. plt.show()

    我酷毙了的Python脚本。

    9f9ccea345efe2f054dc4e21fd10dd43.png9757f550ab623f6996751e9879b2ba57.jpeg 正态分布图

    …再到酷炫的仪表板 

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

    1. import streamlist as st

    2. 用st.title添加标题

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

    4. 用st.pyplot绘图

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

    1. import numpy as np
    2. from scipy.stats import norm
    3. import matplotlib.pyplot as plt
    4. import streamlit as st
    5. st.title('Normal distribution')
    6. mu_in = st.slider('Mean', value=5, min_value=-10, max_value=10)
    7. std_in = st.slider('Standard deviation', value=5.0, min_value=0.0, max_value=10.0)
    8. size = st.slider('Number of samples', value=100, max_value=500)
    9. def norm_dist(mu, std, size=100):
    10. """Generate normal distribution."""
    11. return norm.rvs(mu, std, size=size)
    12.  
    13.  data = norm_dist(mu_in, std_in, size=size)
    14.  
    15.  # Fit the normal distributio
    16.  mu, std = norm.fit(data)
    17.  
    18.  # Make some plots
    19.  
    20.  st.pyplot(fig)

    现在变成仪表板了

    运行仪表板程序,输入如下命令行:

    streamlit run my_dashboard.py

    这会开启一个服务器端,然后利用浏览器就可以访问仪表板了(就像用Jupyter Notebook一样)

    dc274e0845f787f86c72d7554186999d.jpeg

    5cc1717f7f2ca1a97c550ec8e55f79d6.png

    酷炫的仪表板

    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

    编辑:于腾凯

    校对:林亦霖

    译者简介

    284469d51115e89daa0e7c90f37a46c3.png

    王闯(Chuck),台湾清华大学资讯工程硕士。曾任奥浦诺管理咨询公司数据分析主管,现任尼尔森市场研究公司数据科学经理。很荣幸有机会通过数据派THU微信公众平台和各位老师、同学以及同行前辈们交流学习。

    翻译组招募信息

    工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

    你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

    其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

    点击文末“阅读原文”加入数据派团队~

    转载须知

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

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

    bf08758a87f3bde524e092a9f27d3327.png

    点击“阅读原文”拥抱组织

  • 相关阅读:
    宁德时代麒麟电池有着更大的野心
    深入理解java虚拟机:类文件结构(2)
    win10 安装 elasticsearch
    1.0 Zookeeper 教程
    Linux 分区 parted 使用教程
    情侣头像微信小程序源码 朋友圈背景小程序源码 动态壁纸微信小程序源码
    服务器租用安全么?
    HarmonyOS 实战项目
    微型计算机原理速通期末复习
    可编程直流回馈式负载箱的工作原理
  • 原文地址:https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/127020008