Média móvel em DAX: o que faz e quando usar (com exemplos)
Aprenda a calcular média móvel DAX com AVERAGEX, DATESINPERIOD e DATESBETWEEN: escolha da janela, tabela de datas e o tratamento de períodos incompletos.
Um número que sobe e desce todo dia não conta tendência nenhuma
Quem abre um gráfico de vendas diárias esbarra sempre no mesmo problema: a linha pula para cima e para baixo o tempo todo. Segunda vende pouco, sábado vende muito, um feriado zera tudo, uma promoção estoura o pico. No meio desse serrote, ninguém responde à pergunta que importa, que é se o negócio está subindo ou descendo. É para resolver isso que existe a média móvel, e escrever uma média móvel DAX bem feita separa um gráfico que informa de um gráfico que só assusta a diretoria.
A boa notícia é que média móvel não é bicho de sete cabeças em DAX. O padrão é quase sempre o mesmo: AVERAGEX iterando uma janela de datas gerada com DATESINPERIOD ou DATESBETWEEN. A má notícia são os detalhes que ninguém conta, a escolha da janela, a tabela de datas contínua, as lacunas e os períodos incompletos, que fazem a diferença entre uma leitura confiável e um número que engana. Neste artigo mostro o padrão, trago exemplos reais de código e aponto onde a média móvel mente se você não tomar cuidado.
A média móvel troca o ruído do dia a dia por tendência
A ideia é simples de explicar. Em vez de mostrar o valor de um único dia, você mostra a média dos últimos N dias em cada ponto do gráfico. Se hoje é dia 20, o ponto de hoje é a média dos dias 14 a 20. Amanhã, dia 21, o ponto passa a ser a média dos dias 15 a 21. A janela desliza, um dia entra e o mais antigo sai, e por isso se chama média móvel.
O efeito prático é que o ruído de curto prazo some. Um sábado excepcional deixa de ser um pico assustador e vira só mais um dia dentro de uma média de sete. O que sobra na linha é o movimento de fundo: a tendência. É isso que a média móvel faz e só isso que ela promete. Ela não prevê o futuro, não corrige dado errado e não substitui a análise. Ela suaviza a curva para você enxergar a direção sem ser enganado pela variação natural do dia a dia.
Vale reforçar uma verdade que muita gente ignora: a média móvel atrasa o sinal. Como ela olha para trás, uma queda que começou hoje só aparece com força na média de sete dias uns dias depois. É o preço da suavização, e quase sempre vale a pena pagá-lo para ler tendência.
AVERAGEX com DATESINPERIOD é o padrão de média móvel DAX que você mais vai usar
Para janelas contadas em dias, o padrão canônico usa duas funções. A DATESINPERIOD gera a tabela de datas da janela: você diz a data final, quantas unidades voltar e a unidade de tempo, e ela devolve o intervalo. A AVERAGEX itera essa tabela e calcula a média da sua medida diária avaliada em cada uma daquelas datas. Supondo uma medida [Vendas Diárias] e uma tabela de calendário chamada Calendario, a média móvel de sete dias fica assim:
Média Móvel 7 dias =
VAR DiasNaJanela = 7
VAR UltimaData = MAX( Calendario[Data] )
VAR Janela =
DATESINPERIOD(
Calendario[Data],
UltimaData,
-DiasNaJanela,
DAY
)
RETURN
AVERAGEX( Janela, [Vendas Diárias] )
Leia de dentro para fora. MAX( Calendario[Data] ) pega a última data do contexto, o dia daquele ponto do gráfico. DATESINPERIOD volta sete dias a partir dele e devolve as sete datas da janela. AVERAGEX percorre essas datas, calcula [Vendas Diárias] em cada uma e tira a média. O sinal negativo em -DiasNaJanela diz para a função olhar para trás. Se fosse positivo, a janela olharia para a frente, o que raramente é o que você quer.
Um detalhe que muda resultado: AVERAGEX ignora as linhas em que a expressão retorna vazio. Se um dia da janela não tem venda e [Vendas Diárias] devolve BLANK, esse dia não entra na conta da média. Às vezes é o que você quer, às vezes não, e essa é a raiz do problema das lacunas que discuto adiante.
DATESBETWEEN entra quando a janela não fecha em dias exatos
DATESINPERIOD é ótima para janelas em dias. Só que nem toda média móvel é diária. Uma média de três meses sobre faturamento mensal pede outra abordagem, porque você não quer a média dos dias e sim a média dos meses. Aí entra a DATESBETWEEN, que recebe uma data inicial e uma data final explícitas e devolve todas as datas entre elas.
O padrão para três meses móveis fica assim, iterando sobre os meses e não sobre os dias:
Média Móvel 3 Meses =
VAR MesAtual = MAX( Calendario[Data] )
VAR Janela =
DATESBETWEEN(
Calendario[Data],
STARTOFMONTH( EDATE( MesAtual, -2 ) ),
ENDOFMONTH( MesAtual )
)
RETURN
CALCULATE(
AVERAGEX( VALUES( Calendario[AnoMes] ), [Faturamento] ),
Janela
)
Aqui a lógica é diferente. EDATE( MesAtual, -2 ) recua dois meses, STARTOFMONTH e ENDOFMONTH garantem os três meses inteiros, do primeiro dia do mês mais antigo ao último dia do mês atual. O CALCULATE aplica essa janela como filtro e, dentro dela, AVERAGEX itera sobre os valores distintos de Calendario[AnoMes], calculando [Faturamento] de cada mês e tirando a média dos três. É uma média de três valores mensais, não de noventa valores diários, e a diferença é enorme.
A tabela abaixo resume quando pegar cada função.
| Critério | DATESINPERIOD | DATESBETWEEN |
|---|---|---|
| Como você define a janela | Data final + quantidade + unidade | Data inicial e data final explícitas |
| Melhor para | Janelas em dias ou contagem fixa de unidades | Janelas de mês ou trimestre fechado |
| Direção | Controlada pelo sinal do número | Sempre do início ao fim informados |
| Legibilidade | Curta e direta | Mais verbosa, porém explícita |
Não existe função certa e errada aqui, existe a que descreve melhor a janela que você precisa. Para média diária, DATESINPERIOD é mais enxuta. Para janelas mensais fechadas, DATESBETWEEN deixa a intenção mais clara.
A escolha da janela decide a história que o gráfico conta
Este é o ponto que mais gera discussão em projeto, e onde a opinião do consultor pesa mais que a sintaxe. O tamanho da janela não é detalhe técnico, é decisão de negócio. Janela curta reage rápido e suaviza pouco. Janela longa suaviza muito e reage devagar. Escolher errado faz a mesma série contar histórias opostas.
A regra de ouro para dados diários é casar a janela com o ciclo do negócio. Se o faturamento tem forte efeito de dia da semana, a média móvel de sete dias é quase obrigatória, porque cada janela contém uma semana completa, com um de cada dia, e isso neutraliza o efeito de calendário de graça. Janelas que não são múltiplas do ciclo semanal deixam resíduo de sazonalidade e a linha continua ondulando sem motivo aparente.
| Janela | O que ela suaviza | Quando faz sentido |
|---|---|---|
| 7 dias | Efeito de dia da semana | Vendas, tráfego, operações com ciclo semanal claro |
| 30 dias | Ruído diário e picos pontuais | Leitura de tendência de médio prazo em séries diárias |
| 3 meses | Variação mês a mês | Faturamento e metas com sazonalidade mensal |
| 12 meses | Toda a sazonalidade anual | Receita recorrente, indicadores anuais, visão de fundo |
A média móvel de doze meses merece destaque. Como cobre um ano inteiro, elimina qualquer sazonalidade anual e mostra o crescimento estrutural do negócio, sem o barulho de dezembro forte ou fevereiro fraco. É a janela que a diretoria quer ver quando pergunta se a empresa está crescendo de verdade. Já a operação que precisa reagir rápido prefere sete dias. Não há janela universal, há a que responde à pergunta de quem vai olhar o gráfico.
Sem uma tabela de datas contínua, a média móvel simplesmente não fecha
Aqui está o erro mais comum e mais silencioso. Toda função de inteligência de tempo do DAX, DATESINPERIOD e DATESBETWEEN incluídas, assume que existe uma tabela de datas dedicada, contínua e marcada como tabela de datas do modelo. Contínua significa uma linha por dia, sem buracos. Se o seu calendário pula datas, a janela da média móvel pula junto, e a média passa a ser calculada sobre menos dias do que você imagina.
O sintoma é traiçoeiro porque o número aparece, ele só está errado. Uma média de sete dias que pegou cinco datas porque faltavam dois dias no calendário devolve um valor plausível, e ninguém desconfia até conferir na mão e a conta não bater. Por isso a base é usar a data da tabela de calendário nas funções, nunca a da tabela fato, e garantir que esse calendário seja completo.
Se você ainda não tem uma tabela de datas decente, resolva isso antes de escrever qualquer média móvel. A gente trata desse alicerce no guia de boas práticas de modelagem DAX, e ele é pré-requisito para praticamente tudo que envolve tempo em Power BI. Média móvel sobre um modelo sem tabela de datas contínua é construir na areia.
Lacunas e períodos incompletos são onde a média móvel mente
Dois problemas próximos, mas diferentes, derrubam a confiança na média móvel: as lacunas de dado dentro da janela e os períodos incompletos nas pontas da série.
A lacuna acontece quando um dia da janela não tem valor. Lembra que AVERAGEX ignora linhas vazias? Sem tratamento, um domingo sem venda some da conta e a média de sete dias vira média de seis, inflando o resultado. Se o correto é tratar domingo sem venda como zero, force o zero com [Vendas Diárias] + 0 ou um COALESCE. Se é ignorar o dia mesmo, o padrão já serve. O ponto é decidir de forma consciente, não deixar o motor decidir por você.
O período incompleto é o que mais engana quem olha. No começo da série, os primeiros seis dias não têm sete dias atrás deles, então a média de sete é calculada sobre menos dias e desenha uma rampa de subida artificial que não existe no negócio. O mesmo vale para o mês corrente ainda em andamento numa média mensal. A solução honesta é só mostrar a média quando a janela está completa:
Média Móvel 7 dias (janela cheia) =
VAR DiasNaJanela = 7
VAR UltimaData = MAX( Calendario[Data] )
VAR Janela =
DATESINPERIOD( Calendario[Data], UltimaData, -DiasNaJanela, DAY )
VAR DiasDisponiveis = COUNTROWS( Janela )
VAR Media = AVERAGEX( Janela, [Vendas Diárias] )
RETURN
IF( DiasDisponiveis = DiasNaJanela, Media )
O truque está no COUNTROWS( Janela ), que conta quantas datas a janela realmente tem. Se forem menos que sete, você está numa ponta da série sem histórico suficiente, e o IF devolve vazio em vez de um número enganoso. O gráfico começa só a partir do primeiro ponto com janela cheia, e a rampa falsa desaparece. Uma linha a mais de código que salva a leitura inteira.
Quando a média móvel ajuda a ler tendência, e quando ela atrapalha
A média móvel é ferramenta de tendência, não de tudo. Usar no lugar errado polui o relatório. A tabela abaixo é o resumo honesto de onde ela rende e onde ela atrapalha.
| Cenário | Média móvel ajuda? |
|---|---|
| Ler direção de vendas ruidosas dia a dia | Sim, é o caso clássico |
| Neutralizar efeito de dia da semana | Sim, com janela de 7 ou 14 dias |
| Comparar crescimento estrutural ano a ano | Sim, com janela de 12 meses |
| Detectar o valor exato de um pico ou anomalia | Não, ela esconde o pico de propósito |
| Reagir a uma mudança no mesmo dia | Não, ela atrasa o sinal |
| Fechar um número contábil oficial do mês | Não, use o total do período, não a média |
Traduzindo em conselho de consultor: use média móvel para ver para onde a coisa vai, e use o valor bruto ou o total do período para saber exatamente quanto foi. Muitos dashboards mostram as duas linhas juntas, o valor real em tom claro ao fundo e a média móvel em destaque por cima, e assim cada linha responde à pergunta que sabe responder. Se você quer levar essa leitura para além da média simples, com sazonalidade e previsão, é assunto de analytics avançado, uma camada acima do que a média móvel entrega.
Perguntas frequentes
Qual a diferença entre média móvel e a média do período no DAX? A média do período usa uma janela fixa, por exemplo o mês inteiro, e dá um número só por período. A média móvel usa uma janela que desliza a cada ponto do gráfico, sempre olhando os últimos N dias ou meses a partir dali. A do período responde quanto foi a média daquele mês. A móvel responde como a tendência se move ao longo do tempo.
Por que minha média móvel só começa depois de alguns pontos no gráfico?
Provavelmente você colocou o filtro de janela cheia, e ele está fazendo o certo. Nos primeiros dias da série não existe histórico para preencher a janela, então a medida devolve vazio de propósito para não desenhar uma rampa artificial. Se quiser algo desde o primeiro dia, remova a verificação de COUNTROWS, sabendo que os primeiros pontos serão médias parciais e não comparáveis com o resto.
Preciso mesmo de uma tabela de datas para calcular média móvel?
Sim, não é opcional. DATESINPERIOD e DATESBETWEEN operam sobre a coluna de data de uma tabela de calendário contínua e marcada como tabela de datas. Sem ela, ou com uma tabela furada, as janelas não fecham e a média sai calculada sobre menos períodos do que deveria. É o primeiro item a resolver antes de qualquer fórmula de tempo.
Uso DATESINPERIOD ou DATESBETWEEN?
Use DATESINPERIOD quando a janela é uma contagem a partir de uma data, tipicamente médias diárias como sete ou trinta dias, porque a sintaxe é mais curta. Use DATESBETWEEN quando precisa de uma janela de meses ou trimestres fechados, com início e fim explícitos, porque deixa a intenção mais clara e evita confusão entre média de dias e média de meses.
Como faço a média móvel tratar dias sem venda como zero?
Por padrão, AVERAGEX ignora os dias em que a medida retorna vazio, o que encurta a janela. Se no seu negócio um dia sem venda vale zero, force o valor com [Vendas Diárias] + 0 ou um COALESCE( [Vendas Diárias], 0 ) dentro do AVERAGEX. Se o dia sem venda deve mesmo sair da conta, o comportamento padrão já resolve. O importante é escolher, não descobrir depois.
Média móvel serve para previsão? Não, e é bom deixar isso claro para quem pede. A média móvel descreve o passado suavizado e atrasa a reação a mudanças, então é péssima como previsão pura. Ela ajuda a enxergar tendência, um insumo para previsão, mas previsão de verdade envolve sazonalidade, ciclos e modelos estatísticos. Se a demanda é prever, o caminho é um projeto de Power BI com modelagem própria, não uma média móvel esticada além do que aguenta.
Fechando
Média móvel em DAX é um dos padrões de melhor retorno que existe: pouca fórmula, muito valor de leitura. O segredo não está na sintaxe, quase sempre AVERAGEX sobre DATESINPERIOD ou DATESBETWEEN, e sim nas decisões ao redor. Escolha a janela pelo ciclo do negócio, garanta uma tabela de datas contínua, trate as lacunas com intenção e esconda os períodos incompletos para não desenhar tendência que não existe. Faça esses quatro pontos e a sua linha passa a contar a história certa.
Se a sua equipe está afogada em gráficos que sobem e descem sem contar nada, ou se as médias móveis do relatório não batem com a planilha de conferência, quase sempre o problema está no modelo por baixo. Fale com a gente e a gente ajuda a colocar o seu Power BI em ordem, da tabela de datas à medida.
Quer aplicar isso na sua empresa?
A Fynx implementa BI, Power BI e Power Platform de ponta a ponta. Conte seu cenário e devolvemos um diagnóstico direto ao ponto.
Falar com um especialista