【发布时间】:2018-03-04 19:00:16
【问题描述】:
我有一堆时间序列数据(sas 文件),我喜欢将它们合并/组合成一个更大的表(我对 SAS 很陌生)。
文件名: cq_ts_SYMBOL,其中 SYMBOL 是每个文件各自的符号
结构如下:
cq_ts_AAA.sas7bdat: 文件 1
SYMBOL DATE TIME BID ASK MID
AAA 20100101 9:30:00 10.375 10.4 .
AAA 20100101 9:31:00 10.38 10.4 .
.
.
AAA 20150101 15:59:00 15 15.1 .
cq_ts_BBB.sas7bdat: 文件2
SYMBOL DATE TIME BID ASK MID
BBB 20120101 9:30:00 12.375 12.4 .
BBB 20120102 9:31:00 12.38 12.4 .
.
.
BBB 20170101 15:59:00 20 20.1 .
主要特点: - 它们具有相同的变量名 - 他们有不同数量的观察 - 它们都保存在同一个文件夹中
所以我想做的是: - 创建3个表:BID-table、ASK-table、Mid-table,结构如下,即对于bid-table,cq_ts_bid.sas7bdat:
DATE TIME AAA BBB ...
20100101 9:30:00 10.375 .
20100102 9:31:00 10.38 .
.
.
20120101 9:30:00 9.375 12.375
20120102 9:31:00 9.38 12.38
.
.
20150101 15:59:00 15 17
.
.
20170101 15:59:00 . 20
对于 2 个股票时间序列来说,做到这一点并不难,但是,我想知道是否有可能做到以下几点:
- 从数据集 cq_ts_AAA 获取 DATE TIME BID 并将 BID 重命名为 AAA(根据符号中的值?这有意义吗?或者从文件名中获取名称)。
- 对 cq_ts_BBB 执行相同操作。
- 其实就是循环遍历文件夹获取文件个数和文件名(这部分我多多少少,见下文)。
- 合并文件夹中所有文件的 cq_ts_BBB 和 cq_ts_BBB,其 DATE TIME AAA(AAA 的前投标价格)BBB(BBB 的前投标价格)。
- 对 BID、ASK 和 MID 执行此操作(实际上,我无法从 bid 和 ask 中获取中点变量(即 mid= (bid + ask) / 2;))只是给了我“。”在之前创建文件时的数据步骤)。
我认为一个宏首先获取每个单个文件然后重命名(何时应该执行此步骤?)并将它们合并在一起 - 就像一个双循环。
这里是重命名和合并部分:
data ALDW_short (rename=(iprice = ALDW));
set output.cq_ts_aldw
retain date time ALJ;
run;
data ALJ_short (rename= (iprice = ALJ));
set output.cq_ts_alj;
retain date time datetime ALJ;
run;
data ALDW_ALJ_merged (keep= date itime ALDW ALJ);
merge ALDW_short ALJ_short;
by datetime;
run;
这是遍历文件夹并获取名称列表的部分:
proc contents data = output._all_ out = outputcont(keep = memname) noprint;
run;
proc sort data = outputcont nodupkey;
by memname;
run;
data _null_;
set outputcont end = last;
by memname;
i+1;
call symputx('name'||trim(left(put(i,8.))),memname);
if last then call symputx('count',i);
run;
从文件名中提取符号(以及如何提取符号?它们的长度不同)或者只是从变量 SYMBOL 中提取符号(以及如何获得一个值来重命名我的列?)是否有意义?
不知何故,我很难改变列的顺序,即。我尝试了保留和格式。
【问题讨论】:
-
为什么?为什么要从变量中取出 Symbol 的值并将其转换为变量的名称?你原来的结构对我来说看起来不错。您始终可以只使用 PROC REPORT 来制作以符号值作为列标题的报告。
标签: loops merge macros time-series renaming