KDB新手求助:表格转置(Pivot)实现问题
KDB表格转置(Pivot)解决方案
针对你提供的表格,我们可以分两步完成转置操作:
步骤1:将宽格式的OB列转为长格式
首先把原表格中OB_p1到OB_p4这类列拆分为OB(标识序号,如OB_1)和对应的值,生成长格式表格:
// 提取所有OB开头的列名 obCols: cols[t] where cols[t] like "OB_*"; // 生成对应OB标识(OB_p1 → OB_1) obNames: `$"OB_" ,/: string 1+til count obCols; // 展开为长格式表格,包含sym、exchange、OB、val字段 longT: ungroup `sym`exchange`OB`val flip (t`sym; t`exchange; obNames; each[;t] obCols);
执行后longT的结构如下:
sym exchange OB val ----- -------- ----- ----- IBM A OB_1 100.1 IBM A OB_2 100.2 IBM A OB_3 100.5 IBM A OB_4 100.8 FB A OB_1 100.1 FB A OB_2 100.2 FB A OB_3 100.6 FB A OB_4 100.8 TESLA B OB_1 100.1 TESLA B OB_2 100.3 TESLA B OB_3 100.7 TESLA B OB_4 100.8 IBM B OB_1 100.1 IBM B OB_2 100.4 IBM B OB_3 100.8 IBM B OB_4 100.9
步骤2:将长格式表格转置为目标宽格式
通过xgroup实现pivot,按exchange和OB分组,将sym作为列名,val作为对应值:
// 执行pivot操作 pivotT: `exchange`OB xgroup update val:val by sym from longT; // 调整列顺序,确保exchange、OB在前,sym列按顺序排列 pivotT: pivotT `exchange`OB, exec distinct sym from longT;
最终得到的pivotT就是目标表格:
exchange OB IBM FB TESLA -------- ----- ----- ----- ----- A OB_1 100.1 100.1 A OB_2 100.2 100.2 A OB_3 100.5 100.6 A OB_4 100.8 100.8 B OB_1 100.1 100.1 B OB_2 100.4 100.3 B OB_3 100.8 100.7 B OB_4 100.9 100.8
内容的提问来源于stack exchange,提问作者theQDude
相关产品推荐
相关产品推荐

