数据科学工作者常常需要构建关于数据和模型的可视化界面,使得分析结果更加直观,或者模型使用更加简易。日常工作中几种常见的数据分析可视化方法有:

  1. 直接在 Jupyter Notebook 中进行可视化

    我们常常会直接在 Jupyter Notebook 之中使用 Matplotlib 或者 Seaborn 等优秀的 Python 软件包进行数据可视化。作为数据工作者这是一种非常方便的分享方式。Jupyter Widget 现在也已经可以支持很多交互式的可视化。然而对于没有编程经验的人比如老板们来说,安装 Jupyter、设置环境和依赖包、运行 cell 直到生成可视化的图标是有一些门槛的。

  2. 将代码生成的可视化结果截图放到 PPT 中

    把结果截图放到 PPT 中是数据可视化门槛最低的方式。然而静态的图片完全限制了用户的交互性,给人浅尝辄止、意犹未尽、无法沉浸其中的感觉。

  3. 将数据生成并导入到如 Power BI 或 Tableau 等工具中可视化

    把数据导入到 Power BI 或者 Tableau 中这也没毛病,而且很多不写代码的同事甚至客户都非常喜欢这样的形式。但这几种工具都是要钱的,而且有时候千奇百怪的需求他们的功能模块中也不一定都有,因为是闭源的商业软件开发者也无法自行扩展功能。

  4. 使用 Flask, Django 等框架搭建网页应用

    直接当做前端工程来做,使用 Flask 或者 Django 这样的框架来设计自己的网页应用,这是最硬核的方法,Respect!但是往往算法或者数据工程师并没有太多的前端开发背景,而且一入前端深似海,数据方面层出不穷的新技术新算法都学不过来了,年纪又大了…好吧都是借口…

在上面的背景之下,Dash 这样的软件包无疑解决了数据科学从业者的一大痛点。

Dash 是一个开源的 Python 库,用来构建可交互式的数据分析类的网页应用,可以无缝支持使用 Python 进行数据分析、数据探索、可视化、建模、流程控制以及报表等的需求。

我们来通过 Dash 的几个例子来初探其功能。

  • 这是一个下拉菜单的例子。用户选择一个值然后代码自动从 Google Finance 中提取实时数据,写入 Pandas DataFrame 中然后可视化。整个网页 app 一共只有43行代码:

  • Dash 的代码很适合创建包含有多种交互元素的复杂引用。下面的例子只有160行全部是 Python 的代码:

  • Dash 中的元素都是可以定制化的:大小、位置、颜色、字体等等。Dash 应用部署在网页中,所以全面支持 CSS。下面是一个高度定制化的仿照高盛风格的可交互 Dash 报表应用:

Dash 有多简单呢?我们不需要写任何的 Javascript 或者 HTML 代码,而完全依赖 Dash 提供的 Python 接口来定义各种交互性的网页组件:

import dash_core_components as dcc

dcc.Slider(value=4, min=-10, max=20, step=0.5,
           labels={-5: '-5 Degrees', 0: '0', 10: '10 Degrees'})

Dash 的做法,是提供了一个简单的 decorator,使用 callback 函数将我们定制化的数据分析代码绑定到 Dash 用户界面中:

@dash_app.callback(Output('graph-id', 'figure'),
                   [Input('slider-id', 'value')])

def your_data_analysis_function(new_slider_value):
    new_figure = your_compute_figure_function(new_slider_value)
    return new_figure

这种做法和使用 Flask 框架是一致的。当输入因为用户选择下拉菜单或者拖动滑块而改变时,Dash 的 decorator 会传递给 Python 代码新的输入值,然后我们可以自定义 Python 函数来进行需要的处理,比如处理一个 Pandas Dataframe、调用 SQL 查询、跑一个模拟、进行一次运算,或者开始一段实验。这个 Python 函数返回一个 Dash UI 中一些元素的新属性,比如一副新图、一张新表,或者一段新文字。

  • 下面的例子中,用户在网页的 Graph 元素中进行交互,代码在 Pandas Dataframe 中根据选择的点进行过滤搜索,然后根据结果修改文本框中的文字。

  • 这个例子中,Dash 应用会显示用户鼠标在 Graph 组件中悬停位置的点对应的药品信息。如果元素从下拉菜单中被选择加入到文字框中的话,代码还会把相应的数据行加入到 Table 组件中。

所有这一切都是靠简单的两部分完成:

  1. Python 功能组件
  2. Dash 的响应式 decorator 函数

通过这两部分的功能,借助 Flask 和 React,Dash 将所有需要构建交互网页应用的技术和规范抽象在了用户代码背后,使得 Python 开发者在书写网页应用的代码时依然像在书写自己熟悉的后端数据分析代码一样,而无需成为专业的前端开发者。Dash 使很多数据从业者的天马行空的想法都可以成为无门槛使用的现实网页应用产品,解决了最后一公里的问题。

如果读者有兴趣深入研究 Dash,请直入 Github:https://github.com/plotly/dash

Reference

Introducing Dash, https://medium.com/plotly/introducing-dash-5ecf7191b503