楼主: qiaqiao
2202 8

[原创博文] data整理 [推广有奖]

  • 1关注
  • 1粉丝

已卖:3份资源

博士生

98%

还不是VIP/贵宾

-

威望
0
论坛币
74 个
通用积分
3.5400
学术水平
3 点
热心指数
6 点
信用等级
2 点
经验
3527 点
帖子
116
精华
0
在线时间
606 小时
注册时间
2009-1-27
最后登录
2025-6-1

楼主
qiaqiao 发表于 2010-12-8 21:14:43 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
4个data set:
data A :  code       date           ratio
             600000  2005-01-01  0.033
             600000  2005-01-03  0.765
             ............
data A 包括所有股票几年(2005-2008)的数据

data B  是部分股票在上述几年当中的上市的日期, 要求 在data A中删除 data B中i_ date开始的20个交易日的数据
data B : code   i_date
             600004   2005-07-03
             600008   2005-09-28
              。。。。。。。。。。

请教如何做
da
然后有data C 表示在05-08几年特别处理开始的时间
data C: code  s_date
            600009  2005-06-18

data D表示在05-08年特别处理结束的时间
data D : code d_date

要求在数据集 data A 中删除那些出现在data C中开始及以后的数据,若data D中出现
相应的结束的时间, 那么删除到此为止;如果data d中没有出现相应的结束时间, 则
将data A 中 从data C中显示的开始时间后相应的code的数据全部删除
二维码

扫码加我 拉你入群

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

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

关键词:Data ratio code date COD 交易日 如何

回帖推荐

andrawliu 发表于3楼  查看完整内容

1# qiaqiao

本帖被以下文库推荐

沙发
weihancool 发表于 2010-12-8 21:38:26
用SAS sql解决最方便啦
国士无双

藤椅
andrawliu 发表于 2010-12-9 22:29:37
  1. data a;
  2. input code $ date ratio;
  3. informat date yymmdd10.;
  4. format date yymmdd10.;
  5. datalines;
  6. 600000 2005-01-01 0.033
  7. 600000 2005-01-05 0.721
  8. 600000 2005-01-11 0.133
  9. 600000 2005-01-13 0.765
  10. 600000 2005-01-15 0.721
  11. 600000 2005-01-16 0.265
  12. 600000 2005-01-17 0.721
  13. 600000 2005-01-21 0.537
  14. 600000 2005-01-23 0.765
  15. 600000 2005-01-24 0.537
  16. 600000 2005-02-05 0.721
  17. 600000 2005-02-13 0.765
  18. 600000 2005-03-03 0.768
  19. 600000 2005-03-13 0.768
  20. 600001 2005-01-06 0.133
  21. 600001 2005-01-11 0.537
  22. 600001 2005-01-14 0.033
  23. 600001 2005-01-21 0.437
  24. 600001 2005-01-22 0.931
  25. 600001 2005-02-01 0.931
  26. 600001 2005-02-21 0.833
  27. 600001 2005-02-23 0.631
  28. 600001 2005-02-27 0.131
  29. 600001 2005-03-06 0.133
  30. 600001 2005-03-13 0.133
  31. 600001 2005-03-16 0.133
  32. 600001 2005-05-03 0.768
  33. 600001 2005-05-03 0.768
  34. 600002 2005-01-03 0.665
  35. 600002 2005-01-13 0.265
  36. 600002 2005-01-23 0.465
  37. 600002 2005-02-13 0.265
  38. ;
  39. run;
  40. data b;
  41. input code $ i_date;
  42. informat i_date yymmdd10.;
  43. format i_date yymmdd10.;
  44. datalines;
  45. 600000 2005-01-15
  46. 600001 2005-02-01
  47. ;
  48. run;
  49. data c;
  50. input code $ s_date;
  51. informat s_date yymmdd10.;
  52. format s_date yymmdd10.;
  53. datalines;
  54. 600000 2005-01-13
  55. 600001 2005-01-22
  56. ;
  57. run;
  58. data d;
  59. input code $ d_date;
  60. informat d_date yymmdd10.;
  61. format d_date yymmdd10.;
  62. datalines;
  63. 600000 2005-02-05
  64. 600001 2005-02-21
  65. ;
  66. run;
  67. proc sql;
  68. create table out as
  69. select a.*,i_date,s_date,d_date
  70. from a left join b on a.code=b.code
  71. left join c on c.code=a.code
  72. left join d on d.code=a.code
  73. ;quit;
  74. data out(keep=code date ratio);
  75. set out;
  76. if date >= i_date and date <= i_date+10 then delete;
  77. if s_date^=. and date >=s_date and (date <= d_date or d_date=.) then delete;
  78. run;
复制代码
1# qiaqiao

板凳
qiaqiao 发表于 2010-12-11 20:32:26
谢谢楼上同学的帮助。
现在有个问题, 可能有些stock特别处理了2次, 开始时和结束时 在我考虑的区间有2个, 用
proc sql;
create table out as
   select a.*,i_date,s_date,d_date
   from a left join b on a.code=b.code
          left join c on c.code=a.code
          left join d on d.code=a.code
;quit;

会对同一只stock  四次匹配, 假设 600009 在2005-06-09,和2007-10-05特别处理开始, 在 2006-06-09和2008-10-08特别处理结束, 所以我应该删除05-06-9——06-06-09 和07-10-05——08-10-08的区间, 但是sql把 所有的可能匹配都列出来,也就是可能把05-06-09——08-10-08的数据也删除了。

报纸
soporaeternus 发表于 2010-12-11 21:43:00
在原数据情况不是太明了的情况下
我的建议是
1 c和d分别记录了一支股票的事件起始日和结束日,并且会有一支股票多次事件的话,应该会有对应事件的标记或者是默认的事件准则(比如对于同一支股票,早开始的事件,对应的结束日也较早),否则就像楼主4楼所说的那样,由于无法识别事件日期对应的事件而造成对所有事件始末日作笛卡儿积。对此我的建议是先将c和d合并,并且在此过程中明确事件的始末日,对于终止日缺失的事件,可以用2099-12-31之类的常量替代,以满足后面楼主的要求。
2 对于删除20个交易日的问题。如果之前a表是股票到交易日的全量,那么直接控制记录数就可以了,如果不是全量的话,那么可能需要一张到股票的全量交易日表,以免发生由于数据缺失而导致多删除20交易日之后的数据。

我发现打字要比打代码累,希望对楼主有帮助,思路明确的话3楼的代码足以借鉴,我就偷下懒,不打了,呵呵
Let them be hard, but never unjust

地板
qiaqiao 发表于 2010-12-11 22:35:12
谢谢楼上教授细心指导哈, 思路很有帮助, 偷懒 够我想半天:)

7
andrawliu 发表于 2010-12-12 17:06:26
  1. data a;
  2. input code $ date ratio;
  3. informat date yymmdd10.;
  4. format date yymmdd10.;
  5. datalines;
  6. 600000 2005-01-01 0.033
  7. 600000 2005-01-05 0.721
  8. 600000 2005-01-11 0.133
  9. 600000 2005-01-13 0.765
  10. 600000 2005-01-15 0.721
  11. 600000 2005-01-16 0.265
  12. 600000 2005-01-17 0.721
  13. 600000 2005-01-21 0.537
  14. 600000 2005-01-23 0.765
  15. 600000 2005-01-24 0.537
  16. 600000 2005-02-05 0.721
  17. 600000 2005-02-13 0.765
  18. 600000 2005-03-03 0.768
  19. 600000 2005-03-13 0.768
  20. 600001 2005-01-06 0.133
  21. 600001 2005-01-11 0.537
  22. 600001 2005-01-14 0.033
  23. 600001 2005-01-21 0.437
  24. 600001 2005-01-22 0.931
  25. 600001 2005-02-01 0.931
  26. 600001 2005-02-21 0.833
  27. 600001 2005-02-23 0.631
  28. 600001 2005-02-27 0.131
  29. 600001 2005-03-06 0.133
  30. 600001 2005-03-13 0.133
  31. 600001 2005-03-16 0.133
  32. 600001 2005-05-03 0.768
  33. 600001 2005-05-03 0.768
  34. 600002 2005-01-03 0.665
  35. 600002 2005-01-13 0.265
  36. 600002 2005-01-23 0.465
  37. 600002 2005-02-13 0.265
  38. ;
  39. run;
  40. data b;
  41. input code $ i_date;
  42. informat i_date yymmdd10.;
  43. format i_date yymmdd10.;
  44. datalines;
  45. 600000 2005-01-15
  46. 600001 2005-02-01
  47. ;
  48. run;
  49. data c;
  50. input code $ s_date;
  51. informat s_date yymmdd10.;
  52. format s_date yymmdd10.;
  53. datalines;
  54. 600000 2005-01-13
  55. 600000 2005-03-03
  56. 600001 2005-01-22
  57. ;
  58. run;
  59. data d;
  60. input code $ d_date;
  61. informat d_date yymmdd10.;
  62. format d_date yymmdd10.;
  63. datalines;
  64. 600000 2005-02-05
  65. 600001 2005-02-21
  66. ;
  67. run;
  68. data c;
  69. set c;
  70. by code;
  71. if first.code then num=1; else num+1;
  72. run;
  73. data d;
  74. set d;
  75. by code;
  76. if first.code then num=1; else num+1;
  77. run;
  78. proc sql;
  79. create table cd as
  80. select c.*,d_date
  81. from c left join d on c.code=d.code and c.num=d.num;
  82. update cd set d_date='30DEC2099'D  where d_date=.;
  83. create table out as
  84. select a.*
  85. from a
  86. except select a.* from a left join b on a.code=b.code where i_date<=date<=i_date+10
  87. except select a.* from a left join cd on a.code=cd.code where s_date<=date<=d_date
  88. ;
  89. quit;
复制代码

8
qiaqiao 发表于 2010-12-12 17:10:47
十分感谢andrawliu 同学, 自己编数据很辛苦, 拿来借鉴下

9
qiaqiao 发表于 2010-12-12 21:32:35
解决了, 谢谢 andrawliu, soporaeternus , weihancool同学的帮助

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-18 23:01