Formatting KDB+;:设置表中的值的格式

Formatting KDB+;:设置表中的值的格式,formatting,display,tabular,kdb,Formatting,Display,Tabular,Kdb,指定表格值格式规则的最可靠方法是什么?我希望以最有效的方式将每个规则应用于其相应的列。我想在这种情况下使用函数形式会有所帮助 以下是示例表: tbl:flip `GARP`longWgt`shortWgt`longWgtBeta`shortWgtBeta`longWgtRisk`shortWgtRisk`netWgt`netExposure`relativeBeta`relativeRisk`adjBeta`adjRisk!(`GARP_AUTOS_CA`GARP_BANKS_CA`GARP_C

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

以下是示例表:

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和netWgt
列应以百分比为单位

我有这样的想法,但我相信有更好的方法:

tbl:update longWgt:100f*longWgt, shortWgt:100f*shortWgt, netWgt:100f*netWgt from tbl;
tbl:update .Q.f[2] each longWgt, .Q.f[2] each shortWgt, .Q.f[2] each longWgtBeta, .Q.f[2] each shortWgtBeta, .Q.f[2] each longWgtRisk, .Q.f[2] each shortWgtRisk, .Q.f[2] each netWgt, .Q.f[2] each netExposure, .Q.f[2] each relativeBeta, .Q.f[2] each relativeRisk, .Q.f[2] each adjBeta, .Q.f[2] each adjRisk from tbl;
tbl:update {x,"%"} each longWgt, {x,"%"} each shortWgt, {x,"%"} each netWgt from tbl;
使用一个:

首先将下面的
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))
使用一个:

首先将下面的
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))

您还可以使用
@
apply运算符的3参数形式,该运算符可在此处找到,因为您只对列应用函数,而不聚合、筛选或重命名任何列

它使用第二个参数索引到第一个参数中指定的项,然后将第三个参数中的函数应用到结果元素,而其他元素保持不变

@[`tbl;wgtCols;100*];
@[`tbl;allCols;.Q.f[2]'];
@[`tbl;wgtCols;{x,'"%"}];
可以使用两个
将它们很好地合并到一个函数中,这两个函数将遍历参数列表,并依次应用它们。关于这两个方面的信息都可以找到

这些都将修改到位,例如覆盖
tbl
变量。如果不希望发生这种情况,可以使用此功能:

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

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

您也可以使用
@
应用运算符的3参数形式,该运算符可以在此处找到,因为您只对列应用函数,而不聚合、筛选或重命名任何列

它使用第二个参数索引到第一个参数中指定的项,然后将第三个参数中的函数应用到结果元素,而其他元素保持不变

@[`tbl;wgtCols;100*];
@[`tbl;allCols;.Q.f[2]'];
@[`tbl;wgtCols;{x,'"%"}];
可以使用两个
将它们很好地合并到一个函数中,这两个函数将遍历参数列表,并依次应用它们。关于这两个方面的信息都可以找到

这些都将修改到位,例如覆盖
tbl
变量。如果不希望发生这种情况,可以使用此功能:

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

这使用
/
(扫描)操作符依次应用每个函数,第一个函数在初始表上运行,结果输入到下一个函数。

我喜欢这个解决方案的整洁,但它不适合我。我一直得到一个长度误差哪一步给了你长度误差?在定义了上面的表并使用Jeje对列的定义之后,依次运行所有查询,或者仅运行最后一个查询,在3.5上对我有效。你能在抛出
'length
错误后,在错误陷阱模式下发布运行
.z.ex
.z.ey
的输出吗?我喜欢这个解决方案的整洁,但它不适合我。我一直得到一个长度误差哪一步给了你长度误差?在定义了上面的表并使用Jeje对列的定义之后,依次运行所有查询,或者仅运行最后一个查询,在3.5上对我有效。在抛出
'length
错误后,在错误陷阱模式下运行
.z.ex
.z.ey
时,是否可以发布输出?