Moving Gjennomsnittet Python


Jeg spiller i Python litt igjen, og jeg fant en fin bok med eksempler. En av eksemplene er å plotte noen data. Jeg har en fil med to kolonner, og jeg har dataene jeg plottet dataene fint, men i øvelsen sier Endre programmet videre for å beregne og plotte det løpende gjennomsnittet av dataene definert av. hvor r 5 i dette tilfellet og yk er den andre kolonnen i datafilen. Har programmet plottet både de opprinnelige dataene og løpende gjennomsnittet på samme graf. Så langt har jeg dette. Så hvordan beregner jeg summen I Mathematica er det enkelt siden det er symbolsk manipulasjon Sum jeg, for eksempel, men hvordan beregner summen i python som tar hver tiende poeng i dataene og gjennomsnitt det , og gjør det til slutten av poengene. Jeg så på boken, men fant ingenting som ville forklare dette. Heltonbiker s kode gjorde kunsten D. Takk så mye. Det er et problem med det aksepterte svaret jeg tror vi må bruk gyldig i stedet for samme her - returner vindu, samme. Som et eksempel, prøv MA av dette datasettet 1,5,7,2,6,7,8,2,2,7,8,3,7,3,7,3,15,6 - resultatet skal være 4 2,5 4 , 6 0,5 0,5 0,5 2,5 4,4 4,5 4,5 6,5 6,4 6,7 0,6 8 men å ha samme gir oss en feil utgang på 2 6,3 0 , 4 2,5 4,6 0,5 0,5 0,5 2,5 4,4 4,5 4,5 6,5 6, 4 6,7 0,6 8,6 2,4 8.Rusty kode for å prøve dette ut. Prøv dette med gyldig samme og se om matematikken er fornuftig. Ansatt 29. oktober, 14 på 4 27.Haven t prøvde dette, men jeg skal se på det, det har vært en stund siden jeg har kodet inn Python dingod 29 oktober klokken 7 07. dingod Hvorfor kan du ikke prøve dette ut med den rustne koden og prøvedatasettet som en enkel liste, postet jeg For noen dovne folk som jeg hadde vært i begynnelsen - det maskerer ut faktum at glidende gjennomsnitt er at du bør vurdere å redigere det opprinnelige svaret jeg prøvde det bare i går, og dobbeltkontrollen reddet meg fra å se dårlig på å rapportere til Cxo-nivå Alt du trenger å gjøre er å prøve det samme bevegelige gjennomsnittet en gang med gyldig og annen tid med samme - og når du er overbevist om å gi meg litt kjærlighet, kjør opp te ekta 29 okt 14 kl 7 16. Vi har tidligere innført hvordan man lager glidende gjennomsnitt ved hjelp av python. Denne veiledningen vil være en videreføring av dette emnet. Et glidende gjennomsnitt i sammenheng med statistikk, også kalt et rullende løpende gjennomsnitt, er en type endelige impuls respons. I vår tidligere opplæring har vi plottet verdiene til arrays x og y. Let s plot x mot det bevegelige gjennomsnittet av y som vi skal ringe yMA. Firstly, la s utjevne lengden på begge arrays. And å vise dette i kontekst. Den resulterende grafen. For å forstå dette, la s plotte to forskjellige forhold x vs y og x vs MAy. Den glidende gjennomsnittet her er det grønne plottet som starter ved 3.I fortsettelsen av denne opplæringen vil vi lære å beregne bevegelige gjennomsnitt på store datasett. Jeg vet at dette er et gammelt spørsmål, men her er en løsning som ikke bruker noen ekstra datastrukturer eller biblioteker. Det er lineært i antall elementer i inngangslisten, og jeg kan ikke tenke på noen andre måte å gjøre det mer effektivt faktisk hvis noen man vet om en bedre måte å tildele resultatet, vennligst gi meg beskjed. IKKE dette ville være mye raskere ved hjelp av en numpy array i stedet for en liste, men jeg ønsket å eliminere alle avhengigheter. Det ville også være mulig å forbedre ytelsen med multi-threaded utførelse. Funksjonen forutsetter at inntallelisten er endimensjonal, så vær forsiktig. UPD mer effektive løsninger har blitt foreslått av Alleo og jasaarim. You kan bruke for det. Modusargumentet angir hvordan du kan håndtere kantene jeg valgte den gyldige modusen her fordi jeg tror det er slik de fleste forventer å kjøre, betyr å jobbe, men du kan ha andre prioriteringer. Her er et plott som illustrerer forskjellen mellom modiene. Ansatt Mar 24 14 kl 22 01. Jeg liker denne løsningen fordi den er ren en linje og relativt effektiv arbeid gjort inne numpy Men Alleo s Effektiv løsning bruker har bedre kompleksitet Ulrich Stern Sep 25 15 på 0 31. Du kan beregne en løpende betyr med. Heldigvis inneholder numpy en convolve-funksjon som vi kan bruke for å øke hastigheten ting opp Det løpende gjennomsnittet er ekvivalent med å innlemme x med en vektor som er N lang, med alle medlemmer lik 1 N Den numpy implementeringen av convolve inkluderer startovergangeren, så du må fjerne de første N-1 poengene. På min maskin , den raske versjonen er 20-30 ganger raskere, avhengig av lengden på inngangsvektoren og størrelsen på gjennomsnittsvinduet. Notat som convolve innebærer en samme modus som virker som den burde adressere begynnende forbigående problem, men det splitter det mellom begynnelsen og slutten. Den fjerner forbigående fra slutten, og begynnelsen har ikke en Vel, jeg antar at det er saken om prioriteringer, jeg trenger ikke samme antall resultater på bekostning av å få en skråning mot null som ikke er t der i data-BTW, her er det en kommando for å vise forskjellen mellom modusmodusene fulle, samme, gyldige plot convolve de 200,, de 50, 50, modus m for m i moduser akse -10, 251, -1, 1 1 legemodus, lok lavere senter med pyplot og numpy importert lapis Mar 24 14 på 13 56.pandas er mer egnet for dette enn NumPy eller SciPy. Funksjonen rollingmean gjør jobben beleilig. Den returnerer også et NumPy array når inngangen er en array. Det er vanskelig å slå rollingmean i ytelse med enhver tilpasset ren Python implementering Her er et eksempel på ytelse mot to av de foreslåtte løsningene. Det er også gode alternativer for hvordan man skal håndtere kanten verdier. Jeg er alltid irritert av signalbehandling funksjon som returnerer utgangssignaler av forskjellig form enn inngangssignaler når både innganger og utganger er av samme natur, for eksempel begge tidsmessige signaler. Det bryter korrespondansen med relatert uavhengig variabel, for eksempel tid, frekvenser som plotting eller sammenligning er ikke en direkte sak uansett. Hvis du deler følelsen, vil du kanskje endre de siste linjene i den foreslåtte funksjonen som samme retur-windowlen-1 - windowlen-1 Christian O Reilly Aug 25 15 på 19 56. Litt sent til festen, men jeg har laget min egen lille funksjon som ikke vikler ar ound ender eller pads med nuller som deretter brukes til å finne gjennomsnittet, så vel som en videre behandling er at den også sampler signalet på lineært avstandspunkter. Tilpass koden på vilkårlig måte for å få andre funksjoner. Metoden er enkel matriksmultiplikasjon med en normalisert gausskjerne. En enkel bruk på et sinusformet signal med tilsatt normal distribuert støy. Dette spørsmålet er nå enda eldre enn når NeXuS skrev om det i forrige måned, MEN jeg liker hvordan koden hans håndterer kantsaker. Men fordi det er et enkelt bevegelige gjennomsnitt, det er resultatene som ligger bak de dataene de søker på. Jeg trodde at det handlet om kantsaker på en mer tilfredsstillende måte enn NumPy s-modi som var gyldige samme og fulle, kunne oppnås ved å anvende en lignende tilnærming til en konvoluttbasert metode. Mitt bidrag bruker et sentralt løpende gjennomsnitt for å justere resultatene med deres data Når det er to få poeng tilgjengelig for vinduet i full størrelse som skal brukes, beregnes løpende gjennomsnitt fra suksessivt mindre vinduer på ed Går av arrayet Egentlig fra suksessivt større vinduer, men det er en implementeringsdetalj. Det er relativt sakte fordi det bruker convolve og kan sannsynligvis bli spruced opp ganske mye av en ekte Pythonista, men jeg tror at ideen står. Jan 2 på 0 28. Det er fint, men sakte når vinduets bredde blir stor. Noen svar gir mer effektive algoritmer med, men synes ikke å håndtere kantsverdier. Jeg har selv implementert en algoritme som kan håndtere dette problemet godt, hvis dette problemet er erklært som. Input parameter mergenum kan betraktes som 2 windowwidth 1. Jeg vet at denne koden er litt ulæselig hvis du finner det nyttig og vil ha noen utvidelser, vennligst gi meg beskjed og jeg vil oppdatere dette svaret Siden skriving kan en forklaring koste meg mye tid , Håper jeg jeg bare gjør det når noen trenger det. Vennligst tilgi meg for min latskap. Hvis du bare er interessert i sin opprinnelige versjon. Det er enda mer uleselig, den første løsningen blir kvitt kantenproblemet ved å putte nuller rundt arrayet, men den andre løsningen som er oppført her, håndterer den på en tøff og direkte måte. I min siste setning forsøkte jeg å angi hvorfor det hjelper flytende punktfeil. Hvis to verdier er omtrent samme størrelsesorden, blir det mindre presisjon enn å legge til dem mindre enn om du lagt til et veldig stort tall til en veldig liten kode. Koden kombinerer tilstøtende verdier på en slik måte at selv mellomliggende beløp alltid skal være rimelig nær i størrelsesorden, for å minimere flytpunktsfeilen. Ingenting er dumt bevis, men denne metoden har reddet et par svært dårlig implementert prosjekter i produksjon Mayur Patel 15 desember klokken 17 22. Alleo I stedet for å gjøre ett tillegg per verdi, vil du gjøre to. Beviset er det samme som bit-flipping problemet. Poenget med dette svaret er imidlertid ikke nødvendigvis ytelse, men presisjon Minnebruk for gjennomsnittlige 64-biters verdier vil ikke overstige 64 elementer i hurtigbufferen, så det er vennlig i minnesbruk også Mayur Patel Des 29 14 på 17 04.

Comments