Skip to content
RATH
准备数据
自定义表达式

自定义表达式

交互

数据导入后即可在 DataSource 页面找到这个按钮,点击打开 自定义计算

Open Customized Computation Console

自定义计算 的左上角位置是编辑器,在这里输入表达式。 编辑器下方显示的是输入中的智能提示,可以点击或按下 Tab 快速键入。 当表达式不合法时,左下角会显示报错信息。 当表达式合法,右侧会实时更新表达式输出的列的预览(Distribution Charts)。 Use Customized Computation Console

表达式语法

基础

字段

自定义计算 表达式通过 field ID 引用一个字段(包括原有的和扩展生成的)。 在编辑器中,可以通过输入字段的名称,智能匹配到对应的字段后,选择自动补全。

字段的类型

自定义计算 表达式中关注字段的数据类型,原始的类型包含以下三种:

  • set类型: 有序的数字类型,表示序数,不参与数学运算
  • group类型: 离散的数字类型,参与数学运算
  • collection类型: 字符串类型

自定义计算 表达式的算子与数据类型强关联,如果有需要的情况下使用对应的算子对列进行转型操作(这会构造一个新的列而不是更改原始的列)。

字面量

自定义计算 表达式部分支持 JavaScript 的 number 与 string 字面量。

语句

自定义计算 表达式由算子、字段引用、字面量和操作符组成。算子是 自定义计算 功能的核心。 自定义计算 表达式应当使用可嵌套的算子,生成并导出至少一个新的字段。 最外层的 自定义计算 表达式可以通过逗号 , 分割多个计算语句以快捷创造一些计算过程独立的字段。 你不应该在表达式中使用分号。

时间日期对象

时间日期对象是一种特殊的对象,它由 $toDate 算子返回。 直接导出将会以时间戳(group 类型的列)生成一个字段。 也可以对其进行 切片 以构造新的单个或多个列。 切片语法为 <时间日期对象>.<维度标记>。 合法的维度标记包括:Y, M, W, D, h, m, s

DateTime object

算子

算子是对字段或其他对象进行操作的函数。 算子的标识符都以 $ 符号开始。 对算子的调用语法为 <算子>(<参数1>, <参数2>...)

关键字

操作符 out

对于一个 计算生成 的新的扩展列,在计算语句前添加 out 关键字对其导出。 out 操作符可以置于一段嵌套操作的任何层级自定义计算 表达式必须包含至少一个 **out** 声明。 可以在 out 关键字后添加一个不含特殊字符的单词作为该导出字段的名称(name)。 特别的是,对于四则运算生成的字段,必须显式声明它的名称。 例子:

Operator out

常用算子

类型转换

$set(group|collection) -> set

从一个非 set 类型的列变换出一个 set 类型的列。

$group(set|collection) -> group

从一个非 group 类型的列变换出一个 group 类型的列。在对字段进行数学运算时非常有用(你需要确信运算是有意义的)。

$nominal(set|group) -> collection

从一个非 collection 类型的列变换出一个 collection 类型的列。

序数生成

$id() -> set

生成从 1 起的 ID。

$order(set|group) -> set

生成所有行在某一字段上的数学次序(从 1 起)。

$dict(collection) -> set

生成所有行在某一字段上的字典序次序(从 1 起)。

数据标准化

$inset(group) -> group

将某一字段标准化到 -1 ~ 1 区间。

$bound(group) -> group

将某一字段标准化到 0 ~ 1 区间。

$normalize(group) -> group

将某一字段使用 Z-score 标准化。

非线性变换

$log(group) -> group, $log(group, JS.number) -> group

对数映射,可提供底,默认为自然对数。

$log2(group) -> group

$log10(group) -> group

$log1p(group) -> group

相当于 $log(group + 1)

$sigmoid(group) -> group

$ReLU(group) -> group

数据清洗

$isNaN(set|group) -> collection

某一字段上该行是否为 NaN,是返回 "1",否返回 "0"。

$isZero(set|group) -> collection

某一字段上该行是否为 0,是返回 "1",否返回 "0"。

$zeroFill(group) -> group

将某一字段上该行的异常值(±Infinity | NaN)映射到 0。

$meanFill(group) -> group

将某一字段上该行的异常值(±Infinity | NaN)映射到非异常值的平均值。

$nearestClip(group, JS.number, JS.number) -> group

提供一个范围,将某一字段上该行超出这个范围的值作为异常值,映射到距离它最近的边界值。

$meanClip(group, JS.number, JS.number) -> group

提供一个范围,将某一字段上该行超出这个范围的值作为异常值,映射到非异常值的平均值。

$boxClip(group) -> group

通过箱线图统计标记出某一字段的异常值,替换为 NaN。

字符串操作

$concat(collection, ...collection) -> collection, $concat(JS.string, collection, ...collection) -> collection

用分隔符(默认为 , 顺序连接若干个字符串列的内容作为新列。

日期时间

$toDate(group|set|collection)

这个算子引入了一种特殊的日期时间对象,它返回一个该对象的实例。

最佳实践

标准化变换

...

非线性映射

试着转换一下 bike sharing 的 casual 列(原始的非常集中于 0 附近) 这里原始列 + 0 的操作是因为不支持原始列不经计算导出,看起来比较 hack 但实际上没有这种实际需求。 Non-leaner Mapping

从多个列获取日期信息并推导 weekday

$toDate() 算子的底层逻辑是原始的 DateTimeExpand,支持多种常规的日期格式。搭配切片操作能够获取确定的精度,避免精度不够得到无效数据。 搭配拼接+日期时间算子:(这一段用的是 bike sharing,其实这些信息它是有的,我们假设它缺信息) Get datetime information 在此基础上: Calcualte weekday