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