DeepUX数据源

前言

对DeepUX组件来说,在当前的数据分析场景中,有较多情况是目前已有数据源是无法满足的:

  • 当分析的数据需要基于模型中原始数据进行计算的情况下,如计算 A列+B列,该类计算能力从产品框架划分来看,应该是由计算层提供,但短期内可能无法上线以满足需求场景

  • 当分析图表希望从多个数据模型中取数据时,如:展示A模型中的销售数据、B模型中的成本数据等,此类为多个数据模型作为数据源的需求

2c04a86d9ecc43cea74a97bf628afe7d

0b689665478948ce85d168b276eadc1d

上述场景中,可能仅数据输入部分无法满足需求,如果能将Python的结果作为数据源输入到DeepUX组件中,将极大的减少需要自定义开发的功能数量,提高项目实施效率。

简单示例

一个可以作为DeepUX数据源的脚本,由如下部分组成

  • 字段信息,即元数据信息

  • main函数中返回符合元数据信息的 Pandas DataFrame

定义字段信息

例如需要定义如下数据的元数据信息:

id

description

cost

count

datetime

active

comment

00000000-0000-0000-0000-000000000001

{“zh-cn”: null, “en”: “a”}

1.1

1

2000-01-02 00:00:00

true

demo1

00000000-0000-0000-0000-000000000002

{“zh-cn”: null, “en”: “b”}

2.2

2

2000-02-03 00:00:00

false

demo2

00000000-0000-0000-0000-000000000003

{“zh-cn”: null, “en”: “c”}

3.3

3

2000-03-04 00:00:00

true

demo3

其中,id为UUID类型,description为json类型,datetime为日期类型

则可如下定义元数据结构

[1]:
from deepfos.lib.deepux import Struct, UUID, Json, Float, Integer, DateTime, Boolean, String


class Data(Struct):
    id_ = UUID(name='id')
    desc = Json('description')
    cost = Float()
    count: Integer
    datetime: DateTime
    active: Boolean
    comment: String

从如上定义方式可以看出,在定义元数据的字段时,支持如下定义形式:

  • 定义成员等于字段实例:在实例化时,可选择指定name作为字段名,如不使用kwargs的指定方式,则第一个入参即为字段名,如不指定,则以成员名为字段名

  • 定义成员并声明其字段类型:成员名将作为字段名

组织数据

main函数中返回符合元数据信息的 Pandas DataFrame,此处的 Pandas DataFrame 可以以任何方式组织,只需保证在main函数 return时,为 Pandas DataFrame 数据即可。

将定义的结构class作为as_datasourcestruct 字段,并装饰main函数,即为一个具有了提供元数据信息,并可返回实际数据的数据源了。

示例完整脚本

c4e7c7a37b4e4225a5c0a5113f7019ed

注意事项

DeepUX的功能目前处于逐步完善阶段,因此SDK中的deepux模块 只提供 返回元数据信息的功能,其余返回数据对入参的处理逻辑需要用户编写逻辑的细节。

使用效果

在DeepUX元素创建后选择python元素作为数据源

265575f035f34da6813b51261f154701 068cbe2083454d629067e74760e00e29

可以看到刚刚编辑的脚本的元数据信息呈现在了数据源的信息中: 4bc72b57b3cb4cb9a98802fde68ad6b2

进一步拖入图表并选取显示字段,可以看到脚本返回的数据显示在了画布中: 4f481e8604d34f368ee86621fe7e8260

元数据

元数据,即DeepUX编辑时所需的字段信息,在选取Python元素作为DeepUX数据源时,需提供。

deepfos.lib.deepux中,包装了作为图表数据源已支持的字段类型,只需将其进行初始化后作为 Struct 子类的类成员即可。

字段类型

Python类名

字段类型

String

文本

Integer

整数

Boolean

布尔值

Json

多语言文本(json)

Float

小数

DateTime

日期时间

UUID

uuid

备注

在定义元数据的字段时,支持如下定义形式:

  • 定义成员等于字段实例:在实例化时,可选择指定name作为字段名,如不使用kwargs的指定方式,则第一个入参即为字段名,如不指定,则以成员名为字段名

  • 定义成员并声明其字段类型:成员名将作为字段名

字段描述*(1.1.8新增)

在1.1.8版本后,针对返回的值需要显示可切换的列描述信息的需求,新增了对提供描述信息的支持,用法例如如下:

假设当前应用内,有维度example,其成员如下:

f0bcc5a718dd4e35bcc971c28178ecb4

如果想要在DeepUX中显示数据来自该维度,且可切换描述信息,则可编写代码如下:

[2]:
from deepfos.lib.deepux import to_desc, as_datasource
from deepfos.element import Dimension
import pandas as pd

class Data(Struct):
    text = String('v1')

@as_datasource(struct=Data)
def main(p2):
    dim = Dimension('example')
    res = dim.query('Descendant(#root,0)')
    # 使用deepux新增的方法
    # 将维度query返回值转换为
    # 符合预期格式的描述值
    desc = to_desc(res)
    # 指定v1及其列信息作为返回的第二个值
    return pd.DataFrame(
        {
            'v1': [dim.name for dim in res]
        }
    ), {'v1': desc}

在如上代码中,需注意的是,main 函数的返回值中,第一个值将被当作数据,第二个值,如果存在,则将被当作字段描述

字段描述预期为以字段名为键,值描述键值对为值的字典

图结构数据源*(1.1.31新增)

在1.1.31版本后,新增对图结构数据源的支持,可通过继承 NodeStructEdgeStruct 的方式提供图结构信息的元组

图结构的数据组成

  • edges: 关系数据,固定必须提供的字段为 source (关系的来源) 和 target (关系的目标) ,其余自定义字段,可在UX中的“代码表达式”区域被引用

  • nodes: 节点数据,固定必须提供的字段为 _id (节点主键)和 label (节点描述),其余自定义字段,可在UX中的“代码表达式”区域被引用

例如需要声明节点数据包含了String类型的自定义字段field1的图结构,并返回数据,代码示例如下:

[3]:
from deepfos.lib.deepux import NodeStruct, EdgeStruct, as_datasource, String
import pandas as pd
import uuid

# 声明节点内自定义字段
class NodeData(NodeStruct):
    # _id和label字段已在NodeStruct中定义, 无需声明
    field1: String

# EdgeStruct中已包含了source和target, 可以直接使用
@as_datasource(struct=(NodeData, EdgeStruct))
def main(p1, p2):
    nodes_df = pd.DataFrame(
        {
            '_id': ['0', '1'],
            'label': ['Node1', 'Node2'],
            'field1': ['xxx', 'yyy']
        }
    )
    edges_df = pd.DataFrame({'source': ['0'], 'target': ['1']})
    return nodes_df, edges_df

在UX中增加代码对应的Python元素作为数据源后,可见字段信息被识别:

e536df49d3b04992a2a93a1cb8ef7a06

在画布中拖入“图与树结构”控件,并选择刚刚导入的Python数据源,确认后展示如下:

39a10d21300d49c4a8c3ada6494483a1

field1 字段可在js表达式代码编辑过程中被使用:

d8d0ce5c2e7f453696676015079add10

保存后显示的描述中追加了 field1 的内容:

37385a1db4874c65a741c62d750654a3