楼主: sherrysmile
7632 9

[原创博文] 因本人数据量很大 请教如何分类计算大量数据的平均值 [推广有奖]

  • 0关注
  • 0粉丝

高中生

87%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
199 点
帖子
31
精华
0
在线时间
25 小时
注册时间
2011-5-2
最后登录
2011-12-18

楼主
sherrysmile 发表于 2011-9-12 11:38:53 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
运行数据时碰到一个问题,现有共十年的daily股票收益,每个股票分类到4种投资组合(portfolio)里, 例子如下:
date              股票代码   portfolio   return
19910101           AD         1           0.001
19910101           jhk         1           0.123
19910101           koj         2           -0.024
19910101           jkh         2           0.0013
19910101           ab          3           0.144
19910101           fff           3           -0.003
19910101           ere         4           0.094
19910101           frrh        4            0.0038

19910102            fh          1            0.002
19910102            te          1            0.002
19910102           jiou         2            0.0435
19910102           iuiu         2            0.0054
19910102             ui          3            0.0535
19910102            rge        3            0.0432
19910102            vds        4            0.0236
19910102            ewi         4           0.0877
     .
     .
     .
     .
现在我想用sas计算每天每个portfolio的平均收益, 例如一月一号potfolio1的平均收益 = (0.001+0.123)/2,
                                                                                                    portfolio2的平均收益= (-0.024+0.0013/2
                                                                                                          .
                                                                                                          .
                                                                                     一月二号portfolio1的平均值收益= (0.002+0.002)/2
                                                                                                   portfolio2的平均值收益= (0.0435+0.0054)/2
                                                                                         以此类推
一共算出十年每天每种portfolio的平均收益
我知道用 proc means data = “   " mean sum maxdec = 4;
               class “  ";
               var return;
               run;
可以计算 但是适合于数据比较少的变量 因为算出的结果会在另外的output中输出。但我的数据量十分大,按日期分类的话一共十年3千6百多天,用以上的code不方便计算,有没有其他的代码可以一次性算出总共10年每天每个投资组合的平均收益值? 请高手多多指教 谢谢!!
二维码

扫码加我 拉你入群

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

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

关键词:平均值 Portfolio Portfoli RETURN output 投资组合 股票代码 平均值 如何 收益

沙发
miniwhale 发表于 2011-9-12 12:00:41
SPSS用Group分组后计算
其实,如果你用Excel中的数据透视表的话,会有惊喜喔:)

藤椅
sherrysmile 发表于 2011-9-12 12:39:25
我的数据量太大 大概有一千多万个测量值 excel放不下。。。spss我没有试过不知道能不能import进去那么多的测量值 当然多谢ls大侠说的方法 我会去试试 毕竟又多学集中新方法以后可以用哦 呵呵

不过还希望有哪位大侠能知道在sas里如何计算 多谢多谢!!

板凳
shenliang_111 发表于 2011-9-12 15:45:51
  1. try this---four methods;
  2. data a;
  3. informat date yymmdd8.;
  4. format date yymmdd10.;
  5. input date  code $ portfolio return;
  6. cards;
  7. 19910101           AD         1           0.001
  8. 19910101           jhk         1           0.123
  9. 19910101           koj         2           -0.024
  10. 19910101           jkh         2           0.0013
  11. 19910101           ab          3           0.144
  12. 19910101           fff           3           -0.003
  13. 19910101           ere         4           0.094
  14. 19910101           frrh        4            0.0038
  15. 19910102            fh          1            0.002
  16. 19910102            te          1            0.002
  17. 19910102           jiou         2            0.0435
  18. 19910102           iuiu         2            0.0054
  19. 19910102             ui          3            0.0535
  20. 19910102            rge        3            0.0432
  21. 19910102            vds        4            0.0236
  22. 19910102            ewi         4           0.0877
  23. ;
  24. /*sql*/
  25. proc sql;
  26. create table result as
  27. select date,portfolio,sum(return)/count(*) as mean_return from a
  28. group by date,portfolio
  29. order by 1,2;
  30. quit;
  31. run;
  32. /*data step*/
  33. data result2;
  34. sum_return=0;
  35. do _n_=1 by 1 until(last.portfolio);
  36. set a;
  37. by date portfolio;
  38. sum_return+return;
  39. if last.portfolio then mean_return=sum_return/_n_;
  40. drop  code return sum_return;
  41. end;
  42. run;
  43. /*proc means*/
  44. ods output summary=result3;
  45. proc means data=a mean ;
  46. var return;
  47. class date portfolio;
  48. run;
  49. ods output close;
  50. /*hash object*/
  51. data _null_;
  52. length date portfolio sum_return cnt 8.;
  53. if _n_=1 then do;
  54. declare hash h(ordered:'y');
  55. h.definekey('date','portfolio');
  56. h.definedata('date','portfolio','sum_return','cnt')
  57. h.definedone();
  58. call missing(date,portfolio,sum_return,cnt);
  59. end;
  60. set a(drop=code) end=last;;
  61. rc=h.find();
  62. if rc=0 then do;
  63. sum_return+return;
  64. cnt+1;
  65. h.replace();
  66. end;
  67. else do;
  68. sum_return=return;
  69. cnt=1;
  70. h.add();
  71. end;
  72. if last then h.output(dataset:'result3');
  73. run;
  74. data result3(drop=sum_return cnt);
  75. set result3;
  76. mean_return=sum_return/cnt;
  77. run;
复制代码
已有 4 人评分学术水平 热心指数 信用等级 收起 理由
pl172231 + 1 + 1 + 1 观点有启发
xiaobing212 + 1 + 1 + 1 精彩帖子
soporaeternus + 1 + 1 + 1 我很赞同
jingju11 + 1 + 1 + 1 真可谓博大精深!

总评分: 学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

报纸
sherrysmile 发表于 2011-9-13 02:32:45
shenliang_111 发表于 2011-9-12 15:45
太强大了 !非常感谢shenliang_111提供的四种方法 我试过了都运行成功了!many thanks!

地板
jingju11 发表于 2011-9-13 11:45:38
  1. data have;
  2.         do x =1 to 5500000;
  3.                 if ranuni(1) >0.95 then group ++1;
  4.                 output;
  5.         end;
  6. run;
复制代码
很好的程序。
京剧

7
shenliang_111 发表于 2011-9-13 13:38:13
jingju11 发表于 2011-9-13 11:45
权当是对S楼上的模拟之作。前两种基于数据已经排序。如果数据较大,运行时间由短到长排列。那个hash,语法都 ...
在大侠面前班门弄斧了...呵呵,.连mean函数都忘了...

8
liyimin88 发表于 2012-5-7 18:41:17
厉害!

9
wozxmzxmzxmzxm 发表于 2012-5-7 20:30:35
学习一下!!!!!

10
nernernini 发表于 2012-5-7 22:58:17
very great. good to learn. thanks.

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 03:11