Sunday 10 December 2017

Np rörliga genomsnittet


Hmmm, det verkar vara lätt att implementera funktionen är faktiskt ganska lätt att få fel och har främjat en bra diskussion om minneseffektivitet. Jag m glad att ha uppblåst om det innebär att veta att någonting s har gjorts rätt Richard Sep 20 14 på 19 23.NumPy s brist på en viss domänspecifik funktion är kanske på grund av Core Teams disciplin och trovärdighet för NumPys s främsta direktiv ger en N-dimensional array-typ samt funktioner för att skapa och indexera dessa arrays Precis som många grundmål, Är inte liten, och NumPy gör det briljant. Den mycket större SciPy innehåller en mycket större samling domänspecifika bibliotek som heter subpackages av SciPy devs - till exempel numerisk optimering optimera, signal processsing signal och integral calculus integrera. Min gissning är att den funktion du är ute efter är i minst en av SciPy-underpackningarna kanske, men jag skulle se först i samlingen av SciPy-scikits identifiera relevanta scikit s och leta efter Funktionen av intresse there. Scikits är självständigt utvecklade paket baserat på NumPy SciPy och riktad till en viss teknisk disciplin, t. ex. scikits-image scikits-learn osv. Flera av dessa var i synnerhet den fantastiska OpenOpt för numerisk optimering var högt ansedda, mogna projekt länge innan du väljer att bo under den relativt nya scikits rubriken The Scikits hemsida gillade att ovan listas omkring 30 sådana scikits men åtminstone flera av dessa är inte längre under aktiv utveckling. Efter detta råd skulle du leda till scikits-timeseries men det paketet är nej längre under aktiv utveckling I själva verket har Pandas blivit AFAIK, de facto NumPy-baserade tidsseriebiblioteket. Pandas har flera funktioner som kan användas för att beräkna ett rörligt medelvärde. Det enklaste av dessa är förmodligen rollingmean som du brukar vilja. Nu , Ring bara funktionen rollingmean som passerar i Serieobjektet och en fönsterstorlek som i mitt exempel nedan är 10 dagar. Verifiera att det w orked - till exempel jämförda värden 10-15 i originalserien jämfört med den nya serien slätad med rullande medel. Funktionsvalsen, tillsammans med ungefär ett dussintals annan funktion, grupperas informellt i Pandas dokumentation under rubriken rörelsefönster fungerar en sekund relaterad grupp av funktioner i Pandas kallas exponentiellt viktade funktioner, t. ex. ewma som beräknar exponentiellt rörligt vägt genomsnitt. Att den andra gruppen inte ingår i de första rörliga fönstervfunktionerna är kanske att de exponentiellt viktade transformationerna inte är beroende av En fast längd fönster. Svarade den 14 januari 13 på 6 38. Jag vet att det här är en gammal fråga, men här är en lösning som inte använder några extra datastrukturer eller bibliotek. Det är linjärt i antalet element i ingångslistan och Jag kan inte tänka på något annat sätt att göra det effektivare faktiskt om någon vet om ett bättre sätt att fördela resultatet, var snäll och låt mig veta. OBSERVERA det här skulle bli mycket snabbare med en numpy arr Ay istället för en lista men jag ville eliminera alla beroenden. Det skulle också vara möjligt att förbättra prestanda genom multi-threaded execution. Funktionen förutsätter att ingångslistan är endimensionell, så var försiktig. UPD har effektivare lösningar föreslagits av Alleo och jasaarim. Du kan använda för det. Modusargumentet anger hur du hanterar kanterna jag valde det giltiga läget här, för jag tror det är hur de flesta förväntar att de körs, menar att de har andra prioriteringar. Här är en plot som Illustrerar skillnaden mellan modes. answered Mar 24 14 på 22 01. Jag gillar den här lösningen eftersom den är ren en linje och relativt effektivt arbete utfört i numpy Men Alleo s Effektiv lösning använder har bättre komplexitet Ulrich Stern Sep 25 15 på 0 31. Du kan beräkna ett löpande medelvärde med. Lyckligtvis innehåller numpy en convolve-funktion som vi kan använda för att påskynda sakerna. Runningmedlet motsvarar att samla x med en vektor som är N lång, med alla medlemmar lika med 1 N Den numpiga implementeringen av convolve inkluderar starttidspunkten, så du måste ta bort de första N-1-poängen. På min maskin är den snabba versionen 20-30 gånger snabbare beroende på längden på ingångsvektorn och storleken på det genomsnittliga fönstret . Notera att convolve inkluderar ett samma läge som verkar som att det borde ta itu med det starta transientproblemet, men det delar upp det mellan början och slutet. Det tar bort övergången från slutet, och början har inte en. Tja, jag antar det Det är en fråga om prioriteringar, jag behöver inte samma antal resultat på bekostnad av att få en sluttning mot noll som inte finns där i data BTW, här är ett kommando för att visa skillnaden mellan lägena lägena fulla, samma, giltiga tomt convolve ones 200, ones 50, 50, läget m för m i lägena axel -10, 251, - 1, 1 1 legend lägen, läget lägre center med pyplot och numpy importerad lapis Mar 24 14 på 13 56.pandas är mer lämplig För detta än NumPy eller SciPy Dess funktion rollingmean gör jobbet bekvämt Ly Det returnerar också en NumPy-array när ingången är en array. Det är svårt att slå rollingmean i prestanda med någon anpassad ren Python-implementering. Här är ett exempel prestanda mot två av de föreslagna lösningarna. Det finns också fina alternativ för hur man hanterar Med kantvärdena. Jag är alltid irriterad av signalbehandlingsfunktionen som returnerar utsignaler av annorlunda form än ingångssignalerna när både ingångar och utgångar är av samma natur, t. ex. båda temporala signaler. Det bryter korrespondensen med relaterad oberoende variabel, t. ex. tid, frekvens Gör det i själva verket inte en direkt fråga, men om du delar känslan kanske du vill ändra de sista raderna i den föreslagna funktionen som samma återkomst y windowlen-1 - windowlen-1 Christian O Reilly aug 25 15 vid 19 56.A Lite sent till festen, men jag har gjort min egen lilla funktion som INTE vrider runt ändarna eller dynorna med nollor som sedan används för att hitta medelvärdet också. Som en ytterligare behandling är det också Samplera signalen på linjärt åtskilda punkter Anpassa koden på viljan för att få andra funktioner. Metoden är en enkel matrismultiplicering med en normaliserad Gaussisk kärna. En enkel användning på en sinusformad signal med normalt normalfördelat brus. Denna fråga är nu jämn Äldre än när NeXuS skrev om det förra månaden, men jag tycker om hur hans kod handlar om kantfall. Men eftersom det är ett enkelt glidande medelvärde, sitter resultaten efter de data de tillämpar på jag trodde att det handlar om kantfall i en mer Tillfredsställande sätt än NumPy s-lägen som är lika och fullständiga kan uppnås genom att tillämpa ett liknande tillvägagångssätt för en konvolutionbaserad metod. Mitt bidrag använder ett centralt löpande medelvärde för att anpassa sina resultat med deras data. När det finns två få punkter tillgängliga för fullstor Fönstret som ska användas, beräknas löpande medelvärden beräknas från successivt mindre fönster vid kanterna av arrayen Egentligen från successivt större fönster, men det är en implementeringsdetalj. Det är relativt långsamt eftersom det använder convolve och sannolikt kan spruced upp ganska mycket av en sann Pythonista men jag tror att tanken står. svarade den 2 januari på 0 28. Det är trevligt men långsamt när fönstervidden blir stor Vissa svar ger mer effektiva algoritmer Med men verkar inte kunna hantera kanten värden jag själv har implementerat en algoritm som kan hantera detta problem bra om det här problemet förklaras. Input parameter mergenum kan anses som 2 windowwidth 1. Jag vet att den här koden är lite oläslig om du Hitta det bra och vill ha några expanations, snälla låt mig veta och jag ska uppdatera detta svar Eftersom skrivning en förklaring kan kosta mig mycket tid hoppas jag bara gör det när någon behöver det. Vänligen förlåt mig för min latskap. Om du bara är du Intresserad av sin ursprungliga version. Det är ännu mer oläsligt, den första lösningen blir av med kantproblemet genom att padda nollor runt matrisen, men den andra lösningen som skickas här hanterar den på ett tufft och direkt sätt. I min sista mening försökte jag indikera E varför det hjälper floating point-felet Om två värden är ungefär samma storleksordning, då lägger till dem förlorar mindre precision än om du lägger till ett mycket stort tal till en mycket liten kod. Koden kombinerar intilliggande värden så att även mellanliggande belopp ska Alltid vara ganska nära i storleksordningen för att minimera floating point-felet. Inget är dumt bevis, men den här metoden har sparat ett par väldigt dåligt genomförda projekt i produktionen. Mayur Patel Dec 15 14 på 17 22. Alleo Istället för att göra en tillägg per värde kommer du Gör två Provet är detsamma som det bit-flipping-problemet Men punkten i detta svar är inte nödvändigtvis prestanda, men precision Minnesanvändningen för genomsnittliga 64-bitars värden skulle inte överstiga 64 element i cacheminnet, så det är vänligt i Minnesanvändning Mayur Patel Dec 29 14 på 17 04. Följande exempel ger ett glidande medelvärde av de föregående WINDOW-värdena Vi avkortar de första WINDOW -1-värdena eftersom vi inte kan hitta genomsnittet före t Hem Standardvärdet för konvolvering är att anta att värden före starten av vår sekvens är 0 Mer formellt konstruerar vi sekvensen y för sekvensen x där yi xi xi 1 xin n. This använder numpy s convolution-funktionen Detta är en Allmänna ändamål rörande genomsnittlig operation. Changing viktningar gör vissa värden viktigare motsättning lämpligt kan du se genomsnittet som runt punkt snarare än tidigare punkt. I stället för avkortade värden kan vi fixa de ursprungliga värdena på plats, som illustreras i det här exemplet.

No comments:

Post a Comment