2016-05-13 10 views
0

私はq/KDBをしばらく学んだので、事前に些細な質問で私を許していますが、私は以下の問題に直面しています。解決方法はわかりません。Q/KDBのテーブルでF型を扱う方法

私はクローズとオープン位置を計算したい示す「RES」、側、注文の合計といくつかのsimbolsのaverage_priceこれらのタイプ

c  | t f a 
---------| ----- 
sym  | s p 
side  | s  
sum_order| f  
avg_price| f  

sym side | sum_order avg_price 
----------| ------------------- 
ALPHA B | 95109  9849.73 
ALPHA S | 91662  9849.964 
BETA B | 47  9851.638 
BETA S | 60  9853.383 

という名前のテーブルを持っています、平均ポイント、クローズポジションによって作成され、オープンポジションの平均価格。

私はそれはかなり奇妙であると信じて、このクエリを使用している(私は確信してそれを行うために、より専門的な方法があるでしょう)が、それは私に次の表

を与える
position_summary:select 
    close_position:?[prev[sum_order]>sum_order;sum_order;prev[sum_order]], 
    average_price:avg_price-prev[avg_price], 
    open_pos:prev[sum_order]-sum_order, 
    open_wavgprice:?[sum_order>next[sum_order];avg_price;next[avg_price]][0] 
by sym from res 

を期待通りに動作します
sym  | close_position average_price open_pos open_wavgprice 
----------| ---------------------------------------------------- 
ALPHA  | 91662   0.2342456  3447 9849.73  
BETA  | 47    1.745035  -13  9853.38 

と種類が

c    | t f a 
--------------| ----- 
sym   | s s 
close_position| F  
average_price | F  
open_pos  | F  
open_wavgprice| f 

ある今、私の問題はここから始まり、私はポーに参加想像sition_summaryテーブルに別のテーブルが追加され、タイプfの別の列「current_price」

オープンポジションのポイントを決定することを行います。 sum_orderはF型で、open_wavgpriceとCURRENT_PRICEはFであるため、確実に、

select 
    ?[open_pos>0;open_price-open_wavgprice;open_wavgprice-open] 
    from position_summary 

が、私は」タイプのエラーを得た:

私はこの方法を試してみました。私はFタイプについてあまり知りませんでしたので、インターネットで検索しました。

まず、どうすれば対応できますか?私は "キャスト"しようとしているか "レイズ"を使用していますが、効果はありません。さらに、彼らがこの特別な機会にぴったりなのかどうかはわかりません。

2番目:クエリテーブルで「if-then」を使用するより良い方法があります(たとえば、この列のこの行が別の列の前/次、または次の次/前の列)

あなたは

答えて

0

タイプFが列内の「セル」は、山車のベクトルではなく、原子が含まれていることを意味助けをいただき、ありがとうございます。ですから、あなたの列は実際にはフラットベクトルではなくベクトルのベクトルです。あなたのケースでは

あなたのケースで、あなただけ行うことができますので、あなたは、各セルに大きさ1のベクトルを持っている:あなたのタイプfを与える

select first each close_position, first each average_price..... 

を。

私はあなたが最初のクエリでやろうとしたものに100%ではないよ、と私はチェックして手に水溶液端子を持っていないが、あなたはあなたのクエリにこれを置くことができます:

select close_position:?[prev[sum_order]>sum_order;last sum_order; last prev[sum_order]..... 

つまり、リスト内の最後のsum_orderを取得します。

+0

実際、最初のクエリでは列はfにタイプ変換されますが、奇妙な動作では空の列だけが表示されます。 – Max

0

私は少しシンプルなテーブルを使用してあなたの質問を言い換えるてみましょう:

q)show res:([sym:`A`A`B`B;side:`B`S`B`S]size:95 91 47 60;price:49.7 49.9 51.6 53.3) 
sym side| size price 
--------| ---------- 
A B | 95 49.7 
A S | 91 49.9 
B B | 47 51.6 
B S | 60 53.3 

あなたはこのようなクエリを使用して、各シンボルの閉鎖位置を見つけようとしている。

q)show summary:select close:?[prev[size]>size;size;prev[size]] by sym from res 
sym| close 
---| ----- 
A | 91 
B | 47 

結果に思えます「close」列の各行に1つの番号がありますが、実際には2つあります。あなたは上記のディスプレイ内の各番号の前に余分なスペースが表示されることがあります。また、最初の行に

q)first 0!summary 
sym | `A 
close| 0N 91 

を表示し、「クローズ」列の最初の行が0N 91であることがわかります。 0Nなどの欠損値はスペースとして表示されるため、以前の表示では見えませんでした。

どのようにこれらの2つの値を持っているのか分かりません。あなたはSYMによって選択するので

q)?[prev[size]>size;size;prev[size]] 
0N 91 

につながること、各列は、シンボルごとにグループ化されますとシンボルAのために、あなたは

q)show size:95 91 
95 91 

q)prev size 
0N 95 

を持っている(0Nがあることを思い出してください他の整数より小さい)

補足として、?[a>b;b;a]は要素単位の最小値であり、cあなたの条件式が

q)size & prev size 
0N 91 

のように書くことができるよう表示が「クローズ」、欺くされている間?はあなたに型エラー

q)close:exec close from summary 
q)close 
91 
47 

を与え、なぜ今、私たちが見ることができ、Qにa & bのように書くこと

q)first close 
0N 91 

0:上記の2つのベクトルのリストであります

条件付きベクトルはそれをサポートしていません。

q)?[close>0;10;20] 
'type 
    [0] ?[close>0;10;20] 
    ^

一つは、おそらくeachを使用していることを治すことができます。

q)?[;10;20]each close>0 
20 10 
20 10 

しかし、私は、これはあなたが望むものではないと思います。サマリー表を計算したときに問題が発生しました。私は今、あなたはあなたの概要の列の残りの部分を修正することができるはず閉鎖位置が「B」の受注の合計マイナス

q)select close:sum ?[side=`B;size;neg size] by sym from res 
sym| close 
---| ----- 
A | 4 
B | -13 

として計算することができる「S」注文の合計になるように期待しますクエリ。すべての列の式にsumなどの集計関数を使用するようにしてください。

関連する問題