楼主: ciciwanghk
3974 14

[原创博文] sas编程问题,大侠帮忙做出这个结果 [推广有奖]

  • 0关注
  • 0粉丝

博士生

13%

还不是VIP/贵宾

-

威望
0
论坛币
75 个
通用积分
1.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2914 点
帖子
97
精华
0
在线时间
289 小时
注册时间
2009-7-15
最后登录
2022-4-30

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
原数据程序如下
  1. data a;
  2. input name $        date $        price1;
  3. cards;
  4. a        20080101        23
  5. a        20080102        43
  6. a        20080103        134
  7. a        20080104        43
  8. a        20080105        243
  9. a        20080106        43
  10. a        20080107        32
  11. a        20080108        4
  12. b        20080101        324
  13. b        20080102        3
  14. b        20080103        43
  15. b        20080104        23
  16. b        20080105        3
  17. b        20080106        32
  18. ;
  19. run;
复制代码
price1指的是昨日价格,今日价格用price表示,另外还要求出一个变量叫因子,公式是昨日价格/今日价格*昨日因子,因子初始值为1
我想要的结果是这样的:name date price1 price  yinzi
二维码

扫码加我 拉你入群

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

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

关键词:sas编程问题 SAS编程 Price cards Input price 程序

回帖推荐

已有 1 人评分论坛币 收起 理由
论坛数据分析 + 100 SAS版面二日最佳人气奖励

总评分: 论坛币 + 100   查看全部评分

本帖被以下文库推荐

沙发
yvh74 发表于 2011-2-11 14:59:23 |只看作者 |坛友微信交流群
用一个笨办法,将date设为num,用滞后,效率不高,也许合乎要求:
data a;
input name $        date        price;
if name="a" then date2=lag(date);
    else if name="b" then date2=lag(date);
else;
cards;
a        20080101        23
a        20080102        43
a        20080103        134
a        20080104        43
a        20080105        243
a        20080106        43
a        20080107        32
a        20080108        4

b        20080101        324
b        20080102        3
b        20080103        43
b        20080104        23
b        20080105        3
b        20080106        32
;
run;
每人一小步,人类一大步

使用道具

藤椅
ciciwanghk 发表于 2011-2-11 15:05:42 |只看作者 |坛友微信交流群
2# yvh74 可是我的数据量有几百万,name有几千个名字

使用道具

板凳
yvh74 发表于 2011-2-11 15:06:12 |只看作者 |坛友微信交流群
呵呵,要不我笨呢。事实上电脑挺快的。我曾遇见过更大样本的数据,呵呵,笨办法搞定算了。
每人一小步,人类一大步

使用道具

报纸
yvh74 发表于 2011-2-11 15:39:34 |只看作者 |坛友微信交流群
再来一下(前提是日期连续):
data a;
input name $        date        price;
pr=price;
datelag=lag(date);
if date-datelag ne 1 then pr=.;
else;
cards;
a        20080101        23
a        20080102        43
a        20080103        134
a        20080104        43
a        20080105        243
a        20080106        43
a        20080107        32
a        20080108        4
b        20080101        324
b        20080102        3
b        20080103        43
b        20080104        23
b        20080105        3
b        20080106        32
;
run;

proc print;
run;

                                  1     a      20080101      23       .           .
                                  2     a      20080102      43      43    20080101
                                  3     a      20080103     134     134    20080102
                                  4     a      20080104      43      43    20080103
                                  5     a      20080105     243     243    20080104
                                  6     a      20080106      43      43    20080105
                                  7     a      20080107      32      32    20080106
                                  8     a      20080108       4       4    20080107
                                  9     b      20080101     324       .    20080108
                                 10     b      20080102       3       3    20080101
                                 11     b      20080103      43      43    20080102
                                 12     b      20080104      23      23    20080103
                                 13     b      20080105       3       3    20080104
                                 14     b      20080106      32      32    20080105
每人一小步,人类一大步

使用道具

地板
ciciwanghk 发表于 2011-2-11 15:45:08 |只看作者 |坛友微信交流群
5# yvh74 可是日期是不连续的,我做的是股票,股票周六周日是不开盘的,而且就算是连续的话,2月份的减去一月份的数据也不对啊,还有就是原数据里日期是字符型的。原数据是给你的,相当于直接用a这个数据集做分析。帖子我稍微修改了一下。呵呵不过辛苦了,非常感谢

使用道具

7
hssnow 发表于 2011-2-11 16:57:15 |只看作者 |坛友微信交流群
先抱歉一个,关于股票这方面知识比较欠缺,price1 是昨日价格,那好比对第二行数据:
a        20080102        43
就是说2008年1月2日,a 产品的“昨日价格”是43,即2008年1月1号的实际(今日)价格是43么?
就是将所有的 price1 前移一位就得到 price (今日价格)么?
或者楼主能否给出部分你想要的结果表看一下?
My Blog: http:/hssnow.name/
宁静致远

使用道具

8
baoaibaobao 发表于 2011-2-11 17:32:05 |只看作者 |坛友微信交流群
  1. data a;
  2. input name $ date $ price1;
  3. date1=mdy(substr(date,5,2),substr(date,7,2),substr(date,1,4));
  4. format date1 yymmdd10.;
  5. drop date;
  6. cards;
  7. a        20080101        23
  8. a        20080102        43
  9. a        20080103        134
  10. a        20080104        43
  11. a        20080105        243
  12. a        20080106        43
  13. a        20080107        32
  14. a        20080108        4
  15. b        20080101        324
  16. b        20080102        3
  17. b        20080103        43
  18. b        20080104        23
  19. b        20080105        3
  20. b        20080106        32
  21. ;
  22. proc sort data=a(rename=(date1=date));
  23.         by name descending date;
  24. run;
  25. data a;
  26.         set a;
  27.         by name;
  28.         price=lag(price1);
  29.         if first.name then price=.;
  30. run;
  31. proc sort data=a;
  32.         by name date;
  33. run;
  34. data a;
  35.         set a;
  36.         by name;
  37.         retain factor;
  38.         if first.name then factor=price1/price;
  39.         else factor=price1/price*factor;
  40. run;
  41. proc sql;
  42.         create table a as
  43.         select name,date,price1,price,factor
  44.         from a;
  45. quit;
复制代码
已有 3 人评分经验 论坛币 学术水平 热心指数 收起 理由
ciciwanghk + 1 + 1 厉害
crackman + 40 + 2 鼓励积极发帖讨论
论坛数据分析 + 100 + 2 我很赞同

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

使用道具

9
ciciwanghk 发表于 2011-2-11 17:34:50 |只看作者 |坛友微信交流群
7# hssnow 你的理解是对的,就是上移一个

使用道具

10
ciciwanghk 发表于 2011-2-11 17:48:58 |只看作者 |坛友微信交流群
8# baoaibaobao
  1. name        date        price        price1        yinzi        
  2. a        20080101        23        43        43/23*1=1.869565        1.869565217
  3. a        20080102        43        134        134/42*1.869565=5.964803        5.964802619
  4. a        20080103        134        43               
  5. a        20080104        43        243               
  6. a        20080105        243        43               
  7. a        20080106        43        32               
  8. a        20080107        32        4               
  9. a        20080108        4                        
  10. b        20080101        324        3               
  11. b        20080102        3        43               
  12. b        20080103        43        23               
  13. b        20080104        23        3               
  14. b        20080105        3        32               
  15. b        20080106        32                        
复制代码
这是我想要的结果,我把因子的计算公式写出来了
因子初始值是1只是在计算的第一个值是1而不是因子的第一个值就是1name是股票名,每只股票因子初始值是1

使用道具

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

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

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

GMT+8, 2024-4-28 17:42