SAS данные пошагового просмотра и перенос данных в макрос для цикла

Для исследовательского проекта в университете я получаю данные из WRDS через SAS, и я относительно новичок в SAS. Я пытаюсь получить данные через определенный интервал, предоставленный WRDS, который на самом деле работает очень для меня; структура выглядит следующим образом

[1]Define some macro variable
[2]Use data step view
[3]Make manipulation on data
[4]Export the data to csv

В частности, я получаю данные по акциям за каждый год. Вместо того, чтобы постоянно менять переменную, макрос, который позволил бы мне указывать годы в качестве входных данных, был бы "самым элегантным" решением (отсюда и вдохновляет: [SAS Loop through список макропеременных][1]). Однако мой макрос не работает должным образом (я также немного изменил структуру, добавив шаг добавления вместо экспорта в CSV).

Шаг [3] теперь сообщает об ошибке:ERROR 180-322: Statement is not valid or it is used out of proper order.

Я помещаю код здесь (часть 3 я оставляю как есть, потому что это создает проблемы, другую я немного сократил (я прокомментировал):

%macro get_stock_ts(list_years);

%local i tables;
%do i=1 %to %sysfunc(countw(&list_years,%str( )));
%let tables=%scan(&list_years,&i,%str( ));

proc datasets lib = work memtype = all nolist;
    delete _:;
quit; 

%local stock = "COP";       

%local taq_ds=taq.&tables:; 
%local filename = &tables._&stock; 

data  _v_&tables / view=_v_&tables;
  set &taq_ds;  
  where symbol = &stock and                             
        (time between '9:30:00't and '16:00:00't) and       
        mode = 12 and                                   
        EX = 'N';                                       
run; 

data xtemp2; 
 set _v_&tables; 
 by symbol date time; 
 format itime rtime time12.; 
 if first.symbol = 1 or first.date = 1 then do;         
    rtime = time; 
    iprice = bid; 
    oprice = ofr; 
    itime = &start_time; 
 end; 

 if time >= itime then do;                                              
       output;                                                          
       itime = itime + &interval_seconds; 
       do while(time >= itime);                                         
           output; 
           itime = itime + &interval_seconds; 
       end; 
end; 
rtime = time; 
iprice = bid; 
oprice = ofr; 
retain itime iprice oprice;                                             
run; 

proc append base = all data = work.xtemp2 force;
run;

proc printto log="/home/Logs/ &filename.log" new; run;
proc printto log=log; run;                                          

%end;
%mend get_stock_ts;

и затем я призываю, например:

%get_stock_ts(cq_2009)

Знаете ли вы, как получается, что выполнение кода в автономном режиме работает нормально, но как только я обертываю его как макрос, "хорошо" начинает создавать проблемы?

редактировать: я скорректировал код выше и получаю следующее. Это потому, что макро и локальные макропеременные имеют проблемы с оператором?

 1          OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
 72         
 73         %get_stock_ts(cq_2009)
 ERROR: Invalid symbolic variable name =.
 ERROR: Invalid symbolic variable name "COP".
 ERROR: Invalid symbolic variable name =.
 ERROR: Symbolic variable name TAQ.CQ_2009 must contain only letters,     digits, and underscores.
 ERROR: Invalid symbolic variable name TAQ.CQ_2009.
 ERROR: Invalid symbolic variable name :.
 ERROR: Invalid symbolic variable name =.
 ERROR: Invalid symbolic variable name =.
 ERROR: Invalid symbolic variable name '9:30:00'T.
 ERROR: Invalid symbolic variable name =.
 ERROR: Invalid symbolic variable name 1.
 ERROR: Invalid symbolic variable name *.
 ERROR: Invalid symbolic variable name 60.
 ERROR: Variable symbol is not on file WORK.ALL.

 NOTE: The SAS System stopped processing this step because of errors.
 NOTE: DATA statement used (Total process time):
   real time           0.00 seconds
   cpu time            0.00 seconds

 ERROR: Variable SYMBOL not found.
 ERROR: Variable DATE not found.
 ERROR: Variable TIME not found.
 NOTE: The SAS System stopped processing this step because of errors.
 NOTE: PROCEDURE SORT used (Total process time):
   real time           0.00 seconds
   cpu time            0.00 seconds

 ERROR: File WORK.XTEMP2.DATA does not exist.

3 ответа

Эта строка просто неверна.

%local stock = "COP";   

Вы пытаетесь определить локальные макропеременные с именем = а также "COP", Вы, вероятно, хотели это сделать.

%local stock ;
%let stock = "COP";   

Не знаю, в чем ваша ошибка, но эти строки в вашем макросе выглядят проблематично.

Первый:

%symdel stock taq_ds filename start_time interval_seconds; */
%let stock = "COP";     
%let taq_ds=taq.&tables:;   
%let filename = &tables._&stock; 
data  _v_&tables / view=_v_&tables;

Какова цель %SYMDEL? Вы, вероятно, просто хотите вместо этого создать некоторые макропеременные%LOCAL. Затем они исчезнут, когда макрос закончится. Поэтому нет необходимости их удалять. Если вам нужно установить их пустыми, то внутри %do цикл, а затем просто использовать %let заявления.

Кроме того, вы действительно хотите начать комментарий в стиле оператора в конце первой строки? Поскольку следующие три строки - это все макропрограммы, я думаю, * прокомментируем до точки с запятой в конце data заявление.

Второе:

DM 'log; file "/home/ &filename.log" replace'; 
DM "log; clear; ";                                          

Почему вы используете команды DM? Это может работать только в том случае, если вы все еще используете SAS с помощью диспетчера отображения.

Что вы пытаетесь сделать здесь? Если вы хотите записать журнал в отдельное место, то перенаправьте ПЕРЕД рукой, используя

proc printto log="filename" new; run;

затем закройте его.

proc printto log=log; run;

Я использую SAS Studio, работающую в облаке WRDS. Я понял следующее:

Когда я запускаю свой код - не как макрос - "block_by-block", тогда все работает очень хорошо. Если я запускаю весь сценарий, я получаю сообщение об ошибке в части данных xtemp2:

 73          '9:30:00't and '16:00:00't) and     mode = 12 and            EX =
 73       ! 'N';           run;   *Screen data to find the trade before a set
 73       ! time interval   data xtemp2;       set _v_&tables;       by symbol
                                               ___
                                               180
 73       ! date time;       format itime rtime time12.;       if
 ERROR 180-322: Statement is not valid or it is used out of proper order.

Но если я запускаю свой код один раз за блоком, после этого я могу запустить весь сценарий без проблем.

Поэтому я думаю, что решение заключается в последовательном запуске блоков кода. Есть ли возможность "симулировать" последовательный прогон в коде?

редактировать: я пытался использовать функцию сна, чтобы приостановить код, но это все еще не работает, он выдает мне ошибку:

 129        data xtemp2;
 130             set _v_&tables;
 130             set _v_&tables;
                 ___
                 180
 ERROR 180-322: Statement is not valid or it is used out of proper order.
 .
 .
 .

V& таблицы происходит из моего шага данных.

редактировать: я пробовал функцию сна, однако, она не работает. Как ни странно, если я запустлю все до просмотра шага данных, а затем запусту все, начиная с фактического шага данных, кодовые слова; и после этого я могу перезапустить ПОЛНЫЙ код вместо разделения на два раза.

Я создам новый вопрос, который ссылается на этот и вышеупомянутый вопрос, где я заключаю код в макрос...

РЕШЕНИЕ НАЙДЕНО: мне пришлось добавить дополнительный "бег"; заявления до шагов данных и затем это работает (кредиты Ричарду, который нашел это).

Другие вопросы по тегам