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
geben Sie bitte ein reproduzierbares Beispiel dafür, was Sie haben und was Sie die Ausgabe sein wollen – Altons