Como calcular média móvel ponderada em DAX: passo a passo
Aprende a calcular uma média móvel ponderada em DAX para suavizar séries temporais e dar mais peso a observações recentes. Esta técnica é útil para vendas, métricas de utilizador ou qualquer série em que queiras que os eventos mais recentes influenciem mais o resultado.
Pré-requisitos
- Power BI Desktop (ou outra ferramenta que suporte DAX).
- Uma tabela de factos com colunas: Date (tipo Data) e Value (numérico).
- Tabela de datas relacionada com a tabela de factos.
Passo 1: Entender a lógica da média móvel ponderada
Ao contrário da média móvel simples, a média móvel ponderada aplica pesos diferentes a cada ponto dentro da janela (por exemplo, últimos 3 ou 7 dias). Os pesos devem somar 1 ou normalizar-se na fórmula. Decide-se a janela e a sequência de pesos (ex.: 0.5, 0.3, 0.2 para 3 períodos: mais peso no mais recente).
Passo 2: Criar a medida de soma para o período
Primeiro cria-se uma medida base que soma os valores. Isto dá uma referência limpa para usar dentro das janelas.
Total Value = SUM('Facts'[Value])
Passo 3: Medida de média móvel ponderada fixa (ex.: 3 períodos)
Para uma janela fixa de 3 períodos com pesos [0.5, 0.3, 0.2] — onde o mais recente recebe 0.5 — usa-se funções de contexto temporal. Esta medida assume que a tabela de datas está relacionada e a seleção actual de Date é o ponto final da janela.
MMW 3 períodos =
VAR w1 = 0.5 -- peso para data actual
VAR w2 = 0.3 -- peso para 1 período atrás
VAR w3 = 0.2 -- peso para 2 períodos atrás
VAR d0 = MAX('Date'[Date])
VAR v0 = CALCULATE([Total Value], 'Date'[Date] = d0)
VAR d1 = CALCULATE( MAX('Date'[Date]), FILTER(ALL('Date'), 'Date'[Date] < d0))
VAR v1 = CALCULATE([Total Value], 'Date'[Date] = d1)
VAR d2 = CALCULATE( MAX('Date'[Date]), FILTER(ALL('Date'), 'Date'[Date] < d1))
VAR v2 = CALCULATE([Total Value], 'Date'[Date] = d2)
VAR numerator = w1 * v0 + w2 * v1 + w3 * v2
VAR denom =
(IF(NOT(ISBLANK(v0)), w1, 0)) +
(IF(NOT(ISBLANK(v1)), w2, 0)) +
(IF(NOT(ISBLANK(v2)), w3, 0))
RETURN
IF(denom = 0, BLANK(), numerator / denom)
Passo 4: Medida genérica para N períodos com pesos decrescentes
Para uma solução mais flexível, constrói-se uma medida que cria dinamicamente a janela de N períodos e aplica pesos lineares decrescentes (ex.: N, N-1, ..., 1). Esta técnica é útil quando não queres especificar manualmente cada peso.
MMW N períodos (linear) =
VAR N = 7 -- ajusta para 3, 7, 14, etc.
VAR EndDate = MAX('Date'[Date])
VAR WindowDates =
TOPN(
N,
FILTER(ALL('Date'), 'Date'[Date] <= EndDate),
'Date'[Date], DESC
)
VAR TableWithValues =
ADDCOLUMNS(
WindowDates,
"ValueOnDate", CALCULATE([Total Value], 'Date'[Date] = EARLIER('Date'[Date]))
)
VAR Ranked =
ADDCOLUMNS(
TableWithValues,
"Rank", RANKX(WindowDates, 'Date'[Date], , DESC, DENSE)
)
VAR WithWeights =
ADDCOLUMNS(
Ranked,
"Weight", DIVIDE( (N + 1 - [Rank]), SUMX(Ranked, N + 1 - [Rank]) )
)
VAR Numerator = SUMX(WithWeights, [Weight] * [ValueOnDate])
VAR Denominator = SUMX(WithWeights, [Weight])
RETURN
IF(Denominator = 0, BLANK(), Numerator / Denominator)
Passo 5: Erros comuns e como os evitar
Erros frequentes incluem: não ter uma tabela de datas completa (faltam dias), usar MAX sem contexto correcto, ou divisão por zero quando há dados em falta. As medidas acima usam ALL('Date') e verificações de denom = 0 para evitar estes problemas. Confirma que a relação entre a tabela de factos e a tabela de datas está activa e unívoca.
Verificar o resultado
Cria um gráfico de linhas com 'Date'[Date] no eixo e a medida MMW no valor. Compara com a série original (Total Value) para ver a suavização. Usa filtros (slicers) de intervalo de datas e verifica extremos (início da série) para confirmar que a medida trata janelas incompletas correctamente (deve mostrar valores normalizados ou BLANK, conforme a escolha).
Conclusão
Agora tens duas abordagens para médias móveis ponderadas em DAX: uma fixa e outra genérica com pesos lineares. Próximos passos: experimentar diferentes esquemas de peso (exponencial), usar a função SAMEPERIODLASTYEAR para comparar e optimizar desempenho com índices em grandes tabelas. Dica: começa com N pequeno e valida cada passo com uma tabela visual que mostre as datas, valores e pesos para depuração.