29
www.turkuamk.fi DATA-vaiheen ohjelmoijan yleissivistys – helposti unohtuvia asioita Markku Suni Factotum emeritus Turun ammattikorkeakoulu

Markku Suni Factotum emeritus Turun ammattikorkeakoulu › kntur85557 › attachments... DATA-vaiheen ohjelmoijan yleissivistys –helposti unohtuvia asioita Markku Suni Factotum emeritus

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

  • 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