2016-08-08 2 views
0

У меня есть набор торговых данных, которые имеют наблюдения в миллисекундах, но нечастые. Чтобы сделать это разумным временем, я создал макрос для построения сетки (по одному наблюдению в секунду). Теперь я хочу, чтобы мой набор данных, чтобы вписаться в сетку (суммируя объемы, которые случились в том, что второй и с использованием последней котировки/цена сделки. Я очень благодарен за любые идеи. Смотрите ниже код.SAS Составление/суммирование наблюдений за промежуток времени

Лучшие

%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; 

очень отчаянная попытка была такова:

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

Сетка:

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 

Пример данных:

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 

Выход:

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 

Если нет торговли в эту секунду, объем должен быть 0 и цена цена последнего секундная.

EDIT:

так, благодаря Chris я сделал сетку без макросов, но прок SQL не работает, как я хочу.

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; 

Таким образом, идентификатор и дата не найдены, поэтому я создал их на шаге данных. Но тогда id - это не тот же формат, который я пытался исправить, но не смог. Кажется, у меня ошибка при объединении набора данных с желанием, сопоставляя милисекунды между секундами линий сетки. Что мне не хватает? Всегда благодарен за ввод! Best

+0

пожалуйста обеспечивают воспроизводимый пример того, что у вас есть и то, что вы хотите быть выходной – Altons

ответ

0

Прежде всего, спасибо всем за ответы. Я понял, как это сделать. Там может быть проще, но для меня, это сейчас достаточно:

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

Во-первых, почему макрос создает ваши интервалы в одну секунду?

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

Предполагая, что ваш milliseconds просто время до 3 знаков после запятой, просто присоединиться к floor(time) интервалам соответственно, а затем подвести итог.

 
proc sql ; 
    create table want as 
    select a.id, a.date, a.time, sum(b.volume) as Volume 
    from grid a 
     left join 
     inputdataset b on a.id = b.id 
        and a.date = b.date 
        and a.time = floor(b.time) 
    group by a.id, a.date, a.time ; 
quit ; 

Вы можете постобработки этот набор данных, чтобы установить недостающие объемы в ноль или сохранить предыдущую цену соответственно.

+0

Спасибо за ответ. Я пытаюсь. Мне нужно миллисекунды с полуночи, чтобы продолжить вычисления. Но возможно ли объединение, которое сопоставляет тома на сетке? Proc SQL уже полезен. – MaBo88

+0

Просто измените цикл 'do' на' do time = '00: 00't to '23: 59't'. –

+0

Хорошо, что грид работает, но как отредактирован в вопросе: я не могу объединить его, так как a.id = b.id - другой формат. Но формирование его не помогает ... – MaBo88

Смежные вопросы