Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 合并具有不同观察次数的时间序列,其中变量具有相同的名称(SAS)_Loops_Merge_Macros_Time Series_Renaming - Fatal编程技术网

Loops 合并具有不同观察次数的时间序列,其中变量具有相同的名称(SAS)

Loops 合并具有不同观察次数的时间序列,其中变量具有相同的名称(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

我有一堆时间序列数据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: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;?不确定如何编辑上面的评论,但是:请忽略最后的问题。您只能编辑评论一段时间。但您可以删除它们并输入新的。