[英]SAS data step view and data wrap in a macro for loop
對於一個大學研究項目,我正在通過SAS從WRDS檢索數據,這對SAS來說還比較陌生。 我正在嘗試按WRDS提供的特定間隔檢索數據,這實際上對我非常有用; 結構如下
[1]Define some macro variable
[2]Use data step view
[3]Make manipulation on data
[4]Export the data to csv
特別是我每年都在檢索股票數據。 而不是一直更改變量,而是使用一個允許我提供年份作為輸入的宏作為“最優雅的”解決方案(從此處啟發:[SAS循環通過宏變量列表] [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.
不知道您的錯誤是什么,但是宏中的這些行看起來有問題。
第一 :
%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命令? 僅當您實際上仍在使用Display Manager運行SAS時,這才起作用。
您想在這里做什么? 如果您想將日志寫入單獨的位置,請使用
proc printto log="filename" new; run;
然后關閉它。
proc printto log=log; run;
這條線是錯誤的。
%local stock = "COP";
您正在嘗試定義名為=
和"COP"
局部宏變量。 您可能打算這樣做。
%local stock ;
%let stock = "COP";
我正在WRDS雲上使用SAS Studio。 我已經意識到以下幾點:
當我運行我的代碼(而不是作為宏)“ 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 &tables來自我的數據步驟視圖。
編輯:我嘗試了睡眠功能,但是,它不起作用。 有趣的是,如果我運行所有操作直到數據步驟視圖,然后再運行實際數據步驟中的所有代碼字; 然后,我可以重新運行FULL代碼,而不是拆分兩次。
我將創建一個新問題,將其鏈接到上述問題,並將代碼包裝到宏中。
找到的解決方案:我不得不添加額外的“運行”; 數據開始之前先聲明,然后再起作用(歸功於Richard,他找到了這個)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.