KDB +:格式化表中的值

时间:2018-09-26 05:18:40

标签: formatting display tabular kdb

指定格式化表格值规则的最可靠方法是什么?我想以最有效的方式将每个规则应用于其对应的列。我想在这种情况下使用函数形式会有所帮助。

这是示例表:

Not set

我希望所有列都有2个有效数字。 tbl:flip `GARP`longWgt`shortWgt`longWgtBeta`shortWgtBeta`longWgtRisk`shortWgtRisk`netWgt`netExposure`relativeBeta`relativeRisk`adjBeta`adjRisk!(`GARP_AUTOS_CA`GARP_BANKS_CA`GARP_CHEMICALS_CA`GARP_COMMUNICATIONS_CA`GARP_CONS_DISCR_CA;0.0091686 0.0176234 0.0076484 0.0131509 0.0460397;-0.010305 -0.0470135 0n -0.0078549 -0.0563819;1.3522162 0.6234817 1.3140238 0.7327634 1.1802914;0.1440806 0.7642193 0n 0.7216727 0.6112765;0.3254744 0.1573925 0.2541326 0.2554008 0.350877;0.3079491 0.2218098 0n 0.2594863 0.2758658;-0.0011365 -0.0293902 0.0076484 0.005296 -0.0103422;0.8897173 0.374857 0n 1.67422 0.8165681;9.3851363 0.8158414 0n 1.0153681 1.9308631;1.0569097 0.7095833 0n 0.9842553 1.2719117;8.3501184 -3.269856 0n 1.6999496 1.5766812;-1.0634328 -3.7595078 0n 1.64786 1.0386025) 列应以百分比表示。

我有这样的东西,但是我敢肯定有更好的方法:

longWgt, shortWgt and netWgt

2 个答案:

答案 0 :(得分:5)

如何使用functional query

首先将下面的wgtCols乘以100

wgtCols: `longWgt`shortWgt`netWgt;
![`tbl;();0b;wgtCols!{(*;100f;x)} each wgtCols];

然后将allCols以外的所有列设置为`GARP的两位小数:

allCols:1_cols tbl;
![`tbl;();0b;allCols!{(each;.Q.f[2];x)} each allCols];

最终将wgtCols格式化为百分比格式:

![`tbl;();0b;wgtCols!{(each;{x,"%"};x)} each wgtCols]

注意:要了解如何构造函数查询,可以在所选的q查询上使用parse运算符:

parse "update longWgt:100f*longWgt, shortWgt:100f*shortWgt, netWgt:100f*netWgt from tbl"

输出:

!
`tbl
()
0b
`longWgt`shortWgt`netWgt!((*;100f;`longWgt);(*;100f;`shortWgt);(*;100f;`netWgt))

答案 1 :(得分:2)

您还可以使用@ Apply运算符的3参数形式,可以在https://code.kx.com/wiki/Reference/AtSymbol处找到它,因为您仅将函数应用于列,而没有聚合,过滤或重命名任何列。

它将索引与第二个参数一起在第一个参数中指定的项目中,然后将第三个参数中的函数应用于所得元素,而其他元素保持不变。

@[`tbl;wgtCols;100*];
@[`tbl;allCols;.Q.f[2]'];
@[`tbl;wgtCols;{x,'"%"}];

可以将这两个'很好地合并为一个函数,这将遍历参数列表,并依次应用它们。两者的信息都可以找到https://code.kx.com/q/ref/adverbs/#each-both

@[`tbl;;]'[(wgtCols;allCols;wgtCols);(100*;.Q.f[2]';{x,'"%"})]]

这些都会全部修改,例如覆盖tbl变量。如果您不希望发生这种情况,可以使用以下功能:

@[;;]/[tbl;(wgtCols;allCols;wgtCols);(100*;.Q.f[2]';{x,'"%"})]

这利用/(扫描)运算符依次应用每个功能,第一个功能在初始表上运行,结果馈入下一个功能。