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& таблицы происходит из моего шага данных.
редактировать: я пробовал функцию сна, однако, она не работает. Как ни странно, если я запустлю все до просмотра шага данных, а затем запусту все, начиная с фактического шага данных, кодовые слова; и после этого я могу перезапустить ПОЛНЫЙ код вместо разделения на два раза.
Я создам новый вопрос, который ссылается на этот и вышеупомянутый вопрос, где я заключаю код в макрос...
РЕШЕНИЕ НАЙДЕНО: мне пришлось добавить дополнительный "бег"; заявления до шагов данных и затем это работает (кредиты Ричарду, который нашел это).