SAS
Miary pozycyjne, sas, teradata
Saturday, November 21st, 2009 | SAS | No Comments
Dla sasa gotowy do odpalenia kod:
* SAS
data baza;
input x best12.;
cards;
2
3
1
4
5
6
7
8
9
10
;run;
proc sort data = baza; by x; run;
data baza_pozycja;
set baza NOBS=count;
kwantyl = round(_n_/(count/4) + 0.4999, 1);
decyl = round(_n_/(count/10)+ 0.4999,1);
run;
Dla teradaty, wymagana teabelka o nazwie baza, zaierająca kolumny id int, x int.
* TERADATA
alter table baza add kwantyl_ncr byteint;
alter table baza add decyl_ncr byteint;update baza from
(sel
a.id
quantile(4,x) as kwantyl,
quantile(10, x) as decyl
from baza a)u
set kwantyl_ncr = u.kwantyl, decyl_ncr = u.decyl
where baza .id= u.id
Macro SAS - operacje na datach
Wednesday, January 7th, 2009 | SAS | No Comments
http://analytics.ncsu.edu/sesug/2006/SC11_06.PDF
%let StartDate = %Sysevalf( ‘01JAN2004′d ) ;
%let EndDate = %Sysevalf( ‘01JAN2006′d ) ;%let Date = %Sysfunc( InputN( 01JAN2006 , Date9 ) ) ;
%let Date2 = %Sysfunc( PutN( &Date , Date9 ) ) ;%let NumOfMonths = %Sysfunc( Intck( Month , &StartDate , &EndDate ) ) ;
%let NewDate = %Sysfunc( Intnx( Month , &StartDate , &NumOfMonths ) ) ;
%Sysevalf - Evaluates arithmetic and logical expressions using floating-point arithmetic
%Sysfunc - Execute SAS functions (nie obsługuje funkcji put, input, lag i kilku innych)
By zapisać datę do stringa użyj kodu:
…
translate(put(data,ddmmyy10.),”-”,”/”) as moja_data format=$18.,
catx (” “, “Przypominamy, ze dnia”, calculated moja_data) as text
…
SAS w roli auto emailera
Saturday, November 29th, 2008 | SAS | No Comments
Dystrybucja raportów, zobacz jak wysłać e-mail bezpośrednio z %makra w SAS, czyli jedna z możliwiśco oferowanych przez ODS (Output Delivery System) SAS.
Gdzie zapisać %macro SAS
Friday, November 28th, 2008 | SAS | No Comments
Pierwsze kroki programowania w świecie SAS muszą doprowadzić do miejsca w którym zastanawiasz się w jaki sposób zapisać swoje %macro, tak aby było dostępne w dowolnym projekcie, bez potrzeby kopiowania i kompilowania kodu. Zaraz potem pojawia się myśl że fajnie by było współdzielić kawałki kodu ze współpracownikami.
Na szczęście szlaki zostały już przetarte, w internecie łatwo odnajdziemy opracowania tego i podobnych tematów. Tutaj krótko artykuły które dla mnie okazały się szczególnie pomocne.
Building and Using Macro Libraries
Autor ogólnie omawia temat budowania biblioteki makr oraz przedstawia trzy sposoby zapisywania i wywoływania makr (%include, Autocall, oraz funkcję Compiled Stored Macros).
W większości przypadków optymalnym wyborem będzie wykorzystanie funkcji Compiled Stored Macros. Szczegółowy, przyjazny opis jak używać tej funkcji znajdziemy w artykule poniżej.
A Practical Approach to the Stored Compiled Macro Facility…
Krótko pisząc definiujemy katalog w którym chcemy przechowywać nasze makra poleceniem libname, uruchamiamy opcję systemową sas MSTORED oraz ustawiamy jej atrybut SASMSTORE. Następnie dodajemy do definicji naszego makra opcję STORE. W efekcie makro zostanie skompilowane i zapisane do wybranego katalogu. Proc Catalog; umożliwia nam przegląd zgromadzony makr. Aby zachować możliwość korzystania z utworzonej biblioteki makr po uruchomieniu nowej sesji SAS musimy dodać dwie linijki do pliku autoexec.sas, to jest zdefiniować katalog oraz włączyć opcję MSTORED. Poniżej przykładowy kod, a na końcu link przydatny dla użytkowników Enterprise Guide.
libname macrolib ‘ N:\SAS programs\macro_library ‘;
options mstored sasmstore=macrolib;
%macro macro_name (parameters) / STORE SOURCE DES=”description”;
.
.
macro program code
.
.
%mend macro_name;
PROC CATALOG catalog=macrolib.sasmacr;
contents;
Quit;
http://www.sas.com/offices/europe/poland/services/support/faq_eg.html#2
Makra - wprowadzenie
Thursday, November 27th, 2008 | SAS | No Comments
Przyjazne wprowadzenie do tworzenia makr w SAS
By dane z Data Step’u zapisać do zmiennej
Wednesday, November 26th, 2008 | SAS | No Comments
http://www2.sas.com/proceedings/forum2007/050-2007.pdf
%macro doit;
%let id=%sysfunc(open(moja_tabelka));
%let NObs=%sysfunc(attrn(&id,NOBS));
%syscall set(id);
%do i=1 %to &NObs;
%let rc=%sysfunc(fetchobs(&id,&i));%* —- Analysis Code Goes Here —– *;
%put &zmienna_1;
%put &zmienna_2;%end;
%let id=sysfunc(close(&id));
%mend;
LAG RETAIN itp
Thursday, November 20th, 2008 | SAS | No Comments
Kiedy funkcja LAG działa inaczej niż oczekiwalismy:
http://changchung.com/download/retainLagLeadInterleave_draft.pdf
![]()
Informacje o tabelach
Wednesday, November 12th, 2008 | SAS | No Comments
Enjoy
http://www2.sas.com/proceedings/sugi31/259-31.pdf
PROC SQL;
SELECT *
FROM dictionary.members;
QUIT;
Select * from dictionary.dictionaries;
Jakość danych - FreqAll
Saturday, October 25th, 2008 | Data Mining, SAS | No Comments
Otrzymujesz zbiór danych do analizy, mniej lub bardziej uporządkowany i opisany. Przed rozpoczęciem jakichkolwiek analiz wypada sprawdzić jakość jaką reprezentuje zbiór.
Makro %freqAll znakomicie ułatwi Ci życie:
http://www2.sas.com/proceedings/forum2008/007-2008.pdf
Zapytanie SQL w pętli z parametrem
Friday, October 24th, 2008 | SAS | 1 Comment
Podczas pracy w środowisku SAS z pewnością spotkałeś się z koniecznością uruchomienia podobnego zapytania SQL na kilku tabelach oraz zestawienia wyników. Okazuje się że uruchomienie zapytania w pętli z parametrem nie jest trudne jeśli wykorzystamy język makr. Przedstawię prosty przykład.
W pierwszym kroku stworzyłem makro którego zadaniem jest wykonanie pętli dla wszystkich parametrów - zmiennych podanych na wejściu oraz wywołanie innego makra. Liczba parametrów jest dowolna.
Sposób wywołania makra:
%petla (tabela1, tabela2, tabela3)
Oraz samo makro:
%macro petla/ parmbuff;
%put Syspbuff contains: &syspbuff;
%let num =1;
%let zmienna = %scan(&syspbuff, &num);
%do %while (&zmienna ne);
%dodaj_wiersz(&zmienna);
%licznik(&zmienna, t1);
%let num = %eval (&num + 1);
%let zmienna = %scan (&syspbuff, &num);
%end;
%mend
Opcja parmbuff przy definicji makra powoduje zapisanie wszystkich parametrów jako jeden string w zmiennej &syspbuff. Dzięki temu możemy wykonać makro dla dowolnej liczby zmiennych. Za rozdzielenie stringa wejsciowego na poszczególne zmienne odpowiada funkcja %scan, która działa podobnie do funkcji explode w języku php.
W drugim kroku tworzę tabelę w której zostaną zapisane wyniki działania zapytań SQL wywoływanych przez makra.
proc sql noprint; create table work.macierz_wynikow
( nazwa_tabeli char(200) primary key,
t1 num,
t2 num,
t3 num,
t4 num
)
;quit;
Krok trzeci to przygotowanie makra któro wykona stosowny kod SQL.
%macro dodaj_wiersz (tabela);
proc sql noprint;
insert into work.macierz_wynikow nazwa_tabeli VALUES ( &tabela)
;quit;
%mend
%macro licznik_rekordow (tabela, pole);
proc sql noprint;
update work.macierz_wynikow set &pole = (
select
count(*)
from &tabela
)
where tabela = “&tabela”
;quit;
%mend
Więcej info w tym temacie: