目录:
一、前言
听说前几天Tableau更新了,有一个新的功能Table Extension,可以方便处理数据表,特别是对Python、R等第三方工具做了更好的支持。
过往Tableau只能在原有数据表上新增计算列或通过数据源筛选期删减行数据,但却不能通过对数据进行处理,然后新增行数,Table Extension便可以通过扩展实现该功能,这方面比较经典的应用应该非词云图莫属了。
以往版本,如果要做词云图,一般是有一个数据表,然后通过Python对表中的相关文本进行分词处理,再保存为新的数据表,再将新数据表拉到Tableau进行词云图制作(其实这样子直接在Python画词云图更便捷!)。
现在通过Table Extension,便可以在Tableau上更好地进行词云图绘制了。(当然,它的功能远不止于此,各种算法也可以驾驭。)
二、配置环境
2.1 下载安装Tableau 2022.3
Tableau 2022.3版本 下载链接点此
下载完,安装。
安装过程中可能会出现一个错误1310:无法写入xxx.dll文件,需要确认对该目录有访问权限(忘截图了,大概意思就是这个)。
解决方法:把360先退出,安装完再打开。
2.2 安装Tabpy
Tabpy是联通Tableau和Python的工具。
安装之前要确保有Python环境!!!
打开命令提示符或终端,Windows直接敲以下代码回车,Mac使用pip3
。
pip install tabpy
2.3 测试连接
**一定要打开Tabpy才可以连接!**打开方式如下,在命令提示符或终端输入tabpy
回车即可。
这个跟通过终端调出jupyter notebook类似,打开之后,每一步操作都会在命令提示符或终端打印出来。
打开tabpy
之后,切换到Tableau,按以下步骤
接下来会弹出一个窗口,输入一下信息,然后点击测试连接,连通之后点击保存,然后关掉。
主机名:127.0.0.1或localhost
端口:9004
三、数据准备和处理
3.1 准备数据
3.1.1 源数据获取
数据来源:五部门关于印发《虚拟现实与行业应用融合发展行动计划(2022—2026年)》的通知
处理之后的数据资源链接见文末。
数据结构如下:
打开tableau 2022.3,打开文件。
由于只有一个工作表,默认帮我拖到应用区了。这里可以看到多了一个新表扩展程序的按钮,双击点它。
注意:此时应用区已经有一张表,新增表扩展程序表需要编辑关联关系。(本文3.4 节针对相关内容有做补充)
双击后界面如下:
接下来把Sheet1表拖到【将工作表拖到此处】,然后会出现以下界面:
1、是添加数据表的地方,可以进行多表关联;
2、是脚本代码,用于处理数据;
3、可以选择对应的表单查看表结构,也可以选择关系,编辑处理前后字段间关系的,由于扩展表是第二个应用表,所以需要和第一个应用表Sheet1确认关联关系之后就可以在输出表刷新查看数据预览;
4、是查看输入表和输出表数据的地方。
3.1.2 脚本测试
官方的推荐脚本为return _arg1
,接下来在脚本处敲入以下代码,点击应用。
print(type(_arg1))
print(_arg1)
return _arg1
应用之后可以看到界面有一些变化如下图,此时说明代码输出是有效的,因为下图红框左边展示了表扩展程序生成的数据结构。另外两个print()
的内容可以在命令提示符或终端查看。
看看终端,数据正常输出,**_arg1**
是一个字典类型,采用的是列存储,键是列名,值是每一列的值。(其实这一点在官方的API文档中有说明,在《第四节 拓展》补充)
注:由于我使用的数据比较长,可能比较难看出来,小伙伴们可以拿一个比较简单的数据集测试,方便看打印结果。(在《第四节 拓展》有提供另外的建表方式,也可以进行打印测试)
3.1.3 错误代码03D52C7A处理
补充:在你在点击立即更新之后可能会报错,错误代码:03D52C7A
(如下)。
Unexpected Error
内部错误 - 发生意外错误,无法完成操作。
错误代码:03D52C7A:
这时点击刷新数据源按钮即可修复。按钮在保存按钮旁边,如下图。
3.2 处理数据-分词
接下来开始处理一下数据集。
将内容通过结巴分词切割一下,保留名词、动词和形容词,然后应用查看下结果。
import pandas as pd # 使用pandas来进行数据处理
import jieba.posseg as psg # 使用jieba进行文本分词
# 将_arg1转为DataFrame,以便后续处理
df_input = pd.DataFrame.from_dict(_arg1)
# 定义分词函数
def values_cut(arg):
# 只保留 名词、动词、形容词 这三种词性的词汇
result = [x.word for x in psg.cut(arg) if x.flag in ['n','v','a']]
return result
df_input['内容分词'] = df_input['内容'].map(lambda x : values_cut(x)) # 调用分词函数对歌词字段进行分词
df_middle = df_input[['顺序编号', '内容分词']] # 只取顺序编号和内容分词,以避免数据冗余。
df_middle = df_middle.explode('内容分词')[['顺序编号', '内容分词']] # 对分词后的列表进行行扩展,每个词作为一行数据
df_return = df_middle.to_dict(orient='list') # 将 DataFrame 转为 dict 形式({"列名1":["列值1","列值2"], "列名2":["列值1","列值2"]})
return df_return
注:要先设置关联关系,然后点输出表>立即更新更新数据。
3.3 可视化
这时候可以在工作表查看一下分词后的可视化结果。
不得不说,重点特别突出,就是讲虚拟现实的,强调应用!重视通过技术、内容打造沉浸式的体验,同时也有一条支持链,政府鼓励支持企业创新,教研机构支持人才输出,企业支持技术迭代、推广,推动虚拟现实技术和各行业、领域融合发展。
可以分别筛选一级标题,查看各标题有什么侧重点。
3.4 补充:扩展多表
关掉表扩展程序界面(下图红框提示内容),返回上一级。
可以看到,此处显示是Sheet1和表扩展程序表两个表的关联。(可以分别双击任意一个表继续编辑)
还记得开头讲的,打开该Excel文件之后,由于只有一个工作表,于是就自动给我添加到应用区了,所以我使用的第一个表就是Sheet1,再添加其他表时便需要设置关联关系。
如果有多个工作表(不会默认添加到应用区),或者把Sheet1从工作区移除(保持应用区没有表),然后双击新表扩展程序,此时显示的就只是表扩展程序表(作为第一个表)。在新增表扩展程序表的过程中,也就不会有关联关系的操作了,通过脚本处理之后,数据直接输出。
注:每新增一张表,都需要编辑关联关系。
再建表扩展程序表。
如果还需要再添加一张表扩展程序表,单击非扩展表,然后便可双击“新表扩展程序”新增第二张扩展数据表。
四、拓展
4.1 表计算(table calculations)和表扩展(Table Extensions)
拓展部分想讲点Tableau表扩展的工作原理,讲工作原理前,必须先搞清楚两个词:表计算(table calculations
)和表扩展(Table Extensions
)。
我一开始没有注意这两个概念,导致中间走了一些弯路,因为表计算有长篇大论,而表扩展的资料少之又少,在没有意识到二者差异前,越看越糊涂!
表计算是之前老版本支持的和Python“通话”的工具,目前有8个和Python“通话”的函数:SCRIPT_BOOL、SCRIPT_INT、SCRIPT_REAL、SCRIPT_STR、MODEL_EXTENSION_BOOL、MODEL_EXTENSION_INT、MODEL_EXTENSION_REAL、MODEL_EXTENSION_STR。这8个在哪里使用的呢?在“工作表”界面,右击字段,创建>计算字段,然后搜索对应的函数名,便可以看到对应的函数,具体应用此处就先不展开(其实也还没有仔细研究过)。
本文重点讲的是表扩展,是2022.3才新增的功能,这个功能是在“数据源”界面操作的。
使用表扩展功能,需要你传入一个表和处理表数据的代码(支持Python、R等),然后Tableau和对应的扩展工具(Tabpy、Rserve等)就会帮你把数据处理好,然后返回到输出表中。
4.2 工作原理
了解了二者的差异之后,回到终端。
在终端提示的数据中,有一个东西引起了我的注意,def _user_script(tabpy, _arg1):
。
或许,完整的情况是:
def _user_script(tabpy, _arg1):
print(type(_arg1))
print(_arg1)
return _arg1
如果有一点Python基础,应该能够明白,这是一个函数,也就是说我们在Tableau上敲的代码被封装到_user_script()
函数中,所以脚本代码才可以使用return
语句。
在查看了Tableau Analytics Extensions API文档之后,我有一些猜测,或许不一定准确,但可以辅助理解相关的数据传输过程:
Tableau将我传入的表单处理成字典({“列名1”:[“列值1”,“列值2”], “列名2”:[“列值1”,“列值2”]})格式,然后Tabpy进行Post请求时,Tableau将字典传递给_arg1
参数,如果直接return arg1
那就是直接将Tableau传递进来的数据再原封不动返回,结果输出表和输入表是一致的。
注意:返回给Tableau的数据格式也必须是字典形式({“列名1”:[“列值1”,“列值2”], “列名2”:[“列值1”,“列值2”]})。
4.3 更多可能性:自建表和调用API
再进一步~~
如果要实现处理后的结果数据,那就可以拿_arg1
参数进行处理(如本文的3.2小结),处理完之后只要数据结构是Tableau要求的即可。
或许你会想到,既然填写函数内容给tabpy处理,那我随便造一个表,或者从其他地方读取数据是不是也可以呢?答案是肯定的!
比如说,我通过以下脚本进行应用,结果可以正常输出。
import pandas as pd
df = pd.DataFrame([i/2 for i in range(10)],columns=['x'])
df['y2'] = df.x.apply(lambda x:x*x)
df_return = df.to_dict(orient='list')
print(type(df_return))
print(df_return)
return df_return
这时候,_arg1
是一个空字典{}
,因为没有表拖到表扩展程序下,也就是说没有输入表。
也就是说,可以通过该功能,自行创建一个表单,当然还有更加大想象空间的内容:调用API。
有一些外部未入库数据,可以通过开放的API调取数据进行关联,打通数据孤岛。
注意:需要考虑账户密码的安全性。
4.4 一点吐槽:和Power BI
最后,还是得吐槽一下!其实,在Python的支持方面,Tableau似乎有点拉胯,PowerBI通过Python和R绘图的功能老早就上线了,在画图区,选择Py
便可链接Python扩展(下图一);也可以通过Python扩展拉取数据表等(下图二)。
五、小结
相关资源下载点此,免积分下载~~~
参考内容:
甘正-Tableau 2022.3的Table Extension到底怎么用?
Tableau Analytics Extensions API文档
Tableau官方表扩展使用说明文档