2013-07-19 4 views
2

Я вычисляю статистику интервалов (стандартное отклонение, например, одноминутных интервалов) финансовых данных временных рядов. Моему коду удалось получить результаты для всех интервалов, содержащих данные, но для интервалов, которые не содержат каких-либо наблюдений в временном ряду, я хотел бы вставить пустую строку только для поддержания последовательности времени.SAS: Вставить пустые строки

Например, если есть данные с 10:00 до 10:01, 10:02 до 10:03, а не 10:01 до 10:02, мой выход будет:

10:01 stat1 stat2 stat3 
10:03 stat1 stat2 stat3 

Это бы идеально, если результат может быть (я хочу некоторые значения быть 0, некоторые не хватает «»):

10:01 stat1 stat2 stat3 
10:02 0  0  . 
10:03 stat1 stat2 stat3 

что я сделал:

data v_temp/view = v_temp; 
    set &taq_ds; 
    where TIME_M between &start_time and &end_time; 
    INTV = hms(00, ceil(TIME_M/'00:01:00't),00); *create one minute interval; 
    format INTV tod.; *format hh:mm:ss; 
run; 

proc means data = sorted noprint; 
    by SYM_ROOT DATE INTV; 
    var PRICE; 
    weight SIZE; 
    output 
    out=oneMinStats(drop=_TYPE_ _FREQ_) 
    n=NTRADES mean=VWAP sumwgt=SUMSHS max=HI min=LO std=SIGMAPRC 
    idgroup(max(TIME_M) last out(price size ex time_m)=LASTTRD LASTSIZE LASTEX LASTTIME); 
run; 

для некоторых не-эк e, есть много пробелов, подобных этому. Что было бы эффективным способом генерации этих заполняющих строк?

+0

FYI, код INTV = намного сложнее, чем нужно. Если это действительно значения времени, а не дата и время, INTV = 60 * ceil (TIME_M/60); достаточно. Значения времени - это просто целое число секунд, поэтому все действия HMS() умножаются на 60, а все/'00: 01: 00't делает деление на 60. (Но если вы предпочитаете, чтобы этот способ был больше ясно, что происходит, это нормально, конечно.) – Joe

+0

Да, ваш путь определенно более ясен. Спасибо Джо! –

+0

Alex, если ответ ниже поможет, пожалуйста, поддержите его и/или примите его. Если нет, прокомментируйте, о чем у вас все еще есть вопросы. Благодаря! – Joe

ответ

2

Если у вас есть SAS:ETS лицензия, PROC EXPAND - хороший выбор для добавления пустых строк во временные ряды. Вот очень короткий пример:

data mydata; 
input timevar stat1 stat2 stat3; 
format timevar TIME5.; 
informat timevar HHMMSS5.; 
datalines; 
10:01 1 3 5 
10:03 2 4 6 
;;;; 
run; 

proc expand data=mydata out=mydata_exp from=minute to=minute observed=beginning method=none; 
id timevar; 
run; 

documentation имеет более подробную информацию, если вы хотите выполнить меж/экстраполяцию или что-нибудь подобное. Важные параметры: от = минута, наблюдается = начало, метод = нет (нет экстраполяции или интерполяции) и id (который идентифицирует временную переменную).

Если у вас нет ETS, тогда необходимо выполнить шаг данных. Вы можете либо объединиться к известному набору данных, либо добавить свои собственные строки; размер вашего набора данных определяет несколько, что проще. Вот вариант слияния. Добавление собственных строк в переменную datastep аналогично тому, как я создаю дополнительные строки.

*Select the maximum time available.; 
proc sql noprint; 
select max(timevar) into :endtime from mydata; 
quit; 

*Create the empty dataset with just times; 
data mydata_tomerge; 
set mydata_tomerge(obs=1); 
do timevar = timevar to &endtime by 60; *by 60 = minutes!; 
output; 
end; 
keep timevar; 
run; 
*Now merge the one with all the times to the one with all the data!; 
data mydata_fin; 
merge mydata_tomerge(in=a) mydata; 
by timevar; 
if a; 
run; 
+0

Если вы делаете это для нескольких акций в одном наборе данных, и похоже, что это может быть, немного сложнее создать этот набор данных слияния. Вы должны иметь возможность использовать BY с PROC EXPAND, и я настоятельно рекомендую использовать этот вариант, если у вас есть ETS и/или проводят анализ временных рядов, регулярно лицензируя его. Если вам нужно использовать шаг данных, вам нужно будет создать таблицу поиска либо на шаге PROC FORMAT, либо в хеш-таблице максимального времени на акцию, а затем использовать first.stock для определения минимальных времен; или используйте PROC MEANS, чтобы получить MIN и MAX на одной строке. – Joe

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