Loops 合并具有不同观察次数的时间序列,其中变量具有相同的名称(SAS)
我有一堆时间序列数据sas文件,我喜欢将它们合并到一个更大的表中。我对sas还比较陌生 文件名: cq_ts_SYMBOL,其中SYMBOL是每个文件的相应符号 结构如下: cq_ts_AAA.sas7bdat:文件1Loops 合并具有不同观察次数的时间序列,其中变量具有相同的名称(SAS),loops,merge,macros,time-series,renaming,Loops,Merge,Macros,Time Series,Renaming,我有一堆时间序列数据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
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:file2
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表、ASK表、具有以下结构的中间表,即对于BID表、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获取日期时间出价,并根据符号中的值将出价重命名为AAA?这有意义吗?或者从文件名中获取名称。
对cq\u ts\u BBB也要这样做。
事实上,在文件夹中循环以获得我或多或少获得的文件数和文件名,见下文。
对于文件夹中的所有文件,合并cq_ts_BBB和cq_ts_BBB,其日期时间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;
提取符号有意义吗?如何提取?它们的长度与文件名不同,或者只是从变量符号中取出来,我如何才能得到一个值来重命名我的列
不知何故,我很难改变列的顺序,例如,我尝试了retain和format。看起来你可以用PROC TRANSPOSE轻松做到这一点。将数据集合并到单个数据集中
data all ;
set set output.cq_ts_: ;
by date time;
run;
然后对每个源变量/目标表使用PROC TRANSPOSE
proc transpose data=all out=bid ;
by date time ;
id symbol;
var bid;
run;
给你的示例数据一个公式
mid = (bid + ask)/2 ;
应该有用。最有可能的情况是,如果您得到了所有缺少的值,您可能会将赋值语句放在SET或INPUT语句之前。换句话说,您试图使用尚未读入的值进行计算。为什么?为什么要从变量中取出Symbol的值,并将其转换为变量名?我觉得你原来的结构不错。您可以随时使用PROC REPORT生成一个以符号值作为列标题的报告;你刚刚在那里找到了我的私人飞机航班!根据效率,您建议在第一个数据集步骤中创建一个新变量,即datetime=dhmsdate,0,0,time;然后转置还是先转置再创建新变量?并创建mid变量mid=bid+ask/2;?不确定如何编辑上面的评论,但是:请忽略最后的问题。您只能编辑评论一段时间。但您可以删除它们并输入新的。