自定义表达式
交互
数据导入后即可在 DataSource 页面找到这个按钮,点击打开 自定义计算。
自定义计算 的左上角位置是编辑器,在这里输入表达式。 编辑器下方显示的是输入中的智能提示,可以点击或按下 Tab 快速键入。 当表达式不合法时,左下角会显示报错信息。 当表达式合法,右侧会实时更新表达式输出的列的预览(Distribution Charts)。
表达式语法
基础
字段
自定义计算 表达式通过 field ID 引用一个字段(包括原有的和扩展生成的)。 在编辑器中,可以通过输入字段的名称,智能匹配到对应的字段后,选择自动补全。
字段的类型
自定义计算 表达式中关注字段的数据类型,原始的类型包含以下三种:
set
类型: 有序的数字类型,表示序数,不参与数学运算group
类型: 离散的数字类型,参与数学运算collection
类型: 字符串类型
自定义计算 表达式的算子与数据类型强关联,如果有需要的情况下使用对应的算子对列进行转型操作(这会构造一个新的列而不是更改原始的列)。
字面量
自定义计算 表达式部分支持 JavaScript 的 number 与 string 字面量。
语句
自定义计算 表达式由算子、字段引用、字面量和操作符组成。算子是 自定义计算 功能的核心。
自定义计算 表达式应当使用可嵌套的算子,生成并导出至少一个新的字段。
最外层的 自定义计算 表达式可以通过逗号 ,
分割多个计算语句以快捷创造一些计算过程独立的字段。
你不应该在表达式中使用分号。
时间日期对象
时间日期对象是一种特殊的对象,它由 $toDate
算子返回。
直接导出将会以时间戳(group
类型的列)生成一个字段。
也可以对其进行 切片 以构造新的单个或多个列。
切片语法为 <时间日期对象>.<维度标记>
。
合法的维度标记包括:Y
, M
, W
, D
, h
, m
, s
。
算子
算子是对字段或其他对象进行操作的函数。
算子的标识符都以 $
符号开始。
对算子的调用语法为 <算子>(<参数1>, <参数2>...)
。
关键字
操作符 out
对于一个 计算生成 的新的扩展列,在计算语句前添加 out
关键字对其导出。
out
操作符可以置于一段嵌套操作的任何层级。
自定义计算 表达式必须包含至少一个 **out**
声明。
可以在 out
关键字后添加一个不含特殊字符的单词作为该导出字段的名称(name)。
特别的是,对于四则运算生成的字段,必须显式声明它的名称。
例子:
常用算子
类型转换
$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 但实际上没有这种实际需求。
从多个列获取日期信息并推导 weekday
$toDate()
算子的底层逻辑是原始的 DateTimeExpand,支持多种常规的日期格式。搭配切片操作能够获取确定的精度,避免精度不够得到无效数据。
搭配拼接+日期时间算子:(这一段用的是 bike sharing,其实这些信息它是有的,我们假设它缺信息)
在此基础上: