Re: [程式] SAS如何配對每五分鐘資料
這個資料整理的難度是要縱向去抓最靠近的五分鐘的那個值然後配對上來
因此程式寫作的思路是
step1. 抓出每個時間點超過五分鐘後的時間點當candidate
step2. 從這些candidate中抓出第一筆時間點
step3. 把抓出的第一筆時間點相對應的價格也抓出來
step4. 配對抓出來的價格和原本的價格
因此我先把範例延伸成十個時間點,這樣比較好寫範例:
data temp;
input time hhmmss. price;
cards;
090110 15
090220 16
090530 17
090630 18
090720 19
090840 20
090950 21
091010 22
091120 23
091230 24
;
用data step無法直接處理,所以我用proc iml:
proc iml;
/*把資料讀進一個x的矩陣內*/
use temp;
read all into x;
/*建立一個10X10的空矩陣*/
y = J(10, 10, .);
/*算出每一個時間點跟其他時間點的秒數差距,並用橫的方式排列*/
/*算好後把所有小於300秒的數值都設定為missing*/
do i = 1 to 10;
do j = 1 to 10;
y[j, i] = x[i,1] - x[j,1];
if y[j, i] <= 300 then y[j, i] = .;
end;
end;
/*算每一個時間點有多少個missing,而missing+1的結果就是最靠近
五分鐘後的那個時間點位置。把那個位置存在idx矩陣內*/
m = missing(y);
idx = m[,+]+1;
/*整理idx矩陣,讓沒有五分鐘後時間點的位置都變成missing data*/
do i = 1 to 10;
if idx[i] > 10 then idx[i] = .;
end;
/*開一個都是0的10X10矩陣,然後讓第i列的第idx[i]行變成1*/
/*因此這個矩陣就可以用來去抓相對應的price值*/
z = J(10,10,0);
do i = 1 to 10;
z[idx[i],i] = 1;
end;
/*把五分鐘後最靠近的那個price值抓出來存在一個price2的向量裡面
(注意他是橫的)*/
price2 = t(x[,2])*z;
/*把price2轉成直的後跟原本的存放資料的x矩陣合併*/
match = x||t(price2);
print match;
/*把配對好的資料輸出成SAS檔....請自己寫*/
quit;
結果呈現:
match
32470 15 18
32540 16 20
32730 17 23
32790 18 24
32840 19 24
32920 20 0
32990 21 0
33010 22 0
33080 23 0
33150 24 0
注意,沒有配對值的數據都是0,如有必要請自行轉換成missing
※ 引述《TheDuke (Duke)》之銘言:
: 入門程度
: 低(1~3個月)
: [問題敘述]:
: 目前在處理日內的資料,需要把每個時點的資料配對上最靠近的5分鐘後的資料
: 像是
: 時間 價格 五分後價格
: 090110 15 17
: 090220 16 19
: 090530 17 19
: 090630 18
: 090720 19
: [程式範例]:
: 目前是參照板上之前的文章 將時間轉成秒數除以300後 用INT 跟MOD 還有first.去篩選資料
: 但是是完全無法配對
: data aa; set aa; SEC_COUNT = (hr-9)*3600+min*60+sec;
: INT_5 = int(SEC_COUNT/300) ;
: mod_5 = MOD(SEC_COUNT,300) ; run;
: data aa;set aa; if first.INT_5;run;
: 跑出來的資料雖然是每五分鐘的資料,但我需要的是每筆資料每個時間點都要有對應的
: 五分鐘後的資料,請問各位高手我應該怎麼做?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 139.52.242.104
※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1428176250.A.C56.html
推
04/05 11:29, , 1F
04/05 11:29, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):