
TabPy 工具
TabPy Tools 是一个用于在 TabPy 服务器上部署与管理 Python 函数的 Python 软件包。
下面我们深入了解 TabPy 工具的各项功能。
连接到 TabPy
客户端函数可使用 URL 和端口将 Python API 连接到 TabPy 服务器。
rom tabpy.tabpy_tools.client import Client
client = Client('http://localhost:9004/')
我们可以使用对象“client”来设置身份验证并在服务器上管理 Python 函数。
身份验证
您可以使用“set_credentials”函数设置用户名和密码。若要在服务器上部署模型,需先设置凭据。
注意:仅当您已在 TabPy 服务器上启用身份验证时才运行此函数。阅读服务器配置文档了解更多信息。
client.set_credentials('username', 'password')
部署函数
创建一个函数,并使用 `client.deploy()` 发布。它需要三个参数:函数名称、Python 函数以及描述。
addition 函数用于相加两个数据字段并返回列表。稍后将在 Tableau 中调用该“add”函数。
client.deploy('add', addition, 'Adds two numbers x and y')
部署模型
当您训练并部署了机器学习模型的推理函数后,Tableau 会使用 cloudpickle 自动保存模型与函数定义。它们会保留在服务器内存中,以提供更快的响应时间。
简单来说,您无需在 Tableau 发生变化时重新训练模型。我们将在后续章节进一步学习如何部署模型。
移除端点
要移除某个函数或模型,请使用 `remove` 函数。只需提供函数名即可。
client.remove('add')
>>> 若需更多高级功能,请查看 GitHub 上的 TabPy/tabpy 仓库。
使用 IDE 部署 Python 函数
与第一部分类似,我们将创建皮尔逊相关系数函数。但这次我们不在 Tableau 中编写函数,而是使用 Python API 将其部署到服务器,然后通过 Tableau 计算来调用该函数。
本节将使用 Kaggle 的 Sales Store Product 数据集来计算销售额与利润字段之间的相关性。

Kaggle 数据集 Sales Store Product
在开始编写 Python 代码前,请确保已安装最新的 TabPy 包。
pip install -U tabpy
在本地通过终端运行服务器。
tabpy
TabPy 客户端
如果您熟悉 Python,这部分会很容易理解。您可以通过 Python 入门课程系统学习 Python 函数。
- 我们将从 tabpy_tools 导入 Client,并导入用于计算的 NumPy。
- 使用 URL 和端口连接 TabPy 服务器。
- 创建 pearson_correlation_coefficient(),接收 x 与 y 并返回单列相关系数。
- 使用 client.deploy() 发布“pcc”函数。它需要三个参数:名称、函数与描述。
from tabpy.tabpy_tools.client import Client
import numpy as np
client = Client('http://localhost:9004/')
def pearson_correlation_coefficient(x,y):
return np.corrcoef(x,y)[0,1]
client.deploy('pcc', pearson_correlation_coefficient, 'correlation coefficient is extracted of x and y')
TabPy 查询
我们现在将使用 tabpy.query() 在 Tableau 中调用该函数。它需要 Python 函数名和参数占位符,例如 _arg1 和 _arg2。
- 在 SCRIPT_REAL 中添加查询脚本并聚合数据字段。
- 查询脚本以 return 开头,并以 [‘response’] 结尾以从 JSON 中取出结果。
- 将默认表计算设置为 Customer Name 字段。
- 应用并点击确定。

皮尔逊相关系数计算字段
您可以回看本教程第一部分以理解 Tableau 脚本。
SCRIPT_REAL("return tabpy.query('pcc',_arg1, _arg2)['response']",
SUM([Sales]),SUM([Profit]))
数据可视化
我们现在创建一个可视化,按产品类别与客户分群显示相关系数。
- 将 Customer Name 拖放到 Marks 面板的 Detail,将 Ship Mode 拖放到 Color。
- 将 Customer Segment 与 pcc(相关系数计算字段)拖放到 Columns 货架。
- 将 Product Category 拖放到 Rows 货架。

相关系数柱状图展示
多数情况下,Corporate 行业部门的销售与利润相关性较高。总体而言,您可以利用相关系数做出数据驱动的决策,提升公司的利润。
阅读我们的 Python 相关性细节教程,了解其他相关系数、在 Python 中计算相关性,以及相关与因果之间的关系。
将 Prophet 模型部署到 Tableau
本节我们将学习如何部署 Facebook Prophet 预测模型,并学习修改日期字段。我们将使用 Apple Stock Prices 2015 至 2020 年的数据来训练时间序列模型。

Kaggle 数据集 Apple Stock Prices(2015-2020)
在 Tableau 中编写脚本并创建预测可视化之前,我们需要在 Jupyter Notebook 中测试 Python 代码并评估预测模型。
Facebook Prophet
Facebook Prophet 是一个用于对单变量时间序列数据进行自动预测的开源库。它在处理年、周、日的季节性方面效果最佳。
为什么选择 Prophet?
它擅长处理缺失数据、趋势变化和异常值。
安装 Prophet
您可以在终端中使用以下命令安装 Prophet Python 包。
pip install pystan==2.19.1.1
pip install prophet
如果您使用 Anaconda Python 环境,请使用以下命令。
conda install -c conda-forge prophet
项目初始化
- 我们将先导入用于数据摄取与处理的 pandas,以及用于训练评估预测模型的 Prophet。
- 使用 pandas 的 read_csv 函数读取苹果股票数据集(AAPL.csv)。
- 将 X 定义为包含 date 与 high 两列。
- 显示数据框形状,并将 high 列绘制为时间序列折线图。
import pandas as pd
from prophet import Prophet
data = pd.read_csv("AAPL.csv")
X = data.loc[:, ['date','high']]
print(X.shape)
X.plot();
输出
(1258, 2)
苹果股价随时间上涨。期间出现过两次下跌,但随后恢复并保持稳步增长。

请参考 Hugo Bowne-Anderson 的 Python 时间序列分析教程以深入了解。您也可以参加 DataCamp 的 Python 时间序列分析短课进行实操。
构建机器学习模型
本部分我们将为 Prophet 模型准备数据,并使用默认超参数进行训练。
- 将列重命名为 ds 和 y
- 将 ds 列转换为日期时间(日期)
- 使用 Prophet() 定义 model
- 使用 model.fit() 训练模型
X.columns = ['ds', 'y']
X['ds']= pd.to_datetime(X['ds'], format='%Y-%m-%d').dt.date
model = Prophet()
# fit the model
model.fit(X)
模型评估
要进行评估,我们需要向数据集中添加未来日期。可通过 make_future_dataframe 实现。
我们将设置:
- prediods 为 365 天
- freq 为“D”。您也可以改为“Y”,但需将 periods 改为 1。
- include_history 为 false,以省略历史数据。
future = model.make_future_dataframe(periods=365,
freq='D',
include_history=False
)
future.tail()
输出
如可见,future 数据集截至 2021 年。
ds
360 2021-05-18
361 2021-05-19
362 2021-05-20
363 2021-05-21
364 2021-05-22
下一步使用这些数据来预测苹果股价的 high 值。之后我们将显示“ds”“yhat”“yhat_lower”“yhat_upper”。
yhat_lower 与 yhat_upper 定义了可接受的波动范围。简单说,股价最高可到 485.3,最低可到 365.4。此信息可帮助日内交易者评估风险。
forecast = model.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail
输出
ds yhat yhat_lower yhat_upper
360 2021-05-18 423.757736 365.415878 485.293438
361 2021-05-19 423.862811 365.527086 482.751097
362 2021-05-20 423.918642 365.233839 482.501335
363 2021-05-21 423.842872 364.454184 483.672508
364 2021-05-22 421.187822 360.181717 481.024524
让我们使用 plot() 函数可视化预测数据。它需要预测值以显示点线图,并用蓝色显示可接受范围。
model.plot(forecast)
下图显示苹果股价将持续增长且无回落。

您可以通过调整与饱和预测、趋势变点、季节性、假日效应及回归变量、乘法季节性、不确定性区间和异常值相关的超参数来改进预测。也可使用超参数调优自动调整。阅读 文档了解更多 Facebook Prophet 的信息。
时间序列预测是一个广阔领域。您可以通过 Moez Ali 的时间序列预测教程系统学习,其中涵盖时间序列分析、统计模型、Python 框架与 AutoML。
您还可以参加我们的 用 Python 可视化时间序列数据课程,学习折线图、季节性/趋势/噪声的检测与多时间序列展示等内容。
部署模型推理
本节我们将部署模型推理。这将允许我们在 TabPy 服务器中存储模型与函数定义,以提供更快的响应时间。
我们先通过 URL 与端口连接 Client,然后定义 prophet_forecasting 函数。
- 它将接收用于预测的年份数,并据此创建 future 日期框架。
- 使用 model.predict 与 future 数据框进行预测。
- 将“yhat”重命名为“y”,以便与历史数据拼接。
- 最后一步较为巧妙:在 Tableau 中,我们无法为 data 字段直接添加值,因此我们将日期值整体平移 365*n,其中 n 为年份数。
最后,我们将使用 client.deploy() 将其打包并部署到 TabPy 服务器。我们将函数命名为“prophet”。override 参数可帮助我们创建模型与函数的版本,这在初期调试代码时非常必要。
from tabpy.tabpy_tools.client import Client
client = Client('http://localhost:9004/')
def prophet_forecasting(n):
future = model.make_future_dataframe(periods=365*n,include_history=False)
prediction = model.predict(future)
prediction.rename(columns={"yhat":"y"}, inplace=True)
return pd.concat([X,prediction[['ds','y']]])['y'].to_list()[365*n:]
client.deploy('prophet',
prophet_forecasting,
'forecast time series data using prophet',override=True)
设置 Tableau
为了在 Tableau 中控制年份数,我们需要创建一个 Years 参数。该参数将用于 prophet 函数。
在 Data 区域右键选择 Create Parameter 来创建 Years 参数。将 Data type 设为 Integer,Current value 设为 1,点击 Range 并添加 Minimum 1 与 Maximum 5。

创建 Years 参数
之后我们将创建一个 Forecast_date 计算字段。我们将使用 Date 字段,并按 Years 的数值进行平移。

Forecast_date 计算字段
DATEADD 函数会将 Years 加到 Date 字段上,然后再截断到天级别。
DATETRUNC('day',DATEADD('year',[Years],[Date])))
接下来我们将创建一个 forecast 计算字段,并使用 tabpy.query() 调用已部署的模型。查询函数由两部分组成:第一部分是 Python 函数名,第二部分是参数占位符列表。

forecast 计算字段
在我们的案例中只有一个参数,因此使用 _arg1。我们将查询封装在名为 SCRIPT_REAL 的 Tableau 函数中,并将 Years 参数作为输入。在点击确定之前,请确保结果沿着 Forecast_date 进行计算。您可以通过点击蓝色文字(默认表计算)来更改。
SCRIPT_REAL("return tabpy.query('prophet',_arg1[0])['response']",
[Years]
)
之后我们基于 High 字段与 Years 参数创建一个 Actual 计算字段。

Actual 计算字段
LOOKUP 将帮助我们把 High 值按 Years*365 进行偏移。例如,当 Years 为 2 时,将偏移 730。
LOOKUP(SUM([High]),[Years]*365)
实际 vs. 预测
终于来到最后一步。要绘制实际 vs. 预测的折线图,请按以下步骤:
- 前往左下角的 Parameters 区域,右键 Years 参数并选择 Show Parameters。
- 将 Forecast_date 拖放到 Columns 货架,并将其更改为 Day。
- 将维度中的 Measure Names 拖到 Filters,仅选择 Actual 与 forecast。
- 将维度中的 Measure Names 拖到 Color。
- 最后,将度量中的 Measure Names 拖到 Rows 货架。
完成以上步骤后,您将看到不同颜色的 Actual 与 forecast。

实际 vs. 预测 折线图
上面的折线图还远非完美,仍需进行超参数调优、交叉验证、填补缺失值与日期,以及改进日期函数。
总结
在本教程中,我们学习了如何在 TabPy 服务器上构建并部署机器学习模型,并通过 Tableau 脚本进行调用。我们还学习了 tabpy_tools 的基础知识,以及如何使用它来部署函数或模型。
通过参加 DataCamp 的 金融预测课程,进一步学习相关内容。您将学习理解损益表、资产负债表与预测比率、原始数据格式化、日期与会计期间管理,以及预测中的假设与差异。
时间序列预测只是基线;我们可以通过使用其他机器学习算法来训练数据以改进预测,例如:
- 自回归积分滑动平均(ARIMA)
- 季节性自回归积分滑动平均(SARIMA)
- 指数平滑(ES)
- XGBoost
- LSTM(深度学习)
- Temporal Fusion Transformer(Google)
如果您是 Tableau 新手并想系统学习数据可视化与统计计算,请参加 Tableau 基础技能路径。
这是本系列的最后一部分。在本教程的第一部分中,我们全面了解了 TabPy,并在 Tableau 中执行 Python 脚本,为阿姆斯特丹的 Airbnb 房源创建了多个聚类。