举个栗子!Tableau 技巧(27):如何在 Tableau 中用 Python(技术干货,建议收藏)

published: 2021-05-20

自从 Tableau10.2 发版,技术宅们欣喜若狂:Tableau 中终于可以用 Python 啦!不过,究竟怎么用?很多用户就不是很清楚了。

关于 Python 在 Tableau 的用法,我查阅相关资料,找到了这篇内容完整并且满满干货的分享文章。英文原文链接接:https://github.com/tableau/TabPy/blob/master/server.md

在这里,我将原文做了翻译,分享给技术达人们!



本期《举个栗子》,阿达要给大家分享的 Tableau 技巧是:如何在 Tableau 中用 Python。

在 Tableau 中用 Python,首先需要添加 TabPy 服务器。TabPy 服务器是 Tableau 的 Python 集成的服务器组件,它是一个基于 Tornado 和其他 Python 库的 Python 进程。

Part 1:在Linux / MacOS上安装

在基于 Linux 的系统上,您可以使用脚本 setup.sh 从头开始安装 TabPy。

首先点击 TabPy 存储库着陆页右上角的绿色克隆或下载按钮并下载 zip 文件。解压缩后,导航到终端窗口中包含 setup.sh 的文件夹,然后键入 ./setup.sh。

在 MacOSX 上,您可能还需要通过键入以下命令来为文件授予权限:chmod + x setup.sh

该脚本执行以下操作:

- 下载并安装Anaconda,除非Anaconda在PATH或文件夹Anaconda在当前文件夹中找到。 Anaconda提供了一套详尽的Python包,包括可由服务器执行的Python代码使用的ML相关库。

- 创建一个名为Tableau-Python-Server的Python环境(如果尚不存在)。然后脚本激活环境,并将服务器文件夹添加到PYTHONPATH(这是服务器脚本在同一个文件夹中查找其Python依赖项所必需的)。

- 将所需的Python包安装到新环境以及客户端软件包中,因为它包含服务器所依赖的常用功能。

- 初始化服务器,显示安装位置和下次启动服务的说明。

安装完成后,或根据启动服务器的说明运行startup.sh时,应该会看到如下输出:

INFO:__ main __:{“INFO”:“Loading state from state file”}

INFO:__ main __:{“INFO”:“Initializing tabpy”}

INFO:__ main __:{“INFO”:“Done initializing tabpy”}

INFO:__ main __:{“INFO”:“Web service listening on port 9004”}

此时,服务器可以远程执行Python代码或部署Python函数。

您可以通过终止进程来停止服务器(例如,使用CTRL-C)。

Part 2:在 Windows 上安装

在 Windows 上,您可以使用脚本 setup.bat 从头开始安装 TabPy。

首先点击TabPy存储库着陆页右上角的绿色克隆或下载按钮并下载zip文件。解压缩后,使用Windows命令行导航到包含setup.bat的文件夹,然后键入setup.bat。

脚本执行以下步骤:

- 下载并安装Anaconda,在当前用户帐户下,例如C:\ users \ yourUserName \,除非Anaconda在PATH中或具有注册表项。 Anaconda提供了一套详尽的Python包,包括可由服务器执行的Python代码使用的ML相关库。

- 创建一个名为Tableau-Python-Server的Python环境(如果尚不存在)。脚本然后激活环境。

- 将所需的Python包安装到新环境以及客户端软件包中,因为它包含服务器所依赖的常见功能。

初始化服务器,显示安装位置和下次启动服务的说明。

安装完成后,或者根据启动服务器的说明运行startup.bat时,应该会看到如下输出:

INFO:__ main __:{“INFO”:“Loading state from state file”}

INFO:__ main __:{“INFO”:“Initializing tabpy”}

INFO:__ main __:{“INFO”:“Done initializing tabpy”}

INFO:__ main __:{“INFO”:“Web service listening on port 9004”}

此时,服务器可以远程执行Python代码或部署Python函数。

您可以通过终止可以在Windows任务管理器中看到的python2.7进程来停止服务器。 (按Ctrl + Shift + Esc访问任务管理器)

Part 3:手动安装

如果您熟悉Python环境并且已经设置了一个,或者不喜欢使用Anaconda,并且只想启动服务器进程,则可以跳过安装脚本,安装依赖项并直接从命令行运行该进程。手动安装说明假定Conda或Python被定义为PATH的一部分。

它是可选的,但建议您为此项目创建一个新的Conda环境:

conda create --name Tableau-Python-Server python = 2.7 anaconda

上面的示例创建了一个Python 2.7环境,但Python 2.7+和Python 3.5+都支持Tableau Python Server。

现在激活新创建的环境。

在Linux / MacOS上:

source Tableau-Python-Server

在Windows上:

activate Tableau-Python-Server

由于TabPy在PyPI上可用,您可以通过简单的运行以下命令进行安装。

pip install tabpy-server

随着软件包的安装,您将看到命令行中列出的安装位置。这些可能看起来像/Users/username/anaconda/envs/Tableau-Python-Server/lib/python2.7/site-packages或\ Users \ username \ anaconda \ envs \ Tableau-Python-Server \ lib \ site-packages,取决于你的环境。

导航到site-packages下的tabpy_server文件夹,并分别在Windows和Linux / MacOS上运行startup.bat或startup.sh。您可以指定自定义端口号作为参数。 startup.bat 9001。

Part 4:更新TabPy

您可以使用pip中的--upgrade选项来更新到较新版本。

pip install --upgrade tabpy-server

为了使其成功,如果您在Conda环境中安装了TabPy,请确保它处于活动状态。

Part 5:扩展环境

如果您的功能取决于未包含的Python软件包,则需要将它们安装到Python环境中,以使其可用于服务器进程。

以下代码段假设您已经运行setup.sh或setup.bat,它创建了一个Conda环境,并在该环境中启动了服务器进程。

通过添加包名称,它可用于在服务器中执行的任何Python代码:

在Linux / MacOS上:

/Anaconda/bin/source activate Tableau-Python-Server

pip install _names_of_packages_here_

在Windows上:

/ Anaconda / Scripts / activate Tableau-Python-Server

pip install _names_of_packages_here_

如果您在默认的Python框架中安装了没有Anaconda的TabPy,那么您可以通过以下方式实现:

pip install _names_of_packages_here_

您可以在服务器进程运行时在单独的终端中执行此操作 - 无需重新启动。

Part 6:REST接口

服务器进程暴露了几个REST API以获取状态并执行Python代码并查询已部署的方法。


http:get :: / info


获取有关服务器的静态信息。

☞示例请求:

   GET /info HTTP/1.1

    Host: localhost:9004

    Accept: application/json

☞响应示例:

    HTTP / 1.1 200 OK

    Content-Type:application / json

    {“description”:“”,

     “creation_time”:“0”,

     “state_path”:“/ Users / username / my-server-state-folder”,

     “server_version”:“dev”,

     “name”:“my-server-name”}

- description是在state.ini文件中硬编码的字符串,可以在那里编辑。

- creation_time是自1970-01-01以来的创建时间(以秒为单位),硬编码在state.ini文件中,可在其中进行编辑。

- state_path是服务器的状态文件路径(服务器启动时环境变量TABPY_STATE_PATH的值)。

- server_version是由服务器提供的硬编码字符串(在server / common / config.py中定义)。客户可以使用此信息进行兼容性检查。

☞使用卷曲

    curl -X GET http:// localhost:9004 / info


http:get :: / status


获取部署端点的运行时状态。如果在服务器中未部署端点,则返回的数据是空的JSON对象。

☞示例请求:

    GET /status HTTP/1.1

    Host: localhost:9004

    Accept: application/json

☞响应示例:

    HTTP / 1.1 200 OK

    Content-Type:application / json

 {"clustering": {

      "status": "LoadSuccessful",

      "last_error": null,

      "version": 1,

      "type": "model"},

     "add": {

      "status": "LoadSuccessful",

      "last_error": null,

      "version": 1,

      "type": "model"}

    }

☞使用卷曲:

    curl -X GET http:// localhost:9004 / status


http:get :: / endpoints


获取部署的端点及其静态信息的列表。如果在服务器中未部署端点,则返回的数据是空的JSON对象。

☞示例请求:

  GET /endpoints HTTP/1.1

    Host: localhost:9004

    Accept: application/json

☞响应示例:

    HTTP / 1.1 200 OK

    Content-Type:application / json

 {"clustering":

      {"description": "",

       "docstring": "-- no docstring found in query function --",

       "creation_time": 1469511182,

       "version": 1,

       "dependencies": [],

       "last_modified_time": 1469511182,

       "type": "model",

       "target": null},

    "add": {

      "description": "",

      "docstring": "-- no docstring found in query function --",

      "creation_time": 1469505967,

      "version": 1,

      "dependencies": [],

      "last_modified_time": 1469505967,

      "type": "model",

      "target": null}

    }

☞使用卷曲:

    curl -X GET http:// localhost:9004 / endpoints


http:get :: / endpoints /:endpoint


获取特定部署端点的描述。端点必须首先部署在服务器中。

☞示例请求:

    GET /endpoints/add HTTP/1.1

    Host: localhost:9004

    Accept: application/json

☞响应示例:

    HTTP / 1.1 200 OK

    Content-Type:application / json 

{"description": "", "docstring": "-- no docstring found in query function --",

     "creation_time": 1469505967, "version": 1, "dependencies": [],

     "last_modified_time": 1469505967, "type": "model", "target": null}

☞使用卷曲:

    curl -X GET http:// localhost:9004 / endpoints / add


http:post :: / evaluate


执行一个Python代码块,用提供的值替换命名参数。

预期的POST主体是一个带有两个元素的JSON字典:

- 包含传递给代码的参数值的值的关键数据data。这些值是按键名称(_arg1,_arg2等)的特定约定的键值对。

- 包含Python代码(一行或多行)的值的关键脚本scritp。对参数名称的任何引用将根据数据被其值替代。

☞示例请求:

   POST /evaluate HTTP/1.1

    Host: localhost:9004

    Accept: application/json

    {"data": {"_arg1": 1, "_arg2": 2}, "script": "return _arg1+_arg2"}

☞响应示例:

    HTTP / 1.1 200 OK

    Content-Type:application / json

    3

☞使用卷曲:

    curl -X POST http:// localhost:9004 / evaluate \

    -d'{“data”:{“_arg1”:1,“_arg2”:2},“script”:“return _arg1 + _arg2”}'

可以通过预定义的函数tabpy.query从代码块中调用已部署的函数。此函数的工作方式与客户端库的查询方法类似,并返回相应的数据结构。该功能必须首先作为服务器端点部署。

☞以下示例在部署deploy-function部分时调用端点集群:

    POST /evaluate HTTP/1.1

    Host: example.com

    Accept: application/json

    { "data":

      { "_arg1": [6.35, 6.40, 6.65, 8.60, 8.90, 9.00, 9.10],

        "_arg2": [1.95, 1.95, 2.05, 3.05, 3.05, 3.10, 3.15]

      },

      "script": "return tabpy.query('clustering', x=_arg1, y=_arg2)"}

☞下一个示例显示如何使用curl从终端调用评估;此代码查询部署在deploy-function中的方法add:

    curl -X POST http:// localhost:9004 / evaluate \

    -d'{“data”:{“_arg1”:1,“_arg2”:2},

         “script”:“return tabpy.query(\”add \“,x = _arg1,y = _arg2)[\”response \“]”}'


http:post :: / query /:endpoint


在指定的端点执行一个函数。该功能必须首先部署。

该界面希望具有数据键的JSON体,根据其原始定义指定函数的值。在下面的例子中,函数聚类被定义为两个参数x和y的签名,期望数字数组。

☞示例请求:

    POST / query / clustering HTTP / 1.1

    Host:localhost:9004

    Accetp:application / json

    {“data”:{

      “x”:[6.35,6.40,6.65,8.60,8.90,9.00,9.10],

      “y”:[1.95,1.95,2.05,3.05,3.05,3.10,3.15]}}

☞响应示例:

    HTTP / 1.1 200 OK

    Content-Type:application / json

    {“model”:“clustering”,“version”:1,“response”:[0,0,0,1,1,1,1]

     “uuid”:“46d3df0e-acca-4560-88f1-67c5aedeb1c4”}

☞使用卷曲:

    curl -X GET http:// localhost:9004 / query / clustering -d \

    '{“data”:{“x”:[6.35,6.40,6.65,8.60,8.90,9.00,9.10],

               “y”:[1.95,1.95,2.05,3.05,3.05,3.10,3.15]}}'

今天的Tableau技巧你Get到了吗?把它分享给你的朋友吧~