Sunday 24 September 2017

Compute Moving Average Python


Hmmm, parece que essa citação para implementar a função é realmente muito fácil de se errar e promoveu uma boa discussão sobre a eficiência da memória. Estou feliz por ter tossido se isso significa saber que algo foi feito corretamente. Ndash Richard 20 de setembro 14 às 19:23 NumPys, a falta de uma função particular específica de domínio é talvez devido à disciplina e à fidelidade das equipes principais à diretiva principal do NumPys: forneça um tipo de matriz N-dimensional. Bem como funções para criar e indexar esses arrays. Como muitos objetivos fundamentais, este não é pequeno, e 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 SciPy) - por exemplo, otimização numérica (otimização), processamento de sinal (sinal) e cálculo integral (integrar). Meu palpite é que a função que você está procurando é em pelo menos um dos subpacotes de SciPy (scipy. signal talvez) no entanto, eu olharia primeiro na coleção de SciPy scikits. Identifique o (s) scikit (s) relevante (s) e procure a função de interesse lá. Os Scikits são pacotes desenvolvidos de forma independente com base em NumPySciPy e dirigidos a uma disciplina técnica específica (por exemplo, scikits-image. Scikits-learn, etc.). Vários desses foram (em particular, o incrível OpenOpt para otimização numérica) eram altamente conceituados, projetos maduros por muito tempo Antes de escolher residir sob a rubrica de scikits relativamente nova. A página inicial do Scikits gostava de incluir acima de cerca de 30 desses scikits. Embora pelo menos vários deles não estejam mais em desenvolvimento ativo. Seguindo este conselho o levaria a scikits-timeseries no entanto, esse pacote não está mais em desenvolvimento ativo. Na verdade, o Pandas tornou-se, a AFAIK, a biblioteca de séries temporais baseada em NumPy. Pandas tem várias funções que podem ser usadas para calcular uma média móvel, o mais simples é provavelmente o padrão de rolamento. Que você usa da mesma forma: Agora, basta chamar a função rollingmean passando no objeto Series e um tamanho de janela. Que no meu exemplo abaixo é de 10 dias. Verifique se funcionou - por exemplo. Comparou os valores de 10 a 15 na série original em relação à nova série suavizada com a média de rolamento. A função rollingmean, juntamente com cerca de uma dúzia de outras funções, são agrupadas informalmente na documentação do Pandas sob as funções da janela de mudança de rubrica, um segundo grupo relacionado de funções Em Pandas é referido como funções ponderadas exponencialmente (por exemplo, ewma. Que calcula a média ponderada exponencialmente móvel). O fato de que este segundo grupo não está incluído na primeira (funções da janela em movimento) é talvez porque as transformações ponderadas exponencialmente não dependem de uma janela de comprimento fixo no processo de criação de um algoritmo de negociação forex e queria tentar meu tiro no cálculo EMA (Médias móveis exponenciais). Meus resultados parecem estar corretos (em comparação com os cálculos que fiz à mão), então eu acredito que o método seguinte funciona, mas queria apenas obter um conjunto extra de olhos para garantir que eu não perca nada. Observe que isso apenas retorna o EMA para o preço mais recente, ele não retorna uma série de EMAs, pois isso não é o que eu preciso para minha aplicação. A recursão é uma boa ferramenta para o trabalho certo, mas aqui é usado para realizar o loop simples. Como tal, o código. É mais difícil de ler e raciocinar. É mais lento porque grande parte do código em ema só precisa ser executado uma vez. Falhará com o valor de janela grande o suficiente devido à pilha de chamadas Pythons transbordante. Documentar pelo menos os parâmetros de cada função, por exemplo. Essa janela é o comprimento da janela, e essa posição conta para trás a partir do final dos dados. (Na verdade, as coisas seriam mais claras se a posição fosse um índice direto normal em dados) Aumentar uma exceção quando você encontrar um parâmetro tem um valor inválido. O retorno de Nenhum, em vez disso, só causará uma exceção mais confusa mais tarde. Na verdade, se eu tentar Indicators (). Ema (closeprices, 600) recebo uma recursão infinita porque sma retorna None. O que faz ema chamada sma uma e outra vez. O ponto anterior também revela que se len (dados) a janela 2 não é a verificação de validade correta. O 1 na janela de dados2 1: a janela 1 não parece correta para mim. Suponho que você queira data-window2: - window A declaração retorna previousema está em um lugar estranho porque nesse ponto você calculou um novo currentema. Este é o caso base da recursão, e é costume lidar com o caso base primeiro. Minha proposta para ema: respondeu 26 de novembro às 18:56 Avaliação bastante rasa: você não precisa escrever uma aula pelo que está fazendo (e sugiro que dê uma olhada neste vídeo). Sua classe não encapsula nenhum dado e você apenas usa para ter suas funções na mesma entidade. Eu acho que as coisas seriam mais fáceis de entender se você fosse definir o método da classe para deixar óbvio que você realmente não confia em nenhum caso. No entanto, uma opção ainda melhor seria simplesmente definir funções em um módulo indicador. Respondeu 24 de novembro às 18h04 Obrigado pelas sugestões que eu realmente fizesse como métodos de classe e debatia indo e voltando entre mesmo usando uma classe ou apenas definindo funções em um módulo de indicadores (o que agora vou fazer). Ndash ChrisC 25 de novembro 14 às 19:12 Apenas assistiu o vídeo, ótimo material. Ndash ChrisC 25 de novembro 14 às 19:43 Sua resposta 2017 Stack Exchange, IncLets diz que eu tenho uma lista: eu quero criar uma função que calcula a média móvel do n-dia. Então, se n fosse 5, eu gostaria que meu código calculasse os primeiros 1-5, adicione-o e encontre a média, que seria 3.0, então vá para 2-6, calcule a média, que seria 4,0 e depois 3 -7, 4-8, 5-9, 6-10. Eu não quero calcular os primeiros n-1 dias, então a partir do nono dia, contam os dias anteriores. Isso parece imprimir o que eu quero: no entanto, não sei como calcular os números dentro dessas listas. Todas as idéias foram feitas 14 de fevereiro às 21:05 Enquanto eu gosto da resposta de Martijns sobre isso, como george, eu queria saber se isso não seria mais rápido, usando uma soma em execução ao invés de aplicar a soma () repetidamente na maioria dos mesmos números . Também é interessante a idéia de ter valores Nenhum como padrão durante a fase de aceleração. Na verdade, pode haver muitos cenários diferentes que se poderia conceber para médias móveis. Permite dividir o cálculo das médias em três fases: Ramp Up: Iniciando iterações onde a contagem de iteração atual é o tamanho da janela Progressão constante: Temos exatamente o tamanho da janela do número de elementos disponíveis para calcular uma média normal: soma (xiterationcounter-windowsize: iterationcounter) windowsize Ramp Down: No final dos dados de entrada, podemos retornar outro Windowsize - 1 números médios. Heres uma função que aceita Iteráveis ​​arbitrárias (geradores são finos) como entrada para dados Tamanho de janela arbitrária 1 Parâmetros para mudar a produção de valores durante as fases para Ramp UpDown Callback funções para essas fases para controlar como os valores são produzidos. Isso pode ser usado para fornecer constantemente um padrão (por exemplo, Nenhum) ou para fornecer médias parciais. Parece ser um pouco mais rápido que a versão de Martijns - o que é muito mais elegante, no entanto. Heres o código de teste: a questão original agora pode ser resolvida com esta chamada de função: respondida 18 de fevereiro às 18:15 Use as funções soma e mapa. A função do mapa no Python 3 é basicamente uma versão preguiçosa disso: Tenho certeza de que você pode adivinhar o que a função de soma faz. Respondeu 14 de fevereiro às 21:07 Uma abordagem que evita recomputar somas intermediárias .. faça isso executado (int (v)). então. Repr (runsumlistk - runsumlistk-5) 5) se você forçar para carregar números em uma corda ... Alt sem o global: certifique-se de fazer matemática flutuante mesmo se você inserir valores são inteiros respondidos 14 de fevereiro às 22:04 De fato, uma corrida O algoritmo de soma é mais rápido. Eu publiquei uma resposta que comprovava o seu ponto de vista. Não há necessidade de uma variável global aqui. Ndash cfi 18 de fevereiro às 18:16 certo você está, eu estava tentando muito difícil aviod um explícito para loop. Ndash agentp Feb 19 13 at 18:37 Existe outra solução que amplia uma receita de itertools em par (). Você pode estender isso para nwise (). O que lhe dá a janela deslizante (e funciona se o iterável é um gerador): enquanto um custo de instalação relativamente alto para curtos iteráveis ​​esse custo reduz em impacto, mais longo o conjunto de dados. Isso usa a soma (), mas o código é razoavelmente elegante: respondido 26 de novembro 16 às 14:59

No comments:

Post a Comment