楼主: cz851218
7430 37

连续时间段里面的最值 [推广有奖]

21
cz851218 发表于 2010-5-11 09:55:25
4# nkwilling

谢谢,学习到一点point的用法了!哈哈

22
醉_清风 发表于 2010-5-11 10:55:46
很精彩 学习了
这也是我天天来的原因 呵呵
从来不需要想起 永远也不会忘记

23
nkwilling 发表于 2010-5-11 11:17:07
soporaeternus 发表于 2010-5-10 16:58
  1. %MACRO T(n);
  2. data b;
  3.         retain t0-t%eval(&n-1) 0;
  4.         set a;
  5.         %do i=%eval(&n-1) %to 1 %by -1;
  6.                 t&i=t%eval(&i-1);
  7.         %end;
  8.         t0=x;
  9.         max=max(of t0-t%eval(&n-1));
  10.         dis=max(0*((t0-max)=0)%do i=1 %to %eval(&n-1) %by 1;,&i*((t&i-max)=0)%end;);
  11. /*        dis=min(0*((t0-max)=0)%do i=1 %to %eval(&n-1) %by 1;,&i*((t&i-max)=0)%end;);*/
  12.         keep x max dis;
  13. run;
  14. %MEND T;
  15. %T(5);
复制代码
时间窗内多个达到最值取最后条计算差值,如需第一条则使用注释部分的就是max和min
这个时间窗可以调,也很快
谁有兴趣把soporaeternus的代码用临时数组实现吧,Jingju11和我的代码可读性都没有soporaeternus的代码强.如果soporaeternus代码用临时数组实现,将应该是最好的答案.有兴趣的也可以同时比较我们三个人的代码效率,用100万行*100列测试.谢谢!

24
bobguy 发表于 2010-5-11 11:22:07
cz851218 发表于 2010-5-10 15:13
我如果要计算连续N个时间段里面的最大值或最小值、还有最值距离现在有多长时间,该如何用SAS程序实现,举个简单点的例子:
假设A列为原始数据,B列为需要最大值的结果,C为最大值距离现在有多长时间(以天计算)
A: 2 5 6 9 8 2 6 5 4 7 9 5 6 7 ....................................
B:          9 9 9 9 8 7 9 9 9 9  ....................................
C:          1 2 3 4 4 0 0 1 2 3 .....................................
其中假设连续时间段N为5天,这个程序可以用LAG函数找出,但是我的数据量很大,同时N的值也很大,这样写起来程序可能很繁琐,同时写出来的程序也不具有普遍性,请问下有高手可以改写下程序不,让它更具有移植性。
希望高手能够帮忙解决下,谢谢!!
Here is one to handle it all in memory. It should be fast enough.

data tmp;
do i = 1 to 100000;
   x=ceil(ranuni(12345)*10000) ;
   output;
end;
drop i;
run;

%macro max(start,var,loopvar);
    %let i=0;
max( %do k=&start %to 1 %by -1;
       %let i=%eval(&i+1);
      %if &k ne 1 %then  &var( &loopvar-&start+&i ),  ;
      %else   &var( &loopvar-&start+&i )                 ;
      %end ;
      )
%mend;

*data _null_;

%let start=10;

data tmp2;
   array _x_(1000000)  _temporary_;
   do until (end);
      set tmp end=end nobs=nobs;
           i+1;
           _x_(i) = x;
    end;
    do i=&start     to nobs;
        b=%max(&start,_x_,i);
        if i=&start then do ;
            c=1;
            max_1=b;
        end;
        else if b ne max_1 then do;
              c=0;
              max_1=b;
        end;
        else c+1;
        output ;
        *put b= c=;
    end;
run;
proc print data= tmp(obs=100);
run;
proc print data= tmp2(obs=100);
run;
已有 1 人评分经验 论坛币 学术水平 热心指数 收起 理由
crackman + 100 + 100 + 1 + 1 精彩帖子

总评分: 经验 + 100  论坛币 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

25
crackman 发表于 2010-5-11 12:05:57
这个论坛上SAS让我佩服的几个全都来了

26
醉_清风 发表于 2010-5-11 12:09:07
不得不说 这帖子里回复的很精彩
从来不需要想起 永远也不会忘记

27
cz851218 发表于 2010-5-11 12:56:00
每种程序都体现在不同的方面,值得我好好学习啊!

28
pandasasa 发表于 2010-5-11 13:20:46
借花献佛
data a;
input x @@;
cards;
2 5 6 9 8 2 6 5 4 7 9 5 6 7
;
%let lag_n=5;
data b(drop=pre arr:);
array arr[0:%eval(&lag_n-1)];
   pre=0;
   do _n_=1 by 1 until(last);
      set a end=last;
      arr[pre]=x;
      pre=mod(pre+1,&lag_n);
      if _n_>=&lag_n then do;
         max=max(of arr[*]);
         end;
      output;
   end;
run;
已有 1 人评分经验 论坛币 学术水平 热心指数 收起 理由
crackman + 100 + 100 + 1 + 1 欢迎

总评分: 经验 + 100  论坛币 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

29
pandasasa 发表于 2010-5-11 16:16:40
data a;
   do k=1 to 100;
         x=ceil(10*ranuni(123));
         output;
   end;
run;

data b;
   set a;
   rename x=y
          k=k1;
run;
%let lag_n=5;

data temp_data(drop=k1 y rc);
    if _n_=1 then
        do;
if 0 then set b;
           declare hash h(dataset:'b');
          h.definekey ('k1');
          h.definedata(all:'yes');
          h.definedone();
           declare hiter p_hiter('h');
        end;
   set a;
   length temp $100;
   id=0;       
    rc=p_hiter.first();
    do while(rc eq 0);
        if  0<=k-k1<&lag_n then
            do;   
            if id=0 then temp=cat(y);
               else temp=catx(',',temp,y);
           id+1;
            end;
        rc=p_hiter.next();
    end;
run;

%macro max_dy;
   %let dsid=%sysfunc(open(temp_data));
    %let nobs=%sysfunc(attrn(&dsid,nobs));
    %syscall set(dsid);
    %do i=1 %to &nobs;
       %let rc=%sysfunc(fetchobs(&dsid,&i));
      k=&k;
      x=&x;
      %if &id=&lag_n %then %do;
           max_x=max(&temp);
         %end;
        output;
   %end;
   %let dsid=%sysfunc(close(&dsid));
%mend;

data final;
   %max_dy;
run;

30
cz851218 发表于 2010-5-11 16:39:12
proc import out=a
datafile="C:\Documents and Settings\boonepks\桌面\CU指数"
dbms=excel replace;
sheet="cu";
run;
proc import out=c
datafile="C:\Documents and Settings\boonepks\桌面\CU"
dbms=excel replace;
sheet="cu";
run;
data c;
set c;
rename date=date1 time=time1;
run;
%macro t(n,m,t);
%do a=1 %to &n;
%do b=2 %to &m;
%do c=2 %to &t;
data a;
set a;
tr=max(max((high-low),abs(lag(close)-high)),abs(lag(close)-low));
retain atr1 0;
atr1=atr1+tr;
run;
data a;
set a;
atr2=lag&a(atr1);
atr=1/&a*(atr1-atr2);
data b;
retain t0-t%eval(&b-1) 0 f0-f%eval(&c-1) 100000;
set a;
%do i=%eval(&b-1) %to 1 %by -1 ;
t&i=t%eval(&b-1);
%end;
t0=close;
f0=close;
hh=max(of t0-t%eval(&b-1));
hht=max(0*((t0-hh)=0)%do i=1 %to %eval(&b-1) %by 1;,&i*((t&i-hh)=0)%end;);
%do i=%eval(&c-1) %to 1 %by -1;
f&i=f%eval(&c-1);
%end;
ll=min(of f0-f%eval(&c-1));
llt=max(0*((f0-ll)=0)%do i=1 %to %eval(&c-1) %by 1;,&i*((f&i-ll)=0)%end;);
rh=log(hh)-log(mean(of t0-t%eval(&m-1)));
rl=log(mean(of f0-f%eval(&t-1)))-log(ll);
ls=ll*(1+rh*(&m));
ss=hh*(1-rl*(&t));
keep  date time  ls ss;
data b;
set b;
if date<="10may2010"d and date>="05JUN2007"d+&n;
run;
proc sql;
create table bb as
select b.*,c.lx,c.sx from b join c on b.date=c.date1 and b.time=c.time1
order by date;
quit;
data xx;
set bb;
x=(ls-lx)/lx;
y=(ss-sx)/lx;
keep date time x y;
run;
proc means data=xx;
var x y;
output out=zhishun (drop=_type_ _freq_) mean=meanx meany std=stdx stdy;
run;
data p;
n=&a;
m=&b;
t=&c;
run;
data tt;
merge p zhishun;
run;
proc append base=zhi data=tt force;
run;
%end;
%end;
%end;
%mend;
%t(5,3,3);
再问下,这个程序我想生成一个5*3*3的记录,为什么结果中会有很多数据相同的呢,是不是DO语句控制出现问题了!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 20:59