Ответ на задачу из поста: «Объединение таблицы с помощью SET»

На прошлой неделе мы рассмотрели проблему некорректной работы шага data step, где с помощью set объединялись две таблицы.

И так правильный ответ:

Дело в том, что при значение amount отсутствует в таблице B.

При написании set a b сначала считываются все данные из таблицы A, затем все данные из таблицы B, т.е. происходит конкатинация данных.

В нашем случае вектор PDV (Program Data Vector) будет выглядеть следущим образом, когда начнет читать данные из таблицы B:

до прохода data step:

_N_ _ERROR_ ID AMOUNT
3 0 . .

далее после считывания первых значений из таблицы B:

_N_ _ERROR_ ID AMOUNT
3 0 1001 .

после прохода всего шага:

_N_ _ERROR_ ID AMOUNT
3 0   1001      3

Следущий круг цыкла:

до прохода data step:

_N_ _ERROR_ ID AMOUNT
3 0  1001      3

После прохода считывания данных из таблицы B:

_N_ _ERROR_ ID AMOUNT
3 0  1003      3

Прошу обратить внимания, что на этом этапе значение amount не перетелось.

После прохода всего шага:
_N_ _ERROR_ ID AMOUNT
3 0  1003      3

Вот таким образом мы получили заполненные занчения amount даже у тех ID из таблицы B, которые не соответсвовали условию IF.

P.S.

Решить данную проблему можно просто добавив мустой столбец amount в таблицу B.
После этого все будет работать корректно.

MSTORED SASMSTORE. Склад макрасов. Part1.

Всем привет.

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

Довольно часто пользователи используют в своих программах маросы, написанные очень и очень давно.
Я бы даже сказал эти макросы для многих стали своего рода частью sas кода, т.е. своего рода стали как современный телефон — жить без него можно, но очень неудобно :).

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

1.  Сперва поиск происходит в текущей сесси пользователя, т.е. в папке Work.Sasmacr

Видно, что в указанном каталоге храниться макрос: Abc.

2.  Если название макроса не удалось найти в папке  Work.Sasmacr, то поиск происход в библиотеке определенной под SASMSTORE

B выглядит это так:

Как мы видим в данном каталоге имются макросы: Foobar, Secure, Secure1.

3.  Далее поиск осуществляется в библиотеке, определенной под SASAUTOS

4.  И конечный поиск идет по библиотке SASHELP из каталога Sasmacr из пункта 2.


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

P.S.  Более подромно материал можно посмотреть здесь.

SAS DATA STEP. Объединение таблиц с пощью SET.

Все привет.

Сегодня речь пойдет о старом и добром языке DATA STEP.

Не для кого не секрет, что получиться в результате следующего кода:

data c;
set a b;
run;

Т.е. в set указаны две таблицы A и B.

А теперь давайте проведем следущий эксперимент:

Возьмем таблицу A

Т.е это таблица с двумя полями (ID и amount)

Возьмем таблицу B

Таблица B с одним полем ID.

И теперь напишем следующий запрос:

А теперь внимание вопрос:

Почему результат выглядит следущим образом?

Конкретно требуется объяснить почему в четвертой строчке (ID=10002) Значение amount=3 ?

Жду Ваших решений.

P.S.
Нашел похожий пост здесь. Опубликованный уже через месяц после моего с той же проблемой.

Также там предлагается еще одно изящное решение.

Lock SAS Tables. Блокировка таблиц SAS. Part 2

Всем добрый день.

Начну сразу с рассмотрения TestCase.

Допустим у Вас есть процесс который обращается к SAS таблице, которая периодически обновляется (допустим неким ETL процессом).

Если в момент обновления таблицы вы попробуете к ней обратиться, то схватите ошибку «невозможности блокировки таблицы»:

Как можно обойти эту пролему?

Один из возможных вариантов — можно в цикле проверять залочена ли таблица и если да, через какой-то промежуток времени опять делать проверку и так до дех пор пока не истечет ожидаемое время либо до тех пор пока таблицу не отпустит сторонний процесс и вы тогда ее спокойно заблокируете.

Привожу макрос, проверяющий в цикле осободили ли таблицу и если да, то блокирует ее.

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

Из лога видно, что макрос висел почти 20 секунд и после этого таблица была отпущена и тутже заблокирована нашим процессом. После мы уже делаем то что хотим ( в данном случае просто переливаем данные).

Да, и не забывайте разблокировать талицу когда закончите с ней работать.

P.S. оригинал макроса можно посмотреть здесь.

ERROR: More positional parameters found than defined.

Всем привет.

Столкнулся со следующей ошибкой:

ERROR: More positional parameters found than defined.

Полное описание ошибки можно посмотреть здесь.

Ошибка интересна тем, что когда она может проявиться не сразу, а через какое-то время.

Допустим у вас вы вызываете макрос с параметром %test(&parameter), при этом до вы в параметр инсертите некий текст из внешнего источника, допустим.
Так вот если в этом тексте встретяться спецсимволы, то вы схватите вышеупомянутую ошибку.

А как вы понимаете, запятая в тексте может появиться ой как не скоро (допустим забор текста из некоего справочника, который постоянно пополняется пользовательскими данными).

Решение данной проблемы достаточно простое — использовать %bquote

Тогда код будет выглядеть: %test(%bquote(&parameter)).

Curse of dimensionality

Так называемое «проклятие размерности (curse of dimensionality)» это явление накладывающее серьзные ограничения на классификаторы основанные на оценке локальных свойств плотности вероятности наблюдений в многомерных данных. Одним из наиболее простых и интуитивно понятных методов классификации является метод k ближайших соседей. Класс к которому принадлежит объект определяется наиболее распространенным классом среди наблюдений в прилежащей локальной области:

 

Число соседей k обычно выбирается пропорциональным общему количеству наблюдений в training data set. Очень важно свойство локальности выборки. Рассмотрим одномерный случай. Допустим у нас есть 1000 равномерно распределенных наблюдений на отрезке (0,1). Для того чтобы захватить r (fraction) = 0.01 всех наблюдений в одномерном кубе (отрезок) понадобится интервал длины L = 0.01. В двумерном случае чтобы охватить тот же объем в близлежащей окрестности любого наблюдения  нам понадобится интервал длинны L =0.01^0.5 = 0.1. В 10 мерном случае 0.01 ^ 10 = 0.63 (при том что вся длина ребра 1). Как видим свойство локальности теряется. Иначе говоря, чтобы охватить 1% данных в 10 мерном пространстве для того чтобы оценить класс нового объекта нам понадобится 63% всего диапазона значений каждой переменной. Следующий код строит длинну интервала многомерного пространства (от 1 до 10) в зависимости от величины r(fraction) определяющей число наблюдений в локальной области усреднения:

SAS Visual Analytics 6.3. Network Diagram. Маршрут Деда мороза

Поздравляю всех с прошедшими праздниками, в том числе и с сегодняшним «Новым Старым новым Годом» как-то так.

У нас в России любят праздники и некоторые отмечают аж 5 подряд (рождество католическое, НГ, рождество православное, Старый НГ).

Сегодня будет продолжение статьи по SAS VA 6.3, в которой я упомянул статью Falko Schulz.

В этой статье были скриншоты маршрута Санта Клауса. Глядя на этот топик мне также захотелось попробовать сделать что-то подобное только для нашего русского Деда Мороза, который в отличие от Санта Клауса подарки раздает не в ночь на 25 декабря, а в ночь на 1 января.

Однако моим планам не суждено было сбыться, так как Falko использовал в своей статье уже новую версию SAS VA 6.3 (у меня была предыдущая версия 6.2). Поэтому пришлось ждать какое-то время.

И вот вчера поставил своеобразный рекорд уставил SAS VA6.3 за один рабочий день (для сравнения установка версии SAS VA 6.1 в начале прошлого года заняла целую неделю).

Данные по городам будем использовать из предыдущих уроков (можно скачать здесь).

Сразу предвосхищая результат, скажу, что лицензии OR на SAS у меня нет, поэтому задачу я решил по простому, считая, что НГ начинают отмечать на Сахалине и заканчивают в Калининграде, я сделал сортировку по долготе и измерил расстояние между соседними городами.

Надо сказать, что в SAS есть удобная функция- GEODIST, вычисляющая расстояние между двумя точками в любой удобной метрической системе.

Получилось, что Дедушка Мороз должен пролететь на своих санях аж 132 318 км, т.е. это более 3-х кругов вокруг земного шара :).

Признаюсь честно, что решать «незамкнутую задачу коммивояжёра» не стал. Однако, полагаю, оптимальный вариант вряд ли будет сильно отличаться от моего (хотя может кто из Вас попытается? будет интересно посмотреть на результат).

Более подробно о том, что было сделано можно посмотреть в видео варианте урока:

Всех еще раз с прошедшими праздниками и до скорых встреч.

С уважением,
Николай.