Программирование sas что это
Основы программирования на SAS Base. Урок 4. Создание наборов данных SAS
В предыдущей статье мы изучили, как читать внешние необработанные данные. А сегодня познакомимся с оператором 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:
В этом случае результат выполнения шага выглядит следующим образом:
Третий вычисляемый столбец – это адрес электронной почты менеджера. Его можно «собрать» из столбцов Manager_FirstName, Manager_LastName и значения habr.com
Для объединения текстовых значений в одну строку можно использовать функцию CATS.
Изучим дескриптор созданного набора данных:
Обратите внимание на длину переменной Email.Она составляет 200 байт, это длина, возвращаемая по умолчанию функцией CATS. Если изучить атрибуты переменных Manager_FirstName и Manager_LastName, то мы можем убедиться, что на переменную Email достаточно 8+6+длина строки ‘@habr.com’, то есть еще 9 байт, итого 23. Почему стоит на это обратить внимание? Все недостающие символы добиваются пробелами, что сказывается на размере набора данных и на больших объемах данных будет сказываться на производительности.
Для того, чтобы задать длину переменной Email явно, необходимо использовать оператор LENGTH:
Создадим детализированный столбец на основании переменной Lead_Time, учитывая следующие условия:
Добавим условие, которое выбирает только те наблюдения, в которых значение переменной 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
Система статистического анализа (SAS) — это программный комплекс, разработанный SAS Institute, одним из лидеров в аналитике. Это полезно для выполнения расширенной аналитики, многомерного анализа, бизнес-аналитики, функций управления данными, а также для проведения прогнозной аналитики.
Использование SAS:
SAS используется многими ведущими организациями, включая Google, Facebook, Twitter и Accenture, для ответов на многие вопросы, которые остаются на уровне бизнеса и организации, а также используется для создания информативных отчетов. Это помогает в прогнозировании бизнеса, улучшении качества, исследовании операций и управлении проектами. Это особенно полезно при разработке приложений и графического дизайна. Эта статья должна помочь вам получить представление о работе приложений SAS и подсказку о его сырой мощности.
Типы программного обеспечения SAS:
Существуют различные типы программного обеспечения SAS. В общем, есть 4 типа программного обеспечения SAS, которые приведены ниже.
Наиболее используемым программным обеспечением среди вышеуказанных типов является SAS для Windows. Он может быть легко развернут и позволяет модернизировать вашу среду SAS, включив сеточную обработку.
Библиотеки SAS:
Библиотеки — это механизмы хранения в SAS. Он может хранить программы, которые могут быть похожими по своей природе. Вообще говоря, есть 2 типа библиотек, а именно. временный и постоянный.
Временные библиотеки — это библиотеки, которые существуют только во время текущего сеанса или задания SAS. Постоянные библиотеки, как следует из названия, хранятся во внешнем хранилище и не удаляются в конце сеанса.
Рабочий процесс программирования SAS:
Прикладные программы SAS характеризуются управлением потоком, указанным на диаграмме ниже.
На первом этапе приведенной выше диаграммы программа SAS считывает данные, которые обычно хранятся в виде рабочих листов в рабочей книге Excel. На этом этапе выполняется подключение к книге, и данные импортируются в формате, подходящем для использования на следующих этапах.
Исследуйте данные:
На втором этапе мы проверяем на несоответствия или неправильные значения. Здесь также могут генерироваться отчеты о частоте и сводная статистика. Глядя на эти отчеты и резюме на первый взгляд, мы можем сразу обнаружить некоторые несоответствия. Например, все имена меток категориального атрибута, кроме одного, могут быть написаны заглавными буквами. Другим примером неправильного значения является отрицательное значение для минимального количества прогонов, набранных игроком с битой во время строки матчей. Первые 5 строк также показаны на этом этапе.
Подготовить данные:
На этом этапе проблемы, обнаруженные на более раннем этапе, устраняются. Здесь мы создаем новые столбцы с существующими значениями или объединяем их. На этом этапе также выполняется условная обработка. Некоторые таблицы также объединены для обеспечения более согласованного представления данных. Эти таблицы имеют чистые и проверенные значения.
Анализ и отчетность по данным и экспорт результатов:
Последние две фазы объединяются в одну в прикладных программах SAS. Здесь мы создаем карты на основе географических координат, сводной статистики и т. Д., Которые являются одними из выходных моделей, используемых для отображения результатов. Мы также можем сохранить выходные модели, созданные в книге Excel, и загрузить их для последующего автономного использования.
Это общая структура приложения SAS. Надеюсь, что эта статья поможет вам получить четкое представление о рабочем процессе программы SAS.
Основы программирования на SAS Base. Урок 2. Доступ к данным
В предыдущей статье мы познакомились с интерфейсом SAS UE, терминологией SAS Base, типами данных, основными требованиях к синтаксису SAS Base, а также рассмотрели распространенные синтаксические ошибки.
Сегодня я расскажу, как можно получить доступ к данным различных форматов. Обратите внимание, что в данной статье имеются ссылки на документацию, которая поможет вам подробнее ознакомиться с рассматриваемыми примерами.
Что такое библиотеки SAS?
Библиотека в SAS – это метод централизованного хранения и прозрачного использования данных в программах SAS. Библиотека может быть папкой или каталогом на вашем компьютере или располагаться на внешнем жестком диске, FLASH-накопителе или компакт-диске и так далее.
Существует два типа библиотек: постоянные и временные. Постоянные библиотеки SAS сохраняются до тех пор, пока вы их не удалите. Постоянная библиотека доступна для обработки в последующих сеансах SAS. Временная библиотека SAS существует только для текущего сеанса SAS.
Файлы SAS, созданные во время сеанса, хранятся в специальном рабочем пространстве, которое может быть или не быть внешним носителем. Это рабочее пространство обычно назначается по умолчанию с именем Work. Файлы во временной рабочей библиотеке могут использоваться на любом шаге в программе SAS, но они не доступны для последующих сессий SAS. Файлы, хранящиеся в рабочей библиотеке, удаляются в конце сеанса SAS.
Назначаем пользовательскую библиотеку.
Рассмотрим простой случай назначения библиотеки: наборы данных SAS находятся в одной директории c:\habrahabr. Есть два способа решения этой задачи.
1 способ:
Настроить библиотеку без программного кода. Во вкладке «Библиотеки» в SAS UE выбрать «Новая библиотека»:
Далее появится окно для настройки пользовательской библиотеки:
Имя библиотеки – library reference (или libref). Libref – это «псевдоним» (ссылка) для «хранилища», в котором находятся файлы. Название библиотеке задается в соответствии с правилами именования переменных в SAS (см. Урок 1), но на него выделяется не более 8 символов.
Правила именования библиотек, переменных, наборов данных и пр. в SAS можно изучить в справочнике SAS 9.4 and SAS Viya 3.3 Programming Documentation SAS Language Reference: Concepts в разделе Names in the SAS Language.
Обратите внимание, что библиотека назначена на все время сеанса SAS, но переопределять ее параметры можно.
Далее задаем путь к наборам данных SAS.
После назначения библиотеки она появляется в левой панели SAS UE.
2 способ:
Назначить библиотеку программным путем. Назначение библиотеки SAS реализуется с помощью глобального оператора LIBNAME. Информацию по указанному оператору можно изучить в справочнике SAS 9.4 and SAS Viya 3.3 Programming Documentation / Global Statements.
Рассмотрим общий синтаксис глобального оператора LIBNAME.
libref – имя библиотеки.
engine — имя «движка», например, для наборов данных SAS – это BASE (но его можно не указывать, он задан по умолчанию). Если вы хотите создать новую библиотеку с другим «движком», отличным от механизма по умолчанию, вы можете отменить автоматический выбор.
Справочники, которые могут вам пригодиться при изучении механизмов подключения: SAS/ACCESS for Relational Databases и SAS Engines.
«Движки» SAS/ACCESS являются механизмами оператора LIBNAME, которые обеспечивают доступ к чтению, записи и обновлению более чем 60 реляционных и нереляционных баз данных, файлов ПК, устройств хранения данных и распределенных файловых систем.
‘SAS-library’ – путь к библиотеке, если путь задается с помощью макропеременной (будет рассматриваться в данном цикле статей), используются парные двойные кавычки. Во всех остальных случаях можно использовать парные одинарные кавычки.
options — допустимые опции. Простейшим примером является опция ACCSESS=READONLY, которая назначает атрибут «только для чтения» для всей библиотеки SAS. Со всем перечнем допустимых опций можно ознакомиться в справочнике SAS 9.4 and SAS Viya 3.3 Programming Documentation /Global Statements.
engine/host-options — являются одним или несколькими параметрами, которые перечислены в общей форме keyword = value.
Рассмотрим синтаксис оператора LIBNAME на практике. Назначим библиотеку Habr только для чтения:
Запустим код и проверим Log:
Сообщения в журнале указывают, что библиотека успешна назначена. В качестве библиотек можно подключать данные, которые физически находятся не в формате наборов данных SAS (промышленные БД, excel, access).
Просматриваем содержимое библиотеки SAS.
Один из вариантов просмотра содержимого библиотеки – использование процедуры PROC CONTENTS. Ознакомиться с процедурами, используемыми в SAS, можно в справочнике SAS 9.4 Procedures by Name and Product.
Процедура PROC CONTENTS позволяет создавать вывод, который описывает либо содержимое библиотеки SAS, либо информацию дескриптора для отдельного набора данных SAS. Чтобы просмотреть содержимое библиотеки SAS, мы можем использовать следующую общую форму процедуры:
Параметр NODS (который означает «no details») подавляет печать подробной информации о каждом файле при указании опции _ALL_.
Для конкретной библиотеки код будет выглядеть следующим образом:
Фрагмент вывода процедуры:
Обратите внимание, что в библиотеке также хранятся другие типы файлов, например catalog, index. О них можно прочитать в справочнике SAS 9.4 Companion for Windows, Fifth Edition.
Файлы с member type DATA являются стандартными наборами данных SAS. Второй вариант просмотра содержимого библиотеки – использовать процедуру PROC DATASETS:
Просмотр информации о конкретном наборе данных SAS реализуется следующим образом:
Обратите внимание на обращение к таблице в пользовательской библиотеке. Имя после data= двухуровневое: имя_библиотеки.имя_таблицы. В случае набора данных, хранящемся во временной библиотеке WORK, в обращении после data= можно использовать одноуровневое имя.
Например, в случае кода:
выведется информация о наборе данных charities, находящемся во временной библиотеке WORK.
Рассмотрим вывод процедуры для набора данных charities в пользовательской библиотеке HABR:
Служебная информация о таблице, получаемая в результате вывода, называется дескриптором.
Дескриптор содежит общую информацию о наборе данных: его название и имя библиотеки, типе, «движке», дате и времени создания и последнего изменения, количестве наблюдений и переменных, общей длине наблюдений, индексах, сортировке, сжатии, размере страницы и их количестве, информацию об атрибутах переменных.
Читаем электронные таблицы.
Чтение файла EXCEL можно реализовать несколькими способами. В этой статье мы рассмотрим назначение библиотеки для файла excel.
Для назначения библиотеки SAS будем использовать электронную таблицу products.xlsx, хранящуюся в директории c:\workshop\habrahabr\products.xlsx. Данный документ выглядит следующим образом: он содержит 4 листа, каждый из которых станет отдельным набором данных SAS. Фрагмент данного документа представлен ниже:
Общий синтаксис назначения библиотеки такой же, как и в случае наборов данных SAS, меняется только механизм подключения:
Существует несколько механизмов для обработки файла excel, у всех свои особенности и настройки, с которыми можно ознакомиться в документации.
Результат выполнения оператора libname представлены ниже. Фрагмент Log:
Информацию о библиотеке посмотрим через процедуру PROC CONTENTS:
В зависимости от механизма дескриптор заполняется по-разному:
Результат выполнения оператора LIBNAME представлены ниже. Фрагмент Log:
Информацию о библиотеке посмотрим через PROC CONTENTS:
В зависимости от механизма дескриптор заполняется по-разному:
Результат выполнения оператора libname представлены ниже.
Информацию о библиотеке посмотрим через PROC CONTENTS:
В зависимости от механизма дескриптор заполняется по-разному:
Создаем детализированные отчеты.
После получения доступа к требуемым данным рассмотрим процедуру для создания отчетов PROC PRINT. Подробную информацию о ней можно получить в справочнике SAS 9.4 Procedures by Name and Product. Распечатаем детализированный отчет, используя таблицу German из системной библиотеки sasuser.
Для начала изучим дескриптор указанной таблицы, нас интересуют атрибуты столбцов:
Фрагмент вывода процедуры:
Создадим детализированный отчет, удовлетворяющий представленным ниже требованиям:
Оператор VAR определяет переменные для печати. Оператор выводит их в том порядке, в котором вы их перечислили.
В данном условии нам необходимо использовать фильтр в операторе WHERE.
Обратите внимание, что при работе с текстовыми переменными важен регистр, а также вы обязательно заключаете требуемое значение в парные кавычки (двойные или одинарные).
Вывод данной программы SAS:
По умолчанию процедура PROC PRINT выводит номера строк, для того, чтобы убрать данный столбец, можно использовать опцию NOOBS (‘no observation’). В этом случае программный код выглядит следующим образом:
Операторы сравнения вы можете записывать привычными символами, а можете использовать мнемоники, как представлено в примере. Вывод данной программы представлен ниже:
Идентификатором наблюдения можно определить любую переменную. Когда вы указываете одну или несколько переменных в операторе ID, он использует форматированные значения этих переменных для идентификации строк. Обратите внимание, что если одновременно переменная указана в операторе VAR и в операторе ID, то она выведется два раза. Также при использовании оператора ID нет необходимости в опции NOOBS.
В нашем случае программа SAS будет иметь следующий вид:
Результаты выполнения кода представлены ниже:
Стоит отметить, что при задании атрибутов таких как ярлык и формат, они будут использованы только на определенном шаге PROC для создания требуемого отчета.
Для задания ярлыка используется оператор LABEL.
Общий синтаксис оператора LABEL выглядит следующим образом:
В ярлыке вы можете использовать любые символы, в том числе и пробелы, количество символов не должно превышать 256. Ярлыки переменных будут использованы для создания отчетов.
Не все процедуры «видят» ярлыки. Для того, чтобы процедура PROC PRINT выводила в отчет ярлыки, а не имена переменных, в опциях необходимо указать label (или split=). Опция SPLIT указывает разделитель, который контролирует разрывы в заголовках столбцов. Используем оператор LABEL в нашем программном коде:
1 вариант
2 вариант
(с использованием опции split=)
В опции split= указывается разделитель (обязательно в кавычках). Код в данном случае выглядит следующим образом (обратите внимание на использование разделителей в операторе Label):
Оператор TITLE задает заголовок в отчете, оператор FOOTNOTE задает нижний колонтитул.
Как и в случае оператора LIBNAME, данные операторы являются глобальными и действуют во время всего сеанса SAS до тех пор, пока вы не переопределите их значения. Вы можете использовать TITLE и FOOTNOTE как вне шагов PROC, так и непосредственно в них.
Общий синтаксис операторов:
Text-string – данный аргумент является строкой, которая может содержать до 512 символов. Вам необходимо заключать такие строки в одиночные или двойные кавычки. Текст отображается точно так же, как вы вводите его в операторе, включая прописные, строчные буквы и пробелы.
Для заголовка в отчете вы можете использовать 10 операторов TITLE (аналогично с FOOTNOTE). Важно понимать, как переопределяются значения. Логика выполнения операторов одинаковая. Рассмотрим переопределение значений заголовков на примере оператора TITLE.
Код | Результат | Примечание |
---|---|---|
TITLE ‘String number one’; | String number one | TITLE и TITLE1 эквивалентны |
TITLE ‘String number three’ | String number one String number three | Строка №2 пустая |
TITLE2 ‘String number two’; | String number one String number two | TITLE2 задал значение заголовку на второй строке и удалил значения заголовков ниже. |
TITLE1 ‘New Title’; | New Title | TITLE1 задал значение заголовку на 1 строке и удалил значения заголовков ниже. |
TITLE; | Пустой оператор TITLE удаляет все заголовки.3 |
Другими словами, оператор TITLEn переопределяет значение заголовка в строке n и удаляет значения заголовков строк c n+1 до 10.
Также для настройки заголовков и нижних колонтитулов можно использовать стили:
Итак, возвращаясь к разрабатываемому отчету:
Результат выполнения программы:
Формат – это правило вывода значений переменных в отчет. Необходимо понимать, что формат не меняет значения в наборе данных SAS. Типы форматов соответствуют типу данных, но разбиты на категории: числовые, символьные, даты, время, дата-время.
Всю информацию о форматах можно найти в справочнике SAS 9.4 Formats and Informats: Reference. Также поддерживается возможность создания пользовательских форматов, об этом мы поговорим в следующих статьях.
Общий синтаксис оператора FORMAT.
variable – одна или несколько переменных, к которым небходимо применить формат.
DEFAULT=default-format – определяет временный формат по умолчанию для отображения значений переменных, которые не указаны в операторе FORMAT, используется в шаге DATA.
format – определяет формат, который используется для отображения переменных.
Общий синтаксис использованиея формата в операторе FORMAT следующий:
$ — признак текстового формата
Format – название формата
w — ширина формата, количество всех выводимых символов в значении
d — количество десятичных знаков
Формат всегда оканчивается на точку или на количество десятичных знаков. Стоит отметить, что при неверном выборе ширины формата значения в выводе могут «обрезаться». Давайте рассмотрим пример:
Значение переменной | Формат | Результат |
---|---|---|
34566.78 | DOLLAR10.2 | $34,566.78 |
34566.78 | DOLLAR9.2 | $34566.78 |
34566.78 | DOLLAR8.2 | 34566.78 |
34566.78 | DOLLAR7.2 | 34566.8 |
34566.78 | DOLLAR6.2 | 34567 |
34566.78 | DOLLAR4.2 | 35E3 |
При этом значение в наборе данных SAS остается неизменным:
Результат выполнения шага:
Итак, применим формат к переменной Pre:
Отчет выглядит следующим образом:
Для группировки переменных используется оператор BY. Группировка переменных по определенным значениям подразумевает сортировку таблицы. Это связано с обработкой данных SAS Base.
Отсортировать набор данных можно с помощью процедуры PROC SORT.
При сортировке набора данных вам необходимо указать источник (исходный набор данных), группирующую переменную или переменные, а также при необходимости выходной (промежуточный) набор данных.
Давайте проверим вышеизложенное. Если посмотреть на отчет, выводимый в п.7 данной статьи, столбец Gender отсортирован по полу по убыванию. Так ли это?
Результат выполнения процедуры представлен ниже:
Добавим несколько опций для создания итогового отчета: nobyline и #byVAL()
Таким образом, мы получили требуемый детализированный отчет на основании набора German в библиотеке Sasuser.
Итак, это кратко об организации доступа к данным и созданию детализированных отчетов. В следующей статье мы рассмотрим чтение внешних файлов, изучим операторы INFILE и INPUT, а также процедуру PROC IMPORT.