在Tableau中使用Python(TabPy的使用)

在Tableau中使用Python(TabPy的使用)

作為數據分析神器,Python、Tableau各有所長,Python功能全而強大,Tableau可視化效果好。而把二者結合,將產生更為豐富的效果。

這裡需要Python的第三方庫TabPy。啟動Tabpy服務,在Tableau中連接此服務,則可以在Tableau中使用Python的各種函數功能。

更多訊息可進入我的個人網站

TabPy安裝

與其他Python包的安裝一樣,直接pip安裝即可。

pip install tabpy

由於公司內網的限制,直接pip無法連接網絡,增加代理即可安裝成功!

pip install pytab --proxy="xxxx:xxx"

TabPy服務器啟動

tabpy安裝成功後,在python安裝目錄的tabpy文件夾( C:ProgramDataAnaconda3Libsite-packagestabpy_server )下回有startup.bat文件,雙擊打開,即可啟動tabpy服務。

為以後使用方便,可使用os將其寫入到Python腳本中:

import os os.system(r"C:ProgramDataAnaconda3Libsite-packagestabpy_serverstartup.bat")

啟動後,若輸出以下結果,則說明TabPy服務啟動成功!

Initializing TabPy... Done initializing TabPy. Web service listening on port 9004

Tableau連接TabPy服務

tabpy服務啟動成功後,保持窗口不要關閉,此時服務器處於等待Tableau連接的狀態。

打開Tableau軟件,依次點擊菜單欄幫助-設置和性能-管理外部服務連接,即可打開服務器連接設置。

由於我們搭建的TabPy服務是建立在本地計算機上,因此服務器填寫為“http://localhost”,端口為“9004”(這是默認的端口),如下所示。 【全程需要保持tabpy服務一直開啟,不要關閉】

Pytab自定義函數部署

連接TabPy服務後,可在Tableau中使用Python自帶的各種函數。同樣,我們可以設置自定義函數,然後部署到TabPy服務上。

例如,我們要定義2個列表相加的函數add,如下:

import numpy as np def add(a,b): return np.add(np.array(a),np.array(b)).tolist() # 注意:由于要在tableau中使用函数的输出结果,需要有return值

在部署add函數之前,首先需要定義我們將要部署的服務器及端口

import tabpy_client client = tabpy_client.Client('http://localhost:9004')

然後,使用deploy將函數部署到服務上。

client.deploy(name='add', obj=add, override=True)

上述命令運行後則馬上結束了,不像TabPy那樣一直處於後台運行的狀態。不要擔心,此時只要TapPy服務未關閉,add函數就已經部署成功啦~

TabPy服務搭建及函數部署匯總

為簡化服務啟動及部署的步驟,可將所有函數匯總到一個Python腳本中,這樣運行一次代碼即可把所有工作準備好。

主要是分為幾個模塊:

  • TabPy啟動函數
  • 功能性函數自定義
  • 已定義函數部署
  • schedule運行。由於Tabpy服務啟動後需要在後台一直運行並保持不關閉,這裡採用多線程與Sleep結合的方式,使服務啟動後停頓一會再啟動自定義函數的部署
import os import time from multiprocessing import Process import tabpy_client import numpy as np # 服务启动def starts(): os.system(r"C:ProgramDataAnaconda3Libsite-packagestabpy_serverstartup.bat") print('*'*30+'Succeed'+'*'*30) # 自定义函数def add(a,b): return np.add(np.array(a),np.array(b)).tolist() # 函数部署def clients(): client = tabpy_client.Client('http://localhost:9004') print('n' + '*' * 50 + 'TabPy Deployment Succeeds' + '*' * 50 + 'n') client.deploy(name='add', obj=add, override=True) # Schedule脚本运行if __name__ == '__main__': s = Process(target=starts) s.start() time.sleep(5) runs = Process(target=clients) runs.start()

Tableau調用TabPy服務

Tableau主要通過在創建計算字段中使用TabPy服務中的函數,即由input通過python函數計算得到output。代碼樣式如下:

SCRIPT_REAL("return tabpy.query('add',_arg1,_arg2)['response']",sum(1),sum(2)) # 注意,这里一定要有return值# 其中_arg1和_arg2指要输入的参数

上述代碼在Python也可直接運行,我覺得可以用來驗證函數是否定義正確

r = client.query('add',[1,2,3,4],[12,3,4,5])['response'] print(r)

除了SCRIPT_REAL外,還有SCRIPT_BOOLSCRIPT_INTSCRIPT_STR等函數,對應輸出不同的數據類型~

歡迎關注個人公眾號“暢所欲言的小筆記”:talk_freely,每周定期更新文章!

What do you think?

Written by marketer

比較Tableau和Power BI

最全數據分析資料匯總(含python、爬蟲、數據庫、大數據、tableau、統計學等)