{count, plural, other {课程}}

什么是 TabPy
TabPy 是一个使 Tableau 能够执行 Python 代码的框架。它允许用户在 Tableau 的计算字段中运行 Python 脚本,或使用 Python API 在 TabPy 服务器上部署函数。
TabPy 是一款功能强大的工具,提供多种配置和实用程序。您可以将其与 Tableau 可视化集成,每当参数发生变化时,Python 脚本都会自动运行,为您提供动态的可视化体验。
为什么选择 TabPy?
尽管 Tableau 提供了丰富的功能来创建、处理和清洗数据字段,但在统计方面我们仍受限于较为基础的功能。要解锁机器学习等高级统计能力,我们将把强大的 Python 库与 Tableau 集成。
通过参加交互式 DataCamp 课程,学习在 Tableau 中的多种统计技术。
在本教程中,我们将学习如何搭建 TabPy 服务器,并完成一个简单的机器学习项目。我们将使用 K Means 算法将阿姆斯特丹的 AirBnB 房源划分为不同的聚类。
设置 TabPy
搭建 TabPy 服务器非常简单。您可以在终端中使用 `pip` 或在 Jupyter Notebook 中使用 `!pip` 安装 TabPy。它会自动安装服务器和 Python 的客户端 API。
pip install tabpy
要运行服务器,我们在终端中输入 `tabpy`。几秒钟后即可看到服务器已在本地 9004 端口运行。
tabpy
输出
... Password file is not specified: Authentication is not enabled
... Call context logging is disabled
... Initializing TabPy...
... Initializing TabPy Server...
... Done initializing TabPy.
... Setting max request size to 104857600 bytes
... Initializing models...
... Web service listening on port 9004
TabPy 服务器配置
您可以使用配置文件和以下命令对 TabPy 服务器进行配置。
tabpy --config=path/to/my/config/file.conf
您可以配置:
- HTTP 与 HTTPS 连接
- 用户管理
- 日志记录
TabPy 允许您根据公司在安全与质量保证方面的政策自由定制服务器。您可以查看示例配置文件,了解如何按特定要求搭建服务器。
将 TabPy 部署到 Heroku
如果您使用 Tableau Cloud 或 Tableau Server,则需要将 TabPy 服务器部署到云或网站托管平台。您可以使用 Docker 文件,或直接在 Heroku 上部署服务器来实现这一点。
在 Heroku 上运行远程服务器:

- 按照指引操作。填写服务器名称并选择服务器位置。
- 设置环境变量用户名和密码。
您的服务器即可无障碍完成部署。您可以使用 URL 和端口号将 Tableau 连接到该服务器。
连接到 TabPy
在与 Tableau 连接之前,请确保您的 TabPy 服务器已经在本地或远程运行。
要连接服务器,我们需要点击帮助菜单并选择设置与性能 > 管理分析扩展连接。随后会弹出一个新窗口,提供多种连接类型:TabPy、Einstein Discovery、RServe 和 Analytics Extension API。

我们将选择 TabPy 选项,此时会弹出另一个窗口,要求我们添加主机名、端口、用户名和密码。由于尚未设置用户名和密码,我们将忽略这两项。
下一步,我们将主机名设置为“localhost”,端口设置为“9004”,并点击测试连接。测试通过后,保存连接配置。

在 Tableau 计算中使用 Python
要在计算字段中运行 Python 脚本,您需要根据输出类型选择以下脚本函数之一:
- SCRIPT_BOOL
- SCRIPT_INT
- SCRIPT_REAL
- SCRIPT_STR
如果您的函数返回布尔值,请使用 SCRIPT_BOOL 函数。您也可以获取整数输出,然后再使用原生函数将其转换为其他类型。
本节我们将使用来自 Kaggle 的门店销售数据集。利用 Sales 和 Profit 数据字段计算皮尔逊相关系数。

SCRIPT_REAL 需要两个部分。第一部分是在双引号内的 Python 脚本,第二部分是聚合后的参数。
我们将使用 Numpy 包来计算 Sales 与 Profit 参数之间的相关性。我们不能直接添加参数,而是要使用占位符,例如“_arg1”和“_arg2”。例如,SUM([Profit]) 位于第二位,它对应“_arg2”。
我们只是从 np.corrcoef 矩阵中提取相关系数,以返回单列结果。
SCRIPT_REAL("import numpy as np
return np.corrcoef(_arg1,_arg2)[0,1]",
SUM([Sales]),SUM([Profit]))
将脚本添加到“Correlation”计算字段后,点击应用按钮。它将运行脚本并返回与Customer Name 对应的值。
在点击确定按钮之前,点击“默认表计算”文本,将选项从自动更改为Customer Name。

要可视化产品类别与客户细分的散点图:
- 将产品Category 和 Sales 字段拖到列架。
- 然后将 Customer Segment 和 Profit 字段拖到行架。
- 将 Customer Name 拖到标记面板中的明细按钮。
- 最后,将新建的计算字段 Correlation 拖到标记面板中的标签按钮。

上图展示了基于产品类别和客户细分的客户相关系数。在 Furniture 类别与 Small Business 客户之间存在较高的相关性。
在 Tableau 中编写聚类 Python 脚本
在本节中,我们将使用 Airbnb 阿姆斯特丹数据集,借助 K-means 聚类算法和 scikit-learn 机器学习框架创建聚类。

在开始 TabPy 脚本之前,我们需要先在 Jupyter Notebook 中分析并理解数据集。
项目初始化
我们将使用 pandas 进行数据读取与清洗,使用 matplotlib 和 seaborn 进行数据可视化,使用 scikit-learn 进行数据处理与聚类算法。
首先,我们导入所需的 Python 包并读入“listing.csv”文件。随后,使用 .isna().sum() 查看缺失值。
mport pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.cluster import KMeans
df = pd.read_csv("listings.csv")
df.isna().sum()
可以看到,neighbourhood_group、last_review 和 reviews_per_month 中存在较多缺失值。我们不会对这些列进行插补或删除,而是在训练模型时不纳入这些列。
id 0
name 38
host_id 0
host_name 4
neighbourhood_group 20030
neighbourhood 0
latitude 0
longitude 0
room_type 0
price 0
minimum_nights 0
number_of_reviews 0
last_review 2406
reviews_per_month 2406
calculated_host_listings_count 0
availability_365 0
dtype: int64
数据处理
我们将创建一个 X 数据框,其中包含用于训练的关键特征。这些特征不存在缺失值、唯一 ID 或高相关性。例如,我们不会包含 id、name、host_id、host_name、latitude 和 longitude。
对于分类列,我们将使用 LabelEncoder() 将其转换为数值。为了对多个分类列应用编码,我们会使用 Pandas 的 .apply() 函数。
X = df[['neighbourhood',
'room_type',
'price',
'minimum_nights',
'number_of_reviews',
'availability_365',
'calculated_host_listings_count']]
LE = LabelEncoder()
cat = ['neighbourhood','room_type']
X[cat] = X[cat].apply(LE.fit_transform)
X.head()

如上所示,最终数据框包含七个数值列。
寻找 K Means 聚类的肘部
肘部法用于确定特定数据集中的最优聚类数。我们将使用 n_clusters 和 .inertia_ 来绘制呈肘状的折线图。Inertia 指每个样本到最近聚类中心的平方距离之和。
下面的代码将从 1 到 9 运行,并将 inertia 值追加到 clusters 数组。然后我们据此绘制聚类数与 inertia 的折线图。
clusters = []
for i in range(1, 10):
km = KMeans(n_clusters=i).fit(X)
clusters.append(km.inertia_)
fig, ax = plt.subplots(figsize=(12, 8))
sns.lineplot(x=list(range(1, 10)), y=clusters, ax=ax)
ax.set_title('Searching for Elbow')
ax.set_xlabel('Clusters')
ax.set_ylabel('Inertia');

图中显示第一个弯折在 3,第二个弯折在 4。我们将在 Tableau 的可视化分析中同时考虑这两种聚类数。
您可以通过我们的教程进一步了解使用 scikit-learn 在 Python 中进行 K Means 聚类。
创建 N-Cluster 参数
为避免在代码中手动添加聚类数量,我们将创建一个范围为 1 到 10 的参数。
您可以在数据区域右键,选择创建参数。将数据类型改为整数,当前值设为 1,并点击范围添加最小值 1 和最大值 10。

计算字段中的 Python 脚本
现在我们将把代码从 Jupyter Notebook 转移到 Tableau 计算字段中。Tableau 计算字段不需要加载数据集;我们已经具备所需的数据字段,并将通过 SCRIPT_INT 参数加以使用。
- 我们将把参数一和二通过 LabelEncoder 转为数值类型。
- 获取所有参数并赋予合适的变量名。
- 我们将把除 N 之外的所有输入参数按列堆叠。
- 用“N”定义聚类的数量。我们可以通过 N Clusters 参数修改该变量。
- 最后,使用这些特征进行训练并预测聚类。
- 将输出作为整数列表返回。
脚本的第二部分是聚合数据字段与一个参数。
您可以查看下面的代码,了解参数与数据字段之间的对应关系。
SCRIPT_INT("from sklearn.preprocessing import LabelEncoder
from sklearn.cluster import KMeans
LE = LabelEncoder()
neighbourhood = LE.fit_transform(_arg1)
room_type = LE.fit_transform(_arg2)
price = _arg3
minimum_nights = _arg4
number_of_reviews = _arg5
availability_365 = _arg6
calculated_host_listings_count = _arg7
N = _arg8[0]
X = np.column_stack(
[
neighbourhood,
room_type,
price,
minimum_nights,
number_of_reviews,
availability_365,
calculated_host_listings_count,
]
)
kmeans = KMeans(n_clusters=N, random_state=35)
return kmeans.fit_predict(X).tolist()
",
ATTR([Neighbourhood]),
ATTR([Room Type]),
AVG([Price]),
MEDIAN([Minimum Nights]),
SUM([Number Of Reviews]),
AVG([Availability 365]),
AVG([Calculated Host Listings Count]),
[N Clusters]
)
创建一个新的计算字段(Kmean),将上述代码复制粘贴进去。请确保结果按Host Id进行计算。您可以点击默认表计算的蓝色文字进行修改。

数据可视化
要创建下图所示的可视化,我们需要按以下步骤操作。
- 将 Price 字段拖到列架,将 Number of Reviews 拖到行架。
- 在顶部的分析菜单中,取消勾选度量汇总。
- 将 Host Id 字段拖到标记面板中的明细,并将 Kmean 计算字段拖到颜色。
- 右键将 Kmean 计算字段设置为离散。
- 在参数区域右键点击N Clusters,选择显示参数,在右侧显示滑块。
- 将 N Clusters 滑块调整为 3 或 4,即可实时查看结果。

接下来,我们将通过更换数据字段与聚类数量来创建多张可视化工作表。
- Price v/s Availability:我们可以看到四个聚类。基于这些信息,我们可以为 Airbnb 或任意酒店业务构建推荐系统。
- Review v/s Availability:即使 N Clusters 为 3,我们也只能看到两个大的聚类。
- Listings v/s Price:可以看到红、蓝、绿三类。角落的黄色被绿色与蓝色包围。

通过参加我们的 Analyzing Data in Tableau 课程,进一步学习高级分析与可视化。这将帮助您理解数据准备、探索、地图分析、组、集合与参数。
如果您喜欢本次聚类教程,不妨尝试将数据点转换到地图上。只需将 Latitude 与 Longitude 分别拖到列与行架即可。

您也可以不借助 TabPy 来创建聚类,参见我们的Tableau 聚类分析教程。
结语
通过集成 TabPy,您将为自动化与改进现有数据分析流程打开无限可能。我们也可以将其用于在分析仪表板中集成深度学习模型、执行复杂统计任务,以及实现持续集成与开发。
TabPy 集成也存在一些限制,例如仅支持单一输出。这些限制主要会影响数据科学家或机器学习工程师等角色。
本文我们了解了 TabPy(Tableau 的 Python 服务器)以及如何使用它创建 K Means 聚类。聚类对于电商、旅游和娱乐行业理解客户行为至关重要。我们使用了 K Means 聚类,您也可以尝试其他算法以获得更好的效果。
以下是常见的聚类算法列表:
- Affinity Propagation
- 凝聚层次聚类(Agglomerative Hierarchical Clustering)
- BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)
- DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
- 高斯混合模型(Gaussian Mixture Models,GMM)
- 均值漂移聚类(Mean Shift Clustering)
如果您刚接触 Tableau,想全面学习数据可视化与统计计算,请参加 Tableau Fundamentals 技能路径。
在本教程系列的第二部分中,我们将使用 TabPy 探索更复杂的 Python 脚本。我们将学习在 TabPy 服务器上部署 Facebook Prophet 预测模型,并创建动态时间序列可视化。