楼主: xmt945
4716 13

[问答] 如何把列数据转成多列数据(处理股票数据) [推广有奖]

  • 1关注
  • 4粉丝

已卖:152份资源

本科生

56%

还不是VIP/贵宾

-

威望
0
论坛币
1380 个
通用积分
0.0600
学术水平
8 点
热心指数
8 点
信用等级
7 点
经验
5505 点
帖子
56
精华
0
在线时间
94 小时
注册时间
2013-2-27
最后登录
2021-2-26

楼主
xmt945 发表于 2013-11-17 01:57:18 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
小生想把从CSMAR获取的股票数据(见源文件)改成目标文件。
  即把单列的股票数据改成多列的股票数据。
因为有些股票月份数据没有,而且,每个股票行长度又不一样,不知道怎么处理。     如果空缺的话,则本月数据(value)等于  上月数据(value)。
具体文件见EXCEL,sheet1是源文件,sheet2是目标文件
TRD_Mnth.xls (35 KB)

原文件:
源文件
目标文件
目标文件
二维码

扫码加我 拉你入群

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

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

关键词:股票数据 value sheet CSMAR EXCEL 拆分

回帖推荐

yongyitian 发表于7楼  查看完整内容

沙发
jasonscut 在职认证  发表于 2013-11-17 04:22:28
可以考虑用个macro (stock),
每次把里面的股票整理出来,
再建一个单列数据,只包括所有月份,
Macro 里面每次做left join.

这个方法肯定可行,不过可能有更好的。
北美统计金融博士

藤椅
A072560 发表于 2013-11-17 09:15:59
你看看,是否按你的需求,你给的数据多,不太好展示,我就拿了其中几个case.

DATA A;
INPUT month        $ stock $ value;
CARDS;
2013-10        000001        69063176.86
2013-09        000001        59026657.64
2013-08        000001        52716568.81
2013-10        000002        89106208.82
2013-09        000002        88332213.52
2013-10        000004        978826.61
;

PROC SORT DATA=A OUT=B;
BY DESCENDING month stock;

DATA C;
SET B;
BY DESCENDING month ;
ARRAY ST{4} $ STOCK1-STOCK4;
ARRAY V{4}  VALUE1-VALUE4;
RETAIN ST V ;
IF FIRST.MONTH THEN DO;
I=0;
DO J=1 TO DIM(ST);
CALL MISSING(ST{J});
  CALL MISSING(V{J});
END;
END;
I+1;
ST{I}=STOCK;
V{I}=VALUE;
IF LAST.MONTH;
DROP STOCK VALUE I J;
RUN;

PROC PRINT;
RUN;

这里是已知你最多有4个股票,如果未知,还需要一步才能自动化,你自己也想想吧。

板凳
xmt945 发表于 2013-11-18 23:10:00
jasonscut 发表于 2013-11-17 04:22
可以考虑用个macro (stock),
每次把里面的股票整理出来,
再建一个单列数据,只包括所有月份,
1900个股票。要整理1900个文件。。。。在MERGE by month,我也会啊。。但是1900个文件啊!!!

报纸
xmt945 发表于 2013-11-19 00:19:01
A072560 发表于 2013-11-17 09:15
你看看,是否按你的需求,你给的数据多,不太好展示,我就拿了其中几个case.

DATA A;
PROC SORT DATA=A OUT=B;
BY DESCENDING month stock;
执行的时候遇到问题
QQ图片19931119000235.jpg


QQ图片19931119000235.jpg (18.18 KB)

QQ图片19931119000235.jpg

地板
xmt945 发表于 2013-11-19 00:33:48
A072560 发表于 2013-11-17 09:15
你看看,是否按你的需求,你给的数据多,不太好展示,我就拿了其中几个case.

DATA A;
在补充一点,如果数据是这样
DATA A;
INPUT month        $ stock $ value;
CARDS;
2013-10        000001        69063176.86
2013-09        000001        59026657.64
2013-08        000001        52716568.81
2013-10        000002        89106208.82
2013-09        000002        88332213.52
2013-10        000004        978826.61
2013-09        000004        132445.45
2013-08        000004        323456.33
;

那么最后显示的是
QQ图片19931119003300.jpg
发现在stock2组里,出现了000002和000004

7
yongyitian 发表于 2013-11-19 23:12:59
  1. /* try this */

  2. proc sort data=trd_mnth out=trd_sort;
  3.    by stock month;
  4. run;

  5. data _null_;
  6.     set trd_sort end=last;
  7.       by stock;
  8.       Retain NS 0;
  9.       if first.stock then do;
  10.          NS+1;
  11.          call symput('stock'||compress(put(NS,best.)), put(stock, $6.));
  12.        end;
  13.    if last then call symput('NN', compress(put(NS,best.)));
  14. run;

  15. %macro merger;
  16.      data wanted;
  17.         set trd_sort;
  18.         label value=value1 stock=stock1;
  19.         where stock="&stock1";
  20.         rename value = value1 stock = stock1;
  21.      run;
  22.      %do i = 2 %to &NN;
  23.         data temp;
  24.           set trd_sort;
  25.           label value=value&i stock=stock&i;
  26.           where stock = "&&stock&i";
  27.           rename value = value&i stock = stock&i;
  28.         run;
  29.         data wanted;
  30.           merge wanted temp;
  31.           by month;
  32.         run;
  33.      %end;
  34. %mend;
  35. %merger
复制代码
已有 1 人评分学术水平 收起 理由
xmt945 + 1 好的意见建议

总评分: 学术水平 + 1   查看全部评分

8
jasonscut 在职认证  发表于 2013-11-20 06:25:07
xmt945 发表于 2013-11-18 23:10
1900个股票。要整理1900个文件。。。。在MERGE by month,我也会啊。。但是1900个文件啊!!!
哎,
无言。。。
北美统计金融博士

9
H09800332 发表于 2013-11-20 09:37:48 来自手机
不知道你想怎么分析这些数据,不过我感觉使用矩阵转置效果也好,不过不能达到你要的目标文件,你可以试一下

10
A072560 发表于 2013-11-20 20:58:06
OH,SORRY。是我的错。你试试如下代码。
如有什么问题再商量吧。
DATA A;
INPUT month        $ stock $ value;
I=stock+0;
CARDS;
2013-10        000001        69063176.86
2013-09        000001        59026657.64
2013-08        000001        52716568.81
2013-10        000002        89106208.82
2013-09        000002        88332213.52
2013-10        000004        978826.61
2013-09        000005        132445.45
2013-08        000004        323456.33
;

PROC SORT DATA=A OUT=B;
BY DESCENDING month stock;
DATA C;
SET B;
I=stock+0;
RUN;

PROC TRANSPOSE DATA=C OUT=D(DROP=_NAME_) PREFIX=VALUE_ ;
BY MONTH NOTSORTED;
VAR   value  ;
ID I  ;

PROC PRINT;
RUN;

PROC TRANSPOSE DATA=C OUT=D2(DROP=_NAME_) PREFIX=stock_ ;
BY MONTH NOTSORTED;
VAR    stock;
ID I  ;


DATA ALL;
MERGE D D2;
RUN;
PROC PRINT;
RUN;
已有 1 人评分热心指数 收起 理由
xmt945 + 1 你的这个很喜欢,简单易懂。。。。。。

总评分: 热心指数 + 1   查看全部评分

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

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