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

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

Jan 30, 2021

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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