markku suni factotum emeritus turun ammattikorkeakoulu › kntur85557 › attachments......
TRANSCRIPT
-
www.turkuamk.fi
DATA-vaiheen ohjelmoijan yleissivistys
– helposti unohtuvia asioita
Markku Suni
Factotum emeritus
Turun ammattikorkeakoulu
-
www.turkuamk.fi
Aivan ensimmäiseksi haluan kiittää kuulijoita kuuntelusta…
Kuten tunnettu poliitikko aloitti …
Tarkoitukseni on muistuttaa mieleen joitakin DATAvaiheen piirteitä,
joiden voisi kuvitella olevan tuttuja, mutta jotka näyttävät helposti
unohtuvan käytännössä.
-
www.turkuamk.fi
Aivan ensimmäiseksi: selvän koodaamisen merkityksestä
Tosin kaikkihan sen tietävät …
Sisennetään ohjelma sopivasti – se lisää selkeyttä:
data tulos ( keep = yksi pieni tieto )
set alku ( keep = talleta yksi tieto );
infile sasin1;
input @1 yksko $char5. /* yksikkökoodi */
@12 pieni $char5. /* pientoimituskoodi */
;
if yksko = yksi then . ..
Ohops ! Sattuipa nolosti !
-
www.turkuamk.fi
Selvän koodaamisen merkityksestä
data tulos ( keep = yksi pieni tieto )
set alku ( keep = talleta yksi tieto );
infile sasin1;
input @1 yksko $char5. /* yksikkökoodi */
@12 pieni $char5. /* pientoimituskoodi */
;
if yksko = yksi then . ..
Ohops ! Sattuipa nolosti !
Puuttuu puolipiste data-lauseen lopusta
-
www.turkuamk.fi
Selvän koodaamisen merkityksestä
DATA tulos ( keep = yksi pieni tieto ) ;
SET alku ( keep = talleta yksi tieto
end = loppuiset );
infile sasin1 end = loppuifile ;
if not loppuifile
input @1 yksko $char5. /* yksikkökoodi */
@12 pieni $char5. /* pientoimituskoodi */
;
if yksko = yksi then . ..
Ohops ! Sattuipa nolosti !
Ajatus oli lukea SAS-tiedostoa ja peräkkäistiedostoa samaan tahtiin..
Entäs, jos tiedostoissa on eri määrä havaintoja?
-
www.turkuamk.fi
Ellei koodata selkeästi,
On vaikeaa todeta
Koodin kuntoa.
Auttaisiko
BUGOMETER?
-
www.turkuamk.fi
Palautetaanpa mieleen, milloin ja miten output tapahtuu
Tiedoston avaa lause INFILE tai SETLukeminen tapahtuu lauseella INPUT tai SET
- näiden lauseiden kohdalla
Tulostus tapahtuu lauseella PUT tai OUTPUT
Lukeminen loppuu silloin, kun lukulause ei onnistu ( ts. tuottaa EOF-merkin )
- ei viimeisen tietueen kohdalla
-
www.turkuamk.fi
Entäs, jos emme tiedä, montako tietuetta on ?
DATA molemmat (KEEP = . . . )
INFILE inputti1 END = ended1 ;
IF ended1 = 0 THEN
INPUT …… ;
INFILE inputti2 END = ended2 ;
IF ended2 = 0 THEN
INPUT …… ;
/* hoidetaan kaikenlaista */
RUN;
-
www.turkuamk.fi
Entäs, jos emme tiedä, montako tietuetta on ?
DATA molemmat (KEEP = . . . )
INFILE inputti1 END = ended1 ;
IF ended1 = 0 THEN
INPUT …… ;
IF ended2 = 0 THEN
SET inputti2 ( END = ended2 ) ;
/* hoidetaan kaikenlaista */
RUN;
-
www.turkuamk.fi
Tiedostojen hyödyllisiä optioita
DATA new ( KEEP = custno /* asiakasnumero, num */
object /* vakuutuskohteen koodi */
income /* maksutulo */
outcome /* kustannukset yht. */ );
SET old( DROP = policy term version
RENAME = ( payment = income )
RENAME = ( claimspay = outcome )
WHERE = ( year = 2009 ));
IF income > 10 THEN . . .
. . .
RUN;
-
www.turkuamk.fi
CAUTION
DO NOT DISTURB
Professional
SAS program
at work
-
www.turkuamk.fi
Monipuolinen DO
DO – END on lohko, joka suoritetaan kerralla
DO laskuri = 1 TO 10;
. . .
END;
DO laskuri = alaraja TO ylaraja BY askel;
. . .
END;
IF jotain THEN DO laskenta = 10 TO 0 BY -1 ;
. . . .
END;
Tämähän on tuttua kaikki muistavat.
-
www.turkuamk.fi
Monipuolinen DO
DO – END toimii myös listan avulla
DO fibonacci = 1, 2, 3, 5, 8, 13, 21, 44, 63 ;
. . .
END;
DO coding = ‘XA’, ‘XB’, ‘XQ’, ‘XZ’ ;
. . .
END;
Tämänkin ehkä muistamme.
-
www.turkuamk.fi
Monipuolinen DO
Mutta entäs nämä:
DO UNTIL (( tax_change < 0 ) AND ( salary_change > 0));
DO UNTIL ( count >= 100 );
DO UNTIL ( cows_come_home ) ;
DO WHILE (( tax_change >= 0 ) OR
( salary_change
-
www.turkuamk.fi
Monipuolinen DO
Puhumattakaan tästä:
DO from = here TO eternity UNTIL ( war_begins );
DO days = 1 TO 1000 UNTIL ( correct > 10 );
DO counter = 1 TO 100 WHILE ( errorcount < 10 );
DO WHILE ( TRUE );
. . .
IF XX THEN LEAVE;
. .
END;
-
www.turkuamk.fi
Procedure PRINTTO – vanha, mutta toimiva
filename routed 'output-file';
proc printto print = routed new;
run;
proc freq data=test;
tables x*y / chisq;
run;
data probtest( keep = df chisq prob );
infile routed;
input word1 $ @;
if word1='Chi-Squa' then do;
input df chisq prob;
output;
end;
run;
-
www.turkuamk.fi
Öhman Åke
SAS-tiedostojen yhdistäminen: BY-lauseella
-
www.turkuamk.fi
Muuten, muistatkos tätä?
Funktion argumenttina voi toimia muuttuja tai lauseke:Jonkun edellisen kuun alku – niinmonta kuuta sitten:
ajopvm = today();
edkuu = month( ajopvm ) - niinmonta;
edalku = MDY( edkuu + ( edkuu
-
www.turkuamk.fi
Muuten, muistatkos tätä?
Funktio INDEX etsii jonkin pituisia merkkijonoja:
length laji $ 1;
SET tiedot;
IF ( index( ‘ABC’, laji ) ) THEN DO;
IF ( laji IN (‘A’, ‘B’, ‘C’ ) THEN DO;
IF ( laji = ‘A’ | laji = ‘B’ | laji = ‘C’ ) THEN DO;
Mitä eroa on noissa kolmessa IF-lauseessa ?
-
www.turkuamk.fi
DATAvaiheen alussa SAS alustaa kaikki muuttujat puuttuviksi, paitsi jos
• muuttuja on mainittu RETAIN-lauseessa
• on olemassa globaalinen RETAIN-lause
• muuttuja esiintyy summaavan lauseen vasemmalla puolella
• summing statement
• muuttuja luetaan SAS-tiedostosta
• muuttujaa käytetään I/O-lauseen optiossa
•
Muuttujien alustus
-
www.turkuamk.fi
DATAvaiheen alussa SAS alustaa kaikki muuttujat puuttuviksi, paitsi jos
• muuttuja on vektori (ARRAY) ja
• ARRAY-lause antaa alkuarvot
• vektorissa on tilapäisiä muuttujia
• vektoria käytetään summaavassa lauseessa
• vektori mainitaan RETAIN-lauseessa
Muuttujien alustus
-
www.turkuamk.fi
FORMATin monta puoltaPROC FORMAT
value tili
low -
-
www.turkuamk.fi
• FORMAT sopii moneen, esim. havaintoarvojen luokitteluun
PROC FORMAT;
value painot
low - 40 = 1
41 - 60 = 2
61 - 80 = 3
81 - HIGH = 4;
RUN;
DATA neljas;
length painolk $ 8;
SET kokeilu;
painolk = “Luokka “ !! PUT( paino, painot. );
painory = INPUT( PUT( paino, painot3. ), 3. );
RUN;
FORMATIN SOVELLUS
-
www.turkuamk.fi
Data kokeilu;
INPUT akt hinta alku loppu
CARDS;
1 15 2 8 Alustan valaminen
2 8 5 12 Rakennuslupa
3 11 2 12 Materiaalihankinta
4 10 8 15 Alustan verhoilu
5 22 15 22 Seinän tekeminen
6 5 24 25 Projektin päättäminen
;
PROC timeplot data = kokeilu;
IKIVANHA PROSEDUURI
-
www.turkuamk.fi
PROC timeplot data = kokeilu;
PLOT alku loppu / overlay hiloc ref = 12;
ID akt hinta;
LABEL hinta = ‘MEur’
akt = ‘aktivi- teetti’;
TITLE ‘Projektin aikataulu’;
FORMAT akt hinta alku loppu 4. ;
RUN;
Ja tulokseksi tulee…
IKIVANHA PROSEDUURI
-
www.turkuamk.fi
Projektin aikataulu
aktivi- MEur ALKU LOPPU min max
teetti 2 25
*---------------------------*
1 15 2 8 |A--------L |
2 8 5 12 | A------------L |
3 11 2 13 |A------------------L |
4 10 8 15 | A------------L |
5 8 12 14 | A—L |
6 5 24 25 | AL|
*---------------------------*
IKIVANHA PROSEDUURI
-
www.turkuamk.fi
Muistutus: automaattimuuttuja _INFILE_ pitää sisällään sen, mitä on syötöstä luettu:
DATA _NULL_;
INFILE sisaan;
FILE ulos;
INPUT $1 koodi 2.;
IF koodi = 12 THEN PUT _INFILE_;
RUN;
Tai:
. . .
IF koodi = 12 THEN PUT ’Valitut:’ @10 _INFILE_;
INPUT ja OUTPUT
-
www.turkuamk.fi
Miten tuo lasketaan ?Helposti:
EALin_kanssa = 12* (EALin_kanssa - ilman_EALia)
Vastaavasti:A antaa 78% enemmän säihkettä kuin B.
enemman = a_saihke – b_saihke);
enemman_kertaa = (a – b) / b ;
enemman_pros = (( a – b ) / b ) * 100;
Prosenttilasku on vaikeaa jopa poliitikoille.
-
www.turkuamk.fi
This is the end
The Doors