2017-11-28 10 views
2

私は1時間以上のdatetimeを含む日時リスト(何らかの理由で私はそれをdateという列と呼んでいます)を持っています。私は、その後、いくつかのテーブルからデータを選択することにより、列tすなわち有効期限をpivotize、pivotizedテーブルに列として対応するdate日時を追加し、すべてのために一緒にpivotizationをステッチする必要がこれらの日付のそれぞれについて バッチピボットを最適化する方法は?

adates:2017.10.20T00:02:35.650 2017.10.20T01:57:13.454 ... 

日付。私は日付に対応しており、私はそれを一つずつやる理由ですどのpivotization識別することができなければならないことに注意してください:

fPivot:{[adate;accypair] 
    t1:select from volatilitysurface_smile where date=adate,ccypair=accypair; 
    mycols:`atm`s10c`s10p`s25c`s25p; 
    t2:`t xkey 0!exec mycols#(stype!mid) by t:t from t1; 
    t3:`t xkey select distinct t,tenor,xi,volofvol,delta_type,spread from t1; 
    result:ej[`t;t2;t3]; 
    :result} 

次のように私は、すべての日時adatesために、この関数を呼び出す:

raze {[accypair;adate] `date xcols update date:adate from fPivot[adate;accypair] }[`EURCHF] @/: adates; 

これには約90秒かかります。より良い方法があるかどうか疑問に思う。日付ごとに1つのピボットを実行してから、それをすべて一緒にステッチするのではなく、大きなピボット処理を行います。私が見る大きな問題は、date属性をピボットの一部として含める明確な方法がなく、dateを失うことができないということです。結果を調整できません。

+0

あなたが 'adates'で提供したデータはdatetimeではなくタイムスタンプです。 kdbのタイムスタンプは '2017.11.28D12:55:47.354335000'のようになります。日付と時刻の間の 'D'セパレータは、datetime型の' T'セパレータと比較して注意してください。 –

+0

正解悪い、更新中。 –

答えて

2

OKピボットする必要があるビット単位で、つまりby t:t from ...からby date:date,t:t from ...にグループを実行するときに日付(datetime)テーブルフィールドを保持するピボットのバッチバージョンを作成することで問題を解決しました。 90秒から150ミリ秒に短縮されました。

fBatchPivot:{[adates;accypair] 
    t1:select from volatilitysurface_smile where date in adates,ccypair=accypair; 
    mycols:`atm`s10c`s10p`s25c`s25p; 
    t2:`date`t xkey 0!exec mycols#(stype!mid) by date:date,t:t from t1; 
    t3:`date`t xkey select distinct date,t,tenor,xi,volofvol,delta_type,spread from t1; 
    result:0!(`date`t xasc t2 ij t3); 
    :result} 
+0

いいですね、あなたはこの質問を包み込む答えとしてそれを受け入れることができます。 –

1

wikiページに行ったことがない場合は、pivotingで始めるのがよいでしょう。やや効率的であることに、いくつかの主張を作るgeneral pivoting function上のセクションがあります:

あるユーザの報告:

これが本当の引用データの一日を回転することができ、およそよりも約2500万 引用符4000 symsと1 symあたり5レベルの平均、 4分を少し超えています。一般的なコメントについては

、私はそれはあなたがキー列を指定することができ、ijのより一般的なバージョンであるようejが不要であると言うでしょう。 t2t3の両方が同じキーを持っているとして、私が代わりに使用します。あなたは非常にマイナーなパフォーマンスの向上を与える可能性があり

t2 ij t3 

を。

+0

こんにちはトーマス、答えてくれてありがとう。はい、私はそのウィキに行きました、それは私がピボットを構築する方法です。私は一度その機能を使ってみましたが、fとgがどんなものであるべきかを考えるのは非常に複雑ですが、確かにそれは約束しています。 OPの汎用ピボットを呼び出す方法を示すことができれば、あなたの答えは完全になります:) –

+0

テーブルのスキーマや 'volatilitysurface_smile'テーブルの例を与えると、やってみることができます。それを質問に編集すると、他の人が答えを出すのに役立つかもしれません。 –

関連する問題