programowanie w SAS

Transcription

programowanie w SAS
Wprowadzenie do Systemu SAS
i programowania w SAS 4GL
Henryk Maciejewski
hmac@pwr.wroc.pl
1
Plan
♦ System SAS - wprowadzenie
– SAS: moduły i aplikacje
– Środowisko SAS
– Organizacja danych w środowisku SAS
♦ Programowanie w SAS 4GL – język do
przetwarzania danych
2
System SAS - wprowadzenie
♦ Historycznie SAS = Statistical Analysis System
♦ Obecnie, (a) system do budowania rozwiązań DSS (moduły do
pobierania danych, analiz, raportowania), (b) specjalizowane
rozwiązania DSS
♦ Moduły – np.
•
•
•
•
•
•
•
•
Base SAS
STAT
ACCESS
GRAPH
AF, webAF
EIS
...
OR, QC, ETS,...
„core” (język, procedury)
procedury analizy statystycznej
pobieranie danych ze źródeł zewn.
budowa aplikacji
Procedury: „operations research”, „quality
control”, „time series forecasting”, itd.
• Enterprise Miner
• Data Warehouse Administrator
3
System SAS - wprowadzenie
♦ Rozwiązania biznesowe dla wspomagania decyzji
(decision support) w środowiskach z duŜymi
zasobami danych np.
–
–
–
–
–
–
–
–
Data warehousing
Data mining
IT resources management
Human resources management
Financial management
Web portal usage analysis
Data analysis in pharmaceutical industry
CRM, SRM (=Supplier RM), etc.
4
Środowisko programowania
♦ MVA (MultiVendor Architecture): programy przenośne: VMS,
CMS, OS/390, Unix, Windows, OS/2
♦ Organizacja danych w środowisku SAS
– Pliki SAS (SAS files)
Np. , SAS data sets, views, MDDBs
– Umieszczane w bibliotekach SAS (SAS libraries)
referencja (LIBREF) do folderu, kartoteki itp. systemu operacyjnego np.
LIBNAME fhh ‘c:\data\fhh’;
5
Środowisko programowania biblioteki
♦ Biblioteki tworzone automatycznie
SASHELP
SASUSER
WORK
-- SAS system files
-- user profile files
-- biblioteka tymczasowa – kasowana po
zamknięciu systemu SAS, pozostałe są
permanentne
♦ Nazwy plików SAS – kwalifikowane: libraryname.filename, np.
fhh.abc
abc
-- plik w bibliotece fhh
-- plik w bibliotece WORK
6
Środowisko programowania – zbiory
danych
♦ Zbiory danych SAS - typy:
– DATA – tablica fizycznie przechowująca dane
– VIEW
– nie zawiera fizycznie danych, a jedynie kod („query”)
realizujący dostęp do danych. VIEW widziane jest przez identycznie jak
DATA set (na ogół)
♦ Konwencja nazw
– Wiersze to obserwacje
– Kolumny to zmienne (variables)
♦ Zbiory danych (data set) składają się z:
– deskryptora
– danych
- atrybuty zbioru i zmiennych
7
Środowisko programowania – zbiory
danych
♦ Wyświetlamy deskryptor DATA set:
PROC CONTENTS DATA=fhh.abc;
RUN;
-----Alphabetic List of Variables and Attributes----#
Variable
Type
Len
Pos
Format
Informat
Label
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
1
sex
Char
2
16
$3.
$3.
sex
4
teach_duration
Num
8
8
11.
11.
teach_duration
2
teacher_Code
Num
8
0
11.
11.
teacher_Code
3
titel_code
Char
12
18
$12.
$12.
titel_code
♦ Typy zmiennych w SAS
– character
– numeric
♦ Atrybuty zmiennych
– Length
- długości zmiennych: numeric: 3-8, character 1-32767 (MS Windows)
– Format
- jak drukować wartość zmiennej
– Informat - jak konwertować „input string” do wartości zmiennej
– Label
- opis zmiennej
8
Środowisko programowania – zbiory
danych
♦ Drukuj wartości zapisane w DATA set:
PROC PRINT DATA=fhh.abc;
RUN;
Obs
1
2
3
4
5
6
7
8
sex
M
M
M
M
M
M
W
M
teacher_Code
1
2
3
4
5
6
7
8
titel_code
teach_duration
006
502
022
006
006
1
1
.
1
1
1
1
1
♦ „Missing value”
– Wskazuje Ŝe w danej obserwacji nie ma wartości zmiennej
– „missing numeric values” reprezentowane przez . (kropka)
– „missing character values” reprezentowane przez puste miejsce
9
Plan
♦ System SAS - wprowadzenie
– SAS: moduły i aplikacje
– Środowisko SAS
– Organizacja danych w środowisku SAS
♦ Programowanie w SAS 4GL – język do
przetwarzania danych
10
Programowanie w SAS
♦ SAS 4GL – język umoŜliwiający realizację:
– Dostępu do danych („retrieval from external sources”)
– Przetwarzanie danych („cleaning, transforming, combining”)
– Analizę danych
– Raportowanie
♦ Inne języki programowania w środowisku SAS
– SCL (object oriented SAS Component Lang.)
– SAS macro language
11
Przykład – pierwszy program
data abc;
teachers=283;
students=853;
all=teachers+students;
s_per_t=students/teachers;
run;
DATA STEP
Utwórz data set abc
proc print data=abc;
run;
PROC STEP
Drukuj data set abc
Obs
1
Utwórz zmienne w abc
Wykonaj „data step”
Data Set WORK.ABC
teachers
students
all
283
853
1136
s_per_t
3.01413
12
Przetwarzanie w SAS
Raport
SAS Data Set
Raw data file
DBMS tables
(e.g., .mdb)
Remote access
(ftp, TCP/IP
socket, etc.)
...
DATA Step
PROC Step
...
DATA Step
...
External file
SAS Data Set
Program w SAS
SAS Log
13
DATA Step, PROC Step
♦ DATA Step
– Wczytuje dane wejściowe
• Np. data sets,
• Pliki , itd.
– Przetwarza (modyfikuje)
dane
– Produkuje dane wyjściowe
♦ PROC Step
– Analiza danych w data setach,
– Tworzenie raportów
(tekstowe, graficzne)
• Np. data sets,
• Pliki
• Raporty
14
Algorytm
DATA Step
data students;
input name $ sex $ note1 note2;
avg=mean(note1,note2);
datalines;
Anna F 4 5
Ian
M 3 .
Eva
F 1 4
;
run;
Obs name
1 Anna
2 Ian
3 Eva
sex note1 note2 avg
F 4 5 4.5
M 3 . 3.0
F 2 1 1.5
15
Algorytm DATA Step podumowanie
♦ Główna pętla DATA step:
– data step czyta jedną obserwację,
– Dane umieszczane w PDV = Program Data Vector;
– PDV inicjownany wartościami missing na początku kaŜdej iteracji
– Wykonywanie poleceń (statements) zapisanych w DATA step na danej
obserwacji,
– Zapis obserwacji do wynikowego data set (implicit OUTPUT)
♦ UWAGA: Implicit OUTPUT nie działa jeśli jawnie uŜyjemy polecenia
OUTPUT w DATA step
♦ Informacja wejściowa dla DATA step-u:
– SET statement – pobieraj dane z data set-u
– INPUT statement – pobieraj po linii danych z pliku zewn. (podanego w
poleceniu INFILE)
16
Programowanie w data step –
„Idiomy programisty”
♦ Wybór obserwacji z data set
♦ Wybór zmiennych
♦ Tworzenie nowych / modyfikacja zmiennych
♦ OUTPUT statement – tworzenie wielu zbiorów
♦ Łączenie data set-ów („stacking, merging”)
♦ „BY-group processing”
♦ Czytanie/pisanie plików zewnętrznych
17
Wybór obserwacji
data male;
set students;
if sex=‘F’ then delete;
run;
Wyślij na wyjście wybrane obserwacje
UŜywając subsetting IF:
→ usuń obserwacje jest wyraŜenie if jest
prawdą;
data male;
set students;
if sex=‘M’;
run;
lub:
→ przetwarzaj dalej obserwację jeśli
data male;
set students;
where sex=‘M’;
run;
data male;
set students (where=(sex=‘M’));
run;
warunek jest prawdą;
UŜywając WHERE (statement lub data set
option)
→ WHERE statement
→ WHERE data set option
18
Wybór obserwacji
data male;
set students;
if sex=‘F’ then delete;
run;
data male;
set students;
if sex=‘M’;
run;
lub:
Obs name
1 Anna F
2 Ian M
3 Eva F
sex
4 5
3 .
2 1
note1 note2 avg
4.5
3.0
1.5
Obs name sex note1 note2 avg
1 Ian M 3 . 3
data male;
set students;
where sex=‘M’;
run;
data male;
set students (where=(sex=‘M’));
run;
19
Wybór zmiennych
data avg_only;
set students;
drop sex note1 note2;
run;
data avg_only;
set students;
keep name avg;
run;
lub:
data avg_only;
set students (drop= sex note1
note2);
run;
data avg_only;
set students (keep= name avg);
run;
Wyślij na wy tylko wybrane zmienne
UŜywając DROP, KEEP statements
→ DROP statement
→ KEEP statement
UŜywając DROP, KEEP data set options
→ DROP data set option
→ KEEP data set option
20
Wybór zmiennych
data avg_only;
set students;
drop sex note1 note2;
run;
data avg_only;
set students;
keep name avg;
run;
lub:
data avg_only;
set students (drop= sex note1
note2);
run;
Obs name
1 Anna F
2 Ian M
3 Eva F
sex
4 5
3 .
2 1
note1 note2 avg
4.5
3.0
1.5
Obs name avg
1 Anna 4.5
2 Ian
3.0
3 Eva
1.5
data avg_only;
set students (keep= name avg);
run;
21
Tworzenie nowych zmiennych
data pass (drop= sex note1 note2
avg);
set students;
if avg < 2 then
result='passed';
else result='failed';
run;
Obs name
1 Anna F
2 Ian M
3 Eva F
sex
4 5
3 .
2 1
note1 note2 avg
4.5
3.0
1.5
Obs name result
1 Anna failed
2 Ian failed
3 Eva passed
22
Tworzenie nowych zmiennych
Uwaga – nie rób tak:
data pass;
set students (drop= sex note1
note2 avg);
if avg < 2 then
result='passed';
else result='failed';
run;
UWAGA: w tym przykładzie sex, note1,2 i
avg nie są wczytywane ze zbioru we, stąd
wartość avg jest niezainicjowana (czyli
missing)
Obs name
1 Anna F
2 Ian M
3 Eva F
sex
4 5
3 .
2 1
note1 note2 avg
4.5
3.0
1.5
Obs name avg result
1 Anna . passed
2 Ian
. passed
3 Eva
. passed
23
OUTPUT Statement
data males females;
set students;
if sex='F' then output females;
if sex='M' then output males;
drop sex;
run;
Zapisuje bieŜącą obserwację do wyjściowego
data set
UŜyteczna przy tworzeniu kilku zbiorów z
jednego data set-u
UWAGA: jeśli OUTPUT jest jawnie uŜyty w
DATA step, „implicit OUTPUT” nie
działa (p. algorytm DATA step)
Obs name
1 Anna F
2 Ian M
3 Eva F
females
1 Anna
2 Eva
sex
4 5
3 .
2 1
note1 note2 avg
4.5
3.0
1.5
males
1 Ian
24
OUTPUT– Generacja danych
data generator;
do x=1 to 100;
y=rannor(-1);
output;
end;
run;
UWAGA: nie ma instrukcji specyfikującej
dane wejściowe (np. SET albo INPUT),
więc będzie wykonana tylko jedna
iteracja głównej pętli DATA steo-u
(DATA step main loop)
Wynik: 100 wartości losowych z rozkładu
N(0,1)
Obs
1
2
...
...
99
100
x
1
2
y
0.52813
0.51177
99 -0.23971
100 0.92665
25
Łączenie data set-ów (instrukcja SET)
data all;
set males females;
run;
data all2;
set males(in=m) females(in=f);
if m then sex=‘M’;
if f then sex=‘F’;
run;
Łącznie data set-ów (stacking): przetwarzaj
obserwacje z pierwszego data set,
potem drugiego itd..
Z którego zbioru we pochodzi dana
obserwacja? – zrób tak:
–
males(in=m) tworzy automatic
variable m (m=1 dla obserwacji ze zbioru
males; m=0 poza tym)
–
UWAGA: zmienne automatyczne (tu: m
i f) nie są zapisywane do wyjściowego
zbioru danych
Obs name
1 Ian 3
2 Anna 4
3 Eva 2
note1
. 3.0
5 4.5
1 1.5
note2 avg sex
M
F
F
26
Łączenie data set-ów (MERGE)
data lib;
input name $ @8 date yymmdd10. title
$20. ;
datalines;
Anna
2000/12/14 Hamlet
Anna
2000/12/14 SAS Programming
Witek 2001/07/12 XML
;
run;
proc sort data=students
out=students_sort;
by name;
run;
data st_books;
merge students_sort lib;
by name;
keep name sex title;
run;
Operacja „match-merging” data set-ów:
Data set
Obs name
1 Anna F
2 Ian M
3 Eva F
STUDENTS:
sex note1 note2 avg
4 5 4.5
3 . 3.0
2 1 1.5
Data set LIB:
Obs name date title
1 Anna 2000-12-14 Hamlet
2 Anna 2000-12-14 SAS Programming
3 Witek 2001-07-12 XML
Wynikowy data set:
Obs name sex
title
1 Anna
F
Hamlet
2 Anna
F
SAS Programming
3 Eva
F
4 Ian
M
5 Witek
XML
27
„BY-group Processing” w DATA
Step
data best_note worst_note;
set exam;
by st_code;
if first.st_code then
output best_note;
if last.st_code then
output worst_note;
keep st_code sem note;
run;
„BY-group” jest podzbiorem obserwacji z
ustaloną wartością zmiennej podanej w
poleceniu BY (zbioór musi być
posortowany po tej zmiennej)
UŜycie polecenia BY w DATA step tworzy
zmienne automatyczne, np.
FIRST.st_code
LAST.st_code
ustawione przez DATA step na 1 tylko
dla pierwszej (ostatniej) obserwacji w
grupie „BY-group”
Data set EXAM:
st_code sem
note
1
WS96/97
1
1
WS96/97
4
1
WS95/96
6
2
WS99/00
1
2
WS00/01
3
3
WS99/00
1
3
WS99/00
1
...
BY-group
BY-group
28
Zmienne automatyczne
Np. kontrola błędów na wejściu:
data results err_log;
infile ‘C:\temp\results.txt’;
input name $ jump date yymmdd8.;
if _error_ then output err_log;
else output results;
run;
Tworzone przez DATA step; nie są
częścią Program Data Vector; nie są
zapisywane do wyjściowych data
setów, np.:
_N_ - numer iteracji DATA step-u
_ERROR_ - ustawiany na 1 jeśli wystąpił
błąd w przetwarzaniu dancych
(input data error, math error, itd. )
FIRST.by_variable
LAST. by_variable – zobacz BY-group
processing
29
Czytanie plików zewnętrznych
data results err_log;
infile ‘C:\temp\results.txt’;
input name $ 1-10 jump @24 date
yymmdd8.;
if _error_ then output err_log;
else output results;
run;
Polecenie INFILE – podaj plik, z którego
będą czytane dane (podajemy w
postaci fizycznej ścieŜki lub
FILEREF utworzony przez
polecenie FILENAME, np.
FILENAME fileref ‘path’;
Polecenie INPUT
–
–
Czyta (co najmniej jedną) linię z
pliku
Konwertuj linię do wartości
zmiennych wg:
•
Specyfikacji zmiennych, np.
–
–
name $ - character variable
jump, date – numeric variables
•
Specyfikacji kolumn, np.
•
Informat-ów, np.
–
–
name $ 1-10 – zakres kolumny
date yymmdd. – informat dla
zmiennej date
30
Czytanie plików zewnętrznych
data xy;
input x y;
datalines;
1 2 3
4
5 6 7 8
;
run;
data xy_ok;
input x y @@;
datalines;
1 2 3
4
5 6 7 8
;
run;
Modyfikujemy zachowanie INPUT:
INPUT var1 var2 var3 @@;
Obs x y
1
1 2
2
4 5
Obs
1
2
3
4
x
1
3
5
7
y
2
4
6
8
Ten INPUT nie zaczyna czytać nowej linii
dopóki ma dane w buforze
wejściowym, które moŜe
konwertować na zmienne
UWAGA: polecenie INFILE moŜe mieć
opcje:
INFILE spec_pliku <opcje>;
np.
DML=‘,’;
separator tokenów w linii
FIRSTOBS=3; zacznij czytać plik od 3 l.
i wiele innych...
31
Zapis do plików zewnętrznych
data _null_;
*no data set;
set fhh.exam;
file 'c:\temp\exam.txt';
put student_code 1-4 ', ' sem
@24 note 3.1 ;
run;
Polecenie FILE – podaj plik do którego
będzie zapis danych
Polecenie PUT– zapisz jedną linię do
pliku wyjściowego, uŜywając
atrybutów FORMAT przypisanych
zmiennym lub podanych w
poleceniu PUT
data _null_ - data step nie będzie
tworzył wyjściowego data set-u
32
Jawne konwersja – funkcje PUT i
INPUT
data a;
t=1234.56;
n=PUT(t,8.1);
n2=PUT(t, comma8.1);
t2=INPUT(n2,comma8.2);
run;
Zmienna_znakowa = PUT(zmienna,
format);
Zmienna numeryczna lub znakowa =
INPUT(zmienna, informat);
proc print;
run;
Obs
t
n
n2
1 1234.56 1234.6 1,234.6
t2
1234.6
33
Instrukcja RETAIN
data wzrosty_miesieczne;
set gielda; *data kurs mies;
BY mies;
RETAIN pocz;
IF FIRST.mies then pocz=kurs;
IF LAST.mies then DO;
Wzrost=kurs-pocz;
Output;
end;
run;
Składnia polecenia RETAIN:
RETAIN var
initial_val;
Zmienna var nie będzie inicjowana na
‘missing’ na początku kolejnych
iteracji DATA step (wartość będzie
zachowana z poprzedniej iteracji)
RównieŜ:
var+expression;
Co jest równowaŜne:
RETAIN var 0;
var=SUM(var,expression);
34
Perspektywy (VIEW)
data pracv bledy(keep=id)/VIEW=pracv;
INFILE ‘pracownicy.txt’ missover;
INPUT nr data yymmdd8. nazwisko $
kwota;
IF kwota=. then
OUTPUT bledy;
ELSE
OUTPUT stview;
run;
VIEW utworzone za pomocą DATA
stepu
Nie zawiera danych a jedynie kod
pozwalajścy na uzyskanie danych
Jest zbiorem tylko do odczytu
UWAGA!!!
Zbiór bledy nie zostanie utworzony zaraz
po wykonaniu programu, ale
dopiero po pierwszym odwołaniu do
perspektywy pracv, np. przez:
proc print data=pracv;
run;
35
Tablice (polecenie ARRAY)
data a;
INPUT skok1 skok2 skok3;
ARRAY s(3) skok1 skok2 skok3;
DO i=1 TO 6;
IF s(i)=0 then s(i)=.;
END;
run;
lub:
ARRAY x(*) _NUMERIC_:
Tablica jest referencją do istniejących
zmiennych, zgrupowanych pod
wspólną nazwą
Polecenie ARRAY nie tworzy nowych
zmiennych)
Wszystkie zmienne numeryczne w data
stepie
Ale uwaga – ten wariant tworzy zmienne
tymczasowe:
ARRAY y(100) _TEMPORARY_ (100*.);
Zmienne te nie są zapisywane do zbioru
wyjściowego
Są automatycznie ‘RETAINED’
36
Język makr – makrozmienne
%LET swieta=’24dec2002'd;
%LET zbior=klasa;
TITLE „Raport dla zbioru &zbior”;
Ile_dni = &swieta – today();
put ‘Do Swiat zostało ‘ ile_dni ‘ dni;
Makrozmienne:
przechowują jedynie teksty;
wartości makrozmiennych są
ustalane przed kompilacją
programu;
wartości są rozwijane w „”, nie są w
‘’
%LET w ‘open source’ (poza
definicją makroprogramu) tworzy
globalną makrozmienną
37
Język makr – makroprogramy
%macro import(rawfile, ds);
data &ds;
infile &rawfile;
input t @;
%do i=1 %to &N;
input v&i %eval(&KOL+&i) @;
%end;
run;
%mend import;
W makroprogramach moŜemy uŜywać
wyraŜeń i funkcji wykonywanych
przez makroprocesor, np.
%if
%then %else ;
%do
%to
%end;
%eval()
%sysevalf()
%let rf=‘t.txt';
%import(&rf,t);
38
Interfejs makr i DATA step
ZauwaŜ, Ŝe w poniŜszym (błędnym) kodzie
makrozmienna foot nie chce zaleŜeć od wartości
zmiennej w DATA stepie...
Wartości makrozmiennych są ustawiane
przed kompilacją programu – stąd
kod obok jest błędny...
data a;
...
if full then do;
%let foot=’pełne’;
end;
else do;
%let foot=’puste’;
end;
proc print;
footnote “&foot”; /*zawsze będzie
napis ‘puste’ !!!*/
run;
Wydrukuj ostatnio utworzony data set...
39
Interfejs makr i DATA step
Teraz kod jest poprawny
data a;
...
if full then do;
call symput(‘foot’,’pełne’);
end;
else do;
call symput(‘foot’,’puste’);
end;
proc print;
footnote “&foot”; /* napis zaleŜy od
full */
run;
SYMPUT / SYMGET – interfejs
pomiędzy językiem makr a DATA
stepem
SYMPUT – ustawia wartość
makrozmiennej w czasie
wykonywania DATA stepu
SYMGET – pobiera wartość
makrozmiennej, ustawionej przez
SYMPUT
CALL SYMPUT(‘total’, total);
CALL SYMPUT(‘POS’||left(_N_),
pos);
pos=SYMGET(‘POS’||left(_N_));
40
Interfejs makr i DATA step
data _null_;
if 0 then set history nobs=count;
call symput('num',
left(put(count,8.)));
stop;
run;
data _null_;
put "Ilosc obserwacji w zbiorze
history = &num";
run;
Przykład – podaj ile jest obserwacji w
data set
Opcja nobs polecenia set ustawia w
zmiennej count ilość obserwacji w
zbiorze. Robi to w czasie kompilacji
data stepu.
Polecenie STOP w celu uniknięcia
zapętlenia (jest polecenie SET, a
nigdy nie będzie spełniony warunek
końca danych)
41