(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como calcular média móvel ponderada em DAX: passo a passo

João Barros 04 de September de 2026 4 min de leitura

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.