隆重推出 Tableau Prep 流程自訂 R 與 Python 指令碼支援

Anton 將在本文的範例中說明如何設定 Prep Builder 執行 Python 指令碼,並示範執行自訂 Python 與 R 指令碼這項新支援功能的一些絕佳運用方法,供您在 Tableau Prep 流程中運用。

最新消息:Tableau 最新版本隆重推出!瞭解這個版本中的最新創新功能

Tableau Prep Builder 是一項強大的資料探索與準備工具。不過使用者建立的流程,複雜度大相逕庭。雖然 Prep Builder 能毫不費力地處理許多應用實例,可是還是有一些進階情境無法輕易處理。

為彌補此不足之處,並提供更令人驚驗的 Tableau Prep 互動方式,我們新增了在 Tableau Prep 流程中執行自訂 Python 與 R 指令碼的支援。此功能為即將推出之 Tableau 2019.3 Beta 的測試版功能。

使用者將能在流程中的任何步驟連接指令碼,並運用慣用指令碼語言的完整功能來轉換資料、查詢遠端來源中的額外資訊﹐甚至在輸入內容上執行複雜的機器學習管道。



在 Tableau Prep 流程中的任何步驟新增自訂 R 或 Python 指令碼。

在本文的範例中,我將會說明如何設定 Prep Builder 執行 Python 指令碼,並示範一些運用這項新功能的絕佳方法,如執行地理查詢。

任何種類的指令碼都可用於探索「假設」情境,不過我這次的目標是同時比較美國不同地點的花費與生活費用資料,以預測搬遷到其他城市居住時可能會花費的生活預算。我要建立的流程將仰賴過去幾年收集的預算資料、生活費用資料,以及將郵寄區號比對到對應的城市。

設定 TabPy

Tableau Prep Builder 運用開放原始碼工具 TabPy 來執行 Python 程式碼。由於執行指令碼為進階功能,且各使用者的設定差距極大,Prep Builder 並未隨附可立即使用的 TabPy。不過您不必擔心!設定作業非常簡單,按一下這裡即可開始進行設定。若一切皆如預期的完成設定,畫面的最下方會顯示連線至 TabPy 伺服器的連接埠號。此值預設為「9004」。

如同任何其他語言,Python 高度仰賴第三方程式庫來提升功能性。如果要使用 Prep,必須在系統上安裝「pandas」程式庫,因為此程式庫提供高效率的資料框架。我們會使用這個框架來將資料傳送到 Python,以及從 Python 中傳出。安裝程序非常簡單,需使用 Python 隨附的「pip」工具。為了回答預算問題,我還需要「requests」程式庫,所以我要執行以下指令
> pip install pandas requests
並在執行後重新啟動 TabPy。如果您在任何時間點需要使用 Python 的其他程式庫,只要使用「pip」加以安裝並重新啟動 TabPy 即可。

現在,一切均已設定完畢,我可專心地解決先前提出的問題。

執行地理查詢

我要以生活費用指標作為預測不同城市花費的依據。這項指標以紐約市為基準(值為 100),以百分比表示各城市的相對花費高昂程度。由於原始預算資料使用郵遞區號,不是使用城市,我需要使用某種方式,把郵遞區號轉換成城市。我要利用 Python 整合功能,以程式設計的方式查詢每個郵遞區號所屬的城市。

這個程序非常簡單,只要新增指令碼步驟、將步驟指向 Python 指令碼檔案,並提供檔案內要叫用的函數名稱即可。Prep Builder 會將前一步驟的所有輸入資料傳送到 TabPy,並以資料做為引數來叫用這個函數。Prep Builder 接著會顯示指令碼步驟中傳回的資料集。

讓我使用郵遞區號傳換這個特定範例來實際示範上述所有步驟。指令碼檔案如下:

 import requests
 
 API_KEY = ""
 URL = f'https://www.zipcodeapi.com/rest/{API_KEY}/info.json'
 
 def lookup(df): 
 	result = pd.DataFrame(columns=['zip_code','city', 'state','area'])
 	for zip in df['zip_code'].unique(): 
 		response = requests.get(f'{URL}/{zip}/radians').json()
 		zip_code = response['zip_code']
 		city = response['city']
 		state = response['state']
 		result = result.append({
 				'zip_code' : zip_code,
 				'current city' : city,
 				'state' : state
 			}, ignore_index=True)
 	return result
 
 def get_output_schema(): 
 	return pd.DataFrame({
 			'zip_code' : prep_string(),
 			'current city' : prep_string(),
 			'state' : prep_string()
 		});

指令碼檔案定義了兩個函數:「lookup」與「get_output_schema」。

「lookup」函數是執行作業的核心,且會執行實際的資料轉換作業。這是我們在 Prep Builder UI 中設定的函數。這個函數會將輸入當作「pandas」資料集,並使用「zip_code」欄向 zipcodeapi.com 要求對應的城市和州。產生的結果會是另一個「pandas」資料集,其中包含三個欄:原始郵遞區號、目前城市及州。請注意,我們不會對輸入中的其他欄進行任何變動,只要輸入中包含「zip_code」欄,指令碼就能正常運作,無論其餘資料是否存在。

第二個函數「get_output_schema」會讓 Prep Builder 瞭解指令碼預期會產生哪種資料作為結果。若仔細查看指令碼,您會發現指令碼傳回的「pandas」資料框架與「lookup」函數具有相同的欄,不過「pandas」資料框架具有如「prep_string()」等值,能告訴 Prep Builder 預期的資料類型為何。我們當然也提供其他支援的類型,例如「prep_int()」或「prep_bool()」。

將自訂 Python 指令碼新增至 Tableau Prep Builder 流程,該流程會執行查詢,使用一系列的郵遞區號傳回城市名稱。

在我們繼續下一步驟前再說明一件事:第一次新增指令碼步驟到流程時,必須告訴 Prep Builder 如何連線到 TabPy。如要進行這項操作,請選取「Tableau Python (TabPy)伺服器」連線類型,然後按一下「連線至 Tableau Python (TabPy)伺服器」。在隨即顯示的快顯示窗中,您將需要向 Prep Builder 提供 TabPy 執行個體的伺服器名稱與連接埠號。如要使用本機設定(如前文所述),請使用「localhost」作為伺服器的值,並使用「9004」作為連接埠號的值。

為資料集進行預測性建模的準備作業

使用前一部分中的指令碼,就能以非常輕鬆的方式,在預算資料中補上正確的城市和州。將指令碼的回應聯結回原始的輸入,即可合併資料,並讓後續處理更容易進行。

在能進行花費預測前,我仍需要加入生活費用資料。有些類似的 API 可擷取此類資訊,但這些 API 不供自由取用,因此我決定改為使用包含所需資料的固定 CSV 檔。不過,如果您能存取可讓您擷取此類資訊的 API,建議您直接使用,就像前面的郵遞區號查詢一樣。

我擁有的資料只包含城市名稱、對應的生活費用指標,以及擷取資料的年份。我收集了五個城市從 2014 到 2019 年的資料。這樣的資料樣本應足以應付我想詢問的問題。

由於要嘗試根據特定地點與時間的資料預測多個城市的預算,因此對應關係自然是一對多的關係。預算資料集中的每筆記錄,都會對應到每個「目標」城市,以及該城市在每筆預算項目建立當年的指標。這個對應關係在 Prep Builder 中,只要使用內部聯結就能輕鬆表示。


Tableau Prep Builder 流程,顯示已建立內部聯結來將生活費用資料與資料集連接。

流程窗格提供資料準備步驟的視覺化呈現。

Tableau Prep Builder 的資料窗格顯示將生活費用資料連接至對應城市的內部聯結結果。

圖表窗格與資料格顯示內部聯結的結果。

預測花費

現在所有資料都已經順利合併,就可以開始預測在各城市可能支出的花費。用於進行這項預測的確切邏輯可能會有極大的差異,從簡單的計算,到運用複雜機器學習模型分析預算資料並推論出花費模式隨時間經過而產生的細微差異,都是可使用的選項。無論使用何種邏輯,Python 都能在預測工作上提供極大的幫助。Python 不僅能進行複雜的資料轉換,也備有各種優秀的程式庫,可供建構複雜的機器學習管道。我可以輕鬆地建立另一個指令碼,並將完整資料集饋送到其中,藉此進行花費預測。即使這個工作與指令碼跟郵遞區號查詢不太一樣,在 Prep Builder 中設定工作和指令碼的程序與郵遞區號查詢的設定程序完全相同。

將自訂 Python 指令碼新增至運用預測性建模的 Tableau Prep Builder 流程。

接下來我就能夠建立輸出資料來源,並將預測結果發佈到 Tableau Server。更令人驚豔的是,我可以將最終的流程安排成 Prep Conductor 工作,讓機器學習管道以我設定的頻率定期進行重新整理,要多頻繁就多頻繁!

讓我進一步說明一件事:雖然結果可發佈到 Tableau Online,不過 Tableau Online 目前不支援使用 Tableau Prep Conductor 執行包含指令碼的流程。

總結

有了 Prep Builder 這項新指令碼支援,要實作大幅超出產品內建功能範疇的複雜資料轉換情境,現在比起以前變得更容易。從簡單的計算到複雜的機器學習模型,甚至是從網際網路擷取資料,都在這項新支援的涵蓋範圍內。

這項新支援在測試版階段時,收到極為正面的社群意見回饋。隨著各種背景的使用者都自行建立程式碼片段來讓 Prep Builder 功能更為強大,支援自訂指令碼這項功能,很明顯地具有廣大的需求。很高興能與您分享這個整合功能,也希望我確實示範了自己開始撰寫 Python 指令碼並將指令碼與 Tableau Prep 整合,是多麼的簡單。

如要測試自己的想法,並實際使用 2019.3 Beta 版中的 Python 與 R 整合功能,請立即加入搶鮮方案