99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀sas快速處理大數(shù)據(jù)的使用技巧
sas快速處理大數(shù)據(jù)的使用技巧
2014-11-02
收藏

sas快速處理大數(shù)據(jù)的使用技巧

用sas在做數(shù)據(jù)分析時,有很多朋友會遇到和我一樣的問題吧,數(shù)據(jù)分析師在這里分享一下。1.測試代碼的時候,可以從大數(shù)據(jù)集中抽取一部分數(shù)據(jù)來進行測試,而不比直接在大文件上全部進行測試。抽取數(shù)據(jù)這個有好多種方法常用的如使用obs=option選項,proc surveyselect進行分層抽樣,利用種子產(chǎn)生隨機數(shù)來抽取等等,反正怎么方便怎么取。如

  1. proc means data=test(obs=1000);
  2. run;
復(fù)制代碼

或者

  1. options obs=1000;    
  2. proc means data=test;    
  3. run;
  4. options obs=max;
復(fù)制代碼

2.每個數(shù)據(jù)集最好只保留自己想要的變量,變量太多是會影響效率的,所以無關(guān)變量可以drop掉,或者keep想要的變量。

3.在對符合已知變量條件的記錄進行處理時,果斷先進行篩選,然后在進行處理。同時在 Data步建立新數(shù)據(jù)集,在進行的條件篩選中,where的效率比if高,因為where在讀入的時候就已經(jīng)進行判斷,而if則是等到全部讀完的時候才進行判斷。如需對class數(shù)據(jù)集中的男生建立一個新變量weight_new,以下這種寫法是不可取的。數(shù)據(jù)分析師培訓

  1. data test;
  2.             set sashelp.class;
  3.             weight_new=sum(height,-101);
  4.             if  sex=”男”;
  5.      run;
復(fù)制代碼

可以這么寫

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

4.一些能省略的data步,如先經(jīng)過data步進行簡單的條件篩選,然后進行proc步的一些操作,諸如此類的data步,盡量省略吧。

  1. data test;
  2.                 set  sashelp.class;
  3.                 where  sex=”男”;
  4.      run;
  5.      proc means data=test;
  6.                 var  weight height;
  7.      run;
復(fù)制代碼

完全可以這么寫

  1. proc means data=test(where=(sex=”男”));
  2.                 var  weight  height;
  3.      run;
復(fù)制代碼

5.需要修改數(shù)據(jù)集變量的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;
復(fù)制代碼

6.縱向合并數(shù)據(jù)集時,如果生成的目標表就是來源表之一,那么proc append會比data步更有效率。

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

  7. data test2;
  8.        do  i=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;
復(fù)制代碼

proc append和proc datasets中的append過程效率是一樣的。

7.對于大數(shù)據(jù)集,一般都會講數(shù)據(jù)集壓縮,以節(jié)省存儲空間,sas里可以通過options compress=yes;來進行壓縮。

8.如果我們想要查看一個變量頂部5%的記錄,可以通過proc rank一步實現(xiàn),而不需先通過univariate過程先將p95分位數(shù)求出,然后賦值給宏變量,最后再回到數(shù)據(jù)集中篩選。

  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;
復(fù)制代碼

9.在編寫一些proc步時,對于分組變量最好是用class而不用by,因為用by是得對分組變量進行排序的。

10.視圖的應(yīng)用。視圖是一個虛擬表,其內(nèi)容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。所以視圖能夠節(jié)省大量的空間,同時因為它不是以存儲的形式存在,因此在一定程序上能夠提高運行效率。如對生成的數(shù)據(jù)集進行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;
復(fù)制代碼

1.jpg

  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;
復(fù)制代碼

2.jpg

   對比之下,我們可以看到視圖比起數(shù)據(jù)集將近節(jié)省了10秒。但是引用視圖的時候要注意,視圖的名字能夠覆蓋視圖的名字,但是它不能覆蓋數(shù)據(jù)集的名字,因此建立視圖的時候,不能存在跟視圖一樣名字的數(shù)據(jù)集,否則會報錯。同時,如果視圖的名字存在,再要建立同樣名字的數(shù)據(jù)集也是會報錯。

11.format格式數(shù)據(jù)集的引用。比如說在信用卡交易數(shù)據(jù)集,每天的交易量都是很大的,同時包括境內(nèi)境外交易,這時就存在幣種轉(zhuǎn)換問題。一張交易量很大的表,和一張幣種匯率表,這時如果通過幣種去連接兩個數(shù)據(jù)集,首先得先對這兩個數(shù)據(jù)集按幣種排序,然后merge進行計算,當然有人想到直接用sql連接,不過這樣消耗時間也都是非常大的。這時候就可以先將匯率表做成format的數(shù)據(jù)集形式,到時就可以直接使用了。如

  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;
復(fù)制代碼

注意format數(shù)據(jù)集的地址,如果非work邏輯庫下,則需要加上這么一句話options fmtsearch=(邏輯庫名稱);

12.將數(shù)據(jù)集載入內(nèi)存。該方法減少數(shù)據(jù)集內(nèi)存分配和釋放的次數(shù),降低I/O處理量,提高SAS程序執(zhí)行效率,但是相當消耗內(nèi)存,需要確認系統(tǒng)有足夠多的內(nèi)存資源,同時在使用完后,要記得釋放。具體形式如下

  1. sasfile test2 load;/*將數(shù)據(jù)集test2載入內(nèi)存*/
  2. data test;
  3. set test2;
  4. run;
  5. proc means data=test2; 
  6. run;
  7. sasfile test2 close;/*將test2數(shù)據(jù)集從內(nèi)存中釋放*/
復(fù)制代碼

13.hash的應(yīng)用。在data步中使用hash對象,不但可以快速有效地檢索和讀取數(shù)據(jù),還可以實現(xiàn)數(shù)據(jù)集merge的功能,從而減少排序時間,提高了數(shù)據(jù)處理的能力,相對于merge,hash的效率更高,但是同時也很消耗內(nèi)存,因此一般都是把小表放進hash中。如用前面匯率進行幣種的連接

  1. data test;
  2.         if _n_=0 then set rate;
  3.         if _n_=1 then do;
  4.                 declare hash  share(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;
復(fù)制代碼

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }