全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
7229 13
2012-04-09

我有一个数据表的前两列如下所示,现在我想进一步筛选出其中的一些数据,想法是:依据“窗口”数据,提取出各只股票分别在第0天前后各2个交易日内的数据来(每只股票总共要5个交易日的数据),想问下sas中有没有sql语言能实现这个步骤呀?谢谢了!!

      股票          窗口                        

300137

-3

300137

-2

300137

-1

300137

0

300137

4

300151

-4

300151

-1

300151

0

300151

1

300151

2

300151

3

300152

-4

300152

-1

300152

0

300152

1

300152

2

300152

3

300156

-1

300156

0

300156

1

300156

2

300159

-4

300159

-3

300159

-2

300159

1

300159

2

300159

3

300159

4

300170

-4

300170

-3

300170

-2

300170

-1

300170

0

300170

3

300170

4

300180

-4

300180

-1

300180

0

300180

1

300180

2

300180

3

300217

-2

300217

-1

300217

0

300217

1

300217

2

300218

-4

300218

-1

300218

0

300218

1

300218

2

300218

3



以如下股票为例,

300152

-4

300152

-1

300152

0

300152

1

300152

2

300152

3

我想将其进一步筛选成

300152

-4

300152

-1

300152

0

300152

1

300152

2

二维码

扫码加我 拉你入群

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

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

全部回复
2012-4-9 22:45:30
股票:gp 窗口:ck 数据集为 a
proc sort data=a;
    by gp descending ck;
run;
data a;
   set a;
     retain t 0;
      if gp=lag(gp) and ck=0 then t+1;
      if gp^=lag(gp) then t=0;
         t1=t;
          if t^=0 then t2+1;
          if t=0 then t2=0;
          if t2>3 then t1=0;
            drop t t2;
               
run;
proc sort data=a;
   by gp ck;
run;
data a;
    set a;
           retain k 0;
              if gp=lag(gp) and ck=0 then k+1;
      if gp^=lag(gp) then k=0;
         k1=k;
          if k^=0 then k2+1;
          if k=0 then k2=0;
          if k2>3 then k1=0;
            drop k k2;
run;
data b;
   set a;
      if t1=0 or k1=0 then delete;
          drop t1 k1;
run;
数据集b就是你想要得~
二维码

扫码加我 拉你入群

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

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

2012-4-9 23:50:51
股票:gp 窗口:ck 数据集为 a

/*每支股票必须大于等于5条记录*/
proc sql noprint;
        create table work.b as
                select *,
                        count(name) as cnt
                from work.a
                group by name
                having cnt>=5
                order by name,sum;
quit;

/*每支股票只取前五条*/
data work.c(drop = i cnt);
        set work.b;
        by name sum;
        if first.name then do;
                i = 1;
                retain i;
        end;else do;
                i = i+1;
                retain i;
        end;
        if i>=6 then delete;
run;
二维码

扫码加我 拉你入群

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

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

2012-4-10 09:30:38
louka99 发表于 2012-4-9 22:45
股票:gp 窗口:ck 数据集为 a
proc sort data=a;
    by gp descending ck;
谢谢好心人的帮助,祝你万事如意!
二维码

扫码加我 拉你入群

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

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

2012-4-10 09:32:07
chendonghui1987 发表于 2012-4-9 23:50
股票:gp 窗口:ck 数据集为 a

/*每支股票必须大于等于5条记录*/
谢谢好心人的帮助,祝你万事如意!
二维码

扫码加我 拉你入群

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

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

2012-4-10 10:24:24
chendonghui1987 发表于 2012-4-9 23:50
股票:gp 窗口:ck 数据集为 a

/*每支股票必须大于等于5条记录*/
这个好像不行吧?他得本意是要提前0前后的两个数据,如果小于0的数据小于2个,那么最后可能就是4个数据。如果确实是要严格每支股票5个数据,那么你程序的第一步筛选是没错的。第二步程序提前5条,那么有可能是-4 -3 -2 0 1,不符合本意~
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群