2017-11-28 7 views
2

Ich habe eine Datetime-Liste (die ich aus irgendeinem Grund Spalte date nennen) mit über 1k Datetime.Wie optimiert man eine Batch-Pivotalisierung?

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

jeder dieser Tage, denn ich die Daten aus einer Tabelle auswählen muß, dann durch eine Säule t dh Ablauf pivotize, die entsprechenden date Datumzeit als Spalte in dem pivotized Tisch und zusammenheften die pivotization für alle hinzufügen Termine. Beachten Sie, dass ich sollte in der Lage zu erkennen, welche pivotization zu einem Datum entspricht, und das ist, warum ich es tun eins nach dem anderen:

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} 

nenne ich dann diese Funktion für alle Datetime adates wie folgt:

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

Das dauert ungefähr 90s. Ich frage mich, ob es einen besseren Weg gibt, z.B. Führen Sie eine große Pivotation durch, anstatt eine Pivotation pro Datum auszuführen und dann alles zusammenzufassen. Das große Problem, das ich sehe, ist, dass ich keine offensichtliche Möglichkeit habe, das date Attribut als Teil der Pivotalisierung einzuschließen und die date kann nicht verloren werden, sonst kann ich die Ergebnisse nicht abstimmen.

+0

Die Daten, die Sie in 'adates' angegeben haben, sind vom Typ datetime nicht timestamp. Ein Zeitstempel in kdb sieht aus wie '2017.11.28D12: 55: 47.354335000'. Beachten Sie das Trennzeichen "D" zwischen Datum und Uhrzeit, verglichen mit dem Trennzeichen "T" in den Datetime-Typen. –

+0

Richtig sorry meine schlechte, Aktualisierung .. –

Antwort

2

OK löste ich das Problem durch eine Batch-Version des pivotization erstellen, die das Datum (Datumzeit) Tabellenfeld hält, wenn die Gruppe von Bit benötigt tun schwenken heißt by t:t from ...-by date:date,t:t from .... Es ging von 90s bis zu 150 Millisekunden.

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

Sieht gut aus, Sie könnten es als Antwort akzeptieren, um diese Frage abzuschließen. –

1

Wenn Sie nicht auf der Wiki-Seite pivoting gewesen sind, dann kann es ein guter Anfang sein. Es gibt einen Abschnitt auf einem general pivoting function, die seinen etwas effizienter einige Ansprüche machen:

Ein Nutzer berichtet:

Dies ist in der Lage einen ganzen Tag von realen Kursdaten zu schwenken, etwa 25 Millionen Zitate über etwa 4000 syms und durchschnittlich 5 Ebenen pro sym, in einem etwas über vier Minuten.

Wie für allgemeine Bemerkungen, ich würde sagen, dass die ej unnötig ist, da es eine allgemeinere Version von ij ist, so dass Sie die Schlüsselspalte angeben. Da beide t2 und t3 das gleiche Keying haben würde ich stattdessen verwenden:

t2 ij t3 

, die Ihnen eine sehr geringe Leistungssteigerung führen kann.

+0

Hallo Thomas, danke für die Antwort. Ja, ich war in diesem Wiki, das ist die Art, wie ich die Pivotalisierung erstelle. Ich habe versucht, einmal diese Funktion zu verwenden, aber es ist sehr komplex, speziell herauszufinden, was f und g sein sollte, aber tatsächlich sieht es vielversprechend aus. Ihre Antwort wäre vollständig, wenn Sie zeigen könnten, wie Sie diesen allgemeinen Pivot für das OP nennen :) –

+0

Ich kann es versuchen, wenn Sie ein Beispiel 'volancitysurface_smile' Tabelle oder sogar nur das Schema für die Tabelle geben. Wenn Sie es in die Frage einarbeiten, kann es auch anderen helfen, eine Antwort zu formulieren. –

Verwandte Themen