Matplotlib moving average example
Hmmm, parece que este quesito implementar muitas funções é realmente fácil de errar e promoveu uma boa discussão sobre eficiência de memória. Fico feliz em ter inchaço, se isso significa saber que algo foi feito corretamente. ndash Richard Sep 20 14 at 19:23 NumPys falta de uma determinada função específica do domínio é talvez devido à disciplina de equipes principais e fidelidade à diretiva prime NumPys: fornecer um tipo de matriz N-dimensional. bem como funções para criar e indexar essas matrizes. Como muitos objetivos fundamentais, este não é pequeno, e o NumPy faz isso de forma brilhante. O SciPy (muito) maior contém uma coleção muito maior de bibliotecas específicas de domínio (chamadas subpacotes por desenvolvedores do SciPy) - por exemplo, otimização numérica (otimização), processamento de sinal (sinal) e cálculo integral (integração). Meu palpite é que a função que você está procurando está em pelo menos um dos subpacotes do SciPy (scipy. signal talvez), no entanto, eu olharia primeiro na coleção de scikits do SciPy. identificar o (s) scikit (s) relevante (s) e procurar a função de interesse. Scikits são pacotes desenvolvidos independentemente baseados em NumPy / SciPy e direcionados para uma disciplina técnica particular (por exemplo, scikits-image. Scikits-learn, etc.) Vários deles (em particular, o incrível OpenOpt para otimização numérica) foram altamente considerados, maduros projetos muito antes de escolher residir sob a rubrica scikits relativamente nova. A página inicial do Scikits gostou das listas acima sobre 30 desses scikits. embora pelo menos vários deles não estejam mais em desenvolvimento ativo. Seguir este conselho o levaria a scikits-timeseries, entretanto, esse pacote não está mais em desenvolvimento ativo. Com efeito, o Pandas se tornou, AFAIK, a biblioteca de séries temporais baseada em NumPy. Os pandas têm várias funções que podem ser usadas para calcular uma média móvel, e a mais simples delas é provavelmente rollingmean. que você usa assim: Agora, basta chamar a função rollingmean passando no objeto Series e um tamanho de janela. que no meu exemplo abaixo é de 10 dias. verificar se funcionou - por exemplo, valores comparados 10 - 15 na série original versus a nova série suavizada com a média rolante A função rollingmean, junto com cerca de uma dúzia de outras funções são informalmente agrupadas na documentação do Pandas sob as funções de janela de movimentação de rubricas, um segundo grupo relacionado de funções em Pandas é referido como funções exponencialmente ponderadas (por exemplo, ewma., que calcula a média ponderada em movimento exponencial). O fato de que esse segundo grupo não está incluído no primeiro (funções de janela móvel) talvez seja porque as transformações com ponderação exponencial não dependem de uma janela de tamanho fixo. Apresentamos anteriormente como criar médias móveis usando python. Este tutorial será uma continuação deste tópico. Uma média móvel no contexto da estatística, também chamada de média de rolamento / corrida, é um tipo de resposta de impulso finita. Em nosso tutorial anterior, plotamos os valores das matrizes x e y: a plotagem de Let8217s x contra a média móvel de y que chamaremos de yMA: Em primeiro lugar, let8217s equaliza o comprimento de ambas as matrizes: E para mostrar isso em contexto: graph: Para ajudar a entender isso, let8217s plotam duas relações diferentes: x vs y e x vs MAy: A média móvel aqui é a trama verde que começa às 3: Compartilhe: Assim: Poste navegação Deixe uma resposta Cancelar resposta Muito útil I Gostaria de ler a última parte em grandes conjuntos de dados Espero que venha em breve8230 d blogueiros como este: Eu sei que esta é uma pergunta antiga, mas aqui está uma solução que não usa estruturas de dados ou bibliotecas extras. É linear no número de elementos da lista de entrada e não consigo pensar em nenhuma outra maneira de torná-lo mais eficiente (na verdade, se alguém souber de uma maneira melhor de alocar o resultado, por favor, avise-me). NOTA: isso seria muito mais rápido usando um array numpy em vez de uma lista, mas eu queria eliminar todas as dependências. Também seria possível melhorar o desempenho pela execução multiencadeada. A função assume que a lista de entrada é unidimensional, portanto, tenha cuidado. UPD: soluções mais eficientes foram propostas pela Alleo e jasaarim. Você pode usar np. convolve para isso: O argumento mode especifica como manipular as arestas. Escolhi o modo válido aqui porque acho que a maioria das pessoas espera que a execução funcione, mas você pode ter outras prioridades. Aqui está um gráfico que ilustra a diferença entre os modos: Respondeu 24/03/14 às 22:01 Eu gosto desta solução porque é limpa (uma linha) e relativamente eficiente (trabalho feito dentro de numpy). Mas a solução eficiente da Alleo, usando numpy. cumsum, tem melhor complexidade. ndash Ulrich Stern Set 25 15 às 0:31 Você pode calcular uma média de execução com: Felizmente, numpy inclui uma função convolve que podemos usar para acelerar as coisas. A média de execução é equivalente a convolver x com um vetor N longo, com todos os membros iguais a 1 / N. A implementação numpy de convolve inclui o transiente inicial, então você tem que remover os primeiros pontos N-1: Na minha máquina, a versão rápida é 20-30 vezes mais rápida, dependendo do comprimento do vetor de entrada e do tamanho da janela de média . Observe que convolve inclui um mesmo modo que parece resolver o problema transitório inicial, mas o divide entre o início e o fim. Remove o transiente do final e o começo não tem um. Bem, eu acho que é uma questão de prioridades, eu não preciso do mesmo número de resultados sobre a despesa de obter uma inclinação para zero que não está lá nos dados. BTW, aqui está um comando para mostrar a diferença entre os modos: modos (39full39, 39same39, 39valid39) plot (convolve (uns ((200,)), uns ((50,)) 4750, modem)) para m em modos eixo (-10, 251, -.1, 1.1) legenda (modos, loc39lower center39) (com pyplot e numpy importados). ndash lapis Mar 24 14 às 13:56 pandas é mais adequado para isso do que NumPy ou SciPy. Sua função rollingmean faz o trabalho convenientemente. Também retorna um array NumPy quando a entrada é um array. É difícil superar o desempenho em qualquer implementação Python personalizada pura. Aqui está um exemplo de desempenho contra duas das soluções propostas: Há também boas opções sobre como lidar com os valores de borda. Eu sempre me incomodo com a função de processamento de sinal que retorna sinais de saída de formato diferente dos sinais de entrada quando ambas as entradas e saídas são da mesma natureza (por exemplo, ambos os sinais temporais). Ele quebra a correspondência com uma variável independente relacionada (por exemplo, tempo, freqüência), fazendo com que a plotagem ou comparação não seja uma questão direta. De qualquer forma, se você compartilhar o sentimento, você pode querer alterar as últimas linhas da função proposta como ynp. convolve (w / w. sum (), s, mode39same39) retornar ywindowlen-1 :-( window-1) ndash Christian Um pouco atrasado para a festa, mas eu fiz a minha própria pequena função que não envolve as extremidades ou blocos com zeros que são usados para encontrar a média também. Como um outro tratamento é que também re-amostras do sinal em pontos linearmente espaçados. Personalize o código à vontade para obter outros recursos. O método é uma multiplicação de matriz simples com um kernel Gaussiano normalizado. Um uso simples em um sinal sinusoidal com ruído normal distribuído adicionado: lapis sim, mas digamos que você use o método cumsum no primeiro tick e salve seu array de média rolante para o próximo tick. a cada tick, você precisa anexar o último valor médio móvel ao seu array de rolagem no armazenamento. Usando este método você não está recalculando coisas que você já calculou: No primeiro tick você cumsum depois disso você apenas acrescenta o tempo médio dos últimos elementos do período - que é 2x mais rápido para todos os ticks subseqüentes. Se você optar por rolar o seu próprio, em vez de usar uma biblioteca existente, por favor, esteja ciente do erro de ponto flutuante e tente minimizar os seus efeitos: Se todos os seus valores são aproximadamente da mesma ordem de magnitude, então isso ajudará a preservar a precisão sempre adicionando valores de grandezas aproximadamente semelhantes. Na minha última frase, eu estava tentando indicar por que isso ajuda o erro de ponto flutuante. Se dois valores forem aproximadamente da mesma ordem de magnitude, adicioná-los perderá menos precisão do que se você tivesse adicionado um número muito grande a um muito pequeno. O código combina valores quotadjacentquot de uma maneira que mesmo as somas intermediárias devem sempre ser razoavelmente próximas em magnitude, para minimizar o erro de ponto flutuante. Nada é à prova de erros, mas esse método salvou alguns projetos mal implementados na produção. ndash Mayur Patel 15. De dezembro de 14 às 17:22 Alleo: Em vez de fazer uma adição por valor, você estará fazendo dois. A prova é o mesmo que o problema de inversão de bits. No entanto, o ponto desta resposta não é necessariamente o desempenho, mas a precisão. O uso de memória para valores médios de 64 bits não excederia 64 elementos no cache, por isso também é um bom uso da memória. ndash Mayur Patel dezembro 29 14 em 17:04
Comments
Post a Comment