Thursday, 10 May 2018

Exponential moving average postgresql


Eu estou tentando implementar uma média móvel exponencial (EMA) no postgres, mas enquanto eu verifico a documentação e penso sobre isso, mais eu tento o mais confuso que eu sou. A fórmula para EMA (x) é: Parece ser perfeita para um agregador, mantendo o resultado do último elemento calculado exatamente o que deve ser feito aqui. No entanto, um agregador produz um único resultado (como reduzir ou dobrar) e aqui precisamos de uma lista (uma coluna) de resultados (como mapa). Tenho verificado como funcionam os procedimentos e funções, mas a AFAIK produz uma única saída, não uma coluna. Tenho visto muitos procedimentos e funções, mas não consigo entender como isso interage com a álgebra relacional, especialmente ao fazer algo como isso, uma EMA. Eu não tive sorte pesquisando as Internets até agora. Mas a definição para um EMA é bastante simples, espero que seja possível traduzir essa definição em algo que funcione no postgres e seja simples e eficiente, porque mudar para o NoSQL será excessivo no meu contexto. Isso é calcular a agregação que produz o resultado em cada linha para cada sub-lista dos dados de entrada Porque parece que está usando o agregador até a linha n, retornando o resultado e indo para a linha 0 para calcular a agregação até a linha n1 novamente. Existe alguma maneira de usar o acúmulo ou alguma variável estática (como em C) para que isso tenha que ser calculado uma vez Obrigado. ndash Trylks Jan 20 12 at 11:59 Não, está usando o valor acumulado. Se você executar a consulta com o comando quotraise infoquot descomentado, você poderá ver que a função é chamada apenas uma vez para cada saída de linha. O Postgresql gera o valor do estado em cada linha (se houver um final definido, isso será chamado para transformar o estado em um valor de saída). ndash araqnid Jan 20 12 at 12:04 ErwinBrandstetter: Eu reverti a maioria das alterações - no caso do formato da primeira parte (âncora) da consulta, EMA (x1) pode ser claramente representada com uma única linha - este corespnds para a única linha definindo-o na questão. No caso da parte recursiva da consulta, usei mn-1 na condição de junção para indicar a equivalência do relacionamento com EMA (xn-1) na pergunta, mesmo que seja menos eficiente se o desempenho for um questão, o OP pode mudar a condição de junção para ser como você sugeriu. ndash Mark Bannister Jan 16 12 at 9: 27Metrics Maven: Calculando uma média móvel no PostgreSQL Em nossa série Maven do Metrics, compõe dados, dicas, truques e códigos do banco de dados de compartilhamentos do cientista de dados que você pode usar para obter as métricas necessárias dos seus dados. Neste artigo, veja bem como calcular uma média móvel no PostgreSQL. Este artigo baseia-se em nossos dois artigos anteriores sobre funções de janela e frames de janela no PostgreSQL. Bem, aproveite os recursos de janelas que já foram discutidos para calcular uma média móvel e veja também um método alternativo. O que é uma média móvel Uma média móvel é exatamente o que parece - uma média que se move continuamente com base na mudança de entrada. Por exemplo, você pode querer obter a média de algum valor para as 100 principais entradas ou para os 30 dias anteriores. Porque você estará recebendo novas entradas em seu banco de dados ou porque cada novo dia é outra data, a média será alterada. O termo média móvel também é sinônimo de média móvel ou média de execução, mas existem alguns tipos diferentes de médias móveis. Neste artigo, vamos nos concentrar na média móvel simples para obter nossos pés molhados e também rever brevemente a média móvel acumulada no final do artigo. Um artigo futuro irá cobrir médias móveis ponderadas e exponenciais. O motivo para usar uma média móvel para suas métricas é facilitar a identificação de tendências. É uma técnica comumente usada em finanças e análise de negócios para suavizar quedas e picos que podem ocorrer nos dados, de modo que as tendências verdadeiras possam ser identificadas nas séries em mudança. Descobrir como realizar o cálculo como as alterações de dados pode ser um pouco assustador, no entanto, se você nunca fez isso. Uma vez que você aprende um método que você gosta, no entanto, (bem cobrir dois) é fácil de fazer e você encontrará muitos usos para ele em seu rastreamento e relatórios. Vamos lá. Primeiras coisas primeiro: bem precisa de uma tabela que contém os valores que queremos média. Na prática, no Compose, muitas vezes descobrimos que os dados básicos de que precisamos já não estão bem definidos em uma tabela. Por esse motivo, temos algumas tabelas agregadas que extraem os dados de que precisamos juntos. Estas são as tabelas base às quais aplicaremos cálculos mais avançados, como uma média móvel. Em alguns casos, estas são tabelas derivadas que existem temporariamente para a execução da consulta principal. Em outros casos, podemos usar uma visão ou uma visão materializada. Portanto, se você quiser, precisará de uma tabela contendo os valores desejados para a média e qualquer dimensão para a qual deseja ordenar os dados. Para nosso exemplo, vamos dizer que nos pediram para criar uma média móvel de 30 dias para downloads de aplicativos da Example Co. Os dados de download do aplicativo são preenchidos diariamente em uma tabela chamada appdownloadsbydate e a parte mais recente se parece com isso: A ordenação por data será importante, pois queremos calcular uma média móvel de 30 dias em relação à série anterior de datas. Por isso, é importante que tenhamos uma linha para cada data. No nosso caso, mas se você tiver lacunas em seus dados onde não há valores para determinadas datas, você pode usar gererseries ao construir sua tabela base para garantir que você tenha todas as linhas necessárias. Observe como esse intervalo de datas contém totais flutuantes de downloads de aplicativos de 35 a 7. É muito difícil ver uma tendência a partir desses dados: insira a média móvel. Usando quadros de janela para uma média móvel simples Se você se lembra do nosso artigo anterior desta série. quadros de janela são usados ​​para indicar o número de linhas ao redor da linha atual que a função de janela deve incluir. Eles criam um subconjunto de dados para que a função de janela funcione. Dependendo de seus dados e suas necessidades, o cálculo da média móvel pode incluir linhas anteriores e posteriores à linha atual, mas, para nossos objetivos, nossa média móvel usará as linhas precedentes e a linha atual porque queremos gerar um novo valor médio móvel para cada nova data. Nossa consulta é assim: Estamos usando ORDER BY em nosso campo de data para garantir que nossos dados estarão na ordem esperada e especificamos LINHAS ENTRE 29 PRECEDING E CURRENT ROW para definir o quadro da janela para o cálculo do AVG. À medida que o quadro da janela avança para cada data, apenas as 29 linhas precedentes e a atual (30 dias no total) são usadas para o cálculo: como não mostramos datas em nossa tabela base antes de 26 de maio para este exemplo, vamos focar nossa revisão dos resultados nas datas em que mostramos as 29 linhas precedentes. Vamos pegar 30 de junho, por exemplo. Nosso frame de janela concentra nossa agregação do AVG nos downloads de aplicativos somente de junho, essa parte da nossa tabela base: Então, agora, se calcularmos a média móvel calculada, podemos ver que os dados são suavizados e há uma tendência ascendente durante a primeira semana de junho, depois uma tendência de queda mais volátil depois disso: Como isso mostra apenas um mês de dados, não é muito revelador para um relatório analítico, mas espero que ajude a entender como o cálculo de uma média móvel pode ser útil para os negócios análise. Uma dica sobre não incluir a linha atual Se, por algum motivo, você não quiser incluir a linha atual na função de janela e estiver usando apenas as configurações PRECEDING ou apenas FOLLOWING para a moldura da janela, uma maneira fácil de usar é x PRECEDING ou y SEGUINDO duas vezes nas suas linhas ENTRE. cláusula. Por exemplo, digamos que queremos usar 30 linhas antes da linha atual, mas não incluir a linha atual no quadro da janela. Poderíamos escrever essa cláusula assim: LINHAS ENTRE 30 ANOS E 1 ANTERIOR. Da mesma forma, podemos excluir a linha atual, mas fazemos 30 linhas seguindo desta forma: LINHAS ENTRE 1 SEGUINDO E 30 SEGUINDO. Um método alternativo para uma média móvel simples Antes do PostgreSQL 9.0, não tínhamos as opções de quadro da janela x PRECEDING ou y FOLLOWING disponíveis para nós. Para calcular uma média móvel sem usar um quadro de janela, podemos usar dois aliases de tabela da nossa tabela base. Bem, use um alias para operar sobre o outro usando um intervalo de data. Confira: Usando este método, podemos obter os mesmos resultados descritos acima com o quadro da janela. Se você estiver operando em grandes quantidades de dados, a opção de quadro de janela será mais eficiente, mas essa alternativa existe se você quiser usá-la. Calculando uma média móvel cumulativa Agora que analisamos alguns métodos para calcular uma média móvel simples, alterne bem o exemplo de quadro de janela para mostrar como você também pode fazer uma média móvel cumulativa. Os mesmos princípios se aplicam, mas em vez de ter um quadro de janela continuamente alternado durante um intervalo, o quadro da janela simplesmente se estende. Por exemplo, em vez de fazer uma média móvel de 30 dias, calcularíamos a média móvel do ano até a data. Para cada nova data, seu valor é simplesmente incluído no cálculo da média de todas as datas anteriores. Vamos dar uma olhada neste exemplo: Como nossa tabela base começa em 1º de janeiro do ano atual, usamos UNBOUNDED PRECEDING para definir o quadro da janela. Os resultados que obtivemos de volta para este cálculo cumulativo são os seguintes: Se traçarmos esses resultados, você poderá ver que a vantagem da média móvel acumulada é uma suavização adicional dos dados, de modo que apenas alterações significativas de dados apareçam como tendências. Vemos agora que há uma ligeira tendência ascendente no acumulado do ano: Conclusão Agora que você conhece alguns tipos diferentes de médias móveis que pode usar e alguns métodos diferentes para calculá-los, é possível executar uma análise mais perspicaz e criar mais relatórios eficazes. Em nosso próximo artigo do Metrics Maven, olhe bem algumas opções de como tornar os dados bonitos para que, em vez de valores como 20.4184782608695652, bem ver 20,42. Até a próxima cópia de 2016 ComposePostgreSQL Re: Calculando uma média móvel Por que não usar um cursor Uma média móvel ficará muito melhor se você tiver as caudas de Hahn. Para fazer uma média móvel normal de 7 pontos, você considera xprimei e yi yi y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y 5 Mas quando você começar, deixe que x0, y0 seja o primeiro ponto, e então calcule a média dos próximos 2 para o segundo ponto. até chegar a 7 e depois fazer a mesma coisa na outra ponta. Caso contrário, você terá uma curva muito estranha. De: pgsql-general-ownerpostgresql. org Em nome de Vanole, Mike Enviado: quarta-feira, janeiro 19, 2005 1:34 PM Para: pgsql-generalpostgresql. org Assunto: GERAL Calculando uma média móvel Eu preciso calcular uma média móvel e eu gostaria de fazê-lo com SQL, ou uma função Pg construída para esse propósito. I39m na pg 7.4. Isso é possível em Pg sem um monte de auto-uniões, ou existe uma função disponível Jim C. Nasby Além disso, se você não precisa de uma média móvel exata, você pode considerar uma média ponderada. Algo como: médio significa 0,9 novo valor 0,1 Muito mais fácil de manter do que uma média móvel. - Jim C. Nasby, consultor de banco de dados decibeldecibel. org Dê ao seu computador um pouco de cérebro animado distributed. net Team 1828 Windows: "Onde você quer ir hoje?" Linux: "Onde você quer ir amanhã? FreeBSD:" Vocês estão vindo, ou o que? em 21 de janeiro de 2005 às 5:09 am Além disso, se você não precisa de uma média móvel exata, você pode considerar uma média ponderada. Algo como: médio significa 0,9 novo valor 0,1 Muito mais fácil de manter do que uma média móvel. Em Thu, 20 de janeiro de 2005 às 08:40:24 PM -0800, Dann Corbit escreveu: Por que não usar um cursor A média móvel ficará muito melhor se você tiver as caudas. Para fazer uma média móvel normal de 7 pontos, você considera xprimei e yi yi y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y 5 Mas quando você começar, deixe que x0, y0 seja o primeiro ponto, e então calcule a média dos próximos 2 para o segundo ponto. até chegar a 7 e depois fazer a mesma coisa na outra ponta. Caso contrário, você terá uma curva muito estranha. De: pgsql-general-ownerpostgresql. org Em nome de Vanole, Mike Enviado: quarta-feira, janeiro 19, 2005 1:34 PM Para: pgsql-generalpostgresql. org Assunto: GERAL Calculando uma média móvel Eu preciso calcular uma média móvel e eu gostaria de fazê-lo com SQL, ou uma função Pg construída para esse propósito. I39m na pg 7.4. Isso é possível em Pg sem um monte de auto-uniões, ou existe uma funtion disponível - Jim C. Nasby, Consultor de banco de dados decibeldecibel. org Dê ao seu computador um pouco de cérebro animado distributed. net Team 1828 Windows: quotOnde você quer ir hoje? Linux: "Onde você quer ir amanhã? FreeBSD:" Vocês estão vindo, ou o que?

No comments:

Post a Comment