Uma implementação simples de média móvel em Java. Em várias ocasiões, eu quis computar métricas simples em meus aplicativos Java, por exemplo, o número de acessos por hora ou erros durante um período de tempo. Embora a computação de métricas simples não seja muito difícil, Trabalho extra e eu prefiro passar esse tempo no domínio do problema Fiquei surpreso ao não encontrar nenhuma solução amplamente aceita para métricas em Java Eu encontrei Metrics, mas parecia um pouco complicado e não bem documentado - Tudo o que eu realmente queria era para Calcular uma média móvel Eu pensei sobre o problema um pouco mais e decidiu que não é um problema difícil Aqui está a minha solução. Isso funciona criando uma matriz de tamanho de freqüência de atualização de janela, em seguida, um segmento define a contagem para o próximo índice na matriz em A freqüência de atualização A contagem para o intervalo é simplesmente array i - array i 1, que é a contagem mais recente menos a contagem mais antiga Para um intervalo de 10 minutos, a contagem mais antiga i 1 é exatamente 10 minutos old. To adicionar um movimento A média para o nosso primeiro código nós precisamos de um contador, usando AtomicLong. This contador deve ser incrementado com base nos eventos que você está interessado em computação eg pedidos POST para um serviço REST. Nós precisamos fornecer a implementação com acesso ao contador e que é Realizado através da interface GetCount Aqui vou criar uma média móvel com uma janela de 5 minutos que atualiza cada segundo. E para obter a média atual, chamamos simplesmente o método getAverage. Um detalhe de implementação chave é como o tamanho da matriz é determinado pela divisão da janela Pela freqüência de atualização Assim, uma grande janela com freqüência de atualização freqüente pode consumir uma quantidade significativa de memória Neste exemplo o tamanho da matriz é razoável 300 No entanto, se criamos uma média móvel de 24 horas com um intervalo de 1 segundo o tamanho seria 86400 A Freqüência de atualização mais razoável para um período de 24 horas pode ser a cada 5 minutos tamanho da matriz de 288. Outra consideração de escolher a janela e atualizar a freqüência é a janela deve ser di Visível pela frequência Por exemplo uma janela de 2 minutos com uma frequência de actualização de 6 segundos é ok, mas uma frequência de actualização de 7 segundos não é, uma vez que não é divisível por 120 An IllegalArgumentException é lançada se a frequência de actualização do módulo de janela não for zero. Implementação requer um thread por média móvel, o que não é muito eficiente Uma solução melhor seria compartilhar um thread em muitas médias Update Eu atualizei o código para compartilhar um thread aqui. Ultimamente, há um problema de estado inicial que não temos dados Ainda para toda a janela Por exemplo, se você tem uma janela de 5 minutos e apenas 15 segundos de dados Esta implementação retorna nulo até que tenhamos 5 minutos de dados Outra abordagem é estimar a média Suponha que temos uma contagem de 10 em 30 segundos, então Podemos calcular a média como 40 em 2 minutos No entanto, há risco de erro significativo extrapolando dados incompletos Por exemplo, se tivéssemos uma explosão de 20 acessos em 2 segundos, estaríamos estimando 1200 por 2 minutos, whic H com toda a probabilidade é maneira off. I necessidade de acompanhar os últimos 7 dias horas de trabalho em um loop de leitura de arquivo plano Ele está sendo usado para medir a fatigueability de rosters. Right trabalho agora tenho algo que funciona, mas parece bastante detalhado E eu não tenho certeza se há um padrão que é mais sucinta. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os últimos dados dias x, então como eu leio através do arquivo, eu cortar o primeiro elemento e mover o Outros 6 por uma semana rolling total de volta por um O processamento desta matriz estática é feito em seu próprio método, ou seja, minha pergunta é esta uma abordagem de design razoável, ou há algo ofuscantemente óbvio e simples para fazer essa tarefa Obrigado guys. asked agosto 30 11 at 14 33.Thanks alot guys eu tenho a mensagem usar um objeto de nível mais alto e explorar os métodos relevantes ou um buffer circular Grandes respostas, todos eles Quando você pensa sobre isso, você sempre precisa de acesso a toda a matriz assim Você pode se livrar dessa primeira entrada - que eu não tinha 100 certeza de No meu próprio eu estou aliviado que eu não tinha perdido um forro 1 e foi basicamente em uma pista razoável, se não eficiente e concisa Isso é o que eu amo sobre este site de alta qualidade, respostas relevantes de pessoas que conhecem o seu sh Pete855217 Ago 30 11 at 15 05.Por que você inicializar runningTotal para null Qual é o seu tipo Onde é declarado Faria bem se você colocar alguns exemplos de código que se assemelham ao código Java real. Movendo, minha crítica seria a seguinte sua função também Muito Uma função, ou método, deve ser coeso Mais apropriadamente, eles devem fazer uma coisa e uma coisa só. Desordem ainda, o que acontece em seu para loop quando x 5 Você copia runningTotal 6 em runningTotal 5, mas então você tem duas cópias do Mesmo valor na posição 5 e 6.No seu design, o seu function. moves baralhar os itens em seu array. calcula o material total. prints para o erro padrão. retorna o total. Ele faz muito. Minha primeira sugestão não é mover coisas Ao redor da matriz Em vez disso, implementar um circul Ar e usá-lo em vez da matriz Ele irá simplificar o seu design Minha segunda sugestão é dividir as coisas em funções que são coesas. Tenha uma estrutura de dados um buffer circular que permite adicionar a ele e que cai a entrada mais antiga sempre que Atinge sua capacidade. Possuem a estrutura de dados implementar um interator. have uma função que calcula o total no iterador que você não se importa se você está calculando o total de um array, lista ou circular bufer. don t chamá-lo total Call it sum , Que é o que você está computing. That s que eu d do. That s grande info luis, no entanto lembre-se esta função é uma pequena parte da funcionalidade da classe, e seria exagero para adicionar muito código para torná-lo perfeito Você está tecnicamente correto, e eu entendo que meu código faz muito, mas ao mesmo tempo às vezes é melhor errar do lado do código menor, mais claro do que ir para a perfeição Dadas minhas habilidades de Java, mesmo fazendo o pseudocódigo que você descreve compilaria teria Eu sopro meu Orçamento, mas obrigado pela descrição clara Pete855217 Aug 31 11 at 2 23.Hmmm, não é sobre a perfeição, mas sobre as práticas industriais estabelecidas que temos conhecimento para as últimas 3 décadas Clean código é sempre um que é particionado Nós temos Décadas de evidência que indicam que este é o caminho a percorrer no caso geral em termos de custo-eficiência, redução de defeitos, compreensão, etc., a menos que seja um código descartável para um tipo único de coisa Nunca é custoso fazer isso Quando se inicia qualquer análise do problema desta maneira Codificação 101, quebrar o problema eo código segue, nem exagerar nem difícil 31 de agosto 11 às 15 55. Sua tarefa é muito simples eo aproach que você adotou é certamente bom para o trabalho No entanto , Se você quiser usar um projeto melhor, você deve se livrar de todo esse movimento número você melhor usar uma fila FIFO e fazer bom uso de push e pop métodos que forma o código não vai refletir qualquer movimento de dados, apenas as duas ações lógicas de Novos dados e remover dados olde R de 7 dias. Respondida 30 de agosto 11 em 14 49.Simple Moving Average - SMA. BREAKING DOWN Média Móvel Simples - SMA. A média móvel simples é personalizável na medida em que pode ser calculado para um número diferente de períodos de tempo, simplesmente adicionando O preço de fechamento do título por um certo número de períodos de tempo e, em seguida, dividindo este total pelo número de períodos de tempo, o que dá o preço médio do título ao longo do período Uma média móvel simples suaviza a volatilidade e torna mais fácil de ver A tendência de preço de um título Se a média móvel simples aponta para cima, isso significa que o preço da segurança está aumentando Se ele está apontando para baixo significa que o preço da segurança está diminuindo Quanto maior o prazo para a média móvel, mais suave o simples Média móvel Uma média móvel de curto prazo é mais volátil, mas sua leitura está mais próxima da fonte de dados. Significado analítico. As médias de movimento são uma ferramenta analítica importante usada para identificar tendências de preços atuais e A forma mais simples de usar uma média móvel simples na análise é usá-lo para identificar rapidamente se uma segurança está em uma tendência de alta ou baixa. Outra ferramenta analítica popular, embora um pouco mais complexa, é comparar um par de Se uma média de longo prazo acima de uma média de longo prazo é superior a uma média de longo prazo, uma tendência de alta é esperada Por outro lado, uma média de longo prazo acima de uma média de curto prazo sinaliza um movimento descendente em A tendência. Popular padrões de negociação. Dois padrões de comércio populares que usam médias móveis simples incluem a cruz de morte e uma cruz de ouro Uma cruz de morte ocorre quando a média móvel simples de 50 dias cruza abaixo da média móvel de 200 dias Isto é considerado um sinal de baixa , Que mais perdas estão na loja A cruz de ouro ocorre quando uma média móvel de curto prazo quebra acima de uma média móvel de longo prazo Reforçada por altos volumes de negociação, isso pode sinalizar ganhos adicionais Estão na loja.
No comments:
Post a Comment