Thursday 24 August 2017

F # Moving Average


Estou usando uma janela de mudança dinâmica para calcular estatísticas simples em uma série encomendada na chave da data. Eu quero ser capaz de definir o limite no final da janela. Por exemplo, um timeseries com média móvel mensal, o mensal é decidido por um, no entanto, a função série deedle sempre usa o começo como limite. Portanto, sempre cria produzir uma série de datapoints n da primeira instância de dados para os próximos n pontos de dados (n é decidido pela diversão acima). Gostaria de ter uma série de n dataapoints a partir dos dados nth e olhar para trás no passado. Eu também tentei usar Series. Rev primeiro para inverter a série, mas acho que a série, embora em uma ordem inversa, não seja mais encomendada. É o que estou procurando Se você olhar para a lista de funções de agregação nos documentos. Você encontrará um agregado de função que é uma generalização de todas as funções de fragmentação do amplificador de janelas e também leva um seletor de teclas. Isso significa que você pode fazer algo como isto: a função leva 3 parâmetros, incluindo o seletor de teclas e uma função que obtém o segmento de dados (que possui a janela junto com uma bandeira, seja completa ou incompleta - por exemplo, no final da janela). Infelizmente, isso não funciona aqui, porque ele criará uma série com chaves duplicadas (e essas não são suportadas por Deedle). As janelas no final do pedaço acabarão com a mesma data e assim você receberá as chaves duplicadas (ele realmente é executado, mas você não pode fazer muito com a série). Uma solução feia é lembrar os últimos fragmentos e retornar os valores faltantes, uma vez que o fim começa a repetir: ainda estou trabalhando para explorar a coisa F - tentando descobrir como pensar em F em vez de simplesmente traduzir de outras línguas que conheço. Ive recentemente pensando nos casos em que você não possui um mapa de 1: 1 entre antes e depois. Casos em que List. map cai. Um exemplo disto é as médias móveis, onde, normalmente, você terá resultados len-n1 para uma lista de comprimento len ao calcular a média de n itens. Para os gurus lá fora, esta é uma boa maneira de fazê-lo (usando a fila apertada de Jomo Fisher) (Talvez uma maneira melhor seja implementar um MovingAverageQueue ao herdar do Fifo) perguntou 17 de novembro às 11:12 Eu tive que declarar Ele deixa MovingAverage n (s. Seqltfloatgt) para colocar isso em um módulo de utilidade, longe do site de chamadas, para aplacar o sistema de tipos. Tanto quanto posso dizer, isso só funciona com flutuadores, devido a uma limitação da Array. average. MSDN afirma que posso substituir isso com Array. averageBy para usar isso em uma seqüência int, mas isso dá um erro diferente. Brian, você pode reformular essa resposta para trabalhar em contextos genéricos, para que funcione com seq-of-any-arithmetic-type, sem tipo de inferência ndash Warren Young 27 de junho às 19:04 Devo ressaltar que minha necessidade de Esta função de média móvel é obter uma janela curta (30ish) sobre uma seqüência de números inteiros que são quase todos em milhões, então eu não preciso de ponto flutuante. Mesmo um único dígito à direita do ponto decimal não é útil na minha aplicação. Convertendo meus inteiros para FP e o resultado de volta para int apenas para aplacar o recurso de recurso de biblioteca padrão F não é um recurso. Ndash Warren Young 27 de junho às 19:30 Se você se preocupa com o desempenho, então você pode calcular uma média móvel de forma eficiente usando algo assim (assumindo que estavam calculando uma média móvel em uma janela de 3 dias). A parte mais difícil disso é segurar No seu anterior total em execução e no número N-janela. Eu criei o seguinte código: Esta versão não é tão bonita quanto o código Haskell, mas deve evitar problemas de desempenho associados à recompor sua janela em cada execução. Ele mantém um total em execução e mantém os números usados ​​anteriormente em uma fila, por isso deve ser muito rápido. Apenas por diversão, escrevi um benchmark simples: se você se preocupa com o desempenho e como um código elegante, tente usar FSUnit, podemos testá-lo. O truque do algoritmo é a primeira soma dos primeiros n números e, em seguida, manter um total em execução adicionando a cabeça Da janela e subtraindo a cauda da janela. A janela deslizante é conseguida fazendo um auto zip na seqüência, mas com o segundo argumento para zip avançado pelo tamanho da janela. No final do pipeline, dividimos apenas o total em execução pelo tamanho da janela. A varredura de notas é como dobrar, mas produz cada versão do estado em uma seqüência. Uma solução ainda mais elegante, embora possível, com sucesso no desempenho é fazer a observação de que, se não formos o zero, não precisamos calcular a soma inicial. Poderia haver um sucesso de desempenho devido à segunda indireção relacionada ao envolvimento das duas seqüências, mas talvez não seja significativa dependendo do tamanho da janela respondida 31 de agosto 12 às 8:06

No comments:

Post a Comment