SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

楼主: shiyiming
打印 上一主题 下一主题

练手系列2:移动平均计算

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2007-9-27 10:25:34 | 只看该作者

Re: 练手系列2:移动平均计算

学习中~ 回家再修改,争取过关,呵呵
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2007-9-27 23:42:07 | 只看该作者

Re: 练手系列2:移动平均计算

proc sort data = a;
by cid;
run;
data b;
set a;
cnt + 1;
by cid;
if first.cid then cnt = 1;
array lagb(12) lagb1 - lagb12;
i=1;
lagb1=lag(balance);
if(cnt=1)then lagb1=.;

do until (i>11);
i+1;
lagb(i)=lag(lagb(i-1));
end;

j=12;
do until (j=0);
if(cnt<j) then lagb(j)=.;
j=j-1;
end;
mean6=mean(of lagb1-lagb6);
mean12=mean(of lagb1 - lagb12);
keep cid month balance mean6 mean12;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
13#
 楼主| 发表于 2007-9-27 23:45:56 | 只看该作者

Re: 练手系列2:移动平均计算

再简化的话就可以不用j,直接用i就可以了.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
14#
 楼主| 发表于 2007-9-28 07:32:54 | 只看该作者

to xsmile

强的!恭喜过关! <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
15#
 楼主| 发表于 2007-9-28 20:40:54 | 只看该作者

Re: 练手系列2:移动平均计算

[code:bf694]
proc delete data=_all_;run;
proc sort data=a;by cid;run;
%macro tt(g);
data b&amp;g;
set a(where=(cid=&amp;g));

lagb1=lag(balance);
lagb2 =lag2 (balance);
lagb3 =lag3 (balance);
lagb4 =lag4 (balance);
lagb5 =lag5 (balance);
lagb6 =lag6 (balance);
lagb7 =lag7 (balance);
lagb8 =lag8 (balance);
lagb9 =lag9 (balance);
lagb10=lag10(balance);
lagb11=lag11(balance);
lagb12=lag12(balance);

mean6=mean(of lagb1-lagb6);
mean12=mean(of lagb1 - lagb12);

keep cid month balance mean6 mean12;
run;

%mend;

data _null_;
set a;by cid;
if first&#46;cid then call execute('%tt('||cid||')');
run;

proc sql;
select count(distinct cid) into &#58;cnt from a;
quit;

%macro test;
%do j=1 %to &amp;cnt;
proc append base=b0 data=b&amp;j force;
run;
%end;
%mend;
%test
proc print data=b0;run;[/code:bf694]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
16#
 楼主| 发表于 2007-9-29 12:00:29 | 只看该作者

Re: 练手系列2:移动平均计算

比较复杂,看的不太懂,楼上的TX是把每个客户的数据单独处理后在merge一起的?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
17#
 楼主| 发表于 2007-9-29 21:53:22 | 只看该作者

Re: 练手系列2:移动平均计算

waterlwh的程序通俗易懂,就是每个客户单独处理,最后把结果摞起来。这样很容易维护,唯一的不足就是大数据量性能不佳,不可实际用于生产环境。还是要赞一个!
xsmile的答案我觉得基本是正解了。

我的参考程序供大家一起讨论,不知道还没有高手再改进一下:
[code:0d6e2]%let period=24;
data b(drop=i lastn1-lastn&amp;period);
set a;
retain lastn1-lastn&amp;period;
by cid;
array lastn{&amp;period};
do i=&amp;period to 2 by -1;
  lastn{i}=lastn{i-1};
end;
lastn{1}=lag(balance);
if first&#46;cid then do i=1 to &amp;period;
        lastn{i}=&#46;;
end;
mean6=mean(of lastn1-lastn6);
mean12=mean(of lastn1-lastn12);
mean24=mean(of lastn1-lastn24);
run;[/code:0d6e2]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
18#
 楼主| 发表于 2007-10-1 09:30:42 | 只看该作者

Re: 练手系列2:移动平均计算

简练~ 学习一下,还有其他练习题目吗?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
19#
 楼主| 发表于 2007-10-9 19:00:38 | 只看该作者

Re: 练手系列2:移动平均计算

如何获取下一行的数据呢,与lag功能相反?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
20#
 楼主| 发表于 2007-10-18 10:30:02 | 只看该作者

Re: 练手系列2:移动平均计算

这个问题简单了点,呵呵,用行号降序排列再用lag就是了
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-11 07:11 , Processed in 0.074271 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表