合并具有不同数量观察值的时间序列,其中变量具有相同的名称(SAS)
Merging time series with different number of observations where variables have the same name (SAS)
我有一堆时间序列数据(sas 文件),我喜欢将它们合并/组合成一个更大的 table(我对 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个tables: BID-table, ASK-table, Mid-table,结构如下,即for 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 日期时间为 AAA(AAA 的前出价)BBB(BBB 的前出价),用于文件夹中的所有文件。
- 为 BID 执行此操作,然后为 ASK 执行此操作,最后为 MID(实际上我无法从出价和要价中获取中点变量(即 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 中提取符号(以及如何获得一个值来重命名我的列?)是否有意义?
不知怎么的,我很难改变列的顺序,即。我尝试保留和格式化。
看起来您可以使用 PROC TRANSPOSE
轻松地做到这一点。将您的数据集合并为一个数据集。
data all ;
set set output.cq_ts_: ;
by date time;
run;
然后对每个源 variables/target 表使用 PROC TRANSPOSE。
proc transpose data=all out=bid ;
by date time ;
id symbol;
var bid;
run;
根据您的示例数据,
的 MID 公式
mid = (bid + ask)/2 ;
应该可以。如果您获得了所有缺失值,您很可能会将赋值语句放在 SET 或 INPUT 语句之前。换句话说,您正在尝试使用尚未读入的值进行计算。
我有一堆时间序列数据(sas 文件),我喜欢将它们合并/组合成一个更大的 table(我对 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个tables: BID-table, ASK-table, Mid-table,结构如下,即for 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 日期时间为 AAA(AAA 的前出价)BBB(BBB 的前出价),用于文件夹中的所有文件。
- 为 BID 执行此操作,然后为 ASK 执行此操作,最后为 MID(实际上我无法从出价和要价中获取中点变量(即 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 中提取符号(以及如何获得一个值来重命名我的列?)是否有意义?
不知怎么的,我很难改变列的顺序,即。我尝试保留和格式化。
看起来您可以使用 PROC TRANSPOSE
轻松地做到这一点。将您的数据集合并为一个数据集。
data all ;
set set output.cq_ts_: ;
by date time;
run;
然后对每个源 variables/target 表使用 PROC TRANSPOSE。
proc transpose data=all out=bid ;
by date time ;
id symbol;
var bid;
run;
根据您的示例数据,
的 MID 公式mid = (bid + ask)/2 ;
应该可以。如果您获得了所有缺失值,您很可能会将赋值语句放在 SET 或 INPUT 语句之前。换句话说,您正在尝试使用尚未读入的值进行计算。