Лекция 4. Программирование на языке SAS. Расширенные возможности шага DATA (1185376)
Текст из файла
Программирование на языкеSASЛекция 4 (Расширенные возможности шага DATA)Авторы материалов:Петровский Михаил (ВМК МГУ, SAS Russia/CIS), michael@cs.msu.su1Отображения и табличный поиск по ключу• Отображения (map) одна из самых удобных и часто используемыхконструкций в программе.• Реализует отображения множества значений одной переменной,называемой ключем в множество значений другой переменной,называемой значением:VarKey=>VarValue• Можно реализовать функциональность массивов (ключ – индекс), множеств(ключ и значение совпадают) и даже структур (ключ – поле структуры)• В SAS Base несколько вариантов реализации выбор зависит от требований креализуемому отображению:• Статическое или динамическое (и насколько часто может обновляться)• Маленькое или большое (или очень большое)• Варианты реализации в SAS BASE•••••Конструкции программирования SELECT и IFМассивыФорматыПоиск в наборе данных по индексуХэш объекты2Конструкции SELECT и IF для определенияотображений• Условия применимости:• Статичность, маленький объем• Реализация: набор условий с веткой присваивания по каждому условию:• На самом деле возможна и «динамичность»!• Сформировав код программы автоматически по набору данных, записать в файл иподключить его в следующем шаге через %include (очень популярный в SAS Base подход):• Например, есть набор с отображением и мы генерируем код для SELECT по нему:3Оператор %INCLUDE• Оператор %INCLUDE извлекает исходный код SAS из внешнего файла,компилирует и выполняет этот код.%INCLUDE file-specification < / SOURCE2 >;file-specificationУказывает физическое имя или ссылочное имя filerefфайла, который должен быть извлечен и помещен вовходной стек.SOURCE2Указывает, что вставленные операторы SAS должнывыводиться в журнал SAS.• Преимущества использования FILE/PUT для генерации кода:• большая гибкость генерации кода по сравнению с использованиеммакросов;• исходный код можно сохранять для будущего использования;• код можно посмотреть перед его выполнением;• одновременно можно записать несколько файлов; эти файлы представляютсобой полную программу;• код можно использовать для написания макрокода (динамическихмакроимен).Применение массивов для определенияотображений• Условия применимости:• Динамичность, средний объем• Реализация: ключи и значения хранятся во временных массивах, по массивуключей находим индекс для массива значений:• Оптимизация:• процедуру поиска можно ускорить, например, сортируя массив и реализуя двоичный поиск,или закодировав ключи в строку вместо массива и использовать строчные поисковыефункции• «динамичность» условная, т.е.
ограничение сверху нужно знать и добавлять новые значенияв конец массива, или реализовать поиск с сортировкой5Применение форматов для определенияотображений• Условия применимости:• Статичность, средний объем• Реализация: реализуем формат, отображающий значения одной переменной взначения другой переменной:• На самом деле возможна и «динамичность»!• Через сохранение/чтение настроек формата с помощью опции cntlout и cntlin6Прямой поиск в наборе данных• Условия применимости:• Динамичность, средний объем• Реализация: создаем набор данных с отображением и создаем индекс по нему• При использование либо обращаемся через set с опцией where• Если нужно искать не по константе, а по переменной,то нельзя использовать where:7Использование параметра KEY=• Если оператор SET или MODIFY содержит опцию KEY=, то всегдаиспользуется индекс.• KEY= в операторе SET, чтобы использовать индекс для получениянаблюдения, значение ключа которого равно текущему значению ключевыхпеременных.• Общий формат параметра KEY=:SET SAS-data-file-name KEY=index-name;• При использовании опции KEY= SAS создает автоматическую переменную_IORC_, для кода возврата ввода-вывода (input/output return code).• Можно использовать переменную _IORC_, чтобы определить,был ли индексный поиск выполнен успешно.• 0 - успехИспользование SET/SET с параметром KEY=ПреимуществаНедостаткиСчитываются только нужныенаблюдения.Требуется индекс для одного набора данных.Используется существующий индекс.Создание и обслуживание индексатребует ресурсов.Для управления обработкойнесовпадающих данных можноиспользовать _IORC_.Если проиндексированный набор данных неотсортирован по ключевым перемен-ным,возможно значительное увеличениеколичества операций ввода-вывода.Это увеличение количества операций вводавывода происходит из-за случайного доступа кнаборам данных и дополни-тельных операцийввода-выводадля доступа к индексу.Доступность синтаксиса шага DATAпозволяет использовать всевозможности шага DATA.Хэш-объекты для определения отображений• Условия применимости:• Динамичность, любой объем• Характеристики хэш-объектов:••обеспечивают хранение в памяти и извлечение из памяти;•имеют компонент данных и компонент ключа, используют ключ для быстрого извлеченияданных;•могут сохранять несколько элементов данных для одного ключа;•не требуют «ручной» сортировки данных;•имеют динамический размер.Хэш похож на таблицу со строками и столбцами со следующимихарактеристиками:•••••могут быть числовыми или символьными;могут загружаться из жестко запрограммированных значений;могут загружаться из набора данных SAS;существуют только в течение шага DATA;могут выводиться в набор данных SAS.Хэш-объекты•Компонент ключа:••••может состоять из числовых и символьных значений;задает соответствие значений ключа и строк данных;должен быть уникальным в версиях до SAS 9.2;может быть составным.•Компонент данных обладает следующими характеристиками:• может содержать несколько значений данных для одного ключа;• может состоять из числовых и символьных значений;•Характеристики хэш-объектов:• создаются с помощью оператора DECLARE;• имеют атрибуты и методы;• управляются посредством синтаксиса с точкой после имени объекта;• Атрибут является свойством.
Метод является функцией.• Компоненты данных и компоненты ключа являются переменными шага DATA (и попадаютв PDV)!!!Имена переменныхПримерФрагмент orion.europe_customersCustomer_NameCorneliaKrahlElkeWallstab. .LastYrTypeThisYrType. .2020. .1020Хэш-объект TKEY:Code102030DATA:MemberTypeOrion ClubmembersOrion Club GoldmembersInternet/CatalogCustomersФрагмент PDVCoderc1.MemberTypeThisYrMemberCustomer_Name...LastYrMemberrc2.LastYrTypeThisYrTypeD..._N_1...Объявление хэш-объектаDECLARE object object-reference (<arg_tag-1: value-1<,…arg_tag-n: value-n>>);objectОпределяет объект компонента.object-referenceОпределяет имя ссылки на объект для объектакомпонента.arg_tagОпределяет информацию, используемую длясоздания экземпляра объекта компонента.valueОпределяет значение тэга аргумента.hashХэш-объектhiterХэш-итераторТэги аргумента хэш-объектаArgument_tagОписание значенияdataset: 'data-set_name'Имя набора данных SAS, загружаемого в хэшобъект.hashexp: nЭтот тэг определяет размер таблицы хэшобъекта, равный 2n (по умолчанию n=8,максимальное значение n=16)ordered: 'NO' |Порядок сортировки, используемый методомOUTPUT или хэш-итератором (значение поумолчанию — NO).'ascending' |'descending' |'YES' | 'Y'Объявление хэш-объектаdeclare hash T();Создание хэш-объекта с именем T.declare hash T(dataset: 'orion.members');Создание хэш-объекта T и его загрузка из orion.members.declare hash T(hashexp: 10,ordered: 'ascending');Создание хэш-объекта T и его дополнительных настроек.Использование хэш объектаOBJECT.METHOD(<arg_tag-1: value-1<,…arg_tag-n: value-n>>);objectИмя объекта.methodВызываемый метод.arg_tagИмя передаваемого аргумента.valueЗначение аргумента.Метод FINDМетод FIND ищет значение ключа в хэш-объекте ивозвращает значения данных.object.FIND(<KEY: keyvalue-1,..., KEY: keyvalue-n>);Метод FIND возвращает статус успешности поискаrc=object.FIND();НольУспешно.Ненулевоезначение.Неудачно.Преимущества и недостатки хэш-объектовПреимуществаНедостаткиИспользование символьныхи числовых ключей.В версиях до SAS 9.2 требовалисьуникальные ключи.Использование составных ключей.Использование тольков шаге DATA.Поиск выполняется быстрее,чем при использовании форматовили слияний/объединений.Требования к памяти.Возможность загрузки изнабора данных SAS.Широкие возможности управления(гибкость).Возможность выполненияпоследовательного поиска.Определение хэш-итератораОбъект hiter является хэш-итератором.• Используя хэш-итератор, можно получить доступ к элементамхэш-объекта по местоположению значения ключа, а не позначению ключа.• Также можно использовать хэш-итератор для перемещениявперед или назад в хэш-объекте.• Нельзя определить хэш-итератор, предварительно не определивхэш-объект.DECLARE HITER iterator-name('hash-name');Некоторые методы хэш-итератораFIRST()Возвращает первые значения данных базового хэш-объекта наоснове значений ключа.LAST()Возвращает последние значения данных базового хэш-объектана основе значений ключа.NEXT()Возвращает значения данных для следующего элемента впоследовательности ключа в базовом хэш-объекте.
Еслинельзя извлечь следующий элемент, возвращается ненулевоезначение.PREV()Возвращает значения данных для предыдущего элемента впоследовательности ключа в базовом хэш-объекте. Еслинельзя извлечь предыдущий элемент, возвращается ненулевоезначение.Хэш-итераторВыполнениеХэш-итератор C Представление фрагментахэш-объекта customerKEY:Total_Retail_Price1937.201796.001687.501561.80...3.203.002.702.60DATA:Total_Retail_Price1937.201796.001687.501561.80...3.203.002.702.60KEY:Customer_ID701007916183...6951117179DATA:Customer_ID701007916183...6951117179C.first();do i=1 to 2;output top;C.next();end;C.last();do i=1 to 2;output bottom;C.prev();end;stop;run;DATA:Product_ID240200100173240200100076230100700009240300300090...230100500004240100100433240200100021230100500045PDVProduct_IDCustomer_ID5240100100433Total_Retail_Price3.00DDi3_N_1...Другие методы хэш-объекта (на примере)Определение переменныхЗагрузка набора в хэшОпределение структуры ключаи данныхПоиск по ключу, заданномув переменнойЗамена по ключу, заданному впеременнойУдаление по ключуЗапись результата вновый наборСравнение массивов, хэш-объектов и форматовМассивХэш-объектФорматЗначения индексов должныбыть числовыми.Ключи могут быть символьными, Диапазоны могут быть символьнымичисловыми или и символьными, или числовыми.и числовыми.Одно значение данных можетбыть назначено значенияминдексов.Несколько элементов данныхмогут быть связаныс ключевым значением.Метке может быть назначено толькоодно значение данных.Массив использует меньшепамяти, чем хэш-объект.Хэш-объект использует большепамяти, чем массив.Для формата требуется большепамяти, чем для хэш-объекта.Размер массива определяетсяво время компиляции.Размер хэш-объектаопределяется во времявыполнения.Требования к памяти для форматаопределяютсяпри использовании формата.Значения индексов должныбыть последовательнымицелыми числами.Ключи не обязаны бытьпоследовательными илиотсортированными.Форматы поддерживают заданиесоответствия диапазона значенийили списка дискретных значенийодному значению.Массив выбирает значенияпосредством прямого доступапо значению индекса.Хэш-объект использует хэшфункцию для выполненияпоиска.Формат использует двоичный поискдля выполнения поиска.Массивы можно использоватьтолько в шаге DATA.Хэш-объкеты можноиспользовать только в шагеDATA.Форматы можно использоватьв шагах DATA и PROC.Написание собственных функций и бизнессправил с использованием FCMP• PROC FCMP — это метод упрощения повторного использования кода.• PROC FCMP обеспечивает следующие возможности:• запись функций и подпрограмм CALL с использованием синтаксиса шага DATA;• сохранение этих функций в пакете в наборе данных SAS;• использование функций и подпрограмм, ранее определенных в текущем шагепроцедуры FCMP, равно как и большинства функций шага DATA;• PROC FCMP создает программы, обладающие следующимиособенностями:• простота - программы, которые легко читать, создавать и изменять;• независимость - реализация подпрограммы не оказывает влияния напрограмму, вызывающую подпрограмму;• повторное использование – подпрограммы можно вызвать из любойпрограммы, которая может читать набор данных, где сохраненыподпрограммы.PROC FCMPPROC FCMP OUTLIB= | OUTCAT=libname.data-set.package;OUTLIB= | OUTCAT=libname.data-set.packageОБЯЗАТЕЛЕН!!!• Этот код создает функцию сименем MKTв пакете с именемMarketing.• Пакет сохраняется в набореданных orion.functions.• Пакет — это коллекцияподпрограмм суникальными именами.Задает трехуровневое имя выходногопакета, в который записываютсяскомпили-рованные подпрограммыи функции, когда завер-шается шаг PROCFCMP.Синтаксис определение пользовательскихфункцииВ одном шаге PROC FCMP можно определить несколько функций.Каждое определение функции содержит следующий блок кода:FUNCTION name (parameter-1, …,parameter-N);function MKT(ID, Date, Type) $ 40;program-statements;RETURN (expression);ENDSUB;FUNCTION function-name(argument-1 <$>,argument-2 <$>, ...,argument-n <$>) <$> <length>;function-nameУказывает имя функции.argumentУказывает один или несколько аргументов функции.$Указывает символьное значение.lengthУказывает длину символьного значения.Операторы RETURN и ENDSUB• Все функции должны возвращать значение.RETURN (expression);expressionУказывает значение, возвращаемое функцией.• Оператор ENDSUB завершает определение функцииENDSUB;• Созданные PROC FCMP функции можно вызвать из:••••••шага DATA;блока COMPUTE в шаге процедуры REPORT;процедуры SQL;некоторых процедур SAS/STAT;некоторых процедур SAS/ETS;процедур SAS/OR, например, NLIN, MODEL и NLP.Использование функции• Чтобы использовать функцию в шаге DATA или поддерживаемомшаге PROC, используйте системную опцию CMPLIB=CMPLIB=libref.data-set | (libref.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.