воскресенье, 24 июня 2018 г.

Moving average nan


Hmmm, parece que esta frase 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 scikit relevante (s) e procure a função de interesse lá. Os Scikits são pacotes desenvolvidos de forma independente com base em NumPy / SciPy 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) foram altamente considerados, maduros Projetos muito antes de escolher residir sob a rubrica de scikits relativamente nova. A página inicial do Scikits gostava de listar cerca de 30 desses scikits. Embora pelo menos vários desses não estejam mais em desenvolvimento ativo. Seguir esse conselho levaria você a Scikits-timeseries no entanto, esse pacote não está mais em desenvolvimento ativo. De fato, 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, a medida 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 nas primeiras (funções da janela em movimento) é talvez porque as transformações ponderadas exponencialmente não dependem de uma janela de comprimento fixo para conseguir uma performance assintótica de O (n) (como a codificação manual Solução), você pode usar a função Agregação como em O valor acumulado (implementado como tipo anônimo) contém dois campos: O resultado contém a compilação da lista de resultados até agora. O trabalho contém os últimos elementos do período 1. A função de agregação adiciona o valor atual à lista de trabalho, cria a média atual e adiciona-a ao resultado e, em seguida, remove o primeiro valor (ou seja, o mais antigo) da lista de trabalho. A semente (ou seja, o valor inicial para a acumulação) é compilada colocando os primeiros elementos do período 1 em Trabalhando e inicializando o Resultado em uma lista vazia. Consequentemente, a agregação começa com o período do elemento (saltando elementos (período 1) no início) Na programação funcional, este é um padrão típico de uso para a função agregada (ou dobra), btw. A solução não é funcionalmente limpa na medida em que os mesmos objetos de lista (Trabalho e Resultado) são reutilizados em cada etapa. Não tenho certeza se isso pode causar problemas se alguns compiladores futuros tentam paralizar a função Agregação automaticamente (por outro lado, eu também não tenho certeza, se isso for possível depois de tudo). Uma solução puramente funcional deve criar novas listas em cada etapa. Observe também que C não possui expressões de lista poderosas. Em algum pseudocódigo hipotético Python-C-mixed pode-se escrever a função de agregação como a qual seria um pouco mais elegante na minha humilde opinião :) Observe o tempo de execução de O (n2). Uma vez que você precisa pular mais e mais elementos em cada etapa (e afaik Skip (i) tem que chamar IEnumerator. MoveNext i times). Veja a minha resposta para uma solução no tempo O (n). (Eu notei apenas o comentário OPs abaixo que ele / ela possivelmente obterá os valores de um SQL DB no futuro. Neste caso, eu iria desanimar cada uma dessas soluções) ndash MartinStettner Mar 3 11 às 0:53 Para o mais eficiente Maneira possível calcular uma média móvel com LINQ, você não deve usar o LINQ Em vez disso, proponho criar uma classe auxiliar que calcula uma média móvel da maneira mais eficiente possível (usando um buffer circular e filtro médio causal), então um método de extensão para fazer Acessível para LINQ. Primeiro, a média móvel Esta classe fornece uma implementação muito rápida e leve de um filtro MovingAverage. Ele cria um buffer circular de Comprimento N e calcula um som, um subtrair e um multiplicar por ponto de dados anexado, em oposição ao N multiplicação por ponto para a implementação da força bruta. Os métodos de extensão acima envolvem a classe MovingAverage e permitem a inserção em um fluxo IEnumerable. Para fazer isso de uma forma mais funcional, você precisa de um método de varredura que exista no Rx, mas não no LINQ. Vamos ver como isso pareceria se você tivesse um método de varredura. Além disso, o método de varredura, tomado e ajustado a partir daqui: isso deve ter melhor desempenho do que o método de força bruta, uma vez que estamos usando um total em execução para calcular o SMA. Para começar precisamos calcular o primeiro período que chamamos de semente aqui. Então, cada valor subseqüente calculamos a partir do valor de semente acumulado. Para fazer isso, precisamos do valor antigo (isto é, t-delta) e do valor mais novo para o qual fazemos o conjunto das séries, uma vez desde o início e uma vez deslocadas pelo delta. No final, fazemos uma limpeza adicionando zeros para o comprimento do primeiro período e adicionando o valor inicial da semente. Respondeu 19 de junho às 22:58

Комментариев нет:

Отправить комментарий