Saturday, 2 June 2018

Mudança média algoritmo python


Eu tenho um intervalo de datas e uma medida em cada uma dessas datas. Eu gosto de calcular uma média móvel exponencial para cada uma das datas. Alguém sabe como fazer isso, eu sou novo no python. Não parece que as médias estejam incorporadas na biblioteca padrão de python, o que me parece um pouco estranho. Talvez eu não esteja olhando no lugar certo. Assim, dado o seguinte código, como eu poderia calcular a média ponderada em movimento de pontos de QI para datas de calendário (provavelmente há uma maneira melhor de estruturar os dados, todos os conselhos seriam apreciados) perguntou Jan 28 09 às 18:01 Meu python é um Um pouco enferrujado (qualquer pessoa pode se sentir livre para editar este código para fazer correções, se Ive estragar a sintaxe de alguma forma), mas aqui vai. Esta função move-se para trás, do final da lista para o início, calculando a média móvel exponencial para cada valor, trabalhando para trás até que o coeficiente de peso de um elemento seja menor do que o dado epsilon. No final da função, inverte os valores antes de retornar a lista (para que eles estejam na ordem correta para o chamador). (NOTA LATERAL: se eu estivesse usando um idioma diferente de Python, Id crie uma matriz vazia de tamanho completo primeiro e depois preencha-a para trás, de modo que eu não precisaria reverter no final. Mas eu não acho que você possa declarar Uma grande disposição vazia no python. E nas listas de python, acrescentar é muito menos dispendioso do que prepender, razão pela qual eu construí a lista na ordem inversa. Por favor, corrija-me se eu estiver errado.) O argumento alfa é o fator de decaimento em cada iteração. Por exemplo, se você usou um alfa de 0,5, o valor médio móvel de hoje seria composto pelos seguintes valores ponderados: Claro, se você tiver uma enorme variedade de valores, os valores de dez ou quinze dias não contribuirão muito para Média ponderada de hoje. O argumento epsilon permite que você defina um ponto de corte, abaixo do qual você deixará de se preocupar com valores antigos (já que sua contribuição para o valor de hoje será insignificante). Você invocou a função algo assim: respondeu Jan 28 09 às 18:46 Eu não conheço o Python, mas para a parte de média, você quer dizer um filtro de passagem baixa exponencialmente decadente da forma em que o dttau alfa, o tempo do filtro , Tau a constante de tempo do filtro (a forma variável-timestep é a seguinte, basta digitar o dttau para não ser superior a 1,0) Se você deseja filtrar algo como uma data, certifique-se de converter uma quantidade de ponto flutuante Como de segundos desde 1 de janeiro de 1970. respondeu Jan 28 09 às 18:10 Achei o trecho de código acima por earino muito útil - mas eu precisava de algo que poderia suavizar continuamente um fluxo de valores - então eu refatorei isso para isso: e eu uso Como isto: (onde pin. read () produz o próximo valor que a Id gostaria de consumir). Respondeu 12 de fevereiro às 20:35 Estou sempre calculando EMAs com Pandas: Aqui está um exemplo de como fazê-lo: Mais informações sobre Pandas EWMA: respondidas em 4 de outubro às 12:42 Don39t versões mais recentes de pandas têm novas e melhores funções. Ndash Cristian Ciupitu 11 de maio 16 às 14:10 Note que, ao contrário de sua planilha, não calculo o SMA, e não espero para gerar o EMA após 10 amostras. Isso significa que meus valores diferem um pouco, mas se você apresentá-lo, segue exatamente após 10 amostras. Durante as primeiras 10 amostras, o EMA que eu calculo é adequadamente alisado. Sei que esta é uma questão antiga, mas aqui está uma solução que não usa nenhuma estrutura de dados ou bibliotecas adicionais. É 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 sabe de uma maneira melhor de alocar o resultado, 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 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 corrida é equivalente a convolver x com um vetor que é N longo, com todos os membros iguais a 1N. 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 (ww. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Ago 25 15 às 19:56 Um pouco atrasado 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: esta questão é agora mais antiga do que quando o NeXuS escreveu sobre isso no mês passado, MAS Gosto de como seu código lida com casos de ponta. No entanto, porque é uma média móvel simples, seus resultados ficam atrás dos dados aos quais se aplicam. Eu pensei que lidar com casos de ponta de uma maneira mais satisfatória do que os modos NumPys válidos. mesmo. E cheio poderia ser alcançado aplicando uma abordagem semelhante a um método baseado em convolução (). Minha contribuição usa uma média de execução central para alinhar seus resultados com seus dados. Quando existem dois pontos disponíveis para a janela de tamanho completo, as médias correntes são calculadas a partir de janelas sucessivamente menores nas margens da matriz. Na verdade, de janelas sucessivamente maiores, mas isso é um detalhe de implementação. É relativamente lento porque usa convolve (). E provavelmente poderia ser bem sucedido por um verdadeiro Pythonista, no entanto, acredito que a idéia está em pé. Respondeu 10 horas atrás Se você não precisa de uma saída de matriz e você não quer nenhuma dependência, você pode fazer isso. Que é quase tão rápido como talib e mais rápido do que qualquer outro método anteriormente mencionado. Respondeu 20 de dezembro 15 às 16:50 Esta não é uma média de corrida, é apenas uma média dos elementos do último período. Ndash lapis 23 de fevereiro 16 às 20:45 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 16 à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