2016-05-03 4 views
1

私は、市場のプロバイダとシンボルの範囲について、注文された価格と数量のデータを持つマーケットデータテーブルを持っています。KDB - 市場データテーブルの列を折り畳む

b:([]symbol:();provider:();px1:();px2:();px3:();qty1:();qty2:();qty3:()) 
PX1は数量qty1でブックの上部で

、PX2次最良価格等のサンプルデータは、次に

`EURUSD;`EBS;1.1;1.2;1.3;1000000;2000000;4000000 

であってもよい私はPX [n]と数量を縮小したい[N]列を単一の列に変換します。

rb:([]symbol:();provider:();px:();qty:()) 

サンプルデータを読み込みます。

EURUSD, EBS, 1.1, 1000000 
EURUSD, EBS, 1.2, 2000000 
EURUSD, EBS, 1.3, 4000000 

これを達成するための最良の方法は何でしょうか。初心者として私は辞書を使うという考え方に沿って考えていました。

q)px:book `px1`px2`px3 
q)qty:book `qty1`qty2`qty3 
q)d:`px`qty!(px;qty) 
q)flip d 
px qty 
----------- 
1.1 1000000 
1.2 2000000 
1.3 4000000 

...もっと良い方法があると確信しています。

答えて

1

元のテーブル定義を再構成できない場合は、次を使用できます。

q)b 
symbol provider px1 px2 px3 qty1 qty2 qty3 
--------------------------------------------------- 
EURUSD EBS  1.1 1.2 1.3 1000000 2000000 4000000 
EURUSD ECS  1.1 1.2 1.3 1000000 2000000 4000000 
q)ungroup {rm _x,'flip enlist[y]!enlist flip x rm:cols[x]where cols[x] like string[y],"*" }/[b;\`px\`qty] 

symbol provider px qty 
--------------------------- 
EURUSD EBS  1.1 1000000 
EURUSD EBS  1.2 2000000 
EURUSD EBS  1.3 4000000 
EURUSD ECS  1.1 1000000 
EURUSD ECS  1.2 2000000 
EURUSD ECS  1.3 4000000 
1

コナーの答えは、しかしungroupはまだ直接リスト操作よりも遅く定義であるテーブルの反復処理で、おそらく最も標準的なです。イテレーションは多くの場合、不可避であるが、ここであなたは、このような入力テーブルのリストから直接結果表を構築することができます。

flip `symbol`provider`px`qty!(
       (3*cb)#b`symbol; 
       (3*cb:count[b])#b`provider; 
       (b[`px1],b[`px2],b`px3); 
       (b[`qty1],b[`qty2],b`qty3)) 

ここで結果テーブルには、最初の2列symbolproviderを3回繰り返しとpxました列は、px1px2およびpx3の連結であり、qtyと同じです。

もちろん、この方法ではungroupと同じ行順は生成されませんが、興味深いのは40倍高速です(1m行で約40ms、ungroupは約1600ms)。レコードの順序を維持するために必要な場合

、私たちはソートし、それらを数とすることができます

ここ
`a`b _ `a`b xasc flip `a`b`symbol`provider`px`qty!(
    (3*cb)#til[cb]; 
    raze cb#/:(til 3); 
    (3*cb)#b`symbol; 
    (3*cb:count[b])#b`provider; 
    (b[`px1],b[`px2],b`px3); 
    (b[`qty1],b[`qty2],b`qty3)) 

ab列はソートにインデックスを提供し、後で結果から削除されます。この実行時間は、1m行で約180msなので、ungroup方式よりも約9倍高速です。もちろん、並べ替えが存在すると、このアルゴリズムは線形よりも悪くなりますが、約100m行まで高速化するために余裕があります(残念なことに、これをテストすることはできません)

+0

" '' '(' symbol'''provider#b)を使ってシンボル列とプロバイダ列に価格と数量列の順序付けを維持するために '' raze flip b ['px1'px2'px3' '' #3''' – user3576050

関連する問題