SAS数据步骤视图和数据包装在宏for循环中

时间:2018-03-03 01:46:39

标签: loops sas sas-macro datastep wrds

对于大学研究项目,我正在通过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

特别是我每年检索一只股票的数据。而不是一直改变变量,一个允许我提供年份作为输入的宏将是最优雅的#34;解决方案(灵感来自于此:[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)

您是否知道如何以独立方式运行代码可以正常工作,但只要我将其作为宏包装就可以了。#34; good"开始造成问题?

编辑:我已调整上面的代码并获得以下内容。是因为宏和局部宏变量的语句有问题吗?

 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.

2 个答案:

答案 0 :(得分:1)

不知道您的错误是什么,但宏中的这些行看起来有问题。

<强>第一

%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时,这才有效。

你想在这做什么?如果要将日志写入单独的位置,请使用

重定向BEFORE
proc printto log="filename" new; run;

然后关闭它。

proc printto log=log; run;

答案 1 :(得分:0)

我正在使用工作在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.

但如果我逐块运行我的代码,之后我可以毫无问题地运行整个脚本。

所以我认为解决方案是按顺序运行代码块。是否有可能在代码中“模拟”顺序运行?

编辑:我尝试使用sleep函数暂停代码,但仍然无效,它给了我错误:

 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 &amp; tables来自我的数据步骤视图。

编辑:我尝试了睡眠功能,然而,它不起作用。有趣的是,如果我运行所有内容直到数据步骤查看然后从实际数据步骤运行代码字;之后我可以重新运行FULL代码而不是分裂两次。

我将创建一个新问题,链接回到此问题和上面提到的问题,我将代码包装成宏...

解决方案:我不得不添加额外的“运行”;在数据步骤之前的陈述然后它起作用(归功于发现这个的理查德)。