2016-08-08 49 views
0

Ich habe eine Reihe von Handelsdaten, die Beobachtungen in Millisekunden, aber selten hat. Um es zu einer vernünftigen Zeitreihe zu machen, habe ich ein Makro erstellt, um ein Gitter zu erstellen (eine Beobachtung pro Sekunde). Jetzt möchte ich meine Daten-Sets in das Raster passen (Summieren der Volumina bis die in diesem zweiten und mit dem letzten Angebot/Handelspreis passiert ist. Ich bin sehr dankbar für alle Ideen. Siehe Code unten.SAS Sammeln/Zusammenfassen von Beobachtungen über ein Zeitintervall

Beste

%macro makeGrid; 
    proc sort data=data.inputdataset; by id date milliseconds descending type order; run;  
    options nomprint; 
    data data.outputgrid (keep=id date miliseconds type order); 
    set data.inputdataset; 
    by id date; 
     if first.date; 
     Type="grid"; Order=0; 
     %do i=((9*60*60)+(10*60)) %to ((16*60*60)+(50*60)); 
      milliseconds=&i; output; 
     %end; 
    run; 
    options mprint; 
%mend makeGrid; 

Ein sehr verzweifelter Versuch war:

data data.merged; 
merge data.outputgrid data.inputdataset; 
by id date milliseconds; 
if first.id then do; 
if milliseconds collate = sum(volume) 
run; 

Grid:

ID date time price volume 
ABC 01/01/15 0801000 
ABC 01/01/15 0802000 
ABC 01/01/15 0803000 
ABC 01/01/15 0804000 

Daten Beispiel:

ID date time price volume 
ABC 01/01/15 0800004 1,55 100 
ABC 01/01/15 0800110 1,56 200 
ABC 01/01/15 0800152 1,52 300 
ABC 01/01/15 0800210 1,51 400 
ABC 01/01/15 0800352 1,50 200 
ABC 01/01/15 0800384 1,51 400 

Ausgang:

ID date time price volume 
ABC 01/01/15 0801000 1,55 100 
ABC 01/01/15 0802000 1,52 500 
ABC 01/01/15 0803000 1,51 400 
ABC 01/01/15 0804000 1,51 600 

Wenn kein Handel in dieser Sekunde, sollte Volumen 0 und den Preis, den Preis der letzten Sekunde.

EDIT:

so, dank Chris machte ich die Gitter ohne Makro, aber die Prozedur SQL funktioniert nicht wie ich will.

data grid1; 
do seconds = '09:10't to '16:50't ; 
    output ; 
    end ; 
/* id=.;*/ 
/* date=.;*/ 
/* format ric $12. ;*/ 
/* format Date best12. ;*/ 
run; 

proc sql ; 
    create table want as 
    select a.id, a.date, a.miliseconds, sum(a.volume) as Volume 
    from have a 
    left join 
     grid1 b on a.id = b.id 
        and a.date = b.date 
        and a.miliseconds = floor(b.seconds) 
    group by a.id, a.date, a.miliseconds ; 
quit; 
run; 

Also, ID und Datum konnte nicht gefunden werden, also habe ich sie im Datenschritt erstellt. Aber dann ist ID nicht das gleiche Format, das ich zu beheben versuchte, aber gescheitert ist. Es scheint, dass ich einen Fehler habe, wenn ich das have-Dataset mit dem wante zusammenfasse, indem ich die Millisekunden zwischen den zweiten Gitternetzlinien abgleiche. Was fehlt mir? Immer dankbar für die Eingabe! Beste

+0

geben Sie bitte ein reproduzierbares Beispiel dafür, was Sie haben und was Sie die Ausgabe sein wollen – Altons

Antwort

0

Zunächst einmal vielen Dank für die Antworten. Ich dachte, wie es geht. Es könnte ein einfacher Weg sein, aber für mich ist dies jetzt genügt:

data data.test; 
set data.taq; 
next_full_sec = int((miliseconds-1)/1000) + 1; 
run; 

data data.grid; 
do seconds = 1 to 86400; 
    output; 
end; 
run; 

proc summary data=data.test; 
by ric date time next_full_sec; 
var volume; 
output out=data.int (drop=_type_) sum=; 
run; 

proc sort data=data.test (keep=ric date) out=data.id_date nodupkey; 
by ric date time; 
run; 

proc sql; 
create table data.testseconds as 
select ric, date, time, seconds 
from data.id_date, data.grid 
order by ric, date, time, seconds 
; 
quit; 

data data.testout; 
merge 
    data.testseconds (in=a rename=(fullseconds=next_full_sec)) 
    data.int (in=b) 
; 
by ric date time next_full_sec; 
if a; 
if not b 
then do; 
    _freq_ = 0; 
    volume = 0; 
end; 
run; 

proc print noobs; 
run; 
2

Erstens, warum ein Makro, um Ihre Ein-Sekunden-Intervalle zu erstellen?

 
    do time = '09:10't to '16:50't ; 
    output ; 
    end ; 

Angenommen, Ihre milliseconds ist nur eine Zeit 3 ​​Dezimalstellen, einfach floor(time) entsprechend den Intervallen verbinden, dann zusammenfassen.

Sie können diesen Datensatz anschließend weiterverarbeiten, fehlende Volumes auf Null setzen oder den vorherigen Preis entsprechend beibehalten.

+0

Vielen Dank für die Antwort. Ich versuche es. Ich brauche Millisekunden von Mitternacht, um meine Berechnungen fortzusetzen. Aber ist eine Zusammenführung möglich, die die Volumes auf das Raster bringt? Proc SQL ist bereits hilfreich. – MaBo88

+0

Ändern Sie einfach die 'do'-Schleife in' do time = '00: 00't zu '23: 59't'. –

+0

Okay, das Grid funktioniert, aber wie in der Frage bearbeitet: Ich kann es nicht zusammenführen, da a.id = b.id ein anderes Format ist. Aber das Formatieren hilft nicht ... – MaBo88