Aureolis Oy Itsemääritellyt funktiot SAS ohjelmoinnissa



Samankaltaiset tiedostot
Makrojen mystinen maailma lyhyt oppimäärä

DS2-proseduuri / ohjelmointisyntaksi. Tapio Kalmi Team Leader, Data Management Consulting SAS Institute Oy

Dynaamista ja joustavaa ohjelmointia - maukasta makrokielellä

Ruokahalu kasvaa syödessä lisää makrokielen herkkuja

DATA-vaiheen ohjelmoijan yleissivistys helposti unohtuvia asioita

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Täysautomatisoitu raportointiympäristö. Joni-Petteri Paavilainen Jani Alatalo

Sukupuu -ohjelma. Ossi Väre ( ) Joni Virtanen ( )

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Tiedot hallintaan PROC CONTENTSilla makroja ja ODS:ää hyödyntäen. Päivi Heimonen ICT-erikoisasiantuntija, Kela SAS Tech Club 24.1.

Java-kielen perusteet

Ohjelmoinnin peruskurssi Y1

Tietorakenteet ja algoritmit

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Bootstrap / HTDP2 / Realm of Racket. Vertailu

Matlab- ja Maple- ohjelmointi

ITKP102 Ohjelmointi 1 (6 op)

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Loppukurssin järjestelyt

XML -muotoisen raportin luonti

ITKP102 Ohjelmointi 1 (6 op)

Testiautomaatio tietovarastossa. Automaattisen regressiotestauksen periaate ja hyödyt

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Tutoriaaliläsnäoloista

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Alustavia käyttökokemuksia SAS Studiosta. Timo Hurme Maa- ja elintarviketalouden tutkimuskeskus MTT (v alusta Luonnonvarakeskus / Luke)

Loppukurssin järjestelyt C:n edistyneet piirteet

DI Studion käyttökokemuksia. Kaisu Ikonen, Tilastokeskus

Datavaiheen taikoja - tietäjien perintönä

Laskennallisesti Älykkäät Järjestelmät. Sumean kmeans ja kmeans algoritmien vertailu

ITKP102 Ohjelmointi 1 (6 op)

Tietotyypit ja operaattorit

Versionhallintaa. Versionhallinnan käyttöönotto SAS ympäristössä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Johdatus ohjelmointiin

1. Omat operaatiot 1.1

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Returns to Scale II. S ysteemianalyysin. Laboratorio. Esitelmä 8 Timo Salminen. Teknillinen korkeakoulu

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Luento 5. Timo Savola. 28. huhtikuuta 2006

Tietueet. Tietueiden määrittely

Osoitin ja viittaus C++:ssa

Harjoitus 4 (viikko 47)

14. Hyvä ohjelmointitapa 14.1

Ohjelmoinnin peruskurssien laaja oppimäärä

Java-kielen perusteita

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Ohjelmoinnin peruskurssien laaja oppimäärä

SAS:in uudet grafiikkaominaisuudet. Ari Toikka

Listarakenne (ArrayList-luokka)

Ohjelmoinnin peruskurssi Y1

1 Tehtävän kuvaus ja analysointi

Hieman linkkejä: lyhyt ohje komentoriviohjelmointiin.

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Ohjelmoinnin perusteet Y Python

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

XML ja SAS. Mitä tänä päivänä voidaan SASista tehdä XML-muotoon

Nopea kertolasku, Karatsuban algoritmi

Jakso 4 Aliohjelmien toteutus

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Ohjelmoinnin perusteet Y Python

Liitosesimerkki Tietokannan hallinta, kevät 2006, J.Li 1

HELIA 1 (14) Outi Virkki Tiedonhallinta

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Dictionary taulut. Miten perus metadataa käytetään koodillisesti joustavuutta lisäämään

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmoinnin peruskurssien laaja oppimäärä

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Harjoitustyö: virtuaalikone

Liitosesimerkki. Esim R1 R2 yhteinen attribuutti C. Vaihtoehdot

Olio-ohjelmointi Javalla

Action Request System

Ohjelmoinnin perusteet Y Python

Rajapinta (interface)

Määrittelydokumentti

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

Ohjelmoinnin perusteet Y Python

TAMPEREEN TEKNILLINEN YLIOPISTO

SEM1, työpaja 2 ( )

SAS ja Sharepoint. Yhteiselon ihanuus ja kurjuus

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

Demokoodaus Linuxilla, tapaus Eternity

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin perusteet Y Python

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Transkriptio:

Aureolis Oy 2013 24.9.2013

Miksi omatekoisia funktiota? Koodin uudelleen käyttö Koodi kirjoitetaan kerran ja käytään monessa paikassa. Säästytään turhalta työltä Koodin hallinta keskitetysti Koodi voidaan talletaa kirjastoon ja ylläpitää keskitetysti Koodin laatu saadaan paremmaksi kun samaa asia ei keksitä uudestaan eri kehittäjien toimesta. Kokeneemmat kehittäjät voivat luoda haastavammat funktiot muiden käytettäväksi

Omatekoiset funktiot SAS:ssa? Ennen SAS 9.2:ta Klassiset viritykset LINK/RETURN rakennelmat INCLUDE lauseen käyttö Makrot SAS 9.2 Nykyaika Proc FCMP SAS 9.4 Tulevaisuus Proc DS2

Esimerkeissä käytety tapaus Lasketaan kolmen pisteen väliset etäisyydet (kolmion sivujen pituudet) Käytetty data: data coordinates; input a1 a2 a3 b1 b2 b3 c1 c2 c3; datalines; 0.0 0.0 0.0 0.0 1.0 1.0 2.0 3.0 1.0 ;

klassinen viritys: LINK-RETURN rakennelma data _null_; Set coordinates; array a[3] a1 a3; array b[3] b1 b3; array c[3] c1 c3; array t1[3] _TEMPORARY_; array t2[3] _TEMPORARY_; do i=1 to 3; t1[i]=a[i]; t2[i]=b[i]; link distance; d1=dist; do i=1 to 3; t1[i]=a[i]; t2[i]=c[i]; link distance; d2=dist; do i=1 to 3; t1[i]=c[i]; t2[i]=b[i]; link distance; d3=dist; put d1= d2= d3=; return; distance: dist=0; do i=1 to 3; dist=dist+(t1[i] t2[i])**2; dist=sqrt(dist); return;

klassinen viritys: INCLUDE lause data _null_; set coordinates; array a[3] a1 a3; array b[3] b1 b3; array c[3] c1 c3; array t1[3] _TEMPORARY_; array t2[3] _TEMPORARY_; do i=1 to 3; t1[i]=a[i]; t2[i]=b[i]; %include 'C:\tmp\dist.sas'; d1=dist; do i=1 to 3; t1[i]=a[i]; t2[i]=c[i]; %include C\tmp\dist.sas'; d2=dist; do i=1 to 3; t1[i]=c[i]; t2[i]=b[i]; %include 'C:\tmp\dist.sas'; d3=dist; put d1= d2= d3=; C:\tmp\dist.sas tiedoston sisältö dist=0; do i=1 to 3; dist=dist+(t1[i] t2[i])**2; dist=sqrt(dist);

LINK rankenteet ja INCLUDE lause Hyvät puolet Käyttöön tarvitaan ainoastaan SAS Data Step ohjelmointiosaamista Toimii vanhoissa SAS versioissa Huonot puolet LINK rankenteessa koodin uudelleen käyttö muualla ei ole mahdollista Funktion parametrit täytyy kopioida funktiossa käytettyihin muuttujiin itse Funktion sisäiset muuttujat voivat mennä päällekäin muun koodin kanssa Funktion palauttama arvo on aina saman nimisessä muuttujassa Funktion sisäiset muuttujat tulevat mukaan output dataan, jos niitä ei ole erikseen pudotettu pois Funktio ei voi kutsua itseään koska muuttujien arvot menevät sekaisin

klassinen viritys: Makro %macro distance(array1name, array2name, arraylength, outputname=dist, loopvar=i); data _null_; set coordinates; array a[3] a1 a3; array b[3] b1 b3; array c[3] c1 c3; drop &loopvar &outputname; &outputname=0; do &loopvar=1 to &arraylength; &outputname=&outputname+ (&array1name[i] &array2name[i])**2; &outputname=sqrt(&outputname); %m %distance(a,b,3,outputname=dist,loopvar=i); d1=dist; %distance(a,c,3); d2=dist; %distance(b,c,3); d3=dist; put d1= d2= d3=;

Makrolla toteutetut funktiot Hyvät puolet Parametrien nimet välittyvät automaattisesti Koodi voidaan tallettaa SAS:in ymmärtämään makrokirjastoon Toimii vanhoissa SAS versioissa Huonot puolet Vaatii makro koodaamisen osaamista Funktion sisäiset muuttujat voivat mennä päällekäin muun koodin kanssa ellei niitä ole parametrisoitu Funktiossa joudutaan parametrisoimaan sisäisten muuttujin nimiä, joten parametrien määrä suurempi kuin muuten olisi tarpeen Koodi on hankalammin luettavaa kuin suora SAS koodi Funktion sisäiset muuttujat tulevat mukaan output dataan, jos niitä ei ole makron sisällä erikseen pudotettu pois Funktio ei voi kutsua itseään, koska muuttujien arvot menevät sekaisin

Nykyaika Proc FCMP SAS proseduuri funktioiden ja CALL funktioiden luomiseen Luotuja funktioita voidaan käyttää useissa SAS:n osissa DATA Step PROC CALIS PROC COMPILE PROC COMPUTAB PROC GA PROC GENMOD PROC MCMC PROC MODEL PROC NLIN PROC NLMIXED PROC NLP PROC PHREG PROC REPORT COMPUTE osiot Risk Dimensions proseduurit PROC SIMILARITY PROC SQL (Array parametreja ei tueta) WHERE lause The Output Delivery System (ODS) PROC DS2 (SAS9.4)

Proc FCMP proc fcmp outlib=work.funcs.omat; function distance(a[*],b[*],alen); dist=0; do i=1 to alen; dist=dist+(a[i] b[i])**2; dist=sqrt(dist); return(dist); endsub; options cmplib = (work.funcs); data _null_; set coordinates; array a[3] a1 a3 ; array b[3] b1 b3 ; array c[3] c1 c3 ; array t1[3] _temporary_; array t2[3] _temporary_; array t3[3] _temporary_; do i=1 to 3; t1[i]=a[i]; t2[i]=b[i]; t3[i]=c[i]; d1=distance(t1,t2,3); d2=distance(t1,t3,3); d3=distance(t2,t3,3); put d1= d2= d3=;

Proc FCMP: käytännön esimerkki Ajojen järjestyksen määrittely: Ajot voivat riippua toisista ajoista Etsitään sellainen ajojärjestys, jossa esitietoina tulevat ajot ajetaan ennen niistä riippuvia aj Ajojen väliset välittömät riippuvuudet esitetään datassa Ajojen_esitiedot etrno Ajo Esitieto 1 A B 2 A C 1 B D 1 D E Itsemääritellyt funktiot SAS Ohjelmoinnissa ajot Ajo A B C D E

Proc FCMP: käytännön esimerkki proc fcmp outlib=work.func.param; function hae_esitiedot(ajo $,taso) $512; length esitiedot_yht $51 esitieto $1 etnro 8 ajo $1; declare hash h(dataset:'ajojen_esitiedot'); rc=h.definekey('ajo'); rc=h.definekey('etnro'); rc=h.definedata('ajo'); rc=h.definedata('esitieto'); rc=h.definedone(); esitiedot_yht=""; etnro=1; rc=h.find(); put "func: " taso= etnro= ajo= esitieto=; if rc=0 then do; esitiedot_yht=strip(put(taso,3.)) "~" strip(esitieto); esitiedot_yht=strip(esitiedot_yht) " " hae_esitiedot(esitieto,taso+1); etnro=etnro+1; rc=h.find() do while (rc=0); put "func: " taso= etnro= ajo= esitieto=; esitiedot_yht=strip(esitiedot_yht) " " strip(put(taso,3.)) "~" strip(esitieto); esitiedot_yht= strip(esitiedot_yht) " " hae_esitiedot(esitieto,taso+1); etnro=etnro+1; rc=h.find(); return(esitiedot_yht); endsub; Itsemääritellyt funktiot SAS Ohjelmoinnissa function is_duplicate(id $); declare hash h(dataset: 'dup'); rc=h.definekey('ajo'); rc=h.definedone(); ajo=id; rc=h.check(); if rc^=0 then do; ajo=id; taso=0; rc=h.add(); return(0); else do; return(1); endsub;

Proc FCMP: käytännön esimerkki options cmplib=work.func; data esitiedot; length esitiedot_yht $512 esitieto $1; set ajot; taso=0; output; esitiedot_yht= hae_esitiedot(ajo,1); put "output: " ajo= esitiedot_yht=; if esitiedot_yht^="" then do; i=1; taso=scan(scan(esitiedot_yht,i),1); esitieto=scan(scan(esitiedot_yht, i),2); do while(esitieto); ajo=esitieto; Output; i=i+1; taso=scan(scan(esitiedot_yht,i),1); esitieto=scan(scan(esitiedot_yht,i), 2,'~'); drop i esitiedot_yht esitieto; proc sort data=esitiedot; by descending taso ajo; data dup; set esitiedot(obs=0 drop=taso); data ajojarjestys; set esitiedot; if not is_duplicate(ajo) then output; Itsemääritellyt funktiot SAS Ohjelmoinnissa

Proc FCMP: käytännön esimerkki Ote lokista func: taso=1 etnro=1 ajo=a esitieto=b func: taso=2 etnro=1 ajo=b esitieto=d func: taso=3 etnro=1 ajo=d esitieto=e func: taso=4 etnro=1 ajo=e esitieto= func: taso=1 etnro=2 ajo=a esitieto=c func: taso=2 etnro=1 ajo=c esitieto= output: ajo=a esitiedot_yht=1~b 2~D 3~E 1~C func: taso=1 etnro=1 ajo=b esitieto=d func: taso=2 etnro=1 ajo=d esitieto=e func: taso=3 etnro=1 ajo=e esitieto= output: ajo=b esitiedot_yht=1~d 2~E func: taso=1 etnro=1 ajo=c esitieto= output: ajo=c esitiedot_yht= func: taso=1 etnro=1 ajo=d esitieto=e func: taso=2 etnro=1 ajo=e esitieto= output: ajo=d esitiedot_yht=1~e func: taso=1 etnro=1 ajo=e esitieto= output: ajo=e esitiedot_yht= Itsemääritellyt funktiot SAS Ohjelmoinnissa

Proc FCMP: käytännön esimerkki Esitiedot ajo taso E 3 D 2 E 2 B 1 C 1 D 1 Ajojarjestys ajo taso E 3 D 2 B 1 C 1 A 0 E 1 A 0 B 0 Tuotettu data...... Itsemääritellyt funktiot SAS Ohjelmoinnissa

Proc FCMP funktiot Hyvät puolet Parametrien nimet välittyvät automaattisesti Koodi tallennetaan SAS:in ymmärtämään koodikirjastoon Funktion sisäiset parametrit ovat paikallisia ei vaaraa nimien törmäämisestä Sisäiset muuttujat eivät tule dataan Voidaan käyttää rekursiivisesti Toimii useissa SAS:n osissa ei vain DATA Stepissä Käytössä on funktioita, joita ei ole DATA stepissä (esim. matriisien käsittelyä) Huonot puolet Vaatii uutta opettelua ohjelmointi poikkeaa hieman DATA Stepistä Kaikki DATA Stepin ominaisuudet eivä ole käytettävissä Syötettyjen Array parametrien täytyy olla väliaikaisia (temporary)

Tulevaisuus Proc DS2 SAS 9.4:ssä tuleva uusi datankäsittelykieli Käytetään seuraavissa ympäristöissä: BASE SAS High Performance Analytics Server SAS Federation Server SAS In Database Code Accelerator (Teradata tai Greenplum) Proc FedSQL

Proc DS2 Huom: koodia ei ole testattu proc ds2; package distances / overwrite=yes; method Euclidean(double x[*], double y[*] ) returns double; dcl int i; dcl double d; d=0; do i=1 to dim(x) >< dim(y); d=d+(x[i] y[i])**2; return sqrt(d); endpackage; Data _null_; dcl package distances dist(); method run(); set coordinates; vararray double a[3]; vararray double b[3]; vararray double c[3]; d1 = dist.euclidean(a, b); d2 = dist.euclidean(a, c); d1 = dist.euclidean(b, c); put d1= d2= d3=; enddata; quit;

Proc DS2 funktiot Hyvät puolet Parametrien nimet välittyvät automaattisesti Koodi tallennetaan SAS:in ymmärtämään koodikirjastoon Funktion sisäiset parametrit ovat paikallisia ei vaaraa nimien törmäämisestä Sisäiset muuttujat eivät tule dataan Voidaan käyttää rekursiivisesti Paketteihin voidaan tallettaa muuttujia. Mahdollistaa objektien käytön ohjelmoinnin. Funktioissa voidaan käyttää FedSQL lauseita Huonot puolet Vaatii uutta opettelua ohjelmointi poikkeaa DATA Stepistä Kaikki DATA Stepin ominaisuudet eivä ole käytettävissä Käytettävissä vain rajoitetusti SAS:ssa (Proc FCMP käytettävissä laajemmin)

Yhteenveto SAS:ssa useita tapoja koodin uudelleen käyttöön funktion tapaisilla rakenteilla Oikeita funktioita on käytössä vasta SAS versiosta 9.2 lähtien Funktioiden käyttö vaatii uusien asioiden opiskelua ja toiminnallisten eroavaisuuksien hyväksymistä Uudet SAS ominaisuudet mahdollistavat kehittyneemmät ohjelmointitavat SAS kehityksessä SAS kehittäjän on osattava päättää mikä menetelmä sopii parhaiten misäkin tilanteessa

Jarkko Venna BI konsultti Jarkko.venna@aureolis.com +358 40 842 2759 Aureolis Oy Hevosenkenkä 3 - FI-02600 Espoo, Finland office +358 20 741 2790 www.aureolis.com - contact@aureolis.com