报表的使用说明
报表的使用说明
Section titled “报表的使用说明”版本时间:2024-07-27
数据结构-Dataframe
Section titled “数据结构-Dataframe”以列为单位
数据类型
节点 node
Section titled “节点 node”Source(DfSource)
Section titled “Source(DfSource)”query data source
Transform(Expr)
Section titled “Transform(Expr)”transformation多个df做转换
可以参考 Polars-Rust/Transformations
TensorEval(Vec<(String, Expr)>, bool),
Section titled “TensorEval(Vec<(String, Expr)>, bool),”Sql(String)
Section titled “Sql(String)”sql execute
Solve(bool)
Section titled “Solve(bool)”linear equations
NLSolve
Section titled “NLSolve”nonlinear equations
MILP(String, String, bool)
Section titled “MILP(String, String, bool)”mixed integer linear programming, objective function related DF name, constraint related DF name
NLP(String, String)
Section titled “NLP(String, String)”nonlinear programming
Wasm(Vec <ModelType>, Vec <u8>)
Section titled “Wasm(Vec <ModelType>, Vec <u8>)”脚本
边 edge
Section titled “边 edge”Eval( EvalType, Vec <Expr>)
Section titled “Eval( EvalType, Vec <Expr>)”以 EvalType 的方式,执行 Expr 表达式。可参考 Polars-Rust/Expressions/
EvalType
Section titled “EvalType”目前支持的 EvalType 如下:
- Select 执行
Vec<Expr>中的多个Expr,每个Expr为一列或多列,并将执行后的一个或多个列作为一个新的 Dataframe。要保证多个Expr的执行结果行数相同。 - Filter
Vec<Expr>中最后一个expr是过滤条件,之前的expr为最终输出的列。 - WithColumn 在原有Dataframe最右边增加一列,
Vec<Expr>中只有最后一个expr有效,是该增加列的表达式。 - WithColumns 在原有Dataframe最右边增加多列,
Vec<Expr>是增加的各列的表达式。 - GroupBy
Vec<Expr>中最后一个expr是分组条件,之前的expr为最终输出的列。
expr可以嵌套。多个公式用分号 ; 相隔。目前支持的 expr如下:
-
字符串
str:需要符合测点中的变量命名规则,否则会被识别错误。 -
数字
number:输入时均被统一处理成f64格式。如需特定格式,可使用cast进行强制类型转换。包含的数据格式有:null、i8、i16、i32、i64、u8、u16、u32、u64、f32、f64、bool、binary、str、date、time、unknown,以上同时是表达数据格式时的写法。 -
双目运算符:加减乘除等
expr_a + expr_bexpr_a - expr_bexpr_a * expr_bexpr_a / expr_bexpr_a % expr_bexpr_a ^ expr_bexpr_a < expr_bexpr_a > expr_bexpr_a <= expr_bexpr_a >= expr_bexpr_a == expr_bexpr_a != expr_bexpr_a && expr_b按位与expr_a || expr_b按位或expr_a ^^ expr_b按位异或
-
单目运算符: 正负号
+expr-expr
-
函数
col(str)根据列名选择列。特殊的,col('*')代表取所有列。cols(str,str,str,···)根据多个列名选择多个列。all()所有列。alias(expr,str)重命名,如alias(expr_a,b)将列”a”重命名为”b”。cast(expr, datatype_str)数据类型转换,datatype_str为数据类型,可以是 “null”、“i8” 、“i16”、“i32”、“i64”、“u8”、“u16”、“u32”、“u64”、“f32”、“f64”、“bool”、“binary”、“str”、“date”、“time”、“unknown”。sort(expr, bool)排序,bool为 “true” 时降序,“false” 时升序。filter(expr, expr)过滤,第一个expr为过滤对象,第二个expr为过滤条件。not(expr)求逆not_null(expr)是否为空值,结果为booldrop_nulls(expr)去掉空值的行not_nan(expr)在列的数据类型为数字时,判断是否为NANis_nan(expr)在列的数据类型为数字时,判断是否为NANdrop_nans(expr)在列的数据类型为数字时,去掉NAN的行eq(expr, expr)等于eq_missing(expr, expr)等于,空值之间相等neq(expr, expr)不等于neq_missing(expr, expr)不等于,空值之间不相等lt(expr, expr)小于gt(expr, expr)大于lt_eq(expr, expr)小于等于gt_eq(expr, expr)大于等于n_unique(expr)获取唯一值的数量unique(expr)获取唯一值arg_unique(expr)获取唯一值的第一个索引arg_min最小值的索引arg_max最大值的索引any_horizontal(expr)对每行的数据按位或,结果形成一个新列,默认列名为anymin_horizontal(expr)每行数据的最小值形成一个新列,默认列名为minmax_horizontal(expr)每行数据的最大值形成一个新列,默认列名为maxsum_horizontal(expr)每行数据的和形成一个新列,默认列名为sumreverse(expr)反转列的顺序shift(expr, number)向下移动number行,空值填充null。shift_and_fill(expr, number, fill_value)向下移动number行,空值填充fill_value。fill_value是一个Expr。first(expr)第一个值last(expr)最后一个值head(expr, number)前number行tail(expr, number)后number行slice(expr, offset_number, length_number)从offset_number行开始,取length_number行count(expr)计数sum(expr/str)求和,其中参数支持表达式或直接使用列名min(expr/str)最小值,其中参数支持表达式或直接使用列名max(expr/str)最大值,其中参数支持表达式或直接使用列名mean(expr/str)或avg(expr)平均值,其中参数支持表达式或直接使用列名median(expr/str)中位数,其中参数支持表达式或直接使用列名nan_min(expr/str)最小值,忽略NAN。std(expr, number)标准差,number为自由度,0表示总体标准差,1表示样本标准差var(expr, number)方差,number为自由度,0表示总体方差,1表示样本方差cum_count(expr, bool)累计计数,bool表示是否反向cum_sum(expr, bool)累计求和,bool表示是否反向cum_min(expr, bool)累计最小值,bool表示是否反向cum_max(expr, bool)累计最大值,bool表示是否反向cum_prod(expr, bool)累计乘积,bool表示是否反向abs(expr)绝对值exp(expr)指数pow(expr, number)幂次方,number为指数log1p(expr)所有元素加1后的自然对数log(expr, number)对数,number为底数sqrt(expr)开方cbrt(expr)立方根sin(expr)正弦cos(expr)余弦tan(expr)正切cot(expr)余切arcsin(expr)反正弦arccos(expr)反余弦arctan(expr)反正切sinh(expr)双曲正弦cosh(expr)双曲余弦tanh(expr)双曲正切degrees(expr)弧度转角度radians(expr)角度转弧度floor(expr)向下取整ceil(expr)向上取整round(expr, number)四舍五入,number为保留小数位数dot(expr, expr)内积- ···
原始数据
| nrs | names | random | groups |
|---|---|---|---|
| i32 | str | f64 | str |
| ---- | ----- | ------ | ------ |
| 1 | foo | 1.1 | A |
| 2 | ham | 3.3 | A |
| 3 | spam | 5.5 | B |
| null | eggs | 2.2 | C |
| 5 | null | 5.5 | B |
- EvalType::Select,表达式为 “sum(nrs); sort(col(names),false); alias(first(col(names)),firstname); alias(mean(nrs) * 10,nrsx10);” 输出四列,分别为:
| nrs | names | firstname | nrsx10 |
|---|---|---|---|
| i32 | str | str | f64 |
| ---- | ------- | ----------- | ------- |
| 11 | null | foo | 27.5 |
| 11 | eggs | foo | 27.5 |
| 11 | foo | foo | 27.5 |
| 11 | ham | foo | 27.5 |
| 11 | spam | foo | 27.5 |
- EvalType::Filter, “col(nrs);col(names);cast(col(random),i32);col(nrs) > 1;” 输出列”nrs”,过滤出列”nrs”中大于1的行
| nrs | names | random |
|---|---|---|
| i32 | str | i32 |
| ---- | ------- | ------- |
| 2 | ham | 3 |
| 3 | spam | 5 |
| 5 | null | 5 |
- EvalType::GroupBy, “alias(shift(col(A),1),A_shift); alias(shift_and_fill(col(A),2,10.0),A_shift_fill); col(cars); sum(B); col(fruits);” 根据列fruit分组,得到两行:
| fruits | A_shift | A_shift_fill | cars | B |
|---|---|---|---|---|
| str | list[i32] | list[f64] | list[str] | i32 |
| ------ | ------- | ------------ | ---- | --- |
| banana | [null, 1, 2] | [10.0, 10.0, 1.0] | [“beetle”,“audi”, “beetle”] | 10 |
| apple | [null, 3] | [10.0, 10.0] | [“beetle”, “beetle”] | 5 |
- EvalType::GroupBy, “all(); cols(fruits,cars);”
| fruits | cars | A | B | optional |
|---|---|---|---|---|
| str | str | list[i32] | list[i32] | list[i32] |
| ------ | ------ | --------- | --------- | --------- |
| banana | beetle | [1, 5] | [5, 1] | [28, -30] |
| apple | beetle | [3, 4] | [3, 2] | [null, 2] |
| banana | audi | [2] | [4] | [300] |