Sas let что это

Обновлено: 04.07.2024

Однако макроциклы не являются единственными инструментами для разработки программ, управляемых данными.

Один из таких инструментов — процедура CALL EXECUTE. Процедура CALL EXECUTE принимает единственный аргумент, который является символьной строкой или символьным выражением. Символьное выражение обычно представляет собой объединение строк, содержащих элементы кода SAS, которые должны быть выполнены после их разрешения. Выражение аргумента может включать символьные константы, переменные шага данных, ссылки на макропеременные, а также ссылки на макросы. Процедура CALL EXECUTE динамически создает код SAS во время итераций шага DATA. Этот код выполняется после завершения шага DATA. Это позволяет превратить шаг DATA, который выполняет итерации в таблице драйверов, в эффективный генератор кода SAS, который аналогичен генератору макросов SAS.

Однако довольно своеобразные правила разрешения аргументов процедуры CALL EXECUTE могут затруднить ее использование. Давайте проясним этот вопрос.

Строка аргумента не имеет ссылки на макрос или макропеременную

Если строка аргумента для процедуры CALL EXECUTE содержит код SAS без ссылок на макросы и макропеременные, этот код просто извлекается из текущего шага DATA и добавляется в очередь после текущего шага DATA. По мере того, как выполняется шаг DATA, код добавляется к очереди столько раз, сколько итераций шага DATA выполняется. После завершения этапа DATA код в очереди выполняется в порядке его создания.

Преимущество этой модели заключается в том, что строка аргумента может представлять собой объединение символьных констант (в одиночных или двойных кавычках) и переменных SAS, которые заменяются их значениями при вызове процедуры CALL EXECUTE для каждой итерации шага DATA. Это приводит к созданию динамически генерируемого кода SAS, точно так же, как в итеративном макроцикле SAS.

Рассмотрим следующий пример. Предположим, что нам нужно загрузить несколько таблиц Oracle в таблицы SAS.

Шаг 1. Создание таблицы драйверов

Чтобы наш процесс стал процессом, управляемым данными, давайте создадим таблицу драйверов, содержащую список имен таблиц, которые необходимо извлечь и загрузить:

Эта программа запускается только один раз и создает таблицу драйверов parmdl.tablelist.

Шаг 2. Загрузка нескольких таблиц

Затем вы можете использовать следующую программу, управляемую данными, которая запускается каждый раз, когда вам нужно перезагрузить таблицы Oracle в SAS:

Чтобы объединить компоненты аргумента CALL EXECUTE, я использовал функцию cats (), которая возвращает объединенную строку без начального и завершающего пробелов.

При запуске этой программы после шага данных _null_ добавляются и выполняются следующие операторы (данные получены из журнала SAS):

В этом примере мы используем шаг _null_ для обработки списка таблиц (parmdl.tablelist). Для каждого значения столбца tname создается новый шаг данных. Этот шаг данных выполняется после шага данных _null_. Этот процесс показан на следующей схеме:

Diagram explaining CALL EXECUTE for SAS data-driven programming

Строка аргумента содержит ссылку на макропеременную в двойных кавычках

Если аргумент CALL EXECUTE содержит ссылки на макропеременные в двойных кавычках, эти ссылки будут разрешены предварительным обработчиком макросов SAS во время компиляции шага DATA. Ничего необычного. Например, следующий код будет выполняться точно так же, как указано выше, и ссылки на макропеременные &olib и &slib будут разрешены в oralib и sasdl соответственно:

Строка аргумента содержит ссылку на макрос или макропеременную в одинарных кавычках

Здесь начинается интересное. Если аргумент процедуры CALL EXECUTE содержит ссылку на макрос или макропеременную в одинарных кавычках, этот аргумент все равно будет разрешен до того как код будет извлечен из шага DATA. Однако это извлечение выполняется не обработчиком макросов во время компиляции шага DATA, как для двойных кавычек. Ссылки на макросы или макропеременные в одинарных кавычках разрешаются самой процедурой CALL EXECUTE. Например, следующий код будет выполняться точно так же, как указано выше, и ссылки на макропеременные &olib и &slib будут разрешены процедурой CALL EXECUTE:

Соображения, касающиеся синхронизации

ВНИМАНИЕ: Если ваш макрос содержит некоторые конструкции, не связанные с макросом, для присваивания макропеременных во время выполнения — например, CALL SYMPUT или SYMPUTX (на шаге DATA) или предложение INTO (в PROC SQL) — то разрешение ссылок на эти макропеременные процедурой CALL EXECUTE произойдет слишком рано, прежде чем будет извлечен и выполнен сгенерированный макросом код. Это приведет к неразрешенным макропеременным. Давайте запустим следующий код, который извлекает таблицы Oracle в таблицы SAS, как указано выше, а также изменяет положения столбцов по названиям столбцов в алфавитном порядке:

Как и ожидалось, в журнале SAS появятся неразрешенные ссылки на макропеременные:

РЕШЕНИЕ: Чтобы избежать проблем с синхронизацией, когда ссылка на макрос разрешается процедурой CALL EXECUTE слишком рано, до того как будут присвоены во время исполнения шагов макросов, мы можем удалить CALL EXECUTE из привилегии разрешения макроса. Чтобы это сделать, можно замаскировать символы & и % с помощью функции макроса %nrstr. При этом процедура CALL EXECUTE "перестает видеть макросы", поэтому она извлечет код макроса без разрешения этого кода. В этом случае разрешение макроса произойдет после шага DATA, в котором находится процедура CALL EXECUTE. Если аргумент CALL EXECUTE вызывает макрос, то можно включить его в функцию макроса %nrstr. Следующий код будет работать корректно:

При выполнении этого шага DATA добавляются и выполняются следующие операторы (данные получены из журнала SAS):

Параметр CALL EXECUTE — переменная SAS

Аргумент процедуры CALL EXECUTE необязательно должен быть символьной константой или включать символьную константу. Он может представлять собой переменную SAS, точнее, символьную переменную. В этом случае поведение процедуры CALL EXECUTE аналогично поведению для аргументов в одинарных кавычках. Это означает, что если ссылка на макрос является частью значения аргумента, ее нужно замаскировать, используя макрофункцию %nrstr(), чтобы избежать упомянутой выше проблемы с синхронизацией.

В этом случае аргумент CALL EXECUTE может выглядеть следующим образом:

Делаем процедуру CALL EXECUTE полностью управляемой данными

В приведенных выше примерах мы использовали драйвер таблиц tablelist для получения значений одного параметра макроса для каждой итерации шага данных. Однако таблицу драйверов можно использовать не только для динамического присвоения значений одному или нескольким параметрам макроса, но и для управления тем, какой макрос будет выполняться на каждой итерации шага данных. На следующей схеме показана программа SAS, полностью управляемая данными:

Diagram explaining using CALL EXECUTE for SAS data-driven programming

Заключение

CALL EXECUTE — мощный инструмент для разработки приложений SAS, управляемых данными. Надеюсь, из этой статьи вы поняли, как избежать недостатков этого инструмента и эффективно использовать его для своих целей. Я буду рад вашим комментариям и хотел бы услышать ваши впечатления от использования процедуры CALL EXECUTE.

В предыдущей статье мы изучили, как читать внешние необработанные данные. А сегодня познакомимся с оператором SET, который считывает стандартные наборы данных SAS (SAS Data Set), научимся создавать срезы данных, настраивать постоянные атрибуты, а также изучим несколько полезных функций SAS. Я снова постараюсь изложить материал максимально простым языком, используя как можно больше примеров.



Допустим данные хранятся в формате EXCEL в директории C:\workshop\habrahabr. Импортируем электронную таблицу, создадим из нее срез, создадим новые вычисляемые столбцы, используя функции SAS, а затем разобьем данный набор данных на два.

Импорт электронной таблицы и задание фильтра


Файл excel хранится в указанной выше директории и имеет следующий вид:


Применим процедуру PROC IMPORT для преобразование электронной таблицы в набор данных SAS:


Опция validvarname=V7 задает «правильные» с точки зрения SAS имена полей: все недопустимые символы заменяет знаками нижнего подчеркивания. О правилах именования переменных можно прочитать в Уроке 1.

Зададим фильтр сразу при чтении внешнего файла, например, выберем только те наблюдения, в которых дата окончания работ не пропущена. Обратите внимание, на синтаксис параметра where.


Рассмотрим детально операторы шага PROC IMPORT:

Datafile – определяет полный путь и имя внешнего файла
Dbms — определяет тип данных для импорта.
Out – идентифицирует выходной набор данных SAS с одно- или двухуровневым именем SAS (имя библиотеки и имя набора данных).
Replace – перезаписывает существующий набор данных SAS.
Getnames – Указывает, генерирует ли PROC IMPORT имена переменных SAS из значений данных в первой строке во входном внешнем файле.

Запустим шаг PROC IMPORT и изучим LOG:


Распечатаем полученный набор данных SAS:


Вывод процедуры PROC PRINT показан ниже:


Также в SAS UE вы можете воспользоваться вкладкой «Результаты» и ознакомиться с импортированным набором данных SAS.


Чтение наборов данных SAS


Чтение набора данных SAS реализуется на шаге DATA с помощью оператора SET:

Рассмотрим общий синтаксис оператора SET:


Если вы не указываете в операторе SET набор данных, то он читает наблюдения из последнего созданного набора данных SAS.

В операторе SET можно указать несколько наборов данных, в этом случае SAS Data Sets допишутся один под другой (аналог UNION в SQL).

Также на шаге DATA может быть два оператора SET, в этом случае таблицы объединяются по общему столбцу. Подробнее о двух операторах SET можно прочитать, например, в этой статье.

Простейший код, создающий копию набора данных SAS, выглядит следующим образом:

Настройка дескриптора набора данных SAS

Изучить дескриптор набора данных SAS можно с помощью процедуры PROC CONTENTS (см. Урок 2). В данном уроке, мы распечатаем компоненту дескриптора с помощью процедуры PROC DATASETS:


Зададим постоянный формат для переменных Travel_Expenses и Budget:


Проверим атрибуты наборы данных SAS:


Создание вычисляемых столбцов

Кроме того, если нет подходящей функции для выполнения той или иной задачи, можно воспользоваться процедурой PROC FCMP и создать свою функцию.

В рамках данного урока мы изучим три функции YRDIF, SUM и CATS.

Для подсчета разницы в датах в годах мы будем использовать функцию YRDIF.

Напомню, что дата в формате SAS представляет собой количество дней, начиная с 01 января 1960 года (см. Урок 1). На представленных данных, нам необходимо вычислить время выполнения работ:


Обратите внимание, что с помощью формата 3.1 для переменной Lead_Time, мы округлили вычисленные значения в отчете (!) до 1 знака после запятой. Оператор формат не меняет значения в наборе данных SAS!


Далее вычислим стоимость работ без командировочных расходов:


В рамках нашей задачи стоимость работ без учета командировочных расходов мы вычислили без использования функции. В нашей таблице нет пропущенных значений, если бы одна из переменных (Budget или Travel_Expenses) имела бы пропущенное значение, результатом был «миссинг».

Создадим тестовый набор данных:


Вычислим разницу переменных Budget Travel_Expenses


Результат выполнения данного шага:


Для того, чтобы получить корректный результат, можно использовать функцию SUM.

Данная функция относится к категории функций описательной статистики. Функции описательной статистики игнорируют пропущенные значения.

Написание кода через SUM:


В этом случае результат выполнения шага выглядит следующим образом:


Для объединения текстовых значений в одну строку можно использовать функцию CATS.


Изучим дескриптор созданного набора данных:


Для того, чтобы задать длину переменной Email явно, необходимо использовать оператор LENGTH:


Создадим детализированный столбец на основании переменной Lead_Time, учитывая следующие условия:

  1. Если значение переменной Lead_Time менее 1, то столбец Detail имеет значение less than 1 year.
  2. Если значение переменной Lead_Time в диапазоне от 1 до 2, включая границы, то столбец Detail имеет значение 1-2 years.
  3. Если значение переменной Lead_Time в диапазоне от 2 до 3, исключая 2, то столбец Detail имеет значение 2-3 years.
  4. Если значение переменной Lead_Time в диапазоне от 3 до 4, исключая 3, то столбец Detail имеет значение 3-4 years.
  5. Если значение переменной Lead_Time в диапазоне от 4 до 5, исключая 4, то столбец Detail имеет значение 4-5 years.
  6. Во всех остальных случаях столбец Detail имеет значение above 5 years.
  1. IF-THEN-ELSE
  2. ELSE IF
  3. SELECT-WHEN


Добавим условие, которое выбирает только те наблюдения, в которых значение переменной Detail не равно ‘above 5 years’. При использовании where в качестве фильтра будет возникать синтаксическая ошибка:


Оператор where не используется для вычисляемых столбцов. Для отбора нужных нам переменных необходим выборочный оператор IF. Он отменяет вывод наблюдения в создаваемый набор данных:


Обратите также внимание, что выборочный оператор IF требует арифметический оператор. Мы не можем написать, например, так:


В Log выведется ошибка:


Настраиваем набор данных SAS.

В новом наборе данных SAS не должны присутствовать переменные Manager_FirstName и Manager_LastName. Данное требование реализуется с помощью параметра DROP, так же можно использовать оператор DROP.

Разбиваем созданный набор данных SAS на два по заданному условию

На одном шаге DATA можно создать несколько наборов данных SAS. Создадим для каждой страны отдельный набор данных.

Чтобы проверить, какие значения есть в столбце Country, можно, например, использовать процедуру PROC FREQ.


Данный шаг считает, сколько раз то или иное значение из переменной Country встречается в указанном в параметре data= наборе данных SAS.

Результат выполнения данного шага будет следующим:


Итак, создадим два набора данных на одном шаге DATA, используя оператор OUTPUT и условную обработку:


Запустим код и посмотрим LOG:


Это кратко о чтении наборов данных SAS и их настройке. В следующей статье мы познакомимся с Вами с объединением наборов данных с помощью операторов MERGE и SET.

А в качестве P.S. напомню структуру наших уроков по SAS BASE:

Статьи, которые уже опубликованы:


Буду рада обратной связи в комментариях! Какие еще темы Вы хотели бы увидеть в статьях?

SAS Macro language – это основной и, чуть ли не единственный, инструмент повторного использования кода в SAS. В данном уроке рассматриваются основные его возможности.

Простой пример макро кода:

Оператор title задает заголовок, который выводится в окне Output. Обратите внимание на строку, которая задана в этом операторе: в этой строке используются макро переменные &sysdate9 и &systime . Это встроенные в SAS макро переменные, они хранят значение даты и времени начала текущей сессии SAS (то есть ту дату и время, когда вы запустили SAS).

В результате выполнения программы в окне Output вы увидите:

7.1

Как видите, макро переменная &sysdate9 преобразовалась в строку 23SEP2016, а &systime в строку 22:15.

Пользователь может самостоятельно создавать макро переменные и присваивать им значения. Один из способов это сделать – воспользоваться макро оператором %LET. Заметьте, все макро переменные начинаются со знака ‘&’, все макро операторы со знака ‘%’.

Итак, создадим свою макро переменную и воспользуемся ею:

Если значение переменной STUDYID должно быть одно и то же во всех датасетах в пределах данного исследования, то хорошим приемом будет задать глобальную макро переменную "&study" и пользоваться ею во всех программах.

Теперь рассмотрим пример создания простого макроса.

Создание макроса всегда начинается с макро оператора %macro и заканчивается макро оператором %mend. Данный код создает макрос reldays, в качестве параметров, принимает макро переменные date, rel_date, rel_days. Назначение макроса уже должно быть понятным: посчитать количество дней от «базовой» даты rel_date до даты date.

Применим макрос для датасета AE:

7.2

Будем иметь в виду, что все даты в датасете AE являются строковыми переменными, а макрос reldays рассчитан на использование числовых

Итак, внутри дата степа мы вызываем макрос reldays с помощью знака ‘%’, и передаем ему такие параметры:

  • в качестве первого параметра date – AESTDT;
  • в качестве второго параметра rel_date – RFSTDT;
  • в качестве третьего – AESTDY.

Как работает этот код.

Если утрировать, SAS “подставляет” на место вызова %reldays(AESTDT, RFSTDT, AESTDY) код макроса, затем, на места макро переменных “подставляет” их значения, и только потом, выполняет получившийся датастеп. В логе можно видеть, как это происходит (опция MPRINT должна быть активна)

7.3

Результатом выполнения будет датасет ae_reldays:

7.4

Мы познакомились с понятиями макро переменных и макро операторов, рассмотрели несколько примеров их использования, а также создали и применили простейший макрос. Далее углубимся еще немного в эту тему.

Макро переменные могут быть локальными и глобальными.

  • Локальные – это переменные, которые действительны только в теле макроса (в куске кода от оператора %macro до оператора %mend).
  • Глобальные макро переменные действительны в течение всей сессии SAS, как в открытом коде, так и внутри любого макроса (только если локальная переменная с тем же именем временно не “перекрыла” глобальную).

Рассмотрим еще способы создания макро переменных и изучим области их действия на примерах.

Оператор %GLOBAL создает глобальные макро переменные с пустыми значениями. Чтобы задать этим макро переменным другие значения, можно использовать оператор %LET. Оператор %GLOBAL можно использовать как в открытом коде, так и в теле макроса – результат будет тот же.

Оператор %LOCAL создает локальные макро переменные с пустыми значениями. Этот оператор не может быть использован в открытом коде, только в теле макроса. Для переопределения значений так же используется оператор %LET.

В открытом коде мы имеем доступ только к глобальным переменным. В теле макроса доступны как глобальные, так и локальные. Локальные и глобальные макро переменные с одним и тем же именем не конфликтуют. Это значит, что в теле макроса может быть создана макро переменная с тем же именем, что и глобальная, при этом значение глобальной переменной останется неизменным, а внутри макроса SAS будет использовать значение локальной переменной.

Уже известный вам оператор %LET создает новую макро переменную, но только в том случае, если ранее не существовало переменной с таким именем, в противном случае – просто переопределяет значение уже существующей. Причем, если это тело макроса, то, сперва, оператор попытается переопределить значение локальной макро переменной, если же локальной с таким именем не существует, то переопределяется значение глобальной, и если не существует глобальной – будет создана новая локальная макро переменная.
Поскольку в открытом коде локальные переменные недоступны, оператор %LET в открытом коде создает или переопределяет только глобальные макро переменные.

Несколько слов о синтаксисе:
%let variable_name = <value>;
На месте <value> может быть как обычная строка, так и выражение содержащее другие макро переменные. Если опустить <value>, то значение макро переменной будет пусто

%let var1 = "PINK"; в результате, var1 = "PINK"

%let var2 = color; в результате, var2 = color

%let var3 = The &var2 is &var1; в результате, var3 = The color is "PINK"

Оператор %PUT позволяет увидеть в логе значение любой макро переменной, если она существует.

Рассмотрим пример, когда глобальная и локальная макро переменные имеют одно и то же имя:

  • Создаются две глобальные макро переменные, variable1 и variable2, им присваивается значение 1;
  • В макросе test_macro создаются две локальные макро переменные, variable1 и variable3. Им обоим присваиваются значение 2. Так же обратите внимание, что переменной variable2 так же присваивается значение 2.

Теперь, подумайте и определите, какими будут значения трех макро переменных variable1, variable2 и variable3 до, после и во время выполнения макроса test_macro. Теперь проверьте ваш ответ, посмотрев в лог программы:

7.5

Что еще необходимо знать о макро переменных?
Макро переменная – это всегда строка. Рассмотрим код:

Можно было бы ожидать, что макро переменная square будет содержать результат выполнения арифметических действий, square = 3.14 * (50**2) = 7850. Но это не так.

В логе мы увидим,

7.6

Если же мы хотим в переменной square хранить площать круга, то мы должны «заставить» SAS в процессе замещения макро переменных их значениями преобразовать строку в число и выполнить арифметические действия. Это делается с помощью макро функций %EVAL и %SYSEVALF. Подробнее о них, и о других макро функциях смотрите здесь Macro Functions.

7.7

Стоит отметить, что SAS в некоторых случаях умеет автоматически выполнять это преобразование. Например, в дата степе, когда значение числовой переменной вычисляется с помощью макро переменной:

Тут макро переменная &p преобразовалась в число без дополнительных усилий.

Еще несколько особенностей, о которых нужно помнить, работая с макро переменными.

  • SAS прекрасно распознаёт макро переменные внутри двойных кавычек. Более того, внутри двойных кавычек работают макро функции, макро операторы и сами макросы. А вот макро код в одинарных кавычках не распознается и обрабатывается как обычный текст.
  • Обычно SAS сам определяет где в коде макро переменная: началом служит &, а окончанием – любой невалидный символ SAS-имени. Например, в коде %let var = &sysdate-date; макропеременная &sysdate определится и преобразуется в соответствующую строку, поскольку ‘-’ не может являться частью имени в SAS. Мы получим макро переменую var = 23SEP16-date . А вот такой вариант: %let var = &sysdatedate; не даст нам нужного результата, поскольку макро переменной &sysdatedate не существует. Таким образом, в некоторых случаях, нам необходимо «подсказать» системе где заканчивается имя нужной макро переменной. Для этого служит точка. То есть, если выполнить %let var = &sysdate.date;, то получим макро переменную var = 23SEP16date .

Обратите внимание на запись format AESTDT & date_format .. ; Тут мы хотим наложить на переменную AESTDT, формат, который задан в макро переменной &date_format. Если мы поставим одну точку после имени: format AESTDT & date_format. ; - эта точка «скушается» SASом в счет имени самой макро переменной. Выполним такой код и обратим внимание на лог:

Лог программы (опция SYMBOLGEN должна быть активна):

7.7

То есть, SAS просто не будет знать, что date9 - это формат.

Как и макро переменные, макросы – это, по сути, текст, который будет подставлен в код там, где макрос был вызван. Конечно, по сравнению с макро переменными, у макросов больше возможностей:

  • Макросы могут содержать определенные макро операторы, которые позволяют контролировать какой именно текст будет сгенерирован в результате работы макроса
  • Макросы могут принимать входящие параметры.

Чтобы иметь возможность воспользоваться макросом, его необходимо сначала определить. Пример того, как это делается, вы уже видели:

Поговорим подробнее о синтаксисе.
После оператора %macro в обязательном порядке следует имя макроса (валидное имя SAS). Затем в круглых скобках параметры. Параметров в определении макроса может и не быть. Заканчивается тело макроса всегда оператором %mend, имя макроса после ключевого слова mend – опционально, его можно не указывать, тем не менее, это считается хорошим стилем программирования.

Параметры бывают двух типов: позиционными (positional) и ключевыми (keywords). В примере выше использовались позиционные, поэтому при вызове этого макроса важнейшую роль играет то, в каком порядке будут заданы параметры.

Несколько примеров вызова этого макроса:

  • %reldays(AESTDT, RFSTDT, AESTDY). Такой вызов означает, что макро переменная
    date = AESTDT,
    rel_date = RFSTDT,
    rel_days = AESTDY
  • %reldays(AESTDT, AESTDY, RFSTDT). Такой вызов означает, что макро переменная
    date = AESTDT,
    rel_date = AESTDY,
    rel_days = RFSTDT.
  • %reldays(AESTDT, AESTDY). Такой вызов означает, что
    date = AESTDT,
    rel_date = AESTDY,
    rel_days = .
  • %reldays(AESTDT, , AESTDY). Такой вызов означает, что
    date = AESTDT,
    rel_date = ,
    rel_days = AESTDY.
  • %reldays Такой вызов означает, что
    date = ,
    rel_date = ,
    rel_days = .

Все приведенные выше варианты абсолютно допустимы и не приведут к ошибкам на этапе компиляции программы.

Ключевые параметры задаются со знаком равно после имени параметра. Например,

После знака ‘=’ можно указать «значение по-умолчанию», то есть то значение, которое будет использоваться в случае, если при вызове макроса не будет указан этот параметр. Порядок, в котором вы указываете параметры при вызове макроса, здесь не важен, поскольку вы явно указываете, какому параметру присвоить данное значение.

  • %reldays(date=AESTDT, rel_days=AESTDY, rel_date=RFSTDT). Такой вызов означает, что макро переменная
    date = AESTDT,
    rel_date = RFSTDT,
    rel_days = AESTDY
  • %reldays(date=AESTDT, rel_days=AESTDY). Такой вызов означает, что макро переменная
    date = AESTDT,
    rel_days = AESTDY,
    rel_date = RFSTDT (сработало «значение по-умолчанию»).
  • %reldays(rel_days=AESTDY). Такой вызов означает, что
    date =,
    rel_days = AESTDY,
    rel_days = RFSTDT.
  • %reldays(AESTDT). Такой вызов приведет к ошибке, поскольку при определении макроса позиционных параметров не было объявлено.

При объявлении макроса часть параметров могут быть позиционными, а часть ключевыми. Самое главное, что при этом нужно помнить, – это то, что сначала должны быть перечислены все позиционные параметры, а потом все ключевые. Например,

Тут у нас один параметр (date) – позиционный, а два последующих (rel_date и rel_days) – ключевые. При вызове этого макроса первым всегда должно идти значение для параметра date. Например, вызов %reldays( , rel_days=AESTDY) будет корректным, а вот %reldays(rel_days=AESTDY, RFSTDT) вызовет ошибку.

Как уже было замечено ранее, макросы могут содержать некие макро операторы, которые помогают контролировать, какой текст будет сгенерирован макро процессором и подставлен на место вызова макроса.
Вот список наиболее часто используемых (полный список тут Macro Statements):

%* Macro Comment Statement
%DO Statement
%DO, Iterative Statement
%DO %UNTIL Statement
%DO %WHILE Statement
%END Statement
%GLOBAL Statement
%IF-%THEN/%ELSE Statement
%LET Statement
%LOCAL Statement
%MACRO Statement
%MEND Statement
%PUT Statement

Не так уж и много, как может показаться, тем не менее, этих операторов, в купе с макро функциями, достаточно для большинства макросов.
С операторами %GLOBAL, %LET, %LOCAL, %MACRO, %MEND, %PUT вы уже знакомы.
С операторами %DO, %DO %UNTIL, %DO %WHILE, %END, %IF-%THEN/%ELSE познакомиться не сложно, поскольку они аналогичны тем же операторам из SAS BASE. Важнее всего понять, чем они отличаются от обычных, и когда ими пользоваться.

Усовершенствуем наш макрос reldays так, чтобы можно было ним пользоваться и для строковых переменных-дат.

Итак, начнем с самого начала.
%macro reldays_iso(date, rel_date, rel_days, dates_iso=1);
Новый макрос reldays_iso имеет 4 параметра: первые три – позиционные (как было и раньше), и четвертый, новый, dates_iso – отвечает за то, с датами какого типа будет работать макрос. По умолчанию задано значение 1, что соответствует тому, что даты &date, &rel_date являются строковыми переменными в формате iso.

Работа макроса основана на том, что в зависимости от значения параметра dates_iso мы задаём значения для новых локальных макро переменных &date_num и &rel_date_num, и считаем дни известным нам способом.

Какие же значения могут принимать эти новые макро переменные?
Если мы работаем с числовыми датами, то есть &dates_iso ne 1, то новые макро переменные будут просто равны тем, что пользователь макроса передал в качестве параметра:

%let date_num = &date;
%let rel_date_num = &rel_date;

Если же пользователь передает в качестве параметров строковые переменные с датами в формате iso и не забывает при этом задать dates_iso=1, то в датасете будут созданы новые числовые переменные, date_num и rel_date_num, которые будут хранить в себе числовой эквивалент строковых дат. Имена этих новых числовых переменных будут присвоены локальным макро переменным &date_num и &rel_date_num:

Таким образом, определив значения макро переменных &date_num и &rel_date_num, становится возможным выполнить оставшийся код, &rel_days = &date_num - &rel_date_num + (&date_num >= &rel_date_num);


История возникновения

Для начала в сотый раз обратимся к рейтингу ресурса TIOBE, дабы отыскать в нём нашего сегодняшнего героя. SAS располагается на “предлидирующем” 21 месте, что, согласитесь, для data-языка великолепный результат. Так что давайте познакомимся с ним поближе.


Итак, Джеймс Гуднайт (James Goodnight) в 1976 году окончил Университет Северной Каролины, тут же приложил свою руку к созданию небольшой аналитической компании SAS Institute и вот уже 40 лет он ее CEO. SAS - аббревиатура от Statistical Analysis System, что полностью описывает основное направление деятельности компании.

Естественно, для того, чтобы эффективно обрабатывать большие потоки информации потребовался не только качественный программный продукт, но и соответствующий язык. И им стал SAS. Изначально это был довольно примитивный набор шаблонных запросов для группировки данных, но со временем SAS стал полноценным и достаточно популярным языком программирования.

В общем-то с этого момента можно было бы смело вести историю языка, программного обеспечения и всей компании, как единого целого, но в 2002 году объявился идеологический конкурент - World Programming System (WPS), который в своей деятельности не просто стал использовать язык SAS, но и разработал для него собственный компилятор и IDE.

Разумеется, вскоре началась судебная тяжба, которая в итоге создала интересный прецедент для всего IT-сообщества: WPS выиграл суд, доказав, что авторское право не нарушается, если используется синтаксис и функциональность языка, но не используются исходные коды. Таким образом, язык SAS отчасти избежал участи MATLAB, сорвав ярлык “вещи в себе”.

Кстати, сегодня SAS Institute - не просто преуспевающая компания с оборотом в несколько миллиардов долларов в год, но и одно из наиболее привлекательных мест для работы. Так, в 2013 году SAS заняла второе место в рейтинге “привлекательности” компаний США, пропустив вперёд лишь Google.

Краткая справка

Впрочем, оставим дела компании и обратимся непосредственно к языку. Чтобы вы визуально представляли его внешний вид, вот небольшой отрывок кода, содержащий вывод на экран таблицу данных:

PROC PRINT DATA = models NOOBS;
WHERE Type = "Mountain";
FORMAT Price DOLLAR6.;
TITLE "Current Models of Mountain Bicycles";
RUN;

Основным конкурентом SAS является язык R, причём стоит признать, что последний имеет солидное преимущество. Во-первых, он был создан позднее, соответственно избежал многих проблем роста. Во-вторых, и это наверное главный фактор, он бесплатный, в то время как SAS требует дорогое программное обеспечение. Впрочем, давайте взглянем на преимущества и недостатки SAS в сравнении с главным конкурентом.

Простой синтаксис, быстрое обучение “с нуля”;

Отладка кода проходит значительно проще, чем на R;

Интеграция с БД (Oracle/Teradata);

Удобный формат выходных данных (особенно таблиц);

Мощная поддержка со стороны компании SAS;

Многолетний успешный опыт эксплуатации компаниями разной величины, с разными задачами и разным объёмом входных данных. В частности, России SAS используют ОАО “РЖД”, МТС, ЦБ РФ, а также ведущие банки, среди которых Сбербанк, Альфабанк, Тинькофф и многие другие.

Профессиональное использование языка предполагает покупку программного продукта;

Исходники многих исполняемых алгоритмов SAS не являются публичными, следовательно изучение работы языка сильно ограничено;

SAS значительно уступает в производительности R;

С точки зрения объёма кода SAS также зачастую сильно проигрывает (иногда в несколько раз).

При этом надо понимать, что далеко не во всех сферах SAS и R являются прямыми конкурентами. Взгляните на следующее изображение:


Из него отчётливо видно, что в Data Science SAS сильно проигрывает не только R, но и Python. Но вот в анализе данных, предполагающем дальнейшие прогнозы, SAS занимает лидирующую позицию.

Программный продукт

Для того, чтобы оценить степень размаха в прикладных программах, с которым придётся столкнуться желающему освоить SAS в полном объёме, можно посетить официальный раздел с перечислением пакетов заглавной IDE. Впрочем, здесь прослеживается аналогия с уже упомянутым продуктом MATLAB/Simulink, где также имеется большое количество надстроек, но по сути подавляющее большинство из них имеет строгую специализацию. Так что изначально стоит сфокусироваться лишь на 4 следующих:

SAS Visual Analytics - инструмент для визуализации ваших данных;

SAS Enterprise Miner - инструмент для машинного обучения;

Enterprise / Text Miner - пакет надстроек, аналогичный SAS Visual Analytics, но с большим упором на упрощение любых внутренних взаимодействий;

SAS ETS Module - система прогнозирования.

Если вы вдруг сейчас подумали, что возможно стоит прикупить пару из них, то вот стоп-сигнал: SAS Enterprise Miner, к примеру, обходится крупным компаниям более чем в 100 тысяч долларов. Пакет Analytics будет значительно дешевле, около 8,5 тысяч, но разве от этого легче?

Обучение

Впрочем, это не означает, что постигнуть азы SAS невозможно. Компания активно продвигает свой продукт среди студентов, причём абсолютно бесплатно. Достаточно мощную пробную версию SAS University Edition можно скачать перейдя по ссылке.

Также на официальном сайте у вас есть возможность записаться на экспресс-курсы по изучению языка (причём на русском языке). Рекомендуемая длительность обучения в каждом разделе составляет 3 дня, требования и программу можно посмотреть прямо рядом с торжественной кнопкой записи.

В общем, было бы желание.

Работа

Откровенно говоря, получить работу конкретно SAS-специалисту в России будет очень сложно. Как правило, SAS идёт как жирный плюс. но не как основная специализация. Тем не менее, если вам удастся набраться практического опыта работы с SAS хотя бы в течение 2 лет, хотя бы базово освоить SQL, VB и прочие полезности, то вы сможете смело рассчитывать на зарплату не менее 80 тысяч рублей в месяц. Причём речь не только о столице, стоимость программного продукта SAS как бы подсказывает работодателю не экономить в поисках дешёвой рабочей силы. Но, как уже было сказано, нужную вакансию ещё придётся поискать.

Литература

Нет смысла перечислять лучшие иностранные книги по SAS, так как все они собраны в одном месте, прямо на официальном сайте компании. Особое внимание стоит уделить пошаговому самоучителю, описанию возможностей языка и IDE, а также справочнику новичка.

Что касается ресурсов на русском языке, то тут, разумеется, всё значительно сложнее, но кое-что всё же есть. Помимо официального сайта, лекции Дмитрия Звежинского помогут тем, кто пока не познал английский язык на хорошем уровне, на официальные курсы записывать не хочет, но SAS изучить отчаянно желает.

На этом краткое знакомство считаем оконченным. А вы сталкивались когда-нибудь с языком SAS? Какие впечатления?

Освоить востребованную профессию в Data Science можно всего за полтора года на курсах GeekBrains. После учёбы вы сможете работать по специальностям Data Scientist, Data Analyst, Machine Learning, Engineer Computer Vision-специалист или NLP-специалист.


История возникновения

Для начала в сотый раз обратимся к рейтингу ресурса TIOBE, дабы отыскать в нём нашего сегодняшнего героя. SAS располагается на “предлидирующем” 21 месте, что, согласитесь, для data-языка великолепный результат. Так что давайте познакомимся с ним поближе.


Итак, Джеймс Гуднайт (James Goodnight) в 1976 году окончил Университет Северной Каролины, тут же приложил свою руку к созданию небольшой аналитической компании SAS Institute и вот уже 40 лет он ее CEO. SAS - аббревиатура от Statistical Analysis System, что полностью описывает основное направление деятельности компании.

Естественно, для того, чтобы эффективно обрабатывать большие потоки информации потребовался не только качественный программный продукт, но и соответствующий язык. И им стал SAS. Изначально это был довольно примитивный набор шаблонных запросов для группировки данных, но со временем SAS стал полноценным и достаточно популярным языком программирования.

В общем-то с этого момента можно было бы смело вести историю языка, программного обеспечения и всей компании, как единого целого, но в 2002 году объявился идеологический конкурент - World Programming System (WPS), который в своей деятельности не просто стал использовать язык SAS, но и разработал для него собственный компилятор и IDE.

Разумеется, вскоре началась судебная тяжба, которая в итоге создала интересный прецедент для всего IT-сообщества: WPS выиграл суд, доказав, что авторское право не нарушается, если используется синтаксис и функциональность языка, но не используются исходные коды. Таким образом, язык SAS отчасти избежал участи MATLAB, сорвав ярлык “вещи в себе”.

Кстати, сегодня SAS Institute - не просто преуспевающая компания с оборотом в несколько миллиардов долларов в год, но и одно из наиболее привлекательных мест для работы. Так, в 2013 году SAS заняла второе место в рейтинге “привлекательности” компаний США, пропустив вперёд лишь Google.

Краткая справка

Впрочем, оставим дела компании и обратимся непосредственно к языку. Чтобы вы визуально представляли его внешний вид, вот небольшой отрывок кода, содержащий вывод на экран таблицу данных:

PROC PRINT DATA = models NOOBS;
WHERE Type = "Mountain";
FORMAT Price DOLLAR6.;
TITLE "Current Models of Mountain Bicycles";
RUN;

Основным конкурентом SAS является язык R, причём стоит признать, что последний имеет солидное преимущество. Во-первых, он был создан позднее, соответственно избежал многих проблем роста. Во-вторых, и это наверное главный фактор, он бесплатный, в то время как SAS требует дорогое программное обеспечение. Впрочем, давайте взглянем на преимущества и недостатки SAS в сравнении с главным конкурентом.

Простой синтаксис, быстрое обучение “с нуля”;

Отладка кода проходит значительно проще, чем на R;

Интеграция с БД (Oracle/Teradata);

Удобный формат выходных данных (особенно таблиц);

Мощная поддержка со стороны компании SAS;

Многолетний успешный опыт эксплуатации компаниями разной величины, с разными задачами и разным объёмом входных данных. В частности, России SAS используют ОАО “РЖД”, МТС, ЦБ РФ, а также ведущие банки, среди которых Сбербанк, Альфабанк, Тинькофф и многие другие.

Профессиональное использование языка предполагает покупку программного продукта;

Исходники многих исполняемых алгоритмов SAS не являются публичными, следовательно изучение работы языка сильно ограничено;

SAS значительно уступает в производительности R;

С точки зрения объёма кода SAS также зачастую сильно проигрывает (иногда в несколько раз).

При этом надо понимать, что далеко не во всех сферах SAS и R являются прямыми конкурентами. Взгляните на следующее изображение:


Из него отчётливо видно, что в Data Science SAS сильно проигрывает не только R, но и Python. Но вот в анализе данных, предполагающем дальнейшие прогнозы, SAS занимает лидирующую позицию.

Программный продукт

Для того, чтобы оценить степень размаха в прикладных программах, с которым придётся столкнуться желающему освоить SAS в полном объёме, можно посетить официальный раздел с перечислением пакетов заглавной IDE. Впрочем, здесь прослеживается аналогия с уже упомянутым продуктом MATLAB/Simulink, где также имеется большое количество надстроек, но по сути подавляющее большинство из них имеет строгую специализацию. Так что изначально стоит сфокусироваться лишь на 4 следующих:

SAS Visual Analytics - инструмент для визуализации ваших данных;

SAS Enterprise Miner - инструмент для машинного обучения;

Enterprise / Text Miner - пакет надстроек, аналогичный SAS Visual Analytics, но с большим упором на упрощение любых внутренних взаимодействий;

SAS ETS Module - система прогнозирования.

Если вы вдруг сейчас подумали, что возможно стоит прикупить пару из них, то вот стоп-сигнал: SAS Enterprise Miner, к примеру, обходится крупным компаниям более чем в 100 тысяч долларов. Пакет Analytics будет значительно дешевле, около 8,5 тысяч, но разве от этого легче?

Обучение

Впрочем, это не означает, что постигнуть азы SAS невозможно. Компания активно продвигает свой продукт среди студентов, причём абсолютно бесплатно. Достаточно мощную пробную версию SAS University Edition можно скачать перейдя по ссылке.

Также на официальном сайте у вас есть возможность записаться на экспресс-курсы по изучению языка (причём на русском языке). Рекомендуемая длительность обучения в каждом разделе составляет 3 дня, требования и программу можно посмотреть прямо рядом с торжественной кнопкой записи.

В общем, было бы желание.

Работа

Откровенно говоря, получить работу конкретно SAS-специалисту в России будет очень сложно. Как правило, SAS идёт как жирный плюс. но не как основная специализация. Тем не менее, если вам удастся набраться практического опыта работы с SAS хотя бы в течение 2 лет, хотя бы базово освоить SQL, VB и прочие полезности, то вы сможете смело рассчитывать на зарплату не менее 80 тысяч рублей в месяц. Причём речь не только о столице, стоимость программного продукта SAS как бы подсказывает работодателю не экономить в поисках дешёвой рабочей силы. Но, как уже было сказано, нужную вакансию ещё придётся поискать.

Литература

Нет смысла перечислять лучшие иностранные книги по SAS, так как все они собраны в одном месте, прямо на официальном сайте компании. Особое внимание стоит уделить пошаговому самоучителю, описанию возможностей языка и IDE, а также справочнику новичка.

Что касается ресурсов на русском языке, то тут, разумеется, всё значительно сложнее, но кое-что всё же есть. Помимо официального сайта, лекции Дмитрия Звежинского помогут тем, кто пока не познал английский язык на хорошем уровне, на официальные курсы записывать не хочет, но SAS изучить отчаянно желает.

На этом краткое знакомство считаем оконченным. А вы сталкивались когда-нибудь с языком SAS? Какие впечатления?

Освоить востребованную профессию в Data Science можно всего за полтора года на курсах GeekBrains. После учёбы вы сможете работать по специальностям Data Scientist, Data Analyst, Machine Learning, Engineer Computer Vision-специалист или NLP-специалист.

Читайте также: