Friday 20 October 2017

Moving Gjennomsnittet Perl


Med vektvektor mener jeg vektoren med vekter at du må multiplisere observasjonene i vinduet som glir over dataene dine med, så hvis du legger til disse produktene, returnerer du verdien av EMA på høyre side av vinduet. For en lineær vektet glidende gjennomsnittlig formelen for å finne vektvektoren er 1 n sum 1 n i R-kode Denne serien av lengde n legger opp til 1 For n 10 vil det være 0 01818182 0 03636364 0 05454545 0 07272727 0 09090909 0 10909091 0 12727273 0 10909091 0 12727273 0 14545455 0 16363636 0 18181818.tallene 1 til 10 55, med 55 summen av tallene 1 til 10.Hvordan beregner du vektorgraven for et eksponentielt glidende gjennomsnittlig EMA med lengde n. if n er lengden av vinduet, da alfa -2 n 1 og i -1 n så EmaWeightVector - alfa 1-alfa 1-i. Dette er riktig. Selv om EMA ikke egentlig er begrenset til et vindu med en start og en slutt, bør ikke vektene legge opp til 1 akkurat som med LWMA. Takk Jason, noen poeng på hvordan å tilnærme EMA-filteret til ønsket p recision ved å tilnærme det med et langt nok FIR-filter Det er et perl-skript på det som gjorde bildet av EMA vektvektoren, men jeg forstår det ikke hvis de setter antall vekter til 15, hvorfor er det 20 røde stolper i stedet for 15 MisterH Des 19 12 på 22 40. Dette kapittelet introduserer deg til konseptene bak referanser til Perl-moduler, pakker og klasser. Det viser deg også hvordan du lager noen få prøvemoduler. Perl-modulen er et sett med Perl-kode som virker som en bibliotek av funksjonssamtaler Termmodulen i Perl er synonymt med ordpakken Pakker er en funksjon av Perl 4, mens moduler er utbredt i Perl 5. Du kan beholde all din gjenbrukbare Perl-kode spesifikk for et sett med oppgaver i et Perl-modul, derfor , er all funksjonalitet knyttet til en type oppgave inneholdt i en fil. Det er enklere å bygge et program på disse modulære blokkene. Ordmodulen gjelder derfor litt mer enn pakken. Her er en rask introduksjon til moduler Visse emner i denne delen vil vær cov leses i detalj gjennom resten av boken. Les følgende avsnitt nøye for å få oversikt over hva som ligger foran når du skriver og bruker dine egne moduler. Hva er forvirrende, er at vilkårsmodulen og pakken blir brukt om hverandre i alle Perl-dokumentasjon, og disse to begrepene betyr det samme. Så når du leser Perl-dokumenter, tenk bare pakken når du ser modulen og omvendt. Så hva er premissen for bruk av moduler. Nå er moduler der for å pakke forkaste ordvariabler, symboler og sammenkoblede data-elementer sammen For eksempel, å bruke globale variabler med svært vanlige navn som kj eller jeg i et program, er vanligvis ikke en god ide. Også en loop-teller, jeg burde få lov til å jobbe uavhengig i to forskjellige deler av koden Deklarere jeg som en global variabel og deretter øke den fra en subrutine vil skape uhåndterlige problemer med din søknadskode fordi subrutinen kan ha blitt kalt fra en loop som også bruker en variant ble kalt i Bruken av moduler i Perl tillater variabler med samme navn som skal opprettes på forskjellige, forskjellige steder i samme program. Symbolene som er definert for dine variabler, lagres i en associativ gruppe, referert til som symboltabell Disse symboltabellene er unike for en pakke Derfor kan variabler med samme navn i to forskjellige pakker ha forskjellige verdier. Hver modul har sin egen symboltabell for alle symboler som er deklarert i den. Symboltabellen isolerer i utgangspunktet synonyme navn i en modul fra en annen Symbolet Tabellen definerer et navneområde som er et mellomrom for uavhengige variabelnavne å eksistere. Bruken av moduler, hver med sin egen symboltabell, forhindrer en variabel som er deklarert i en seksjon, fra å overskrive verdiene til andre variabler med samme navn deklarert andre steder i samme program. Faktisk tilhører alle variabler i Perl en pakke. Variablene i et Perl-program tilhører hovedpakken. Alle andre pakker innenfor Perl pr ogram er enten nestet i denne hovedpakken eller eksisterer på samme nivå. Det finnes noen virkelig globale variabler som signalhåndteringsarmen SIG som er tilgjengelig for alle andre moduler i et applikasjonsprogram og kan ikke isoleres via navneområder. Bare de variabelidentifikatorene som starter med bokstaver eller underskrifter holdes i modulens symboltabell. Alle andre symboler, for eksempel navnene STDIN STDOUT STDERR ARGV ARGVOUT ENV Inc og SIG, er tvunget til å være i pakken main. Switching between packages påvirker bare navneområder Alt du gjør når du bruk en pakke eller en annen erklærer hvilket symbolbord som skal brukes som standard symboltabell for oppslag av variabelnavn. Bare dynamiske variabler påvirkes av bruk av symboltabeller. Variabler som er deklarert ved bruk av søkeordet, er fortsatt løst med kodeblokken de Skje med å bo i og er ikke referert gjennom symboltabeller Faktisk forblir omfanget av en pakkeerklæring aktiv bare innenfor kodeblokken, den er decl ared i Derfor, hvis du bytter symboltabeller ved å bruke en pakke i en subrutine, vil den opprinnelige symboltabellen som ble brukt når samtalen ble gjort, bli gjenopprettet når subrutinen returnerer. Switchen symboltabeller påvirker bare standard oppslag av dynamiske variabelnavn Du kan fremdeles eksplisitt referere til variabler, filhåndtak og så videre i en bestemt pakke ved å forhåndsbeide et pakkenavn til variabelenavnet. Du så hva en pakke kontekst var når du brukte referanser i kapittel 3 En pakke-kontekst innebærer ganske enkelt bruken av symboltabellen av Perl tolk for å løse variable navn i et program Ved å bytte symboltabeller bytter du sammen konteksten. Moduler kan innhylles i andre moduler. Den nestede modulen kan bruke variablene og funksjonene til modulen som er nestet inne For nestede moduler, ville du må bruke moduleName nestedModuleName og så videre. Bruk av dobbelt kolon er synonymt med å bruke et tilbakekall. Imidlertid er dobbeltdunken den foretrukne, fremtidige w ay å adressere variabler i moduler. Eksplisitt adressering av modulvariabler er alltid gjort med en komplett referanse. For eksempel, antar du har en modul, Investering som er standardpakken i bruk, og du vil adressere en annen modul. Obligasjoner som er nestet i Investeringsmodulen I dette tilfellet kan du ikke bruke Bond I stedet må du bruke Investment Bond for å adressere variabler og funksjoner i Bond-modulen. Bruke Bond vil innebære bruken av en pakke Bond som er nestet i hovedmodulen og ikke innenfor Investeringsmodul. Symboltabellen for en modul lagres faktisk i en assosiativ rekkefølge av modulens s navn vedlagt med to kolon. Symboltabellen for en modul kalt Bond blir referert til som den assosiative gruppen Bond. Navnet på symboltabellen for Hovedmodulen er hoved og kan til og med forkortes. På samme måte har alle nestede pakker sine symboler lagret i tilknyttede arrays med to kolonner som skiller hvert nestingsnivå. For eksamen I Bond-modulen som er nestet i Investeringsmodulen, blir den tilknyttede gruppen for symbolene i Bond-modulen kalt Investment Bond. En typeglob er virkelig en global type for et symbolnavn. Du kan utføre aliasing-operasjoner ved å overføre til en typeglob En eller flere oppføringer i en associativ array for symboler vil bli brukt når en oppgave via en typeglob er brukt Den faktiske verdien i hver oppføring i den assosiative array er det du refererer til når du bruker variabelenavnnotasjonen Således er det to måter av å referere til variable navn i en pakke Investeringspeng Investeringsregninger. I den første metoden refererer du til variablene via en typeglobreferanse Bruken av symboltabellen Investeringer er underforstått her, og Perl vil optimalisere oppslaget til symboler penger og regninger Dette er den raskere og foretrukne måten å adressere et symbol på Den andre metoden bruker en oppslag for verdien av en variabel adressert av penger og regninger i den assosiative gruppen som brukes til symboler , Investering eksplisitt Denne oppslaget ville bli gjort dynamisk og vil ikke bli optimalisert av Perl Derfor vil oppslaget bli tvunget til å sjekke det assosiative arrayet hver gang setningen utføres. Som et resultat er den andre metoden ikke effektiv og bør bare brukes til demonstrasjon av hvordan symboltabellen implementeres internt. Et annet eksempel i denne setningen kamran husain. causes variabler, subrutiner og filhåndtak som er navngitt via symbolet kamran for å også adresseres via symbolet husain Det vil si alle symboloppføringer i gjeldende symboltabell med nøkkel kamran vil nå inneholde referanser til de symbolene adressert av nøkkelhusselen For å forhindre en slik global oppgave, kan du bruke eksplisitte referanser For eksempel vil følgende setning la deg adressere innholdet av husain via den variable kamran kamran husain. Enhver arrays som kamran og husain vil ikke være de samme. Bare hva referansene spesifikt spesifiseres vil bli endret. For å oppsummere når y ou tilordne en typeglob til en annen, du påvirker alle oppføringene i et symboltabell uansett hvilken type variabel som blir referert til Når du tilordner en referanse fra en variabeltype til en annen, påvirker du bare en oppføring i symboltabellen. A Perl Modulfilen har følgende formatpakke Modulnavn Sett inn modulkode 1. Filnavnet må bli kalt Navnet på en modul må ende i strengen etter konvensjon Pakningsoppgaven er den første linjen i filen Den siste linjen i filen må inneholde linje med 1-setningen Dette gir i realiteten en ekte verdi til applikasjonsprogrammet ved hjelp av modulen. Ikke bruk 1-setningen vil ikke la modulen lastes inn korrekt. Pakningsoppgaven forteller Perl-tolken å starte med et nytt navneområde domene. I utgangspunktet alle dine variabler i et Perl-skript tilhører en pakke som heter hoved Hver variabel i hovedpakken kan refereres til som hovedvariabel. Her er syntaksen for slike referanser pakkenavn variabelnavn. Singl e quote er synonymt med operatør med dobbelt kolon i overgang til flere bruksområder fra operatøren i neste kapittel For øyeblikket må du huske at følgende to setninger er ekvivalente pakkenavn variableName packageName variableName. Synkroniseringen med dobbelt kolon anses som standard i Perl-verden Derfor, for å bevare lesbarheten, bruker jeg dobbeltkolonsyntaxen i resten av denne boken, med mindre det er absolutt nødvendig å gjøre unntak for å bevise et punkt. Standardbruken av et variabelt navn forsvinner til gjeldende pakke aktiv på den tiden av kompilering Således, hvis du er i pakken og spesifiser en variabel pv, er variabelen faktisk lik Finance pv. Using Perl Modules bruk vs require. You inkluderer Perl moduler i programmet ditt ved å bruke bruken eller kreve utsagnet Her er veien for å bruke noen av disse setningene, bruk Modulenavn krever modulnavn. Merk at utvidelsen ikke brukes i koden vist ovenfor. Vær oppmerksom på at ingen av setningene tillater at en fil inkluderes med flere en gang i et program Den returnerte verdien av ekte 1 som den siste setningen er nødvendig for å la Perl vite at en krever d eller bruk d-modulen lastet riktig og lar Perl-tolk ignorere noen reloads Generelt er det bedre å bruke bruksmodulen erklæring enn krav Modulerklæring i et Perl-program for å forbli kompatibelt med fremtidige versjoner av Perl. For moduler, vil du kanskje vurdere å fortsette å bruke kravoppstillingen Her er hvorfor Bruksoppgaven virker litt mer enn kravkravet i at det endrer navnet på modulen som inneholder en annen modul. Du vil ha denne ekstra oppdateringen av navneområdet som skal gjøres i et program. Når du skriver kode for en modul, kan det hende du ikke vil at navneområdet skal endres dersom det ikke er eksplisitt nødvendig i denne hendelsen, vil du bruke krav-setningen. Krever utsagnet inneholder hele banenavnet til en fil i Inc-arrayet slik at funksjonene og variablene i modulens fil er på et kjent sted under exe forsiktighetstid Derfor blir funksjonene som importeres fra en modul, importert via en eksplisitt modulreferanse ved kjøring med kravserklæringen. Brukerklæringen gjør det samme som kravserklæringen fordi den oppdaterer Inc-arrayet med fulle stinavn av lastede moduler Koden for bruksfunksjonen går også et trinn videre og kaller en importfunksjon i modulen som brukes d for å eksplisitt laste listen over eksporterte funksjoner på kompileringstid og dermed spare tid som kreves for en eksplisitt oppløsning av et funksjonsnavn under utførelse. brukserklæringen tilsvarer å kreve ModuleName import ModuleName-liste over importerte funksjoner. Bruken av brukerklæringen endrer programmets navnområde fordi de importerte funksjonsnavnene er satt inn i symboltabellen. Kreve utsagnet endrer ikke programmets navnområde. følgende setning bruker ModuleName. is som er ekvivalent med denne setningen, krever ModuleName. Functions importeres fra en modul e via en samtale til en funksjon som kalles import Du kan skrive din egen importfunksjon i en modul, eller du kan bruke eksportørmodulen og bruke importfunksjonen. I nesten alle tilfeller vil du bruke eksportørmodulen til å levere en importfunksjon i stedet for gjenoppfinne hjulet Du vil lære mer om dette i neste avsnitt. Hvis du velger å ikke bruke eksportørmodulen, må du skrive din egen importfunksjon i hver modul du skriver. Det er mye enklere å bare bruke eksportørmodulen og la Perl gjør jobben for deg. Eksempelmodulen. Den beste måten å illustrere semantikken til hvordan en modul brukes i Perl er å skrive en enkel modul og vise hvordan du bruker den. La oss ta eksemplet på en lokal lånehaj, Rudious Maximus, som ganske enkelt er lei av å skrive samme forespørsel om betalingsbreve. Å være en ivrig fan av datamaskiner og Perl, tar Rudious den latte programmørens tilnærming og skriver en Perl-modul for å hjelpe ham med å generere sine notater og brev. Nå, i stedet for å skrive inn felt i am emo template fil, er alt han trenger å gjøre, skriv inn noen få linjer for å produsere sitt hyggelige, truende notat. Oppføring 4 1 viser hva han må skrive. Oppføring 4 1 Bruke brevmodulen 1 usr bin perl - w 2 3 Uvanlig linjen under for å inkludere gjeldende dir i Inc 4 push Inc, pwd 5 6 bruk Letter 7 8 Brev til Mr Gambling Man, Pengene til Lucky Dog, Race 2 9 Letter Claim MoneyNice 10 Letter ThankDem 11 Letter Finish. The bruk Letter statement er til stede for å tvinge Perl tolk for å inkludere koden for modulen i applikasjonsprogrammet Modulen skal være plassert i katalogen usr lib perl5, eller du kan plassere den i en hvilken som helst katalog som er oppført i Inc-serien. Inc-serien er listen over kataloger som Perl tolk vil se etter når du forsøker å laste inn koden for den navngitte modulen. Den kommenterte linjenummer 4 viser hvordan du legger til gjeldende arbeidskatalog for å inkludere banen. De neste fire linjene i filen genererer emnet for brevet. Her er utdataene fra å bruke Brevmodul Til Mr Gambling Man Fm Rudious Maximus, Loan Shark Dt Ons 7 Feb 10 35 51 CST 1996.Re Pengene til Lucky Dog, Race 2. Det har kommet meg oppmerksom på at kontoen din er langt over, fordi du skal betale oss snart Eller vil du at jeg skal komme ovå. Takk for din støtte. Brevmodulfilen er vist i Oppføring 4 2 Navnet på pakken er deklarert i første linjen Fordi denne modulens funksjoner vil bli eksportert, bruker jeg eksportørmodulen derfor , erklæringen bruk Eksportør er nødvendig for å arve funksjonalitet fra eksportørmodulen. Et annet nødvendig trinn er å sette ordet Eksportert i ISA-arrayet for å tillate søking. ISA-arrayet er et spesielt utvalg i hver pakke. Hvert element i gruppelistene hvor annet til se etter en metode hvis den ikke kan bli funnet i den nåværende pakken Ordren der pakkene er oppført i ISA-arrayet, er rekkefølgen der Perl søker etter uløste symboler. En klasse som er oppført i ISA-arrayet, kalles grunnklassen av den delen cular class Perl vil cache manglende metoder funnet i baseklasser for fremtidige referanser. Endring av ISA-arrayet vil skylle cachen og få Perl til å slå opp alle metodene igjen. Se nå koden for i Oppføring 4 2 Oppføring 4 2 Modulen 1 pakke Letter 2 3 krever eksportør 4 ISA Exporter 5 6 head1 NAME 7 8 Letter - Eksempelmodul for å generere brevhode for deg 9 10 head1 SYNOPSIS 11 12 bruk Letter 13 14 Letter Date 15 Letter Til navn, firma, adresse 16 17 Deretter en av Følgende 18 Letter ClaimMoneyNice 19 Letter ClaimMoney 20 Letter ThreatBreakLeg 21 22 Letter ThankDem 23 Letter Finish 24 25 head1 BESKRIVELSE 26 27 Denne modulen gir et kort eksempel på å generere et brev for en 28 vennlig neighborbood låne hai 29 30 Koden starter etter cut-setningen 31 kutt 32 33 EKSPORT qw Dato 34 Til 35 ClaimMoney 36 ClaimMoneyNice 37 ThankDem 38 Finish 39 40 41 Skriv ut i dag s dato 42 43 underbrev Dato 44 dato dato 45 utskrift n I dag er det dato 46 47 48 under Brev til 49 lokal navneskift 50 lokal fagskift 51 utskrift n For å nevne 52 utskrift n Fm Rudious Maximus, Lån haj 53 utskrift n Dt, dato 54 utskrift N gjenstand 55 utskrift nn 56 utskrift 57 58 underbrevet KravMoney 59 print n Du skylder meg penger Få handlingen din sammen 60 print n Vil du at jeg skal sende Bruno til 61 print n samle den eller skal du betale 62 63 64 underbrevkravMoneyNice 65 print n Det blir lagt merke til at kontoen din er 66 print n way over på grunn av 67 print n Du skal betale oss snart 68 print n eller vil du at jeg skal komme? 69 70 71 Sub Letter ThreatBreakLeg 72 skriv ut bokstavelig talt bokstaver som disse ikke hjelpe 73 print n Jeg må lage et eksempel på deg 74 print nn Se deg på sykehuset, venn 75 76 77 underbrev TakkDem 78 Skriv ut nn Takk for din støtte 79 80 81 Underbrev Finish 82 printf nnnn Med vennlig hilsen 83 printf n Rudious n 84 85 86 1. Linjer med likestilt brukes til dokumentasjon Du må dokumentere hver modul for egen referanse Perl-moduler behøver ikke å bli dokumentert, men det er en god idé å skrive noen linjer om hva koden din gjør. Noen år fra nå kan du glemme hva en modul handler om. God dokumentasjon er alltid et must hvis du vil huske hva du gjorde tidligere. Jeg dekker dokumentasjonsstiler som brukes for Perl i kapittel 8 Dokumentering av Perl-skript For denne prøvemodulen begynner head1-setningen dokumentasjonen. Alt opp til cut-setningen ignoreres av Perl-tolk. Nedenfor listes modulen alle funksjoner eksportert av denne modulen i EXPORT-arrayen EXPORT-array definerer alle funksjonsnavnene som kan kalles av ekstern kode Hvis du ikke lister en funksjon i dette EXPORT-arrayet, vil det ikke bli sett av eksterne kodemoduler. Følg EXPORT-arrayen er kodenes kropp, en subrutine av gangen Etter at alle subrutiner er definert, avsluttes den endelige setningen 1, modulfilen 1 må være den siste kjørbare linjen i filen. Se på noen av funksjonene som er definert i denne modulen le Den første funksjonen som skal sees på, er den enkle Date-funksjonen, linjene 43 til 46, som skriver ut dagens UNIX-dato og tid. Det er ingen parametere til denne funksjonen, og den returnerer ikke noe meningsfylt tilbake til den som ringer. Merk bruken av Min før datavariabelen i linje 44 Søkeordet mitt brukes til å begrense omfanget av variabelen til datofunksjonen s krøllete braces Kode mellom krøllete braces refereres til som en blokkvariabler som er deklarert innenfor en blokk, er begrenset i rekkevidde til innenfor krøllete bøyler I 49 og 50 er de lokale variablene navn og emne synlige for alle funksjoner. Du kan også deklarere variabler med lokal kvalifiserer. Bruk av lokalt tillater en variabel å være i bruk for nåværende blokk, samt for andre blokker av kode kalt fra denne blokken Således er en lokal x-deklarert innenfor en blokk synlig for alle etterfølgende blokker som kalles fra denne blokken, og kan refereres. I den følgende prøvekoden kan TilTitled-funksjonens navnvariabel være tilgang ed men ikke dataene i iphone 1 under Brev ToTitled 2 Lokalt navneskift 3 Min telefonskift. Eksempelkoden for viste hvordan man kan pakke ut en parameter om gangen. Subrutinen Til to parametere tar du opp toppteksten for memo. Using funksjoner i en modul er det ikke noe annet enn å bruke og definere Perl-moduler i samme kodefil Parametere sendes ved referanse, med mindre annet er angitt Flere arrayer som deles inn i en subrutine, dersom ikke eksplisitt deferreres ved hjelp av tilbakeslaget, er sammenkoblet. Innmatingsarrangementet i en funksjon er alltid et utvalg av skalarverdier Passerende verdier ved referanse er den foretrukne måten i Perl å sende en stor mengde data til en subrutine. Se Kapittel 3 Referanser. En annen prøvemodul Finans. Finansmodulen, vist i liste 4 3, brukes til å gi enkle beregninger for låneverdier Bruke finansmodulen er rettferdig Alle funksjonene er skrevet med de samme parameterne, som vist i formelen for funksjonene. Vi ser på hvordan Den fremtidige verdien av en investering kan beregnes. For eksempel, hvis du investerer noen dollar, pv i et obligasjonslån som tilbyr en fast prosentandel, r brukes med kjente intervaller for n tidsperioder, hva er verdien av obligasjonen på tidspunktet for dets utløp I dette tilfellet vil du bruke følgende formel fv pv 1 r n. Funksjonen for å få fremtidig verdi erklæres som FutureValue Se listen 4 3 for å se hvordan du bruker den Oppføring 4 3 Bruke finansmodulen 1 usr bin perl - w 2 3 push Inc, pwd 4 bruk Økonomi 5 6 lån 5000 00 7 apr 3 5 april 8 år 10 i år 9 10 -------------------- -------------------------------------------- 11 Beregn verdien på slutt på lånet dersom renter 12 påløper hvert år 13 -------------------------------------- -------------------------- 14 tid år 15 fv1 Finansiering FutureValue lån, apr, tid 16 print n Hvis renten er påført ved utgangen av året 17 skriv ut n Fremtidens verdi for lån på lån n 18 skriv ut på en APR av, april for, tid, år 19 printf er 8 2f n fv1 20 21 --------------------------------------------- ------------------- 22 Beregn verdien ved utgangen av lånet dersom renter 23 blir brukt hver måned 24 ------------- -------------------------------------------------- - 25 rente 12 april 26 april 12 år i måneder 27 fv2 Finans FutureValue-lån, rente, tid 28 29 print n Hvis renten påløper ved utgangen av hver måned 30 print n Fremtidens verdi for lån på lån n 31 skriv ut på en APR av, april for, tid, måneder 32 printf er 8 2f n fv2 33 34 printf n Forskjellen i verdien er 8 2f, fv2 - fv1 35 printf n Derfor ved å søke renter på kortere tidsperioder, blir 36 utskrifter faktisk mer penger i interesse n. Her er prøveinngang og utgang fra Listing 4 3 testme. Dersom renten er påført ved årets slutt Fremtidens verdi for et lån på 5000 til en APR på 3 5 i 10 år er 7052 99. Dersom renten er brukt ved utgangen av hver måned Fremtidig verdi for et lån på 5000 på et APR på 3 5 i 120 måneder er 7091 72. Forskjellen i n verdi er 38 73 Derfor ved å søke interesse på kortere tidspunkter, får vi faktisk mer penger i interesse. Åpenbaringen i utgangen er resultatet av sammenligning av verdier mellom fv1 og fv2. Fv1 verdien beregnes ved bruk av interesse en gang hvert år over obligasjonens levetid fv2 er verdien dersom renten blir brukt hver måned til den tilsvarende månedlige rentesatsen. Pakken er vist i liste 4 4 ​​i tidlig utviklingsstadier. Oppføring 4 4 Pakken 1 pakke Finans 2 3 krever Eksportør 4 ISA Exporter 5 6 head1 7 8 Finansiell kalkulator gjort enkelt med Perl 9 10 hode 2 11 bruk Finans 12 13 pv 10000 0 14 15 rente 12 5 12 APR per måned 16 17 tid 360 måneder for lån til modne 18 19 fv FutureValue 20 21 print fv 22 23 cut 24 25 Eksport qw FutureValue, 26 PresentValue, 27 FVofAnnuity, 28 AnnuityOfFV, 29 getLastAverage, 30 getMovingAverage, 31 SetInterest 32 33 34 Globals, hvis noen 35 36 37 lokal standardInterest 5 0 38 3 9 sub Finance SetInterest 40 min rate shift 41 standardInterest rate 42 printf n standardInterest rate 43 44 45 ------------------------------- ------------------------------------- 46 Notater 47 1 Renten r er oppgitt i en verdi av 0-100 48 2 Den n som er gitt i vilkårene er hastigheten som interessen 49 påføres 50 51 -------------------------- ------------------------------------------ 52 53 ------ -------------------------------------------------- ------------ 54 Nåverdi av en gitt investering 55 fv - en fremtidig verdi 56 r - rente per periode 57 n - antall periode 58 ------------ -------------------------------------------------- ------ 59 sub Finance FutureValue 60 min pv, r, n 61 min fv pv 1 r 100 n 62 retur fv 63 64 65 ------------------- ------------------------------------------------- 66 Nåverdi av en investering gitt 67 fv - en fremtidig verdi 68 r - rente per periode 69 n - antall periode 70 ------------------------- ------------------------------------------- 71 sub Finans PresentValue 72 min pv 73 min fv, r, n 74 pv fv 1 r 100 n 75 retur pv 76 77 78 79 ------------------------ -------------------------------------------- 80 Få fremtidig verdi av en livrente gitt 81 mp - Månedlig utbetaling av livrente 82 r - rente per periode 83 n - antall periode 84 --------------------------- ----------------------------------------- 85 86 sub FVofAnnuity 87 min fv 88 my enR 89 min mp, r, n 90 91 oneR 1 rn 92 fv mp oneR - 1 r 93 return fv 94 95 96 ------------------------ -------------------------------------------- 97 Få livrente fra Følgende informasjonskilder 98 r - rate per periode 99 n - antall perioder 100 fv - fremtidig verdi 101 ---------------------------- ---------------------------------------- 102 103 sub AnnuityOfFV 104 min mp mp - Månedlig Betaling av livrente 105 min enR 106 min fv, r, n 107 108 oneR 1 rn 109 mp fv r oneR - 1 110 returnering mp 111 112 113 ------------------- ------------------------------------------------- 114 Få gjennomsnittet av t han holder n-verdier i et array 115 ------------------------------------------ -------------------------- 116 Det siste antall tall fra elementet i verdier 117 Det totale antall elementer i verdier er i nummer 118 119 sub getLastAverage 120 min telle, tall, verdier 121 min i 122 123 min a 0 124 retur 0 hvis telle 0 125 for i 0 jeg teller i 126 a verdier antall - i - 1 127 128 returnerer en telle 129 130 131 --- -------------------------------------------------- --------------- 132 Få et glidende gjennomsnitt av verdiene 133 -------------------------- ------------------------------------------ 134 Vinduets størrelse er den første parameteren , antall elementer i 135-passordet er neste. Dette kan lett beregnes i 136-funksjonen ved hjelp av skalarfunksjonen, men underrutinen vist her 137 brukes også til å illustrere hvordan man skal vende poeng. Referansen til 138-gruppen av verdier sendes neste, etterfulgt av en referanse til stedet 139 returneringsverdiene skal lagres 140 141 sub getMovingAve 142 min tall, nummer, verdier, movingAve 143 min i 144 min a 0 145 min v 0 146 147 retur 0 hvis telle 0 148 retur -1 hvis telle nummer 149 return -2 hvis telle 2 150 151 movingAve 0 0 152 movingAve tall - 1 0 153 for i 0 jeg teller i 154 v-verdier i 155 av teller 156 movingAve i 0 157 158 for jeg teller i nummer i 159 v-verdier i 160 av teller 161 v-verdier i - telle - 1 162 a-v teller 163 movingAve ia 164 165 retur 0 166 167 168 1.Se på erklæringen av funksjonen FutureValue med de tre dollarskiltene sammen angir at tre skalare tall sendes inn i funksjonen Denne ekstra scoping er tilstede for å validere typen av parametrene som er sendt inn i funksjon Hvis du skulle sende en streng i stedet for et nummer inn i funksjonen, vil du få en melding som ligner på denne. For mange argumenter for Finance FutureValue på linje 15, nær tid. Utføring av abort på grunn av kompileringsfeil. Bruken av prototyper Når du definerer funksjoner, forhindrer du at du sender inn va lues annet enn hva funksjonen forventer Bruk eller til å passere i en rekke verdier Hvis du refererer til referanse, bruk eller for å vise en skalarreferanse til en matrise eller en hash. Hvis du ikke bruker tilbakestrek, vil alle andre typer i Prototype prototype ignoreres Andre typer disqualifiers inkluderer en ampersand for en referanse til en funksjon, en stjerne for en hvilken som helst type, og et semikolon for å indikere at alle andre parametere er valgfrie. Nå, la oss se på funksjonen for sisteMovingAverage-funksjonen, som angir to heltall foran og etterfulgt av en rekkefølge Måten argumentene brukes i funksjonen er å tilordne en verdi til hver av de to skalarene, telle og tall mens alt annet sendes til arrayet. Se på funksjonen getMovingAverage for å se hvordan to arrays er bestått for å få det bevegelige gjennomsnittet på en liste over verdier. Veien til å ringe getMovingAverage-funksjonen vises i Oppføring 4 5 Oppføring 4 5 Bruk den glidende gjennomsnittsfunksjonen 1 usr bin perl - w 2 3 push I nc, pwd 4 bruk Økonomi 5 6 verdier 12,22,23,24,21,23,24,23,23,21,29,27,26,28 7 mv 0 8 størrelse skalarverdier 9 skriv ut n Verdier for å jobbe med n 10 print Antall verdier størrelse n 11 12 ---------------------------------------- ------------------------ 13 Beregn gjennomsnittet av funksjonen ovenfor 14 ----------------- ----------------------------------------------- 15 ave Finans getLastAverage 5, størrelse, verdier 16 utskrift n Gjennomsnitt av de siste 5 dagene ave n 17 18 Finansiering getMovingAve 5, størrelse, verdier, mv 19 utskrift n Flytende gjennomsnitt med 5-dagers vindu n n. Here er resultatet fra Listing 4 5 Verdier til arbeid med antall verdier 14. bruk av de siste 5 dagene 26 2. funksjonen getMovingAverage tar to skalarer og deretter to referanser til arrays som skalarer. Innenfor funksjonen blir de to skalarene til arraysene deferreres for bruk som numeriske arrays. Det returnerte sett av verdier er satt inn i området som er sendt inn som den andre referansen. Hadde inngangsparametrene ikke blitt spesifisert med for hvert referert array, vil movingAve array referanse ville ha vært tomt og ville ha forårsaket feil ved kjøretid Med andre ord er følgende erklæring ikke riktig under getMovingAve. De resulterende spy av feilmeldinger fra en dårlig funksjon prototype er som følger Bruk av uninitialized verdi på linje 128 Bruk av uninitialisert verdi på linje 128 Bruk av uninitialisert verdi på linje 128 Bruk av uninitialisert verdi på linje 128 Bruk av uninitialisert verdi på linje 128 Bruk av uninitialisert verdi på linje 133 Bruk av uninitialisert verdi på linje 135 Bruk av uninitialisert verdi på linje 133 Bruk av uniniti value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135 Use of uninitial ized value at line 133 Use of uninitialized value at line 135 Use of uninitialized value at line 133 Use of uninitialized value at line 135.Average of last 5 days 26 2.Moving Average with 5 days window. This is obviously not the correct output Therefore, it s critical that you pass by reference when sending more than one array. Global variables for use within the package can also be declared Look at the following segment of code from the module to see what the default value of the Interest variable would be if nothing was specified in the input The current module requires the interest to be passed in, but you can change this. Here s a little snippet of code that can be added to the end of the program shown in Listing 4 5 to add the ability to set interest rates 20 local defaultInterest 5 0 21 sub Finance SetInterest 22 my rate shift 23 rate -1 if rate 0 24 defaultInterest rate 25 printf n defaultInterest rate 26.The local variable defaultInterest is declared in line 20 The subroutine SetInterest to modify the rate is declared in lines 21 through 26 The rate variable uses the values passed into the subroutine and simply assigns a positive value for it You can always add more error checking if necessary. To access the defaultInterest variable s value, you could define either a subroutine that returns the value or refer to the value directly with a call to the following in your application program Finance defaultInterest. The variable holding the return value from the module function is declared as my variable The scope of this variable is within the curly braces of the function only When the called subroutine returns, the reference to my variable is returned If the calling program uses this returned reference somewhere, the link counter on the variable is not zero therefore, the storage area containing the returned values is not freed to the memory pool Thus, the function that declares my pv. and then later returns the value of pv returns a reference to the value stored at that location If the calling routine performs a call like this one Finance FVofAnnuity monthly, rate, time. there is no variable specified here into which Perl stores the returned reference therefore, any returned value or a list of values is destroyed Instead, the call with the returned value assigned to a local variable, such as this one fv Finance FVofAnnuity monthly, rate, time. maintains the variable with the value Consider the example shown in Listing 4 6, which manipulates values returned by functions Listing 4 6 Sample usage of the my function 1 usr bin perl - w 2 3 push Inc, pwd 4 use Finance 5 6 monthly 400 7 rate 0 2 i e 6 APR 8 time 36 in months 9 10 print n ------------------------------------------------ 11 fv Finance FVofAnnuity monthly, rate, time 12 printf n For a monthly 8 2f at a rate of 6 2f for d periods , 13 monthly, rate, time 14 printf n you get a future value of 8 2f , fv 15 16 fv 1 1 allow 10 gain in the house value 17 18 mo Finance AnnuityOfFV fv, rate, t ime 19 20 printf n To get 10 percent more at the end, i e 8 2f , fv 21 printf n you need a monthly payment value of 8 2f , mo, fv 22 23 print n ------------------------------------------------ n. Here is sample input and output for this function testme ------------------------------------------------ For a monthly 400 00 at a rate of 0 20 for 36 periods you get a future value of 1415603 75 To get 10 percent more at the end, i e 1557164 12 you need a monthly payment value of 440 00.Modules implement classes in a Perl program that uses the object-oriented features of Perl Included in object-oriented features is the concept of inheritance You ll learn more on the object-oriented features of Perl in Chapter 5 Object-Oriented Programming in Perl Inheritance means the process with which a module inherits the functions from its base classes A module that is nested within another module inherits its parent modules functions So inheritance in Perl is accomplished with the construct Here s the b asic syntax SuperClass NextSubClass ThisClass. The file for these is stored in SuperClass NextSubClass Each double colon indicates a lower-level directory in which to look for the module Each module, in turn, declares itself as a package with statements like the following package SuperClass NextSubClass package SuperClass NextSubClass EvenLower. For example, say that you really want to create a Money class with two subclasses, Stocks and Finance Here s how to structure the hierarchy, assuming you are in the usr lib perl5 directory. Create a Money directory under the usr lib perl5 directory. Copy the existing file into the Money subdirectory. Create the new file in the Money subdirectory. Edit the file to use the line package Money Finance instead of package Finance. Edit scripts to use Money Finance as the subroutine prefix instead of Finance. Create a file in the usr lib perl5 directory. The Perl script that gets the moving average for a series of numbers is presented in Listing 4 7 Listing 4 7 Using inheriting modules 1 usr bin perl - w 2 aa pwd 3 aa Money 4 push Inc, aa 5 use Money Finance 6 values 12,22,23,24,21,23,24,23,23,21,29,27,26,28 7 mv 0 8 size scalar values 9 print n Values to work with n 10 print Number of values size n 11 ---------------------------------------------------------------- 12 Calculate the average of the above function 13 ---------------------------------------------------------------- 14 ave Money Finance getLastAverage 5, size, values 15 print n Average of last 5 days ave n 16 Money Finance getMovingAve 5, size, values, mv 17 foreach i values 18 print n Moving with 5 days window mv i n 19 20 print n Moving Average with 5 days window n n. Lines 2 through 4 add the path to the Money subdirectory The use statement in line 5 now addresses the file in the Money subdirectory The calls to the functions within are now called with the prefix Money Finance instead of Finance Therefore, a new subdirectory is shown via the symbol when Perl is sear ching for modules to load. The file is not required Even so, you should create a template for future use Actually, the file would be required to put any special requirements for initialization that the entire hierarchy of modules uses The code for initialization is placed in the BEGIN function The sample file is shown in Listing 4 8 Listing 4 8 The superclass module for 1 package Money 2 require Exporter 3 4 BEGIN 5 printf n Hello Zipping into existence for you n 6 7 1.To see the line of output from the printf statement in line 5, you have to insert the following commands at the beginning of your Perl script use Money use Money Finance. To use the functions in the module, you use this line use Money Stocks. The file appears in the Money subdirectory and is defined in the same format as the file, with the exceptions that use Stocks is used instead of use Finance and the set of functions to export is different. A number of modules are included in the Perl distribution Check the usr lib perl 5 lib directory for a complete listing after you install Perl There are two kinds of modules you should know about and look for in your Perl 5 release, Pragmatic and Standard modules. Pragmatic modules, which are also like pragmas in C compiler directives, tend to affect the compilation of your program They are similar in operation to the preprocessor elements of a C program Pragmas are locally scoped so that they can be turned off with the no command Thus, the command no POSIX. turns off the POSIX features in the script These features can be turned back on with the use statement. Standard modules bundled with the Perl package include several functioning packages of code for you to use Refer to appendix B, Perl Module Archives, for a complete list of these standard modules. To find out all the modules installed on your system, issue the following command If you get an error, add the usr lib perl5 directory to your path find usr lib perl5 - name perl - print. Extension modules are written in C or a mixture of Perl and C and are dynamically loaded into Perl if and when you need them These types of modules for dynamic loading require support in the kernel Solaris lets you use these modules For a Linux machine, check the installation pages on how to upgrade to the ELF format binaries for your Linux kernel. The term CPAN Comprehensive Perl Archive Network refers to all the hosts containing copies of sets of data, documents, and Perl modules on the Net To find out about the CPAN site nearest you, search on the keyword CPAN in search engines such as Yahoo AltaVista, or Magellan A good place to start is the site. This chapter introduced you to Perl 5 modules and described what they have to offer A more comprehensive list is found on the Internet via the addresses shown in the Web sites and. A Perl package is a set of Perl code that looks like a library file A Perl module is a package that is defined in a library file of the same name A module is designed to be reusable You can do som e type checking with Perl function prototypes to see whether parameters are being passed correctly A module has to export its functions with the EXPORT array and therefore requires the Exporter module Modules are searched for in the directories listed in the Inc array. Obviously, there is a lot more to writing modules for Perl than what is shown in this chapter The simple examples in this chapter show you how to get started with Perl modules In the rest of the book I cover the modules and their features, so hang in there. I cover Perl objects, classes, and related concepts in Chapter 5.Moving Average. I have hundreds of thousands of data points stored in data and need to do 100 data point moving average Can anybody share the logic I know I have to do pop or shift but just can t figure out how to do the moving average. thanks in advance. RE Moving Average. KevinADC TechnicalUser 18 Sep 08 16 28.I think you are going to need to explain what you are trying to do in detail Or maybe some knows wh at 100 data point moving average means Sample in and sample out data will be helpful. RE Moving Average. rharsh TechnicalUser 18 Sep 08 16 31.There are a few different ways to define a moving average Not in terms of perl since that s your question what algorithm would you use to calculate the moving average. For example, a simple moving average for 100 data points would be something like. SMA p p-1 p-99 100.Is that what you re looking for. RE Moving Average. PinkeyNBrain IS IT--Management 18 Sep 08 17 02.This looks a little academic, so just in case I ll explain versus writing code here - Loop over your data pushing the data points into an array - Track a runningtotal of the values along the way - If size of array 99, goto start - calc print average - shift array and subtract that amount from your runningtotal - end of loop. Red Flag Submitted. Thank you for helping keep Tek-Tips Forums free from inappropriate posts The Tek-Tips staff will check this out and take appropriate action. Reply To Th is Thread. Posting in the Tek-Tips forums is a member-only feature. Click Here to join Tek-Tips and talk with other members.

No comments:

Post a Comment