【问题标题】:Merging time series with different number of observations where variables have the same name (SAS)合并具有不同数量观察值的时间序列,其中变量具有相同名称(SAS)
【发布时间】:2018-03-04 19:00:16
【问题描述】:

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

  1. 文件名: cq_ts_SYMBOL,其中 SYMBOL 是每个文件各自的符号

  2. 结构如下:

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

  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 中提取符号(以及如何获得一个值来重命名我的列?)是否有意义?

不知何故,我很难改变列的顺序,即。我尝试了保留和格式。

【问题讨论】:

  • 为什么?为什么要从变量中取出 Symbol 的值并将其转换为变量的名称?你原来的结构对我来说看起来不错。您始终可以只使用 PROC REPORT 来制作以符号值作为列标题的报告。

标签: loops merge macros time-series renaming


【解决方案1】:

看起来您可以使用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 语句之前。换句话说,您尝试使用尚未读入的值进行计算。

【讨论】:

  • 亲爱的汤姆,正如我的拉丁老师常说的:条条大路通罗马;而你刚刚在那儿找到了我的私人飞机!在您是否建议 - 基于效率 - 在第一个数据集步骤期间创建一个新变量,即 datetime = dhms(date,0,0,time);然后转置或先转置然后创建新变量?并创建我的中间变量 (mid = (bid + ask) / 2;)?
  • 不确定如何编辑上面的评论,但是:请忽略最后的问题。
  • 您只能暂时编辑 cmets。但是您可以删除它们并输入新的。
猜你喜欢
  • 1970-01-01
  • 2015-07-25
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
相关资源
最近更新 更多