跳至主要内容

使用 TabPy 在 Tableau 中部署 Python 函数与 Prophet 预测模型

通过将 Facebook Prophet 预测模型部署到 Tableau 服务器并创建动态时间序列可视化,学习在 Tableau 中进行高级 Python 脚本编写。
· 12分钟 阅读

使用 AI 探索

Tabpy 标志

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 数据集

Kaggle 数据集 Sales Store Product

在开始编写 Python 代码前,请确保已安装最新的 TabPy 包。

pip install -U tabpy

在本地通过终端运行服务器。

tabpy

TabPy 客户端 

如果您熟悉 Python,这部分会很容易理解。您可以通过 Python 入门课程系统学习 Python 函数。

  1. 我们将从 tabpy_tools 导入 Client,并导入用于计算的 NumPy。
  2. 使用 URL 和端口连接 TabPy 服务器。
  3. 创建 pearson_correlation_coefficient(),接收 x 与 y 并返回单列相关系数。
  4. 使用 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。

  1. 在 SCRIPT_REAL 中添加查询脚本并聚合数据字段。
  2. 查询脚本以 return 开头,并以 [‘response’] 结尾以从 JSON 中取出结果。
  3. 将默认表计算设置为 Customer Name 字段。
  4. 应用并点击确定。

PCC 计算字段

皮尔逊相关系数计算字段

您可以回看本教程第一部分以理解 Tableau 脚本。

SCRIPT_REAL("return tabpy.query('pcc',_arg1, _arg2)['response']",
SUM([Sales]),SUM([Profit]))

数据可视化 

我们现在创建一个可视化,按产品类别与客户分群显示相关系数。

  1. 将 Customer Name 拖放到 Marks 面板的 Detail,将 Ship Mode 拖放到 Color。
  2. 将 Customer Segment 与 pcc(相关系数计算字段)拖放到 Columns 货架。
  3. 将 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

项目初始化 

  1. 我们将先导入用于数据摄取与处理的 pandas,以及用于训练评估预测模型的 Prophet。
  2. 使用 pandas 的 read_csv 函数读取苹果股票数据集(AAPL.csv)。
  3. 将 X 定义为包含 date 与 high 两列。
  4. 显示数据框形状,并将 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 模型准备数据,并使用默认超参数进行训练。

  1. 将列重命名为 ds 和 y
  2. 将 ds 列转换为日期时间(日期)
  3. 使用 Prophet() 定义 model
  4. 使用 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 函数。

  1. 它将接收用于预测的年份数,并据此创建 future 日期框架。
  2. 使用 model.predict 与 future 数据框进行预测。
  3. 将“yhat”重命名为“y”,以便与历史数据拼接。
  4. 最后一步较为巧妙:在 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 计算字段

Actual 计算字段

LOOKUP 将帮助我们把 High 值按 Years*365 进行偏移。例如,当 Years 为 2 时,将偏移 730。

LOOKUP(SUM([High]),[Years]*365)

实际 vs. 预测

终于来到最后一步。要绘制实际 vs. 预测的折线图,请按以下步骤:

  1. 前往左下角的 Parameters 区域,右键 Years 参数并选择 Show Parameters。
  2. 将 Forecast_date 拖放到 Columns 货架,并将其更改为 Day。
  3. 将维度中的 Measure Names 拖到 Filters,仅选择 Actual 与 forecast。
  4. 将维度中的 Measure Names 拖到 Color。
  5. 最后,将度量中的 Measure Names 拖到 Rows 货架。

完成以上步骤后,您将看到不同颜色的 Actual 与 forecast。

实际 vs. 预测 折线图

实际 vs. 预测 折线图

上面的折线图还远非完美,仍需进行超参数调优、交叉验证、填补缺失值与日期,以及改进日期函数。

总结

在本教程中,我们学习了如何在 TabPy 服务器上构建并部署机器学习模型,并通过 Tableau 脚本进行调用。我们还学习了 tabpy_tools 的基础知识,以及如何使用它来部署函数或模型。

通过参加 DataCamp 的 金融预测课程,进一步学习相关内容。您将学习理解损益表、资产负债表与预测比率、原始数据格式化、日期与会计期间管理,以及预测中的假设与差异。

时间序列预测只是基线;我们可以通过使用其他机器学习算法来训练数据以改进预测,例如:

  • 自回归积分滑动平均(ARIMA)
  • 季节性自回归积分滑动平均(SARIMA)
  • 指数平滑(ES)
  • XGBoost
  • LSTM(深度学习)
  • Temporal Fusion Transformer(Google)

如果您是 Tableau 新手并想系统学习数据可视化与统计计算,请参加 Tableau 基础技能路径。

这是本系列的最后一部分。在本教程的第一部分中,我们全面了解了 TabPy,并在 Tableau 中执行 Python 脚本,为阿姆斯特丹的 Airbnb 房源创建了多个聚类。

主题