Friday 6 October 2017

Beregn Bevegelse Gjennomsnittet In Sas


I dette innlegget viser jeg et triks for å flytte gjennomsnittlig beregning (kan utvides til andre operasjoner som krever windowing-funksjoner) som er super fort. Ofte må SAS-analytikere gjennomføre gjennomsnittlig beregning, og det finnes flere alternativer i preferanseprosessen: 1. PROC EXPAND 2. DATA STEP 3. PROC SQL Men mange nettsteder kan ikke lisensiert SASETS å bruke PROC EXPAND og gjør bevegelige gjennomsnitt i DATA STEP krever noe koding og er feilaktig. PROC SQL er et naturlig valg for junior programmerere, og i mange forretningssaker er den eneste løsningen, men SAS39s PROC SQL mangler windowing-funksjoner som er tilgjengelige i mange DB'er for å lette glidende gjennomsnittlig beregning. En teknikk folk vanligvis bruker er CROSS JOIN, som er veldig dyrt og ikke en levedyktig løsning for enda mellomstore datasett. I dette innlegget viser jeg et triks for å flytte gjennomsnittlig beregning (kan utvides til andre operasjoner som krever windowing-funksjoner) som er super fort. Vurder den enkleste glidende gjennomsnittlige beregningen der de etterfølgende K-observasjonene er inkludert i beregningen, nemlig MA (K), her setter vi K5. Vi genererer først 20 obs eksempeldata, hvor variabel ID skal brukes til vinduer og variabelen X skal brukes i MA-beregning, og deretter bruker vi standard CROSS JOIN for først å undersøke de resulterende dataene, ikke-grupperte, bare å forstå hvordan man kan utnytte datastrukturen. Fra det resulterende datasettet er det vanskelig å finne en anelse, nå la oss sortere etter quotequot kolonne i dette datasettet: Fra disse sorterte data er det klart at vi egentlig ikke trenger å KROSSE GJENNOM hele originaldatasettet, men i stedet, vi kan generere et kvoteringsquot datasett som inneholder differanseværdien, og la det opprinnelige datasettet CROSS JOIN med dette mye mindre quotoperationquot datasettet, og alle dataene vi må bruke til MA-beregning, vil være der. La oss nå gjøre det: KROSS MED originale data med quotoperationquot data, sorter etter (a. idops), som faktisk er quotbid39 i sortert datasett. Merk at i over kode er det nødvendig å ha øksmultiplikasjon med b. weight slik at dataene kan være inter-leaved, ellers vil samme X-verdi fra originaltabellen bli utgitt og MA-beregningen mislykkes. Den eksplisitte vektvariabelen gir faktisk mer fleksibilitet til hele MA-beregningen. Ved å sette det til å være 1 for alle, resulterer det i en enkel MA-beregning. Tilordne forskjellige vekter vil bidra til å løse mer komplisert MA-databehandling, for eksempel å gi ytterligere observasjoner mindre vekt for en forfalt MA. Hvis det kreves forskjellig K-parameter i MA (K) beregninger, må bare operasjonsdatasettet oppdateres, noe som er en triviell jobb. Nå er den faktiske koden mal for MA (K) beregning: Med denne nye metoden er det interessant å sammenligne det med det dyre selv CROSS JOIN, så vel som å PROC EXPAND. På arbeidsstasjonen min (Intel i5 3.8Ghz, 32GB minne, 1TB 72K HDD), er selvkryss JOIN forbudt lenge i kjøretid (hvis dataene er store), mens den nye metoden bare bruker 2X så mye tid som PROC EXPAND, er begge tidsforbrukete trivial sammenligne med selv CROSS JOIN. Tidsforbruket som vises nedenfor er i kvotekvot. Nedenfor er kodeleserne kan kjøre og sammenligne dere selv. Skrevet 10. mai 2015 av Liang Xie SAS Programmering for Data Mining Jeg inkluderte et skjermbilde for å klargjøre mitt problem: Jeg prøver å beregne en slags bevegelige gjennomsnitt og flyttende standardavvik. Saken er at jeg vil beregne variasjonskoeffisientene (stdevavg) for den faktiske verdien. Vanligvis gjøres dette ved å beregne stdev og avg for de siste 5 årene. Men noen ganger vil det være observasjoner i databasen min, som jeg ikke har informasjon om de siste 5 årene (kanskje bare 3, 2 osv.). Det er derfor jeg vil ha en kode som vil beregne avg og stdev selv om det ikke er noen informasjon for hele 5 år. Også, som du ser i observasjonene, har jeg noen ganger informasjon over mer enn 5 år, da dette er tilfelle, jeg trenger en slags glidende gjennomsnitt som gjør at jeg kan beregne avg og stdev for de siste 5 årene. Så hvis et selskap har informasjon i 7 år trenger jeg en slags kode som vil beregne avg og stdev for, kan vi si 1997 (1991-1996), 1998 (1992-1997) og 1999 (1993-1998). Jeg er ikke veldig kjent med sas-kommandoer, det burde se (veldig veldig grovt) som: Eller noe som dette, jeg har ingen anelse, jeg skal prøve å finne ut det, men det er verdt å legge det ut hvis jeg ikke finner det selv. med datoperiode flyttende gjennomsnitt med datoperiode glidende gjennomsnitt med datoperiode Jeg er ny hos SAS, og jeg har noen problemer med å beregne glidende gjennomsnitt basert på datoer og grupperinger i datasettet. I utgangspunktet prøver jeg å beregne glidende gjennomsnitt for hver observasjon basert på de siste 90 dagene. Hver observasjon har en dato. Jeg må også gruppere dem slik at glidende gjennomsnitt bare er basert på gruppen. Med andre ord, hvis jeg var gruppert av frukt, ville epler ha sitt eneste bevegelige gjennomsnitt og orages, etc. Jeg vet at jeg må sortere datasettet først, og deretter bruke en holdningserklæring. Jeg tenkte faktisk på å lage en makro også. Jeg startet dette, men kan ikke synes å få noen del av det til å fungere. Kan noen hjelpe meg Jeg vet hvordan å gjøre sorteringen, men jeg vet også hvordan jeg får gjennomsnittet, men det er ikke gruppering riktig. Det gir meg bare verdien av observasjonen. Jeg prøvde da å gjøre det med SQL, men det virker heller ikke. Dette er hva jeg kom opp med. proc sql lage tabell data. movingavg som velg a., mean (basis) som flytting fra xx hvor dateratgruppe etter produkt RE: glidende gjennomsnitt med datoperiode dette virker heller ikke. data nytt sett gammelt ved id behold grunnlag dersom date90 da avg gjennomsnittlig (basis) kjøre RE: glidende gjennomsnitt med datoperiode Her er et eksempel på datasettet mitt. produkt dato basis eple may20 4 oransje mars2 3 apple april 3 banan jan31 33 apple feb13 88 apple dec2 12 hva jeg trenger er et løpende glidende gjennomsnitt av de siste 90 dagene av produktet basert på basisbeløpet. Beklager for flere innlegg, men etter at jeg har lest det tidligere innlegget mitt, virket det forvirrende om hva jeg prøver å gjøre. takk RE: glidende gjennomsnitt med datoperiode klaz2002 (programmerer) 25 sep 07 16:00 Jeg må begynne med å si takk for dette spørsmålet. Fordi det ga meg ingen hvile til jeg kunne løse det. La meg si hva jeg tror er kravet ditt bare slik at du og jeg er på samme side. Req 1) Du vil ha et bevegelige gjennomsnitt av de siste 90 dagene av data etter produktnavn. Betydning, at for et enkelt produkt (for eksempel eple) er du bare interessert i basisverdiene for det produktet som går tilbake 90 dager. 2) Jeg antok at du har en (1) post per produkt per dag. Det betyr at du aldri har mer enn en basisverdi per produkt per dag. (koden håndterer ikke mer akkurat nå) For å løse historikkproblemet (verdiene går tilbake 90 dager) brukte jeg lagx () og satt dager 1-90 i variabler og deretter lagt dem til en ARRAY. Siden variabelen må inkluderes i gruppen, opprettet jeg en liten makro som genererte kodelinjene som jeg trengte. Makro som skaper 270 variabler for 90 dager i historien makro SetVars gjør i1 til 90 prodampi lagampi (produkt) dateampi lagampi (dato) basisampi lagampi (basis) sluttendring FIRST SORT BY PRODUCT AND DATE proc sorter data yourdata ut datasorted etter produktdatoen kjøre data siste sett datasorted etter produkt dato lengde prod1-prod90 7 date1-date90 basis1-basis90 mysum 8 array nåværende mysum array prod prod1-prod90 array dt date1-date90 array bs basis1-basis90 SetVars SETT DATOEN 90 DAGER AGO TO CHECK DateMinus90 date-90 bctr 1 mysum 0 LØP OVER ALLE MULIGE DAGER Gjør I1 TIL 90 SKRIV UTTRYKKELIG FOR FIRST CASE I PRODUKTGRUPPE DER ER INGEN LAG YET OM FØRSTE PRODUKT OG BEGRENSNING AV BEGRENSNING. KONTROLLER FOR DET SAMME PRODUKTNAVN OG INNEN 90 DAGER ANNEN OM TJENESTER (OPPBEVARING )) trim (oppgave (produkt)) og dt dateminus90 så gjør det dersom du legger til SUM VAR mysum summen (mysum, basis, bs) HOLD EN TEL AV HVOR MANGE DATAPOINTER FUNKSJONER 1 End Enden IF INGEN FUNKSJONER DEN NUVENDE GRUNNSVAREN BURDE BLI BRUKT hvis mysum 0 then myavg basis annet minavg mysumbctr kjøre proc print dataFINAL var produkt dato dateminus90 basis myavg format date dateminus90 mmddyy10. løp Jeg håper at dette hjelper deg. Du bør virkelig se dette over som jeg gjorde dette virkelig uten omfattende kontroll. Det kan være mange begrensninger på denne koden, så vær forsiktig. Eksempelkoden på fanen Fullkode illustrerer hvordan du beregner det bevegelige gjennomsnittet av en variabel gjennom et helt datasett, over de siste N-observasjonene i et datasett, eller over det siste N observasjoner innenfor en BY-gruppe. Disse prøvefiler og kodeeksempler er levert av SAS Institute Inc., som er uten garanti av noe slag, enten uttrykk eller underforstått, inkludert, men ikke begrenset til, de underforståtte garantiene for salgbarhet og egnethet for et bestemt formål. Mottakerne erkjenner og aksepterer at SAS Institute ikke skal holdes ansvarlig for eventuelle skader som måtte oppstå ved bruk av dette materialet. I tillegg vil SAS Institute ikke gi støtte til materialene som er inkludert heri. Disse prøvefiler og kodeeksempler er levert av SAS Institute Inc., som er uten garanti av noe slag, enten uttrykk eller underforstått, inkludert, men ikke begrenset til, de underforståtte garantiene for salgbarhet og egnethet for et bestemt formål. Mottakerne erkjenner og aksepterer at SAS Institute ikke skal holdes ansvarlig for eventuelle skader som måtte oppstå ved bruk av dette materialet. I tillegg vil SAS Institute ikke gi støtte til materialene som er inkludert heri. Beregn det bevegelige gjennomsnittet av en variabel gjennom et helt datasett, over de siste N observasjonene i et datasett, eller over de siste N observasjonene i en BY-gruppe.

No comments:

Post a Comment