Tuesday 22 August 2017

Moving Average Python


Eu estou jogando em Python um pouco novamente, e encontrei um livro limpo com exemplos. Um dos exemplos é traçar alguns dados. Eu tenho um arquivo. txt com duas colunas e eu tenho os dados. Eu planejei os dados bem, mas no exercício que diz: Modifique seu programa para calcular e traçar a média de execução dos dados, definida por: onde r5 neste caso (e o yk é a segunda coluna no arquivo de dados) . Peça ao programa que trace os dados originais e a média de corrida no mesmo gráfico. Até agora eu tenho isso: Então, como faço para calcular a soma Em Mathematica é simples desde a manipulação simbólica (Sumi, por exemplo), mas como calcular a soma em python, que leva cada dez pontos nos dados e a média, e faz isso Até o final dos pontos eu olhei para o livro, mas não encontrei nada que explicasse isso: o código da Heltonbikers fez o truque: D Muito obrigado :) Existe um problema com a resposta aceita. Eu acho que precisamos usar o válido em vez do mesmo aqui - retornar numpy. convolve (intervalo, janela, o mesmo). Como um exemplo, experimente a MA desse conjunto de dados 1,5,7,2,6,7,8,2,2,7,8,3,7,3,7,3,15,6 - o resultado Deve ser de 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. Mas ter o mesmo dá-nos uma saída incorreta de 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 Código oxidado para tentar isso -: Tente com um válido amplificador e veja se a matemática faz sentido. Respondeu 29 de outubro 14 às 4:27 Haven39t tentou isso, mas eu vou olhar para ele, faz um tempo desde que eu fui codificado em Python. Ndash dingod 29 de outubro 14 às 7:07 dingod Por que não tenta rapidamente isso com o código oxidado (e o conjunto de dados de amostra (como uma lista simples), publiquei. Para algumas pessoas preguiçosas (como eu já estive no início) - está mascarando o fato de que a média móvel está incorreta. Provavelmente, você deveria considerar a edição de sua resposta original. Eu tentei isso apenas ontem e a verificação dupla me salvou face de parecer ruim em relatar ao nível Cxo. Tudo o que você precisa fazer é tentar Sua mesma média móvel uma vez com quotvalidquot e outra vez com quotsamequot - e uma vez que você está convencido me dê algum amor (aka-up-vote) ndash ekta 29 de outubro às 7: 16 Eu sei que esta é uma pergunta antiga, mas aqui está uma solução Que não usa nenhuma estrutura de dados ou bibliotecas extra. É linear no número de elementos da lista de entrada e não consigo pensar em outra maneira de torná-la mais eficiente (na verdade, se alguém conhece uma maneira melhor de alocar o resultado, por favor Deixe-me saber). NOTA: isso seria muito mais rápido usando uma matriz numpy em vez de um li St, mas eu queria eliminar todas as dependências. Também seria possível melhorar o desempenho por execução multi-threaded. A função assume que a lista de entrada é de uma dimensão, então tenha cuidado. UPD: soluções mais eficientes foram propostas por Alleo e jasaarim. Você pode usar np. convolve para isso: O argumento modo especifica como lidar com as bordas. Eu escolhi o modo válido aqui porque acho que é assim que a maioria das pessoas espera correr significa trabalhar, mas você pode ter outras prioridades. Aqui está um gráfico que ilustra a diferença entre os modos: respondeu 24 de março às 22:01. Eu gosto desta solução porque é limpo (uma linha) e relativamente eficiente (trabalho feito dentro de numpy). Mas Alleo39s quot Solução eficiente usando numpy. cumsum tem melhor complexidade. Ndash Ulrich Stern 25 de setembro 15 às 0:31 Você pode calcular uma média de corrida com: Felizmente, numpy inclui uma função de convolve que podemos usar para acelerar as coisas. A média de execução é equivalente a convolver x com um vetor que é N longo, com todos os membros iguais a 1 N. A implementação numpy de convolve inclui o transiente inicial, então você deve 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 que ele deve abordar o problema transitório inicial, mas ele o divide entre o início eo fim. Ele remove o transiente do final, e o começo não tem um. Bem, acho que é uma questão de prioridades, não preciso do mesmo número de resultados a expensas de obter uma inclinação em direção a zero que não existe nos dados. BTW, aqui está um comando para mostrar a diferença entre os modos: modos (39full39, 39same39, 39valid39) trama (convolve (uns ((200,)), uns ((50,)) 4750, modem)) para modos m in Eixo (-10, 251, -.1, 1.1) legenda (modos, loc39lower center39) (com piplot e numpy importados). Ndash lapis 24 mar 14 às 13:56 pandas é mais adequado para isso do que NumPy ou SciPy. Sua função rollingmean faz o trabalho convenientemente. Ele também retorna uma matriz NumPy quando a entrada é uma matriz. É difícil vencer o rolamento em desempenho com qualquer implementação Pure Python personalizada. Aqui é um exemplo de desempenho em relação a duas das soluções propostas: também há boas opções sobre como lidar com os valores de borda. I39m sempre irritado pela função de processamento de sinal que retorna sinais de saída de forma 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 a variável independente relacionada (por exemplo, tempo, frequência) fazendo complicação ou comparação não é uma questão direta. De qualquer forma, se você compartilhar o sentimento, você pode querer mudar as últimas linhas da função proposta como ynp. convolve (w w. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly 25 de agosto 15 às 19:56 Um pouco tarde para a festa, mas eu fiz minha própria função pequena que NÃO envolve as extremidades ou almofadas com zeros que são usados ​​para encontrar a média também. Como um tratamento adicional é, que também re-amostras o sinal em pontos espaçados linearmente. Personalize o código à vontade para obter outros recursos. O método é uma simples multiplicação da matriz com um kernel gaussiano normalizado. Um uso simples em um sinal sinusoidal com ruído distribuído normal adicionado: lapis sim, mas dizemos que você usa o método cumsum no primeiro tiquetaque e salve sua matriz média rolante para o próximo tiquetaque. Cada anotação depois disso você só precisa anexar o valor médio móvel mais recente à sua matriz em armazenamento. Usando este método, você não recalcula as coisas que você já calculou: no primeiro teste, você cumsum depois disso, você apenas adiciona o quotmean dos elementos do último período que é 2 vezes mais rápido para todos os carrapatos subsequentes. Ndash litepresence 10 de junho às 12:29 Se você optar por rolar o seu próprio, em vez de usar uma biblioteca existente, esteja consciente do erro de ponto flutuante e tente minimizar seus efeitos: se todos os seus valores forem aproximadamente a mesma ordem de grandeza, Então isso ajudará a preservar a precisão sempre adicionando valores de magnitudes aproximadamente semelhantes. Na minha última frase, eu estava tentando indicar por que isso ajuda o erro de ponto flutuante. Se dois valores são aproximadamente da mesma ordem de grandeza, então adicioná-los perde menos precisão do que se você adicionasse um número muito grande a um número muito pequeno. O código combina quotadjacentquot valores de uma maneira que mesmo as somas intermediárias devem ser sempre razoavelmente próximas em magnitude, para minimizar o erro de ponto flutuante. Nada é à prova de engano, mas este método salvou alguns projetos muito pouco implementados na produção. Ndash Mayur Patel 15 de dezembro às 17:22 Alleo: Em vez de fazer uma adição por valor, você estará fazendo dois. A prova é a mesma coisa que o problema do lançamento de bits. No entanto, o ponto desta resposta não é necessariamente desempenho, mas precisão. O uso de memória para valores médios de 64 bits não excederia 64 elementos no cache, de modo que também é amigável no uso de memória. Ndash Mayur Patel 29 de dezembro 14 às 17:04

No comments:

Post a Comment