相关文章推荐
博学的乌龙茶  ·  MyBatis ...·  1 年前    · 
淡定的香烟  ·  ios - UITableview ...·  1 年前    · 

如何用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到网页),无法实时。 实时可视化方案

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

  • 第三方app,最有名的就是Tableau,贵(学生免费),功能多,支持很多数据库,有个漂亮的UI,适合大多数人。


  • PowerBI: 微软的,相对便宜,但需要公司邮箱注册,功能在不断增加中,基本不支持AWS。

  • QuickSight: AWS 新出的,免费,但太新了,第三方插件还不多,不过支持AWS的资源。


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

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

PubNub + PowerBI

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

Create Realtime Charts and Graphs with Microsoft Power BI | PubNub

通过上面这个例子,可以了解如何设置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),