簡體   English   中英

SAS數據步驟視圖和數據包裝在宏中以進行循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM