楼主: cz851218
6275 37

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

  • 0关注
  • 5粉丝

博士生

44%

还不是VIP/贵宾

-

威望
0
论坛币
215 个
通用积分
0
学术水平
3 点
热心指数
4 点
信用等级
3 点
经验
4783 点
帖子
333
精华
0
在线时间
233 小时
注册时间
2008-10-30
最后登录
2016-11-23

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我如果要计算连续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的值也很大,这样写起来程序可能很繁琐,同时写出来的程序也不具有普遍性,请问下有高手可以改写下程序不,让它更具有移植性。
希望高手能够帮忙解决下,谢谢!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:连续时间 时间段 sas程序 原始数据 最大值 时间段 最大值 程序 如何

沙发
crackman 发表于 2010-5-10 16:03:28 |只看作者 |坛友微信交流群
data a;
do i=1 to 10000000;
x=int(ranuni(7)*10);
output;
end;
drop i;
run;
%macro b(n,dataname);
data &dataname;
set a;
obs=_n_;
group=int(obs/&n.);
if mod(obs,&n.)=0 then group=int(obs/&n.)-1;
run;
proc sort data=&dataname. out=&dataname.;
by group x;
run;
data &dataname.;
set &dataname.;
by group x;
if last.x=1 and last.group=1;
drop obs;
run;
%mend b;
%b(13,d);


千万级的是数据
NOTE: 有 10000000 个从数据集 WORK.A 读取的观测。
NOTE: 数据集 WORK.D 有 10000000 个观测和 3 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          18.67 秒
      CPU 时间          6.26 秒



NOTE: 有 10000000 个从数据集 WORK.D 读取的观测。
NOTE: 数据集 WORK.D 有 10000000 个观测和 3 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          24.37 秒
      CPU 时间          13.87 秒



NOTE: 有 10000000 个从数据集 WORK.D 读取的观测。
NOTE: 数据集 WORK.D 有 769231 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          2.43 秒
      CPU 时间          2.42 秒

使用道具

藤椅
crackman 发表于 2010-5-10 16:04:32 |只看作者 |坛友微信交流群
还有最值距离现在有多长时间
不晓得是什么意思
楼主解释哈

使用道具

板凳
nkwilling 发表于 2010-5-10 16:25:59 |只看作者 |坛友微信交流群
楼上的解答可能不是作者的本意,我来抛砖引玉吧:

data a;
input x @@;
cards;
2 5 6 9 8 2 6 5 4 7 9 5 6 7
;
run;

data aa;
set a;
rename x=x1;
run;

data b;

DO row=5 TO 14;
set a point=row;
   do col=row-4 to row;
      set aa point=col;
          retain xxx xx;
          xx=max(x1,x);
          xxx=max(xxx,xx);
          put xx= @;
          put xxx= @;
          put x1= @;
          put x=;
   end;
output;
xxx=0;
put xxx=;
END;
stop;
keep xxx;
run;

再把5和14做成宏变量即可.

第二个问题请楼主自己想一想,相信你会做的.
已有 1 人评分经验 论坛币 学术水平 热心指数 收起 理由
crackman + 100 + 100 + 1 + 1 精彩帖子

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

使用道具

报纸
soporaeternus 发表于 2010-5-10 16:58:26 |只看作者 |坛友微信交流群
  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
这个时间窗可以调,也很快
已有 2 人评分经验 论坛币 学术水平 热心指数 收起 理由
醉_清风 + 1 + 1 很精彩 学习了
crackman + 100 + 100 + 1 + 1 精彩帖子

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

Let them be hard, but never unjust

使用道具

地板
cz851218 发表于 2010-5-10 16:59:11 |只看作者 |坛友微信交流群
3# crackman


谢谢你的回答,
不过我的意思不是把数据划分为每一段都为5个数据,而是由点类似移动平均的概念.....,如:
2 5 6 9 8 2 6 5 4 7 9 5 6 ...............以5为周期需划分为(2 5 6 9 8)、(5 6 9 8 2)、(6 9 8 2 6)、(9 8 2 6 5)、(8 2 6 5 4 )等等,实际上我想生成一个以20 ,100 甚至更大的N为周期一系列数组,取这些数组间的最值。

使用道具

7
soporaeternus 发表于 2010-5-10 17:00:37 |只看作者 |坛友微信交流群
看我的5楼哈,双版主出动......
Let them be hard, but never unjust

使用道具

8
nkwilling 发表于 2010-5-10 17:01:26 |只看作者 |坛友微信交流群
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
这个时间窗可以调,也很快
这个代码在N取很大值(比如1000)就会有点问题,SAS要产生1000列,这可能不是楼主希望的.我一开始也想到用MAX函数,但是无法解决列很多的问题.

使用道具

9
cz851218 发表于 2010-5-10 17:06:54 |只看作者 |坛友微信交流群
谢谢了,非常感谢!!

使用道具

10
soporaeternus 发表于 2010-5-10 17:10:59 |只看作者 |坛友微信交流群
8# nkwilling
仅仅是PDV有n列,输出的还是移动窗口的最大值和最大值条数距今差
Let them be hard, but never unjust

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-27 17:16