Datapane 008 - 团队版

Datapane 团队版 - 简介

Python 开源生态系统的灵活与强大已被众多数据团队认可,但把 Python 分析结果转化为可分享、自动化、能提供商业价值的最后一步却难的让人望而却步。Datapane 团队版的 API 平台利用 Python 实现在公司内部生成与分享数据报告。让数据团队使用自己熟悉的工具驱动商业决策,让相关方自行浏览分析报告,无需每次都要等待别人生成报告。

除了安全、可验证的报告分享机制之外,Datapane 团队版还支持在云端部署 Python 脚本和 Jupyter Notebook,自动生成报告。通过网页表单输入参数,即可生成自定义报告,还可以按计划定时生成报告,或通过我们的 HTTP 和 Python API 按需生成报告。

验证与分享

Datapane 团队版为分享报告、脚本、Blob 对象、密钥等对象提供了安全、可验证的方式。Datapane 虚拟机(如,https://acme.datapane.net)的每个用户都有自己私有的、受密码保护的账户。

每个 Datapane 虚拟机都存在于独立的数据库租户里,因此,不同虚拟机之间的账户并不互通,同一个账户不能在不同虚拟机之间进行验证。

Datapane 虚拟机上创建的项目都有 visibility 设置项,用于管理有访问权限的用户。这些 visibility 选项包括 PUBLICPRIVATEORG。创建对象时,一般都要配置这个选项,默认值是 ORG

以下列报告为例:

# 任何人都可见
report.publish(visibility='PUBLIC')

# 只有在 Datapane 虚拟机上的注册用户可见
report.publish(visibility='ORG')

# 只有账户所有者本人可见,其它用户不可见
report.publish(visibility='PRIVATE')

在网页界面上也可以设置报告或脚本的 visibility 选项。

访问 Token

如需向客户、合同商等外部人员分享私有报告,请用 Share 按钮旁的链接生成带安全标记的 Token。这个链接包含的 Token 可以让任何持有此链接的人访问报告,无需注册 Datapane 账户。

此 Token 也适用于嵌入式报告,比如,嵌入到 Confluence 或网页等平台的报告。为了安全起见,24 小时后会重置访问 Token,因此,这种方式不适合长期分享。

下一节,介绍如何部署 Datapane 团队版的脚本与 Jupyter Notebook。

脚本与 Jupyter 部署

简介

Datapane 团队版支持脚本运行器,可在云端通过参数运行部署的 Python 脚本或 Jupyter Notebook。 即,除在本机生成报告之外,还支持部署后自动生成报告。

脚本或 Notebook 部署后,可用以下三种方式运行:

网页表单

通过界面友好的网页表单输入参数即可运行脚本,为相关方创建的交互、自助式报告工具。

参数与表单(详见下文)

计划定时

使用脚本按计划定时生成、更新报告,创建“实时”仪表盘与自动报告。

按计划运行报告(详见下文)

调用 API

通过 API 生成报告,利用 Slack、Teams 或您自己产品中触发事件生成报告。


部署脚本

通过 CLI 把调用 Report.publish 方法(参阅创建报告小节)创建报告的 Python 脚本或 Notebook 部署到 Datapane。下面以上文中的新冠脚本为例,用 Datapane 的 CLI 部署该脚本。通过 Datapane 网页界面运行脚本时,用该代码发布的报告将返回给用户。

建议:一个脚本只创建一个报告。虽然一个脚本里可以创建多个报告,但网页界面只能追踪每个脚本里最后的报告。

# simple_script.py

import pandas as pd
import altair as alt
import datapane as dp

dataset = pd.read_csv('https://covid.ourworldindata.org/data/owid-covid-data.csv')
df = dataset.groupby(['continent', 'date'])['new_cases_smoothed_per_million'].mean().reset_index()

plot = alt.Chart(df).mark_area(opacity=0.4, stroke='black').encode(
    x='date:T',
    y=alt.Y('new_cases_smoothed_per_million:Q', stack=None),
    color=alt.Color('continent:N', scale=alt.Scale(scheme='set1')),
    tooltip='continent:N'
).interactive().properties(width='container')

dp.Report(
    dp.Plot(plot), 
    dp.Table(df)
).publish(name='covid_report', open=True)

部署报告时,使用 Datapane 的 CLI。

datapane script deploy --script=simple_script.py --name=covid_script
Uploaded simple_script.py to https://acme.datapane.net/leo/scripts/covid_script/

该操作把脚本部署至私有虚拟机,您可以把它分享给别人。分享脚本后,点击 Run 按钮,就可以用上面的示例代码动态生成报告。

每次运行脚本,都会重新提取新冠数据,并生成全新的报告,继而可以用于分享或嵌入到其它平台。

配置

上例部署了单一脚本,并通过命令行参数设置了脚本名称与文件位置。对于单一脚本,这种操作没有问题,但很多时候,还需要配置脚本的其它选项,比如参数定义、设置部署文件与文件夹、Python、系统需求等。

Datapane 的配置文件是 datapane.yaml。运行 deploy 命令时,Datapane 自动查找这个文件。继续下一步操作前, 先用 script init 命令创建项目架构,该命令将生成 datapane.yaml 示例文件及示例脚本文件。

 ~/C/d/d/my-new-proj> datapane script init
Created script 'my-new-proj', edit as needed and upload
 ~/C/d/d/my-new-proj> ls
datapane.yaml dp-script.py

下一步操作要使用的是上例中的脚本文件,所以请删除该命令生成的 dp-script.py 示例脚本文件。这里替换了默认脚本,因此,要在 datapane.yamlscript 项里指定脚本的文件名。在这个文件里,还可以指定报告名称。

# datapane.yaml

name: covid_script
script: simple_script.py # this could also be ipynb if it was a notebook

在这个文件夹里运行 datapane script deploy 命令,Datapane 使用 datapane.yaml 里的设置部署代码。因为该文件里设置的脚本名称与上例中的名称一样,该操作将生成 covid_script 脚本的第 2 个版本。

与报告类似,脚本也支持多版本,可以生成或迭代单一 Python 项目。

下一节,介绍向脚本添加参数,基于用户输入的内容动态生成报告。

脚本参数

脚本支持参数,通过网页表单或 API 可以动态生成报告。


概览

相关方通常需要配置脚本,以实现自助生成报告。Datapane 允许向脚本中传递参数,并以网页表单的形式展现给终端用户。这种方式让其他在虚拟机上有账户的用户不必操心代码、Notebook、设置 Python 环境,就能够生成报告。

运行与参数

datapane.yaml 配置文件里,写清楚输入内容的架构与配置即可定义可以输入哪些参数。在 Python 代码中,在本文件里定义的这些参数通过 Params 字典访问。用 Params.get([value_name], [default_value]),就能从字典里提取所需的项目。

这里继续沿用上节的例子,提取的数据集里还包含一些用户在可视化时需要的其它参数。下面将 new_case_smoothed_per_millionnew_deaths_smoothed_per_millionmedian_agegdp_per_capita 等内容添加到终端用户可选择的内容里。此外,终端用户还要能为可视图选择 continents 的子集。

基于以上内容,要向 datapane.yamlparameters 项中添加两个参数:plot_fieldcontinents。要配置终端用户的表单,需要选择 widget 类型。针对上例,选择 enum (下拉菜单,用户必须选择其中一个选项)、list(用户可以选择预定义列表中的一项或多项内容)。还可以为每项输入内容与描述设置默认参数。

参数配置与可用的字段请参与 API 参考手册(下期发布)

# datapane.yaml

name: covid_script
script: simple_script.py # this could also be ipynb if it was a notebook
  
parameters:
  - name: field_to_plot
    description: Field to plot
    type: enum
    choices: 
      - new_cases_smoothed_per_million
      - new_deaths_smoothed_per_million
      - median_age
      - gdp_per_capita
  - name: continents
    description: Field to plot
    type: list
    choices:
      - Africa
      - Asia
      - Europe
      - Oceania
      - North America
      - South America
    default: 
      - Asia
      - North America

设置完成后,在 Datapane 虚拟机上运行时,就可以用 Params 对象,基于用户的输入自定义数据与可视图。

# simple_script.py

import pandas as pd
import altair as alt
import datapane as dp

dataset = pd.read_csv('https://covid.ourworldindata.org/data/owid-covid-data.csv')

# 获取输入的参数
continents = dp.Params.get('continents', ['Asia', 'North America'])
field_to_plot = dp.Params.get('field_to_plot', 'new_cases_smoothed_per_million')

df = dataset[dataset.continent.isin(continents)].groupby(['continent', 'date'])[plot_field].mean().reset_index()

plot = alt.Chart(df).mark_area(opacity=0.4, stroke='black').encode(
    x='date:T',
    y=alt.Y(field_to_plot, stack=None),
    color=alt.Color('continent:N', scale=alt.Scale(scheme='set1')),
    tooltip='continent:N'
).interactive().properties(width='container')

dp.Report(
    dp.Plot(plot), 
    dp.Table(df)
).publish(name='covid_report', open=True)

运行 script deploy 命令,Datapane 会部署脚本的新版本,并用定义的参数生成下图所示的表单:

终端用户可以输入参数,并基于这些字段自助生成自定义报告。

定时运行报告

按计划安排的节奏生成报告,并创建实时仪表盘。

有时,需要按计划让部署到 Datapane 的脚本或 Jupyter Notebook 自动生成报告 -- 比如,每天从数据仓库中更新数据,或定期查询内部 API 的变化。

新建计划使用 create 命令:

$ datapane schedule create <script name> <crontab> [-p <parameters>]

create 命令接受三个参数:

  • script:运行的脚本文件名
  • cron:crontab 显示计划的间隔时间
  • parameters(可选):针对支持参数的脚本,按计划运行脚本时,需要提供参数的键值对列表

生成 crontab 时遇到任何问题,请参阅 http://corntab.com/

假设每天上午 9 点要运行新冠脚本,请用下列命令:

$ datapane schedule [your-username]/covid_script "0 9 * * MON" 
Created schedule: 3 (https://acme.datapane.net/api/schedules/3/)

使用 -p 选项,可以加入任意输入的参数。

$ datapane schedule [your-username]/covid_script "0 9 * * MON" -p '{"continents": ["Europe"], "field_to_plot": "gdp_per_capita"}' 
Created schedule: 4 (https://acme.datapane.net/api/schedules/4/)

查看有效的计划,请用 list 命令:

$ datapane schedule list
Available Schedules:
  id  script                                          cron         parameter_vals
----  ----------------------------------------------  -----------  -------------------------------------------------------------
   3  https://acme.datapane.net/api/scripts/X0AEQAd/  0 9 * * MON  {}
   4  https://acme.datapane.net/api/scripts/X0AEQAd/  0 9 * * MON  {"continents": ["Europe"], "field_to_plot": "gdp_per_capita"}

删除已有的计划,请用 delete 命令:

$ datapane schedule delete 3
Deleted schedule 3

使用定时报告

报告支持多个版本,因此,可以实现定期自动更新,创建实时报告。浏览脚本发布的报告时,将自动更新,并显示最新版本的报告。同样,报告(或报告里的某个元素)内嵌在 Confluence、Salesforce 等第三方平台时,嵌入的内容也会自动更新。

依赖项与需求项

Python 脚本或 Notebook 有时会调用外部支持库。Datapane 支持在部署脚本时,添加本机文件与文件夹;还支持设置 pip 需求项,用以实现在 Datapane 上运行脚本时调用各种支持库;还支持指定脚本运行的 Docker 容器。所有这些功能都可以在 datapane.yaml 文件里配置。

Python 依赖项

假设我们要创建一个提取金融数据的报告工具,可能会调用 Python 的 yfinance 支持库。为实现这一功能,要在 datapane.yaml 文件的 requirements 项下添加该支持库。

# datapane.yaml

...

requirements:
  - yfinance

附加文件与文件夹

此外,还可以添加本机的 Python 文件或文件夹。假设要在脚本里调用一个独立的 Python 文件,stock_sacler.py,该文件用于评估股票价值,或要在 Python 中调用某个文件夹里的 SQL 脚本。

~/C/d/d/my-new-proj> ls
dp-script.py datapane.yaml stock_scaler.py

将这个文件添加到 include 项下,就可以把它部署到服务器。

# datapane.yaml

...

include:
  - stock_scaler.py
  

Docker 依赖项

默认条件下,Datapane 上的脚本在我们提供的标准 Docker 容器里运行。该容易包含了下列支持库:

seaborn == 0.10.*
altair-recipes ~= 0.8.0
git+https://github.com/altair-viz/altair_pandas@master#egg=altair-pandas
git+https://github.com/altair-viz/pdvega@master#egg=pdvega

scipy == 1.4.*
scikit-learn == 0.22.*
patsy ~= 0.5.1
lightgbm ~= 2.2.3
lifetimes == 0.11.*
lifelines == 0.23.*
./wheels/fbprophet-0.5-py3-none-any.whl
adtk ~= 0.6.2

# data access
sqlalchemy ~= 1.3
psycopg2-binary ~= 2.8
PyMySQL ~= 0.9.3
google-cloud-bigquery[pandas, pyarrow] ~= 1.17
boto3 ~= 1.12.6
requests ~= 2.23.0
ftpretty ~= 0.3.2
pymongo ~= 3.10.1

# misc
dnspython ~= 1.16.0 # requirement for pymongo to connect to certain instances
sh ~= 1.13.0

要让脚本在您自己的 Docker 容器中运行,请自行指定。

目前,我们仅支持 公开 Docker 镜像,今后,我们将添加对私有库的支持。因此,如果不希望公开脚本或报告,建议用常规的 include 机制上传私有文件夹,并在 Dockerfile 中添加系统需求或 pip 的 requirements.txt 文件。

虽然,基于任何 base 镜像都可以生成 Docker 镜像,但还是建议使用我们提供的 Base 镜像(nstack/datapane-python-runner)生成 Docker 镜像,您可以在这个镜像文件里添加自己所需的支持项。

from nstack/datapane-python-runner:latest
COPY requirements.txt .
RUN pip3 install --user -r requirements.txt

创建镜像后,可以推送到 Dockerhub,然后用如下方式在 datapane.yaml 文件中指定该镜像名称。

container_image_name: your-image-name

脚本将在该 Docker 容器里运行。注意,首次运行时,因为要从 Dockerhub 提取镜像文件,因此,所需时间较长。镜像提取完毕后会存在缓存里,以备今后使用之需。

数据库与 API 集成


与传统 BI 平台不同,Datapane 不提供指定的连接器提取数据。反之,您可以随意使用 Python 支持库连接数据仓库或内部 API 等数据源。并且,这些支持库还支持提取并连接来自不同数据源的数据。

在 Datapane 上运行脚本时,需要网络访问权限才可以连接其他平台。

如需连接内部数据库或使用 Datapane 团队版 的云托管服务,请联系支持人员获取虚拟机的 IP 地址。

管理密钥

连接第三方数据商店时,可能会需要验证。为了让这个工作流更简单,Datapane 提供了用户变量 API。可以安全地存储、分享、提取敏感信息。

管理 SQL 脚本

如需连接数据库或数据仓库,或需要调用 SQL 文件,需要在部署脚本时打包上传这些文件,将所需文件复制到脚本文件夹里,并在 datapane.yaml 文件里配置。

将 Python 与 SQL 联合在一起,为我们提供了用 Python 基于输入参数,生成
SQL 模板,实现数据库动态查询的机会。

数据、模型、资源存储


生成报告经常要调用数据集、模型、文件等非代码类资源。很多情况下,和脚本一起部署这些资源并不是什么好主意。

  1. 部署节奏与脚本不同。例如,每日都要训练模型,但脚本代码却是静态不变的。
  2. 部署环境与脚本不同。例如,脚本里使用的模型是在 Segemaker 上训练的。
  3. Blob 对象一般很大,每次部署时重新上传都很麻烦。

对于这些用例,Datapane 提供了 Blob API,通过任何 Python 或 CLI 环境都可以上传文件,并可在脚本内或通过 CLI 访问。

API 文档中的 Blob 功能,请参阅下列文档:

Blob 对象(下期发布)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 知乎链接:https://zhuanlan.zhihu.com/p/36930662 (阅读体验更好一些。) 四月...
    董夕阅读 1,817评论 1 10
  • 这一篇文章给大家介绍:Xcode 11 Beta 5,虽然是beta版本,但是在不久的将来必将来临,例如:Swif...
    Cooci_和谐学习_不急不躁阅读 10,223评论 6 18
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,486评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,551评论 0 11
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,715评论 1 1