Friday 24 November 2017

Moving genomsnittet python


Jag spelar i Python lite igen, och jag hittade en snygg bok med exempel. En av exemplen är att plotta några data. Jag har en fil med två kolumner och jag har data som jag skrev ut data bara bra, men i träningen säger Ändra ditt program vidare för att beräkna och plotta löpande medelvärdet av de data som definieras av. var r 5 i det här fallet och yk är den andra kolumnen i datafilen. Hämta programmet både originaldata och löpande medelvärde på Samma graf. Så långt har jag detta. Så hur räknar jag summan I Mathematica är det enkelt eftersom det är symbolisk manipulation Summa jag till exempel, men hur man beräknar summan i pyton som tar tio punkter i data och medeltar det , och gör det till slutet av poängen. Jag tittade på boken men fann ingenting som skulle förklara detta. heltonbiker s kod gjorde tricket D. Tack så mycket. Det finns ett problem med det accepterade svaret jag tror vi behöver använd giltigt istället för samma här - returnera fönster, samma. Som ett exempel prova MA av denna dataset 1,5,7,2,6,7,8,2,2,7,8,3,7,3,7,3,15,6 - resultatet ska vara 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 med samma ger oss en felaktig effekt 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 Koden för att prova detta. Tryck detta med giltigt samma och se om matematiken är meningsfull. svarad 29 oktober 14 på 4 27.Haven t försökte det här, men jag ska titta på det, det har varit ett tag sedan jag har kodat in Python dingod 29 okt 14 kl 7 07. dingod Varför gör du det snabbt med det rostiga koden och provdatasatsen som en enkel lista, skrev jag För några latiga människor som jag hade varit i början - det maskerar ut Faktum att glidande medelvärde är att du borde överväga att redigera ditt ursprungliga svar Jag försökte det bara igår och dubbelkontroll sparade mig ansikte från att se dåligt på att rapportera till Cxo-nivå Allt du behöver göra är att prova samma glidande medel en gång med giltig och annan tid med samma - och när du är övertygad ge mig lite kärlek aka-up-vo te ekta 29 okt 14 kl 7 16. Vi introducerade tidigare hur man skapar glidande medelvärden med python Denna handledning kommer att vara en fortsättning på detta ämne Ett rörligt medelvärde i statistikens sammanhang, även kallat rullande löpande medelvärde, är en typ av ändlig impuls svar. I vår tidigare handledning har vi ritat värdena för arraysna x och y. Låt s plot x mot det glidande medlet av y som vi ska ringa yMA. Först, låt s utjämna längden på båda arraysna. Och för att visa detta i context. To hjälpa till att förstå detta, låt s plot två olika relationer x vs y och x vs MAy. The rörliga genomsnittet här är den gröna tomten som börjar vid 3.I fortsättningen av denna handledning kommer vi att lära oss hur Beräkna glidande medelvärden på stora dataset. 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ågon annan Sätt att göra det mer effektivt faktiskt om någon man vet om ett bättre sätt att fördela resultatet, var snäll och låt mig veta. NOTE det här skulle bli mycket snabbare med ett 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 med multi-threaded execution. The funktion 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 för att jag tycker att det är så som de flesta förväntar sig att fungera, men att du kanske har andra prioriteringar. Här är ett diagram som illustrerar skillnaden mellan lägena. svarade 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 saker upp Running medelvärdet motsvarar att samla x med en vektor som är N lång, med alla medlemmar lika med 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 , Den snabba versionen är 20-30 gånger snabbare beroende på längden på ingångsvektorn och storleken på det genomsnittliga fönstret. Notera som convolve inkluderar ett samma läge som verkar som det borde ta itu med det starta transienta problemet, men det delar upp det mellan början och slutet. Det tar bort transienten från slutet, och början har inte en. Nåväl, jag antar att det är fråga om prioriteringar, jag behöver inte samma antal resultat på bekostnad av att få en sluttning mot noll som inte är T där i data BTW, här är ett kommando för att visa skillnaden mellan lägena lägena, samma, giltiga plot 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 importerade lapis Mar 24 14 på 13 56.pandas är mer lämplig för detta än NumPy eller SciPy. Funktionen rollingmean gör jobbet bekvämt. Det returnerar också ett 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 insignalerna när både ingångar och utgångar är av samma natur, t ex både tidssignaler. 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 sätter fast Ounda ändarna eller dynorna med nollor som sedan används för att hitta medelvärdet. Såsom en ytterligare behandling är det att den också samplar signalen på linjärt åtskilda punkter. Anpassa koden på viljan för att få andra funktioner. Metoden är enkel matrixmultiplicering med en normaliserad Gaussisk kärna. En enkel användning på en sinusformad signal med normalt normalfördelat brus. 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 hanterar kantfall. Men för att det är ett enkelt glidande medelvärde, det s resultat lagras bakom de data de tillämpar jag trodde att hantering av kantfall på ett mer tillfredsställande sätt än NumPy s-lägen som var lika och fulla kunde 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 det fullstora fönstret som ska användas, beräknas genomsnittsvärden från successivt mindre fönster i ed ges 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 kan sannolikt spruced upp ganska mycket av en sann Pythonista, men jag tror att idén står. Jan 2 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 kantvärden. Jag har själv genomfört en algoritm som kan hantera detta problem bra om problemet är förklarat som. Input parameter mergenum kan betraktas som 2 windowwidth 1. Jag vet att den här koden är lite oläslig om du tycker att den är användbar 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 Jag hoppas jag gör det bara när någon behöver det. Vänligen förlåta mig för min latskap. Om du bara är intresserad av sin ursprungliga version. Det är ännu mer oläsligt, den första lösningen blir av med problem med kanten 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 ange varför det hjälper floating point-felet. Om två värden är ungefär samma storleksordning, så lägger de mindre precision än om du lagt till ett mycket stort antal till en mycket liten kod Koden kombinerar intilliggande värden så att även mellanliggande summor alltid ska vara rimligen nära i storleksordningen för att minimera floating point-felet. Inget är dumt bevis, men denna metod har sparat ett par mycket dåligt implementerade Projekt i produktion Mayur Patel Dec 15 14 på 17 22. Alleo I stället för att göra en tillägg per värde gör du två. Beviset är detsamma som det bit-flipping-problemet. Men punkten i detta svar är inte nödvändigtvis prestanda, men precision Minneskonsumtion för genomsnittliga 64-bitars värden skulle inte överstiga 64 element i cacheminnet, så det är vänligt i minnesanvändning också Mayur Patel Dec 29 14 på 17 04.

No comments:

Post a Comment