搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  谭教授SAS银行模拟范例要点.zip
资料下载链接地址: https://bbs.pinggu.org/a-2163426.html
附件大小:
34.09 KB   举报本内容
以下是自己总结的一些方法,欢迎拍砖,添砖加瓦。

1.测试代码的时候,可以从大数据集中抽取一部分数据来进行测试,而不比直接在大文件上全部进行测试。抽取数据这个有好多种方法常用的如使用obs=option选项,proc surveyselect进行分层抽样,利用种子产生随机数来抽取等等,反正怎么方便怎么龋如


  1. proc means data=test(obs=1000);
  2. run;
复制代码


或者


  1. options obs=1000;
  2. proc means data=test;
  3. run;
  4. options obs=max;
复制代码


2.每个数据集最好只保留自己想要的变量,变量太多是会影响效率的,所以无关变量可以drop掉,或者keep想要的变量。


3.在对符合已知变量条件的记录进行处理时,果断先进行筛选,然后在进行处理。同时在 Data步建立新数据集,在进行的条件筛选中,where的效率比if高,因为where在读入的时候就已经进行判断,而if则是等到全部读完的时候才进行判断。如需对class数据集中的男生建立一个新变量weight_new,以下这种写法是不可取的。


  1. data test;
  2. set sashelp.class;
  3. weight_new=sum(height,-101);
  4. ifsex=”男”;
  5. run;
复制代码



可以这么写


  1. data test;
  2. set sashelp.class(Where =(sex=”男”));
  3. weight_new=sum(height,-101);
  4. run;
复制代码


4.一些能省略的data步,如先经过data步进行简单的条件筛选,然后进行proc步的一些操作,诸如此类的data步,尽量省略吧。


  1. data test;
  2. setsashelp.class;
  3. wheresex=”男”;
  4. run;
  5. proc means data=test;
  6. varweight height;
  7. run;
复制代码



完全可以这么写


  1. proc means data=test(where=(sex=”男”));
  2. varweightheight;
  3. run;
复制代码



5.需要修改数据集变量的label和format格式时,还是通过proc datasets过程进行修改效率比较快,它不需要记录进入pdv,比起data步更有效率。


  1. data test;
  2. set sashelp.class;
  3. label weight="体重(斤)";
  4. format weight best6.2;
  5. run;

  6. proc datasets library=sashelp;
  7. modify class;
  8. label weight="体重(斤)";
  9. format weight best6.2;
  10. run;
  11. quit;
复制代码



6.纵向合并数据集时,如果生成的目标表就是来源表之一,那么proc append会比data步更有效率。


  1. data test1;
  2. doi=1 to 10000000;
  3. x=1;y=1;z=1;
  4. output;
  5. end;
  6. run;

  7. data test2;
  8. doi=1 to 10000000;
  9. x=1;y=1;z=1;
  10. output;
  11. end;
  12. run;
  13. data test1;
  14. set test1 test2;
  15. run;

  16. /*proc append*/
  17. data test1;
  18. set test1;
  19. stop;
  20. run;
  21. proc append base=test1 data=test2;
  22. run;
  23. /*proc datasets中的append*/
  24. data test1;
  25. set test1;
  26. stop;
  27. run;
  28. proc datasets library=work;
  29. modify test;
  30. append base=test1data=test2;
  31. run;
  32. quit;
复制代码



proc append和proc datasets中的append过程效率是一样的。


7.对于大数据集,一般都会讲数据集压缩,以节省存储空间,sas里可以通过options compress=yes;来进行压缩。


8.如果我们想要查看一个变量顶部5%的记录,可以通过proc rank一步实现,而不需先通过univariate过程先将p95分位数求出,然后赋值给宏变量,最后再回到数据集中筛眩


  1. data test;
  2. do i=1 to 200;
  3. output;
  4. end;
  5. run;
  6. proc rank data=test groups=100 out=want(where=(i_pct>=95));
  7. var i;
  8. ranks i_pct;
  9. run;
复制代码



9.在编写一些proc步时,对于分组变量最好是用class而不用by,因为用by是得对分组变量进行排序的。


10.视图的应用。视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。所以视图能够节省大量的空间,同时因为它不是以存储的形式存在,因此在一定程序上能够提高运行效率。如对生成的数据集进行means过程


  1. data test1/view=test1;
  2. do i=1 to 30000000;
  3. x=1;y=1;z=1;output;
  4. end;
  5. run;
  6. proc means data=test1;
  7. var i;
  8. run;
复制代码





  1. data test2;
  2. do i=1 to 30000000;
  3. x=1;y=1;z=1;
  4. output;
  5. end;
  6. run;
  7. proc means data=test2;
  8. var i;
  9. run;
复制代码



对比之下,我们可以看到视图比起数据集将近节省了10秒。但是引用视图的时候要注意,视图的名字能够覆盖视图的名字,但是它不能覆盖数据集的名字,因此建立视图的时候,不能存在跟视图一样名字的数据集,否则会报错。同时,如果视图的名字存在,再要建立同样名字的数据集也是会报错。


11.format格式数据集的引用。比如说在信用卡交易数据集,每天的交易量都是很大的,同时包括境内境外交易,这时就存在币种转换问题。一张交易量很大的表,和一张币种汇率表,这时如果通过币种去连接两个数据集,首先得先对这两个数据集按币种排序,然后merge进行计算,当然有人想到直接用sql连接,不过这样消耗时间也都是非常大的。这时候就可以先将汇率表做成format的数据集形式,到时就可以直接使用了。如


  1. data rate;
  2. input currency $ rate date yymmdd10.;
  3. format date yymmdd10.;
  4. cards;
  5. USD 6.13 2013/6/11
  6. EUR 8.14 2013/6/11
  7. GBP 9.56 2013/6/11
  8. JPY 5.80 2013/6/11
  9. HKD 0.78 2013/6/11
  10. ;
  11. run;

  12. data trans;
  13. input id $ currency $ money;
  14. cards;
  15. 001 USD 200
  16. 002 GBP 100
  17. 003 USD 120
  18. 004 HKD 1000
  19. 005 EUR 300
  20. ;
  21. run;

  22. proc sort data=rate nodupkey;
  23. by currency;
  24. run;

  25. data rate_format;
  26. set rate end=last;
  27. retain fmtname 'rate_fmt' type 'c';
  28. rename currency=start rate=label;
  29. drop date;
  30. run;

  31. /*options fmtsearch=(sashelp);*/

  32. proc format library=work cntlin=rate_format;
  33. run;

  34. data trans_amt;
  35. set trans;
  36. rate=put(currency,$rate_fmt.);
  37. money_to_rmb=money*rate;
  38. run;
复制代码

注意format数据集的地址,如果非work逻辑库下,则需要加上这么一句话options fmtsearch=(逻辑库名称);


12.将数据集载入内存。该方法减少数据集内存分配和释放的次数,降低I/O处理量,提高SAS程序执行效率,但是相当消耗内存,需要确认系统有足够多的内存资源,同时在使用完后,要记得释放。具体形式如下


  1. sasfile test2 load;/*将数据集test2载入内存*/
  2. data test;
  3. set test2;
  4. run;
  5. proc means data=test2;
  6. run;
  7. sasfile test2 close;/*将test2数据集从内存中释放*/
复制代码


13.hash的应用。在data步中使用hash对象,不但可以快速有效地检索和读取数据,还可以实现数据集merge的功能,从而减少排序时间,提高了数据处理的能力,相对于merge,hash的效率更高,但是同时也很消耗内存,因此一般都是把小表放进hash中。如用前面汇率进行币种的连接


  1. data test;
  2. if _n_=0 then set rate;
  3. if _n_=1 then do;
  4. declare hashshare(dataset:'work.rate');
  5. share.definekey('currency');
  6. share.definedata(all:'yes');
  7. share.definedone();
  8. call missing (of _all_);
  9. end;
  10. set Trans;
  11. if share.find()=0;
  12. run;
复制代码






    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

GMT+8, 2026-1-8 06:59