http://code.kx.com/q/cookbook/pivoting-tables/で提供される一般的なピボット関数は次のようになります。
piv:{[t;k;p;v;f;g]
v:(),v;
G:group flip k!(t:.Q.v t)k;
F:group flip p!t p;
count[k]!g[k;P;C]xcols 0!key[G]!flip(C:f[v]P:flip value flip key F)!raze
{[i;j;k;x;y]
a:count[x]#x 0N;
a[y]:x y;
b:count[x]#0b;
b[y]:1b;
c:a i;
c[k]:first'[a[j]@'where'[b j]];
c}[I[;0];I J;J:where 1<>count'[I:value G]]/:\:[t v;value F]}
とは次のようf
にg
定義されます。
f:{[v;P]`$raze each string raze P[;0],'/:v,/:\:P[;1]}
g:{[k;P;c]k,(raze/)flip flip each 5 cut'10 cut raze reverse 10 cut asc c}
これで、この例が機能します (上記のリンクでテーブルのq
定義方法を参照してください)。
piv[`q;`date`sym`time;`side`level;`price`size;f;g]
date sym time | Bprice0 Bsize0 Aprice0 Asize0 Bprice1 Bsize1 ..
----------------------------| -----------------------------------------------..
2009.01.05 milg 09:30:00.187| 93.56285 29 ..
2009.01.05 milg 09:30:15.798| ..
2009.01.05 milg 09:30:30.627| ..
私の場合、(各列の異なるシンボル) でピボットし、 (各行の異なる日付) でsym
キーを設定し、値が最後になります(特定の日付とシンボルの各セルの最終価格)。date
price
この単純な呼び出しは機能しません:
piv[`q;`date;`sym;`price;f;g]
f
およびg
関数を再定義して、個別の日付と各シンボルの最終価格のテーブルを取得できるようにするにはどうすればよいですか?
date | syma symb symc
-----------| ----------------------
2009.01.05 | 93.56 8.5 566.1
2009.01.06 | 93.6 8.0 564.2
2009.01.07 | 9.0
2009.01.08 | 94.05 560.3