Friday, 27 October 2017

Glidande Medelvärde Funktion Python


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 window. answered Jan 14 13 på 6 38. Jag är på väg att skapa en Forex trading algoritm och ville försöka mitt skott för att beräkna EMA Exponential Moving Averages Mina resultat verkar vara korrekta jämfört med de beräkningar jag gjorde av hand så jag tror att följande metod fungerar, men ville bara få en extra uppsättning ögon för att se till att jag inte saknar något. Notera att detta bara returnerar E MA för det senaste priset, returnerar det inte en rad EMA s eftersom det inte är vad jag behöver för min application. Recursion är ett bra verktyg för rätt jobb, men här används det för att uppnå enkel looping Som sådan koden. Är svårare att läsa och orsaka om. Långsammare eftersom mycket av koden i ema bara behöver springa once. will misslyckas med tillräckligt stor värde av fönster på grund av att överfyllda Python s call stack. Please dokumentera åtminstone parametrarna för varje funktion, t. ex. det här fönstret är längden på fönstret och den positionen räknas bakåt från slutet av data. Faktum är att saker skulle vara tydligare om positionen var ett normalt framåtriktat index i data. Ta ett undantag när du finner en parameter har ett ogiltigt värde. i stället kommer bara att orsaka ett mer förvirrande undantag senare Faktum är att om jag försöker 600 får jag oändlig recursion eftersom sma returnerar None som gör ema call sma om och om igen. Den föregående punkten avslöjar också att om len datafönster 2 inte är rätt giltighet kontrollera. 1 in data - window 2 1 - window 1 don t verkar korrekt för mig Jag antar att du vill ha data - window 2 - window. The uttalandet returnera tidigareema är på en udda plats för att du vid den tidpunkten har beräknat ett nytt aktuellt ämne. Detta är basfallet av Rekursionen, och det är vanligt att hantera basfallet första. Mitt förslag till ema. answered 26 november 14 på 18 56.Pritt grunda granskning. Du behöver inte skriva en klass för vad du gör och jag föreslår att du har en Titta på den här videon Din klass inkapslar inte några data och du använder den bara för att få dina funktioner i samma enhet. Jag antar att det var lättare att förstå om du skulle definiera klassmetod för att göra det uppenbart att du inte vågade förlita dig på någon Exakt vad som helst Men ett ännu bättre alternativ skulle vara att bara definiera funktioner i en indikatormodul. Svarade den 24 november kl 14 på 18 04. Tack för de förslag som jag faktiskt hade dem som klassmetoder och debatterade fram och tillbaka mellan ens även med en klass eller Definierar bara funktioner i en indikator Ator-modul som jag nu ska göra ChrisC nov 25 14 på 19 12.Jag tittade också på videon, bra saker ChrisC nov 25 14 på 19 43. Ditt svar.2017 Stack Exchange, Inc. 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 , snälla låt mig veta. NOTE det här skulle vara mycket snabbare med en numpy array 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 effektivare lösningar har föreslagits av Alleo och jasaarim. Du kan använda för det. Modusargumentet anger hur du kan hantera kanterna jag valde det giltiga läget här eftersom jag tycker att det är hur de flesta förväntar sig att springa Menar att arbeta, men du kanske har othe r 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 gjort 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 upp saker. Det löpande medelvärdet motsvarar att convolving x med en vektor som är N lång, med alla medlemmar lika till 1 N Den numpy 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å den 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 transienten från slutet och början har inte en Vi Jag antar att det är fråga om prioriteringar, jag behöver inte samma antal resultat på bekostnad av att man får 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, giltig tomt convolve dem 200,, en 50, 50, läget m för m i lägena axel -10, 251, - 1, 1 1 lägen lägen, lok lägre center med pyplot och numpy importerad lapis Mar 24 14 på 13 56.pandas är mer lämpade för detta än NumPy eller SciPy. Funktionen rollingmean gör jobbet bekvämt. 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 kantvärdena. Jag är alltid irriterad av signalbehandlingsfunktionen som returnerar utsignaler av annan form än ingångssignalerna när både ingångar och utgångar är av samma natur, t. ex. både temporal signaler Det bryter korrespondensen med relaterad oberoende variabel, t. ex. tid, frekvens gör plotting eller jämförelse inte en direkt fråga ändå, 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 på 19 56. En bit sent till festen, men jag har gjort min egen lilla funktion som INTE viklar runt ändarna eller dynorna med nollor som sedan används för att hitta medelvärdet. ytterligare behandling är att den också samplar signalen på linjärt åtskilda punkter. Anpassa koden på viljan för att få andra funktioner. Metoden är en enkel matrismultiplikation med en normaliserad Gaussisk kärna. En enkel användning på en sinusformad signal med tillförd normalfördelad buller. Den här frågan är nu ännu ä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, går det sakta bakom de data de tillämpar på jag trodde att t hatt som hanterar kantfall på ett 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å Några punkter som är tillgängliga för det fönster i full storlek som ska användas, är löpande medelvärden beräknade från successivt mindre fönster vid kanterna av arrayen. Verkligen från successivt större fönster, men det är en implementeringsdetalj. Det är relativt långsamt eftersom det använder convolve och skulle sannolikt bli spruced upp ganska mycket av en sann Pythonista men jag tror att tanken står. svarade den 2 januari på 0 28. är fin men långsam när fönstervidden blir stor Vissa svar ger mer effektiva algoritmer med men verkar inte kunna hantera kanten värden Jag har själv implementerat en algoritm som kan hantera detta problem bra om problemet uppges som. Inputparametern mergenum kan anses som 2 fönsterbredd 1. Jag känner till den här koden Är lite oläslig om du tycker att det är användbart och vill ha några expanationer, snälla låt mig veta och jag ska uppdatera det här svaret Eftersom skrivning kan en förklaring 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 lathet. Om du bara är intresserad av sin ursprungliga version. Det är ännu mer oläsligt, den första lösningen blir av med kanten problem med padding nollor runt matrisen, men den andra lösningen som skickas här hanterar den på ett tufft och direkt sätt. I min sista meningen Jag försökte ange varför det hjälper floating point-felet Om två värden är ungefär samma storleksordning, så lägger de till sig mindre precision än om du lägger till ett mycket stort tal till en mycket liten. Koden kombinerar intilliggande värden i en sätt att även mellanliggande belopp alltid ska vara rimligt nära i storleksordningen, för att minimera floating point-felet. Inget är dåligt bevis, men den här metoden har sparat ett par mycket dåligt genomförda projekt i produktionen. Mayur Patel Dec 15 14 Vid 17 22. Alleo Istället för att göra en tillägg per värde gör du två. Beviset är detsamma som det bit-flipping-problemet. Poängen med detta svar är emellertid inte nödvändigtvis prestanda, men precision Minnesanvändning för medeltal 64-bitars värdena skulle inte överstiga 64 element i cachen, så det är vänligt i minnesanvändning också Mayur Patel Dec 29 14 på 17 04.

No comments:

Post a Comment