SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

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

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

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
31#
 楼主| 发表于 2010-12-25 13:12:08 | 只看该作者

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

若是sas的话:一个proc expand就能解决的问题.当然前面的data步也是相当的perfect.
若是oracle比较高的版本的话:可以用avg+开窗函数就可解决.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
32#
 楼主| 发表于 2011-4-25 19:23:08 | 只看该作者

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

华山论剑?
小弟学习了,正好找到一篇有点相关性的文章:《Easy Rolling Statistics with PROC EXPAND》
<!-- m --><a class="postlink" href="http://www2.sas.com/proceedings/forum2008/093-2008.pdf">http://www2.sas.com/proceedings/forum2008/093-2008.pdf</a><!-- m -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
33#
 楼主| 发表于 2011-4-25 21:54:07 | 只看该作者

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

刚时成功,最笨的方法来了,呵呵!!

[code:3s74yr8m]data a;
infile datalines;
input cid month $ balance;
datalines;
1 200001 1
1 200002 1
1 200003 2
1 200004 &#46;
1 200005 1
1 200006 1
1 200007 1
1 200008 1
1 200009 1
1 200010 1
1 200011 1
1 200012 1
1 200101 1
1 200102 1
1 200103 1
1 200104 1
1 200105 1
1 200106 1
1 200107 1
1 200108 1
1 200109 1
2 200001 1
2 200002 1
2 200003 2
2 200004 &#46;
2 200005 1
2 200006 1
2 200007 1
2 200008 1
2 200009 1
;
run;

proc sort data=a;
by cid month;
run;
data b;
  set a;
  by cid;
  retain total;
  if first&#46;cid=1 then do;
     total=0;
        end;
  if balance ne &#46; then total=total+balance;
run;
data c;
  set b;
  by cid;
  if first&#46;cid=1 then do;
    mv6=0;
        mv12=0;
        retain i k 0;
        i=1;
   end;
   if i&lt;12 and balance=&#46; then k=k+1;
   if first&#46;cid ne 1 then do;
     if i&lt;6 then do;
           mv6=lag(total)/(i-k);
          end;
          else do;
          mv6=mean(lag1(balance),lag2(balance),lag3(balance),lag4(balance),lag5(balance),lag6(balance));
          end;
          if i&lt;12 then do;
            mv12=lag(total)/(i-k);
                end;
          else do;
          mv12=mean(lag1(balance),lag2(balance),lag3(balance),lag4(balance),lag5(balance),
lag6(balance),lag7(balance),lag8(balance),lag9(balance),lag10(balance),lag11(balance),lag12(balance));
      end;
i=i+1;
        end;
        if last&#46;cid=1 then k=0;
run;
   




[/code:3s74yr8m]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
34#
 楼主| 发表于 2011-4-25 22:57:27 | 只看该作者

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

[quote=&quot;天性爱好者&quot;:1henghux]刚时成功,最笨的方法来了,呵呵!!
[/quote:1henghux]
看了大家的后,才知道,好像自己弄错了呀,弄得太急了!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-12 18:09 , Processed in 0.068955 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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