Объединение временных рядов с разным количеством наблюдений, где переменные имеют одинаковое имя (SAS)

У меня есть куча данных временных рядов (файлы 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, имеющие ДАТУ ВРЕМЯ 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 (и как мне получить одно значение для переименования моего столбца?)?

Как-то у меня возникают трудности с изменением порядка столбцов, т.е. Я пробовал с сохранением и форматированием.


person eternity1    schedule 04.03.2018    source источник
comment
Почему? Почему вы хотите взять значение Symbol из переменной и вместо этого превратить его в имя переменной? Ваша оригинальная структура выглядит хорошо для меня. Вы всегда можете просто использовать PROC REPORT для создания отчета со значениями символов в качестве заголовков столбцов.   -  person Tom    schedule 04.03.2018


Ответы (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 of

mid = (bid + ask)/2 ;

Должно сработать. Скорее всего, если вы получили все пропущенные значения, вы, вероятно, поместите оператор присваивания перед оператором SET или INPUT. Другими словами, вы пытались вычислить значения, которые еще не были считаны.

person Tom    schedule 04.03.2018
comment
Дорогой Том, как говорил мой учитель латыни: «Все дороги ведут в Рим; и вы только что нашли мне рейс на частном самолете прямо здесь! Во время Вы бы рекомендовали - исходя из эффективности - создать новую переменную на первом этапе набора данных, т.е. datetime = dhms(date,0,0,time); а затем транспонировать или сначала транспонировать, а затем создать новую переменную? а также создать мою среднюю переменную (mid = (bid + ask) / 2;)? - person eternity1; 05.03.2018
comment
не уверен, как отредактировать комментарий выше, но: пожалуйста, не обращайте внимания на последние вопросы. - person eternity1; 05.03.2018
comment
Вы можете редактировать комментарии только некоторое время. Но вы можете удалить их и ввести новые. - person Tom; 05.03.2018