将时间序列与变量具有相同名称的不同观察数量合并(SAS)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将时间序列与变量具有相同名称的不同观察数量合并(SAS)相关的知识,希望对你有一定的参考价值。

我有一堆时间序列数据(sas-files),我喜欢将它合并/组合成一个更大的表(我对SAS很新)。

  1. 文件名:cq_ts_SYMBOL,其中SYMBOL是每个文件的相应符号
  2. 具有以下结构:

堕落:费城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      .

whole_bb.assist:fillet2

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-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个库存时间序列来说并不难做到这一点,但是,我想知道是否有可能做到以下几点:

  1. 从数据集cq_ts_AAA获取DATE TIME BID并将BID重命名为AAA(从符号中的值?这是否有意义?或从文件名中获取名称)。
  2. 对cq_ts_BBB执行相同操作。
  3. 实际上,循环遍历文件夹以获取文件和文件名的数量(这部分我或多或少,见下文)。
  4. 对于文件夹中的所有文件,合并cq_ts_BBB和cq_ts_BBB,其具有DATE TIME AAA(以前的出价AAA)BBB(BBB的前出价)。
  5. 这样做是为了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中获取它们(我如何获得一个值来重命名我的列?)?

不知何故,我很难改变列的顺序,即。我尝试使用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的公式

mid = (bid + ask)/2 ;

应该管用。最有可能的是,如果您获得了所有缺失值,则可能会将赋值语句放在SET或INPUT语句之前。换句话说,您尝试使用尚未读取的值进行计算。

以上是关于将时间序列与变量具有相同名称的不同观察数量合并(SAS)的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL表中,怎样将名字相同的信息合并,将其中的数值相加?

将具有相同 id 的行合并为一行,保留所有数据

不同对象中具有相同名称的两个变量改变彼此的值

如何通过Python合并具有相同名称但在不同文件夹中的文件的内容?

使用 predict() 时,预测变量数相同但行数不同的新数据出错

反序列化在不同 MailChimp 列表中具有不同名称的合并字段和兴趣