如何用Python和PubNub做实时数据可视化

如何用Python和PubNub做实时数据可视化

数据可视化早已不足为奇,现在大家的关注点都集中在“实 时”两个字。工作中,月报周报的排版再漂亮,内容再充实,在消费快餐的读图年代,总比不上随叫随到的实时dashboard。就好像每秒更新的几个数字,可以让公司和客户多挣几百万似的,但愿是这样吧。但不管怎样,和时间赛跑总是正确的。

 

凑巧,去年年底的时候收到 PowerBI 广告,内容大致是新增了对PubNub的支持,可以支持实时数据传送,你们这些僵尸用户可以重回微软怀抱了。然后我就毫不犹豫的上钩了。

孤陋寡闻如我,之前并没听说过PubNub,谷歌后发现它早已是最火的10家IoT startup之一,专做全球范围内的数据实时传送。并提供跨平台的API和SDK,使用也非常简单,支持几乎所有数据传输方式 (1对1,1对n,n对1,n对n)。基本概念就是publisher和subscriber,顾名思义,发送数据都是publisher,而接受数据的client只要subscribe指定的stream就好。免费版不限制feature,但支持最多100个终端,虽然每月上限传送1M数据量,但足够我们学习和测试。

 

数据可视化工具

现在visualization tool非常多,光python开源的就有matpotlib,seaborn,ggplot等等,但这些package都只能生成静态图 (plotly可以做到交互并且embed到网页),无法实时。

 

实时可视化方案

要做到实时并且可分享,大致有以下3种办法:

  • 第三方app,最有名的就是Tableau,贵(学生免费),功能多,支持很多数据库,有个漂亮的UI,适合大多数人。
  • PowerBI: 微软的,相对便宜,但需要公司邮箱注册,功能在不断增加中,基本不支持AWS。
  • QuickSight: AWS 新出的,免费,但太新了,第三方插件还不多,不过支持AWS的资源。
 

如果不喜欢千篇一律,而且想原创爱折腾,那必须自己动手丰衣足食。会开发网页,又搞得定D3.js的大神们可以自信地踏上这条康庄大道,假装无视旁人羡慕嫉妒的眼神。

 

至于好不好看,那是仁者见仁,智者见智的问题。还是那句话,你在和时间赛跑,别纠结主观的东西。 作为一块引玉的砖头,本文介绍如何通过Python让PubNub给PowerBI发送实时数据

 

PubNub + PowerBI

PubNub官网有现成例子,图文并茂,按步操作就可以。

https://www.pubnub.com/blog/2016-08-31-realtime-charts-and-graphs-with-microsoft-power-bi/

 

通过上面这个例子,可以了解如何设置PowerBI来subscribe并正确解析数据流,从而实时展示。但没有涉及发送数据的部分,而且官网的Python代码是上一代PubNub SDK的用法。下面我们就讲如何用python和PubNub发送我们自定义的数据,并呈现在PowerBI里。

 

1) 注册一个PubNub应用

 

和使用其他服务一样,首先需要注册一个PubNub Application。然后为这个Application创建Keyset,你会看到下图所示的Publish和Subscribe两个秘钥。

 

点击进入keyset,页面拉到最下方,把Realtime Analytics设为“ON”

2)  Python程序

有了密钥,我们就可以写Python应用了。先安装SDK,写这篇文章时最新版本是4.0.6,请安装4.x以上的版本。

pip install pubnub

然后在编译器内输入如下代码:

 

from pubnub.pnconfiguration import PNConfiguration

from pubnub.pubnub import PubNub

import time, random

from datetime import datetime

pnconfig = PNConfiguration()

pnconfig.subscribe_key = “sub-c-a7e153ae-ac30-11e6-b37b-02ee2ddab7fe”

pnconfig.publish_key = “pub-c-4185f85e-676a-48a6-9f8e-1f45ab5a0ed7”

pubnub = PubNub(pnconfig)

 

 

发送的数据会包括时间和随机数字,所以相关的packages也一并import进来。

首先要config我们的PubNub,subscriber key是mandatory的,由于这又是一个发送数据的publisher,所以publish key也必不可少。

for i in range(1000):

json_data = {

‘datetime’ : datetime.now().isoformat(),

‘number_one’ : random.randint(1,50),

‘number_two’ : random.randint(10,35),

‘letter_one’ : random.choice(‘ABCD’),

‘letter_two’ : random.choice(‘XY’),

}

pubnub.publish().channel(‘pubnub_demo’).message(json_data).sync()

time.sleep(1)

 

每隔1秒钟发送一次 json 格式的模拟数据,共1000次。注意时间信息需要先转化为isoformat的string格式,否则PowerBI里解析会很麻烦。channel后括号里填的是channel name,也是这个数据流的名称,之后设置subscriber时会用到。

3)  设置PowerBI

毫无疑问,作为微软的产品,PowerBI对windows和Azure的支持是最好的。PC用户可以直接下载桌面版进行操作,界面和office类似,并且功能更齐全,这里不做展开。Mac用户需要使用网页版,以下的步骤也是基于网页版。

 

PowerBI是visualization工具,所以第一步必须是连接database。Datasets >> Streaming datasets >> 点页面右上方 “+” >> PubNub

在表格中填入Dataset name,subscribe key, 以及Channel name。Channel name要和之前python脚本中的一致。

如果点Next的同时之前的python代码正在运行并发送数据,PowerBI会自动识别数据格式,并出现如图所示的确认页面。如果有问题可以手动调整,注意,这里的key应该和发送出的json数据一样,而value都是假的。

dataset创建完,就是最后创建图表的部分了。

Dashboards >> “+” >> 给dashboard起个名称 >> 页面右上方”+” >> Custom Streaming Data >> 选择刚才创建的pubnub data >> 选择想要的图表形式并设置x,y轴就可以了。

最后的效果大致如下,请发挥自身的聪明才智,玩转这套流程,拿到老板、老师、TA面前好好表现一下。祝成功,不谢。

作者: 文钊