跳至主要内容

如何在 Tableau 中使用 TabPy 运行 Python:完整指南

按照以下步骤,在 Tableau 中使用 TabPy 运行 Python 脚本。这将助您为 Tableau 可视化创建建模与分析流水线。
· 9分钟 阅读

使用 AI 探索

Tableau 是一款广受数据从业者欢迎的数据可视化工具,也是招聘中常见的技能要求。Python 是广泛应用于数据科学的通用编程语言。将 Python 集成进 Tableau,能让用户构建复杂模型、运行复杂计算,并扩展 Tableau 的原生能力。

这对希望在仪表板中直接运用统计建模、机器学习和数据处理技术的数据分析师、数据科学家和商业智能从业者尤其有用。

本文是一篇将 Python 集成到 Tableau 的动手教程。您将学习如何设置环境、运行 Python 脚本、探索高级分析用例,并排查常见问题。如果您想先了解 Tableau 的基础知识,请参阅此Tableau 入门课程。

了解集成方式

Tableau 与 Python 的集成是通过一个外部服务实现的,即名为 TabPy(Tableau Python Server)的分析扩展。该扩展允许 Tableau 用户在其 Tableau 环境中运行 Python 脚本。

尽管您也许已经尝试过用 Python 生成文件再在 Tableau 中进行可视化,例如这篇使用 Python 与 Tableau 可视化数据的教程,但借助 TabPy 的连接,您可以在 Tableau 数据与 Python 脚本之间实现更顺畅的一体化流程。

TabPy 的作用

TabPy 充当 Tableau 与 Python 之间的桥梁。它采用客户端-服务器模型:Tableau(客户端)将脚本发送给 TabPy(服务器),后者在 Python 环境中执行并返回结果。

工作原理

  1. Tableau Desktop 或 Server 通过计算字段发送脚本。
  2. TabPy 执行 Python 代码。
  3. 结果返回到 Tableau,用于在可视化中呈现。

Diagram showing connection between Tableau, TabPy, and Python

使用 eraser.io 生成的 Tableau、TabPy 与 Python 环境之间连接示意图

在 Tableau 中使用 Python 的好处

尽管 Tableau 功能强大,但其计算字段在处理复杂分析任务时有时会显得笨拙或效率不高。Python 集成为 Tableau 的原生功能带来多项优势,并让用户在数据处理上有更大的自由度。

例如,您可以用 Python 实现如下用例:

  • 高级建模: 使用 scikit-learn、statsmodels 与 xgboost 等库完成回归、聚类与分类。
  • API 集成: 通过 Twitter、Reddit 或企业自定义服务等 API 获取实时数据。
  • 动态处理: 运行可随用户输入或数据变化而调整的计算。您可以使用 pandas 或 numpy 等包,大幅提升 Tableau 仪表板的分析能力。

设置 TabPy

要在 Tableau 中开始使用 Python,您需要安装并配置 TabPy。这个步骤相当直接!核心流程是确保您的电脑上已安装 Python 与 Tableau。

系统要求与安装

先决条件:

  • Python 3.7+(确保已安装 pip)
  • Tableau Desktop 或 Tableau Server(建议 2020.1 或更高版本)

分步安装:

1. 安装 Python。 按照您的操作系统说明安装 Python。

2. 创建虚拟环境:

python3 -m venv tableau-env

3. 安装 TabPy(请先激活您的环境)。 您也可以此时安装 pandas、numpy、sklearn 等其他包。

pip install tabpy

4. 启动 TabPy:

tabpy

配置 TabPy

要自定义 TabPy,请编辑其配置文件。通过这些自定义,您可以更改 TabPy 监听信息的端口以及使用的传输协议。有关配置设置的更多信息,请参阅TabPy 配置指南。

示例配置文件(tabpy.conf)

下面是一个 TabPy 配置文件的示例。

[TABPY]
TABPY_PORT = 9004
TABPY_TRANSFER_PROTOCOL = http

网络与安全提示

由于 TabPy 依赖类似互联网的服务器连接以访问本地资源,建议遵循以下网络与安全建议:

  • 确保选择在防火墙上开放但不对外部连接监听的端口。
  • 设置如 NGINX 的反向代理并启用 SSL 以确保安全通信。
  • 如果在 Tableau Server 上运行,请确保 TabPy 可从同一网络访问。

有关 TabPy 入门的更多细节,请参阅这篇TabPy 入门教程。

在 Tableau 中运行 Python

设置好 TabPy 后,您就可以将 Python 直接集成到 Tableau 仪表板中。您需要先在 Tableau 中启用扩展连接。打开 Tableau Desktop,转到“设置和性能”,选择“管理分析扩展连接”,并选择 TabPy。然后根据 TabPy 配置文件中的设置进行配置。

Manage Analytics Extensions Connection screen in Tableau

Tableau 中“管理分析扩展连接”界面(help.tableau.com)

脚本集成方法

在 Tableau 中运行 Python 脚本主要有三种方式:在计算字段内进行内联脚本计算、通过 Tableau 扩展进行预处理,以及使用已部署的模型端点。

1. 内联脚本计算

使用 Tableau 的 SCRIPT_REAL、SCRIPT_INT、SCRIPT_STR 或 SCRIPT_BOOL 函数。这些函数会将数据直接传递给 TabPy 服务器,而无需运行外部脚本。您可以直接在这些函数中编写 Python 代码。

示例:Z 分数标准化

SCRIPT_REAL(
  "import scipy.stats as stats
   return stats.zscore(_arg1)",
  SUM([Sales])
)

以上示例允许您从 scipy 导入 stats 包,并返回 Tableau 中 SUM([Sales]) 列的 Z 分数。

2. 使用表扩展进行预处理

使用 Tableau 扩展在 Tableau 外部用 Python 进行预处理,然后导入结果。

  • 使用 Pandas/Numpy 进行数据预处理。
  • 将结果保存为 CSV 或 API 端点。
  • 将处理后的数据加载到 Tableau。

这些扩展在您的 Tableau 工作簿的工作表页面中启用。使用这些扩展时,您通过 TabPy 扩展输入完整脚本。脚本会对整个数据集运行,从而可以一次性预处理全部数据,而非逐行处理。这通常会生成一张单独的输出表。

Table Extension feature available at the bottom of Sheets page 

工作表页面底部提供的表扩展功能。(摘自 Tableau 文档)

3. 部署的模型端点

最后一种方法也是最强大的之一。我们在 TabPy 服务器上托管一个用于运行脚本的模型。当需要在特定数据集上运行该模型时,再在 Tableau 中调用该脚本。

示例:将模型部署到 TabPy

第一步是创建一个由 TabPy 部署的文件。启动 TabPy 服务器(按照上文步骤)后,您可以用它来运行 Python 脚本。部署好该 Python 脚本后,我们会在 Tableau 中使用 SCRIPT_REAL 进行调用。

from tabpy.tabpy_tools.client import Client
import pickle

def predict_sales(input_features):
    model = pickle.load(open(model.pkl, ‘rb’)) # This assumes you have a saved model
    return model.predict(input_features)

client = Client(‘http://localhost:9004’)

client.deploy('predict_sales', predict_sales, 'Predict sales using linear model', override=True)

Tableau 脚本调用:

SCRIPT_REAL("return tabpy.query(‘predict_sales’, _arg1)[‘response’]", SUM[Feature1])

性能优化技巧

与在 Tableau 外部运行 Python 脚本类似,我们也需要关注性能。在 Tableau 中运行数据时,有一些特别需要注意的点。

  1. 批处理:通过分块处理数据来减少调用次数。通常更有利的是一次性处理整个数据集,而不是在 Tableau 调用时再处理。
  2. 结果缓存:使用 Tableau 的缓存设置缓存静态结果。
  3. 向量化:使用 NumPy/Pandas 的操作替代循环,以更快地执行。这些通常会将数学计算向量化,从而更高效。

如果使用 Tableau Server,您还可以通过连接池进一步优化。连接池的通用理念是维护与数据源的持久连接以减少开销。

您也可以对数据源与 TabPy 进行类似设置,避免 Tableau 在每次运行脚本或新计算时都“重新打开”对 TabPy 的连接。

高级分析用例

掌握基础后,您可以实现高度定制化的分析。这些方法涉及构建更高级的脚本,并以有趣的方式与您的仪表板交互。

实时预测分析

一种很好的模式是部署时间序列模型(例如 ARIMA、Prophet),并根据用户输入进行更新,就像这篇关于使用 TabPy 部署函数与 Prophet 预测模型的指南一样。

构建好模型后,您可以将其打包为可由 TabPy 部署的脚本。随后,我们使用相同的 SCRIPT_REAL 函数将该模型连接到 Tableau,以调用已部署的模型。

用例:销售预测

  • 在 Python 中构建并训练 Prophet 模型。
  • 在 TabPy 上部署模型,并将历史销售数据作为特征。
  • 随着仪表板筛选器变化,实时更新销售预测。

这样一来,当有人更改诸如地域、时间或产品等筛选条件时,Tableau 会基于这些新筛选实时生成新的预测。

安全与治理

鉴于我们要打开与 TabPy 的连接,务必遵循合适的安全与治理规范。

认证协议

TabPy 提供多种认证协议,帮助用户保障安全。支持并可配置如下方式:

  • 基本认证(用户名/密码)
  • 基于证书的认证
  • OAuth2 与安全令牌处理(适用于高级企业场景)

最佳实践是在生产环境中始终使用 HTTPS 与安全令牌。

数据保护措施

在连接 Tableau 与 TabPy 时,必须确保遵循适当的数据保护治理。这包括确保数据通过正确的连接通道传输、不可使用其他端口,以及数据在传输过程中始终加密。以下是一些最佳实践:

  • 加密 Tableau 与 TabPy 之间的通信。
  • 使用防火墙规则与访问控制。
  • 在 TabPy 上启用审计日志以满足合规要求。定期更新 Python 包以修补漏洞。

最后,如果您的组织需遵循特定的监管合规性,请务必继续遵循其最佳实践。确保遵守 GDPR 与 CCPA,通过匿名化与令牌化在发送至 TabPy 前保护个人可识别信息(PII)。此外,使用安全的中间结果存储以最大限度减少泄露风险。

故障排查与调试

问题在所难免,但大多都能迅速解决。

常见问题与解决方案

问题

解决方案

Tableau 无法连接到 TabPy

检查防火墙、确认端口(9004),并验证 TabPy 是否在运行

脚本返回 NULL 值

验证输入类型并检查 Python 错误日志

性能缓慢

优化发送至 Python 的数据、降低调用频率并使用缓存

如果您在编写代码时遇到问题,可参考以下调试步骤(适用于任何脚本):

  • 在脚本中使用 print() 或日志(TabPy 日志会显示这些信息)。
  • 在 Tableau 之外使用 Jupyter 测试 Python 脚本。
  • 检查“我的 Tableau 存储库/Logs”中的 Tableau 日志。

结语

将 Python 与 Tableau 集成,可在可视化仪表板中直接释放高级分析实力。借助 TabPy,您可以:

  • 执行复杂计算
  • 部署并交互式使用机器学习模型
  • 显著扩展 Tableau 的原生能力

无论您是在运行统计模型、处理文本数据,还是可视化预测结果,Python 都能为 Tableau 仪表板带来新的智能维度。

按照本指南中的步骤操作,您将能够借助 Python 实现更具洞察力、更灵活且更具交互性的分析。有关 Tableau 及其功能的更多信息,请查看以下指南:

在 Tableau 中运行 Python 常见问答

我可以在 Tableau Public 中使用 Python 吗?

不能。Tableau Public 不支持 TabPy 等外部服务。Python 集成可在 Tableau Desktop(专业版)与 Tableau Server 中使用。

TabPy 在生产环境中安全吗?

可以。可通过 HTTPS、防火墙限制、认证协议(基本认证、证书认证、OAuth2)以及 NGINX 等反向代理来保护生产环境中的 TabPy。但需要在默认设置之外进行额外配置。

Tableau 如何在仪表板中处理 Python 脚本的性能问题?

Tableau 会将数据发送至 TabPy 并等待响应,如果脚本未优化,可能会导致延迟。要提高性能,可采用向量化、缓存、批处理以及尽量减少发送数据量等技术。

我可以将虚拟环境与 TabPy 一起使用吗?

可以。您可以在 Python 虚拟环境中运行 TabPy,有助于隔离依赖并避免冲突。请在启动 TabPy 前激活该环境。

TabPy 能返回 JSON 或字典等复杂数据结构吗?

不可以。TabPy 必须返回 Tableau 可识别的扁平列表或 NumPy 数组。字典或 JSON 等复杂数据结构必须在返回前预处理为列表。

Tim Lu

作者

Tim Lu

我是一名数据科学家,擅长空间分析、机器学习和数据管道。曾使用过 GCP、Hadoop、Hive、Snowflake、Airflow 等数据科学/工程相关流程与工具。

主题