Powerpivot Moving Average Dax


Rolling 12 Months Average em DAX Computing a média móvel de 12 meses no DAX parece uma tarefa simples, mas esconde alguma complexidade. Este artigo explica como escrever a melhor fórmula evitando armadilhas comuns usando funções de inteligência de tempo. Começamos com o usual modelo de dados AdventureWorks, com a tabela Produtos, Vendas e Calendário. O Calendário foi marcado como uma tabela de calendário (é necessário trabalhar com qualquer função de inteligência de tempo) e construímos uma hierarquia simples ano-mês-data. Com esta configuração, é muito fácil criar uma primeira tabela dinâmica mostrando as vendas ao longo do tempo: Ao fazer análise de tendências, se as vendas estão sujeitas à sazonalidade ou, de forma mais geral, se você quiser remover o efeito de picos e quedas nas vendas, Técnica comum é a de calcular o valor ao longo de um determinado período, geralmente 12 meses, e média dele. A média móvel em 12 meses fornece um bom indicador da tendência e é muito útil em gráficos. Dada uma data, podemos calcular a média móvel de 12 meses com esta fórmula, que ainda tem alguns problemas que vamos resolver mais tarde: O comportamento da fórmula é simples: calcula o valor de Vendas após a criação de um filtro no calendário que Mostra exatamente um ano inteiro de dados. O núcleo da fórmula é o DATESBETWEEN, que retorna um conjunto inclusivo de datas entre os dois limites. O mais baixo é: Leitura do mais íntimo: se estamos mostrando dados de um mês, digamos julho 2007, tomamos a última data visível usando LASTDATE, que retorna o último dia em julho de 2007. Então usamos NEXTDAY para tomar o primeiro De agosto de 2007 e finalmente usamos SAMEPERIODLASTYEAR para mudar de volta um ano, produzindo 1 de agosto de 2006. O limite superior é simplesmente LASTDATE, ou seja, final de julho de 2007. Se usarmos essa fórmula em uma tabela dinâmica, o resultado parece ótimo, mas nós Tem um problema para a última data: Na verdade, como você pode ver na figura, o valor é corretamente calculado até 2008. Então, não há valor em 2009 (o que é correto, não temos vendas em 2009), mas não há Um valor surpreendente em dezembro de 2010, onde nossa fórmula mostra o total geral em vez de um valor em branco, como seria de esperar. Na verdade, em dezembro, LASTDATE retorna o último dia do ano e NEXTDAY deve retornar a 1 de janeiro de 2011. Mas NEXTDAY é uma função de inteligência de tempo e é esperado para retornar conjuntos de datas existentes. Este fato não é muito evidente e vale a pena algumas palavras mais. Funções de inteligência de tempo não executam matemática em datas. Se você quiser tomar o dia após uma determinada data, você pode simplesmente adicionar 1 a qualquer coluna de data, eo resultado será no dia seguinte. Em vez disso, funções de inteligência de tempo deslocam conjuntos de data para trás e para frente ao longo do tempo. Assim, NEXTDAY leva sua entrada (no nosso caso uma tabela de uma linha com o 31 de dezembro de 2010) e muda um dia depois. O problema é que o resultado deve ser 1 de janeiro de 2011 mas, como a tabela de calendário não contém essa data, o resultado é em branco. Assim, nossa expressão calcula vendas com um limite inferior em branco, que significa o começo do tempo, rendendo como resultado o total geral das vendas. Para corrigir a fórmula é suficiente para alterar a ordem de avaliação do limite inferior: Como você pode ver, agora NEXTDAY é chamado após a mudança de um ano de volta. Desta forma, tomamos 31 de dezembro de 2010, movê-lo para 31 de dezembro de 2009 e tomar o dia seguinte, que é 01 de janeiro de 2010: uma data existente na tabela de calendário. O resultado é agora o esperado: Neste ponto, precisamos apenas dividir esse número por 12 para obter a média móvel. Mas, como você pode facilmente imaginar, nem sempre podemos dividi-la por 12. Na verdade, no início do período não há 12 meses para agregar, mas um número menor. Precisamos calcular o número de meses para os quais há vendas. Isso pode ser feito usando a filtragem cruzada da tabela de calendário com a tabela de vendas depois de aplicarmos o novo contexto de 12 meses. Definimos uma nova medida que calcula o número de meses existentes no período de 12 meses: Você pode ver na próxima figura que a medida Months12M calcula um valor correto: Vale ressaltar que a fórmula não funciona se você escolher um período Mais de 12 meses, porque o CalendarMonthName tem apenas 12 valores. Se você precisar de períodos mais longos, você precisará usar uma coluna YYYYMM para ser capaz de contar mais de 12. A parte interessante desta fórmula que usa a filtragem cruzada é o fato de que ele calcula o número de meses disponíveis, mesmo quando você filtrar usando outros atributos. Se, por exemplo, você selecionar a cor azul usando um slicer, em seguida, as vendas começam em julho de 2007 (não em 2005, como acontece com muitas outras cores). Usando o filtro cruzado no Sales, a fórmula calcula corretamente que em julho de 2007 há um único mês de vendas disponíveis para o Blue: Neste ponto, a média móvel é apenas um DIVIDE away: Quando usamos em uma Tabela Dinâmica, nós ainda Tem um pequeno problema: na verdade, o valor é calculado também para os meses para os quais não há vendas (ou seja, futuros meses): Isso pode ser resolvido usando uma instrução IF para evitar que a fórmula de mostrar valores quando não há vendas. Eu não tenho nada contra IF, mas, para o desempenho viciado entre você, é sempre vale a pena lembrar que IF pode ser um assassino de desempenho, porque poderia forçar motor de fórmula DAX para chutar. Neste caso específico, a diferença é insignificante, mas , Como uma regra geral, a melhor maneira de remover o valor quando não há vendas é confiar em fórmulas de mecanismo de armazenamento puro como este: Comparando um gráfico usando o Avg12M com outro que mostra Vendas você pode facilmente apreciar como a média móvel Esboça as tendências de uma forma muito mais limpa: Download Mantenha-me informado sobre os próximos artigos (boletim informativo). Desmarque para baixar livremente o arquivo. ADX inclui algumas funções de agregação estatística, como média, variância e desvio padrão. Outros cálculos estatísticos típicos exigem que você escreva expressões DAX mais longas. Excel, deste ponto de vista, tem uma linguagem muito mais rica. Os Padrões Estatísticos são uma coleção de cálculos estatísticos comuns: mediana, modo, média móvel, percentil e quartil. Gostaríamos de agradecer a Colin Banfield, Gerard Brueckl e Javier Guilln, cujos blogs inspiraram alguns dos seguintes padrões. Exemplo de padrão básico As fórmulas neste padrão são as soluções para cálculos estatísticos específicos. Média Você pode usar funções DAX padrão para calcular a média (média aritmética) de um conjunto de valores. Média. Retorna a média de todos os números em uma coluna numérica. AVERAGEA. Retorna a média de todos os números em uma coluna, manipulando texto e valores não numéricos (valores de texto não numéricos e vazios são contados como 0). AVERAGEX. Calcular a média de uma expressão avaliada sobre uma tabela. Média móvel A média móvel é um cálculo para analisar pontos de dados, criando uma série de médias de diferentes subconjuntos do conjunto de dados completo. Você pode usar muitas técnicas DAX para implementar esse cálculo. A técnica mais simples é usar AVERAGEX, iterando uma tabela da granularidade desejada e calculando para cada iteração a expressão que gera o único ponto de dados a ser usado na média. Por exemplo, a seguinte fórmula calcula a média móvel dos últimos 7 dias, supondo que você está usando uma tabela Data no seu modelo de dados. Usando AVERAGEX, você calcula automaticamente a medida em cada nível de granularidade. Ao usar uma medida que pode ser agregada (como SUM), então outra abordagem baseada em CALCULATE pode ser mais rápida. Você pode encontrar esta abordagem alternativa no padrão completo de Moving Average. Variância Você pode usar funções padrão DAX para calcular a variação de um conjunto de valores. VAR. S. Retorna a variância de valores em uma coluna que representa uma população de amostra. VAR. P. Retorna a variância de valores em uma coluna que representa toda a população. VARX. S. Retorna a variância de uma expressão avaliada sobre uma tabela representando uma população de amostra. VARX. P. Retorna a variância de uma expressão avaliada sobre uma tabela representando a população inteira. Desvio Padrão Você pode usar funções padrão DAX para calcular o desvio padrão de um conjunto de valores. STDEV. S. Retorna o desvio padrão de valores em uma coluna que representa uma população de amostra. STDEV. P. Retorna o desvio padrão de valores em uma coluna que representa toda a população. STDEV. S. Retorna o desvio padrão de uma expressão avaliada sobre uma tabela representando uma população de amostra. STDEV. P. Retorna o desvio padrão de uma expressão avaliada sobre uma tabela representando a população inteira. Mediana A mediana é o valor numérico que separa a metade superior de uma população da metade inferior. Se houver um número ímpar de linhas, a mediana é o valor médio (ordenando as linhas do valor mais baixo ao valor mais alto). Se houver um número par de linhas, é a média dos dois valores médios. A fórmula ignora valores em branco, que não são considerados parte da população. O resultado é idêntico à função MEDIAN no Excel. A Figura 1 mostra uma comparação entre o resultado retornado pelo Excel ea fórmula DAX correspondente para o cálculo da mediana. Figura 1 Exemplo de cálculo mediano em Excel e DAX. Modo O modo é o valor que aparece mais frequentemente num conjunto de dados. A fórmula ignora valores em branco, que não são considerados parte da população. O resultado é idêntico às funções MODE e MODE. SNGL no Excel, que retornam apenas o valor mínimo quando existem vários modos no conjunto de valores considerados. A função Excel MODE. MULT retornaria todos os modos, mas você não pode implementá-lo como uma medida no DAX. A Figura 2 compara o resultado retornado pelo Excel com a fórmula DAX correspondente para o cálculo de modo. Figura 2 Exemplo de cálculo de modo em Excel e DAX. Percentil O percentil é o valor abaixo do qual uma determinada percentagem de valores num grupo cai. A fórmula ignora valores em branco, que não são considerados parte da população. O cálculo no DAX requer várias etapas, descritas na seção Padrão completo, que mostra como obter os mesmos resultados das funções Excel PERCENTILE, PERCENTILE. INC e PERCENTILE. EXC. Quartil Os quartis são três pontos que dividem um conjunto de valores em quatro grupos iguais, cada grupo compreendendo um quarto dos dados. Você pode calcular os quartis usando o padrão Percentile, seguindo estas correspondências: Primeiro quartil quartil inferior 25º percentil Segundo quartil mediano 50º percentil Terceiro quartil quartil superior 75 percentil Padrão Completo Alguns cálculos estatísticos têm uma descrição mais longa do padrão completo, porque Você pode ter diferentes implementações dependendo de modelos de dados e outros requisitos. Média móvel Normalmente, você avalia a média móvel referindo-se ao nível de granularidade do dia. O modelo geral da seguinte fórmula tem estes marcadores: ltnumberofdaysgt é o número de dias para a média móvel. Ltdatecolumngt é a coluna de data da tabela de datas se você tiver uma ou a coluna de data da tabela contendo valores se não houver tabela de datas separada. Ltmeasuregt é a medida para calcular como a média móvel. O padrão mais simples usa a função AVERAGEX no DAX, que automaticamente considera apenas os dias para os quais há um valor. Como alternativa, você pode usar o modelo a seguir em modelos de dados sem uma tabela de datas e com uma medida que pode ser agregada (como SUM) durante todo o período considerado. A fórmula anterior considera um dia sem dados correspondentes como uma medida que tem 0 valor. Isso pode acontecer somente quando você tem uma tabela de datas separada, que pode conter dias para os quais não há transações correspondentes. Você pode fixar o denominador para a média usando apenas o número de dias para o qual há transações usando o seguinte padrão, em que: ltfacttablegt é a tabela relacionada à tabela de datas e que contém valores calculados pela medida. Você pode usar as funções DATESBETWEEN ou DATESINPERIOD em vez de FILTER, mas elas funcionam apenas em uma tabela de data regular, enquanto que você pode aplicar o padrão descrito acima também para tabelas de datas não-regular e para modelos que não têm uma tabela de datas. Por exemplo, considere os diferentes resultados produzidos pelas duas medidas a seguir. Na Figura 3, você pode ver que não há vendas em 11 de setembro de 2005. No entanto, essa data está incluída na tabela Data, portanto, há 7 dias (de 11 de setembro a 17 de setembro) que têm apenas 6 dias com dados. Figura 3 Exemplo de cálculo da média móvel considerando e ignorando datas sem vendas. A medida Moving Average 7 Days tem um número menor entre 11 de setembro e 17 de setembro, porque considera 11 de setembro como um dia com 0 vendas. Se você quiser ignorar dias sem vendas, use a medida Moving Average 7 Days No Zero. Esta pode ser a abordagem certa quando você tem uma tabela de datas completa, mas você quer ignorar dias sem transações. Usando a fórmula Moving Average 7 Days, o resultado está correto porque AVERAGEX automaticamente considera apenas valores não em branco. Tenha em mente que você pode melhorar o desempenho de uma média móvel, persistindo o valor em uma coluna calculada de uma tabela com a granularidade desejada, como data ou data e produto. No entanto, a abordagem de cálculo dinâmico com uma medida oferece a capacidade de usar um parâmetro para o número de dias da média móvel (por exemplo, substituir ltnumberofdaysgt por uma medida implementando o padrão de Tabela de Parâmetros). Mediana A mediana corresponde ao percentil 50, que você pode calcular usando o padrão Percentile. No entanto, o padrão Median permite otimizar e simplificar o cálculo mediano usando uma única medida, em vez das várias medidas exigidas pelo padrão Percentile. Você pode usar essa abordagem ao calcular a mediana dos valores incluídos no ltvaluecolumngt, como mostrado abaixo: Para melhorar o desempenho, você pode querer persistir o valor de uma medida em uma coluna calculada, se você deseja obter a mediana para os resultados de Uma medida no modelo de dados. No entanto, antes de fazer essa otimização, você deve implementar o cálculo MedianX com base no modelo a seguir, usando esses marcadores: ltgranularitytablegt é a tabela que define a granularidade do cálculo. Por exemplo, pode ser a tabela de datas se você deseja calcular a mediana de uma medida calculada no nível do dia ou pode ser VALUES (8216DateYearMonth) se desejar calcular a mediana de uma medida calculada no nível de mês. Ltmeasuregt é a medida para calcular para cada linha de ltgranularitytablegt para o cálculo mediano. Ltmeasuretablegt é a tabela que contém os dados utilizados por ltmeasuregt. Por exemplo, se o ltgranularitytablegt for uma dimensão como 8216Date8217, então o ltmeasuretablegt será 8216Internet Sales8217 contendo a coluna Internet Sales Amount somada pela medida Internet Total Sales. Por exemplo, você pode escrever a mediana de Internet de vendas total para todos os clientes na Adventure Works da seguinte forma: Sugestão O seguinte padrão: é usado para remover as linhas da ltgranularitytablegt que não têm dados correspondentes na seleção atual. É uma maneira mais rápida do que usar a seguinte expressão: No entanto, você pode substituir toda a expressão CALCULATETABLE com apenas ltgranularitytablegt se você quiser considerar valores em branco do ltmeasuregt como 0. O desempenho da fórmula MedianX depende do número de linhas na Tabela iterada e sobre a complexidade da medida. Se o desempenho for ruim, você pode persistir o resultado de ltmeasuregt em uma coluna calculada do lttablegt, mas isso removerá a capacidade de aplicar filtros ao cálculo mediano no momento da consulta. O Percentile Excel tem duas implementações diferentes de cálculo de percentis com três funções: PERCENTILE, PERCENTILE. INC e PERCENTILE. EXC. Todos eles retornam o percentil K de valores, onde K está na faixa de 0 a 1. A diferença é que PERCENTILE e PERCENTILE. INC considerar K como um intervalo inclusivo, enquanto PERCENTILE. EXC considera a gama K 0 a 1 como exclusiva . Todas essas funções e suas implementações DAX recebem um valor percentil como parâmetro, que chamamos de valor de percentil K. ltKgt está na faixa de 0 a 1. As duas implementações DAX de percentil exigem algumas medidas que são semelhantes, mas diferentes o suficiente para exigir Dois conjuntos diferentes de fórmulas. As medidas definidas em cada padrão são: KPerc. O valor percentil corresponde a ltKgt. PercPos. A posição do percentil no conjunto de valores ordenados. ValueLow. O valor abaixo da posição percentil. Valor Alto. O valor acima da posição percentil. Percentil. O cálculo final do percentil. Você precisa das medidas ValueLow e ValueHigh no caso do PercPos contém uma parte decimal, porque então você tem que interpolar entre ValueLow e ValueHigh, a fim de retornar o valor percentil correto. A Figura 4 mostra um exemplo dos cálculos feitos com fórmulas Excel e DAX, usando ambos os algoritmos de percentil (inclusive e exclusivo). Figura 4 Cálculos de percentil usando fórmulas do Excel eo cálculo DAX equivalente. Nas seções a seguir, as fórmulas Percentile executam o cálculo em valores armazenados em uma coluna de tabela, DataValue, enquanto que as fórmulas PercentileX executam o cálculo em valores retornados por uma medida calculada em uma determinada granularidade. Percentile Inclusive A implementação do Percentile Inclusive é a seguinte. Percentile Exclusive A implementação do Percentile Exclusive é a seguinte. PercentileX Inclusive A implementação do PercentileX Inclusive é baseada no seguinte modelo, usando esses marcadores: ltgranularitytablegt é a tabela que define a granularidade do cálculo. Por exemplo, pode ser a tabela de datas se você deseja calcular o percentil de uma medida no nível do dia ou pode ser VALUES (8216DateYearMonth) se você quiser calcular o percentil de uma medida no nível de mês. Ltmeasuregt é a medida a calcular para cada linha de ltgranularitytablegt para o cálculo do percentil. Ltmeasuretablegt é a tabela que contém os dados utilizados por ltmeasuregt. Por exemplo, se o ltgranularitytablegt é uma dimensão tal como 8216Date, 8217 então o ltmeasuretablegt será 8216Sales8217 contendo a coluna Amount somada pela medida Total Amount. Por exemplo, você pode escrever o PercentileXInc do valor total de vendas para todas as datas na tabela Data da seguinte forma: PercentileX Exclusive A implementação do PercentileX Exclusive é baseada no modelo a seguir, usando os mesmos marcadores usados ​​no PercentileX Inclusive: Por exemplo, você Pode escrever o PercentileXExc do montante total de vendas para todas as datas na tabela Data da seguinte forma: Downloads Mantenha-me informado sobre os próximos padrões (newsletter). Desmarque para baixar livremente o arquivo. Publicado em 17 de março de 2014 por Outros padrões que você pode gostar Padrões de Tempo Os padrões de tempo DAX são usados ​​para implementar cálculos relacionados ao tempo sem depender das funções de inteligência de tempo DAX. Isso é útil sempre que você tiver calendários personalizados, como um calendário de semana ISO 8601 ou quando você estiver usando um Analysis Services hellip Padrões de orçamento Os padrões de orçamento são técnicas que você usa para comparar informações de orçamento com outros dados. Eles são uma extensão do tratamento de diferentes granularidades e, como tal, usar algoritmos de alocação para exibir o orçamento em granularidades para o qual é hellip Dax Patterns é produzido por SQLBI. Copyright copy Loader. Todos os direitos são reservados. Microsoft Excel reg e todas as outras marcas comerciais e direitos autorais são propriedade de seus respectivos proprietários. Estou tentando criar uma média móvel no meu modelo. Procurando alguma ajuda. Eu tentei seguir os detalhes em Alberto Ferraris blog aqui. Mas eu não poderia obter a medida DayNumber trabalhando, a sintaxe não parecia correta e eu não poderia corrigi-lo. Meu modelo tem uma tabela de fatos contendo uma lista de casos, juntando-se a uma tabela de data através da data criada. Eu tenho um segundo relacionamento (Inativo) para a tabela Data na coluna ClosedDate. Eu tenho uma medida: Caso Contagem Fechada: CALCULAR (COUNTROWS (Caso), USERELATIONSHIP (CaseClosedDateKey, DateDateKey)). Eu gostaria de uma medida recebendo a soma de Case Closed Count para os últimos três dias do contexto atual. Eu planejo dividir esse número por 3 para obter a média de 3 dias em movimento. Uma outra parte da lógica que eu gostaria de considerar - se o último dia é HOJE, então os 3 dias anteriores são usados ​​- os dados são atualizados a cada 15 minutos, então fazendo isso às 09:00 da manhã seria distorcer a média, como Não é um dia totalmente concluído. Qualquer ajuda é apreciada. Domingo, 17 de fevereiro de 2013 17:25 Respostas Heres um link para uma abordagem usando apenas uma medida calculada que Javier Guillen escreveu um tempo atrás. Espero que ajude. Brent Greenwood, MS, MCITP, CBIP // Por favor marque as respostas corretas e postagens úteis // brentgreenwood. blogspot Editado por Brent Greenwood Editor Segunda-feira, 18 de fevereiro de 2013 16:08 Proposta como resposta por Ed Price - MSFT Microsoft employee, Owner Thursday , 22 de agosto de 2013 19:39 Marcado como resposta por Ed Price - MSFT Microsoft empregado, Proprietário Tuesday, September 17, 2013 6:39 PM Monday, February 18, 2013 4:08 PM Em seu post, Alberto faz uso da Função EARLIER que retorna um valor de um contexto de linha anterior. Isso só funciona em uma expressão de iteração, quando essa expressão é avaliada em um contexto de linha existente (uma outra expressão de iteração, ou uma coluna calculada.) Será que o seguinte atender o requisito (não testado) Caso Contagem Fechada - Últimos 3 dias: CALCULAR ( (DataDateKey, -3, Day). DateDateKey)) O último pode ser feito com uma expressão IF usando a função TODAY () e adaptando o padrão acima. Proposta como resposta por Ed Price - MSFT Microsoft empregado, Proprietário quinta-feira, 22 de agosto de 2013 12:40 PM Heres um link para uma abordagem usando apenas uma medida calculada que Javier Guillen escreveu um tempo atrás . Espero que ajude. Brent Greenwood, MS, MCITP, CBIP // Por favor marque as respostas corretas e postagens úteis // brentgreenwood. blogspot Editado por Brent Greenwood Editor Segunda-feira, 18 de fevereiro de 2013 16:08 Proposta como resposta por Ed Price - MSFT Microsoft employee, Owner Thursday , 22 de agosto de 2013 19:39 Marcado como resposta por Ed Price - MSFT Microsoft empregado, Proprietário Terça-feira, setembro 17, 2013 6:39 PM Segunda-feira, 18 de fevereiro de 2013 4:08 PMSQL Servidor Denali PowerPivot Alberto Ferrari já escreveu sobre o cálculo Mover médias no DAX usando uma coluna calculada. Gostaria de apresentar uma abordagem diferente aqui usando uma medida calculada. Para a média móvel estou calculando uma média móvel diária (nos últimos 30 dias) aqui. Para o meu exemplo, estou usando o PowerPivot pasta de trabalho que pode ser baixado como parte do SSAS Tabular Modelos Projetos do Denali CTP 3 amostras. Neste post, estou desenvolvendo a fórmula passo a passo. No entanto, se você estiver com pressa, você pode querer diretamente saltar para os resultados finais abaixo. Com o ano de calendário de 2003 no filtro, a data nas colunas e o montante das vendas (da tabela Internet Sales) nos detalhes, os dados de exemplo têm esta aparência: Em cada contexto de linhas, a expressão 8218DateDate fornece o contexto atual, ou seja, a data dessa linha . Mas a partir de uma medida calculada não podemos se referir a essa expressão (como não há linha atual para a tabela Date), em vez disso, temos que usar uma expressão como LastDate (8218DateDate). Assim, a fim de obter os últimos trinta dias que podemos usar esta expressão Agora podemos resumir nossas vendas pela Internet para cada um desses dias utilizando a função resumir: Resumir (160 DatesInPeriod (8218DateDate, LASTDATE (8218DateDate), - 30, dia) 160, 160. 8217DateDate quotSalesAmountSumquot 160. Sum (8218Internet SalesSales valor)) E, finalmente, estavam usando a função DAX AVERAGEX para calcular a média desses 30 valores: valor das Vendas (30d avg): AVERAGEX (160 Resumir (160.160.160 DatesInPeriod (8218DateDate, LASTDATE (8218DateDate), - 30, dia) 160160160, 160160160. 8217DateDate quotSalesAmountSumquot 160160160. Sum (8218Internet SalesSales Valor) 160) 160, SalesAmountSum) Este é o cálculo que estamos usando em nossa tabela de Vendas pela Internet, como mostrado na imagem abaixo: Ao adicionar este cálculo à tabela dinâmica a partir de cima, o resultado é o seguinte: Observando o resultado, parece que não temos dados anteriores a 1 de Janeiro de 2003: O primeiro valor para a média móvel é idêntico ao valor do dia Não há linhas antes dessa data). O segundo valor para a média móvel é realmente a média dos dois primeiros dias e assim por diante. Isso não é muito correto, mas estou voltando a este problema em um segundo. A captura de tela mostra o cálculo da média móvel de 31 de janeiro como a média dos valores diários de 2 a 31 de janeiro. Nossa medida calculada também funciona bem quando os filtros são aplicados. Na seguinte captura de tela usei duas categorias de produtos para a série de dados: Como nossa medida calculada funciona em níveis de agregação mais altos Para descobrir, estou usando a hierarquia do Calendário nas linhas (em vez da data). Para simplificar, removi os níveis de semestre e trimestre usando as opções da tabela dinâmica Excels (opção Mostrar / ocultar campos). Como você pode ver, o cálculo ainda funciona bem. Aqui, o agregado mensal é a média móvel para o último dia do mês específico. Você pode ver isso claramente para janeiro (valor de 14,215.01 também aparece na imagem acima como o valor para 31 de janeiro). Se esta foi a exigência de negócios (o que parece razoável para uma média diária), então a agregação funciona bem em um nível mensal (caso contrário, teremos de ajustar o nosso cálculo e este será um tópico da próxima postagem). Mas embora a agregação faça sentido em um nível mensal, se expandirmos essa visão para o nível do dia você verá que nossa medida calculada simplesmente retorna o valor das vendas para esse dia, não a média dos últimos 30 dias mais: Como isso pode ser. Os resultados problema a partir do contexto em que calculamos o nosso resumo, como destacado no código a seguir: Valor das Vendas (30d avg): AVERAGEX (160 Resumir (160.160.160 datesinperiod (8218DateDate, LASTDATE (8218DateDate), - 30, dia) 160.160.160, 8217DateDate 160160160. quotSalesAmountSumquot 160160160. Sum (8218Internet SalesSales Valor) 160) 160, SalesAmountSum) Uma vez que nós avaliamos esta expressão durante o período determinado datas, o único contexto que é substituído aqui, é 8218DateDate. Em nossa hierarquia estavam usando atributos diferentes de nossa dimensão (ano civil, mês e dia do mês). Como esse contexto ainda está presente, o cálculo também é filtrado por esses atributos. E isso explica por que nós o contexto dias atuais ainda está presente para cada linha. Para deixar as coisas claras, desde que avaliamos essa expressão fora de um contexto de data, tudo está bem conforme a seguinte consulta DAX é exibida ao ser executada pelo Management Studio na perspectiva Internet Sales de nosso modelo (usando o banco de dados tabular com os mesmos dados ): avaliar (160160160 Resumir (160160160160160160160 datesinperiod (8218DateDate, data (2003,1,1), - 5, dIA) 160160160160160160160, 8217DateDate 160160160160160160160. quotSalesAmountSumquot 160160160160160160160. Sum (8218Internet SalesSales Valor) 160.160.160)) Aqui, eu reduziu o período de tempo Para 5 dias e também definir uma data fixa como LastDate () resultaria na última data da minha tabela de dimensão de data para a qual não existem dados nos dados de exemplo. Aqui está o resultado da consulta: No entanto, após definir um filtro para 2003, nenhuma linha de dados fora de 2003 será incluída na soma. Isto explica a observação acima: Parecia que só temos dados a partir de 1 de Janeiro de 2003. E agora, sabemos porquê: O ano de 2003 estava no filtro (como você pode ver na primeira tela deste post) e Portanto, estava presente no cálculo da soma. Agora, tudo o que temos a fazer é se livrar desses filtros adicionais, porque já estavam filtrando os nossos resultados por Data. A maneira mais fácil de fazer isso é usar a função Calculate e aplicar ALL () para todos os atributos para os quais queremos remover o filtro. Como temos alguns desses atributos (Ano, Mês, Dia, Dia da semana) e queremos remover o filtro de todos eles, mas o atributo de data, a função de atalho ALLEXCEPT é muito útil aqui. Se você tem um fundo MDX você vai saber por que não temos um problema semelhante ao usar SSAS no modo OLAP (BISM Multidimensional). A razão é que nosso banco de dados OLAP tem relacionamentos de atributo, portanto, depois de definir o atributo de data (chave), os outros atributos também são alterados automaticamente e não precisamos nos preocupar com isso (veja minha postagem aqui). Mas no modelo tabular não temos relações de atributo (nem mesmo um verdadeiro atributo de chave) e, portanto, precisamos eliminar filtros indesejados de nossos cálculos. Então, aqui estamos com a quantia de vendas (30d avg): AVERAGEX (160 Resumir (160.160.160 datesinperiod (8218DateDate, LASTDATE (8218DateDate), - 30, dia) 160160160, 160160160. 8217DateDate quotSalesAmountSumquot 160160160. calcular (Sum (8218Internet SalesSales Valor), ALLEXCEPT (8218Date8216,8217DateDate)) 160), SalesAmountSum) E esta é a nossa tabela dinâmica final em Excel: Para ilustrar a média móvel, aqui é o mesmo extrato de dados em uma visualização de gráfico (Excel): Embora filtrada nossos dados em relação a 2003 A média móvel dos primeiros 29 dias de 2003 toma devidamente em conta os dias correspondentes de 2002. Você reconhecerá os valores para 30 e 31 de janeiro de nossa primeira abordagem, pois foram os primeiros dias para os quais nosso primeiro cálculo teve uma quantidade suficiente de dados (30 dias completos). Eu sempre fui um crente firme de que as médias móveis provavelmente dão uma visão melhor das tendências dentro de um negócio do que uma linha de tendência simples associada a um conjunto de valores, como as vendas mensais (embora eu tenha tendência para revisar essas tendências). Dois valores juntos). A razão para isso é que uma tendência pode ser distorcida por um ou dois valores que podem não ser representativos do negócio subjacente, tais como picos associados à sazonalidade ou um evento específico. Quando BillD destacou uma consulta sobre este conceito em seus comentários sobre Profit amp Loss (Parte 2) Compare e Analise. Eu pensei que seria uma ótima idéia para flex nosso conjunto de dados PampL para fornecer alguma capacidade de média móvel. Neste post, vou explicar o que as médias móveis são destinados a fornecer e explicar como calculá-los usando os elementos de vendas dos dados de exemplo usados ​​na série Profit amp Loss de posts. Em seguida, adicionarei a flexibilidade para que os usuários selecionem o intervalo de tempo que o cálculo da média móvel deve considerar, o número de períodos de tendência a serem exibidos ea data de término do relatório. O que é uma média móvel A medida média móvel mais comum é geralmente referida como uma média móvel de 12 meses. No caso de nossos dados de vendas, para cada período, essa medida somará os últimos 12 meses de vendas anteriores e incluindo o mês analisado e, em seguida, dividir por 12 para mostrar um valor médio de vendas para esse período. Em termos financeiros, a equação é, portanto, muito simples: 12 meses Mover média soma das vendas dos últimos 12 meses / 12 Isso tudo parece muito simples, mas há muito de complexidade envolvida se quisermos colocar o tempo médio móvel (representado como 12 No exemplo acima) nas mãos do usuário, dar-lhes o poder de selecionar o número de períodos de tendência a ser exibido eo mês que o relatório deve exibir até. O conjunto de dados O conjunto de dados que estava usando parece algo como abaixo. Observação Estou usando o PowerPivot V1. O visor do projeto está disponível em V2 mas Ive hashed este junto nada inteligente Você observará que FACTTran (nosso dataset a ser analisado) é ligado a DIMHeading1, DIMHeading2 e DIMDataType para fornecer alguma categorização a nosso dataset. Ive também vinculado a datas, que é um conjunto seqüencial de datas que mais do que abrange o tempo de nosso conjunto de dados. Esta tabela carrega alguma informação adicional estática baseada na data: Uma vez que outra vez, não estava registrando completamente na escala picante de Robs O descanso assegurou que você estará começando um workout mais intenso de DAX como nós vamos sobre. Como estas medidas de data não são esperadas para ser dinâmico, Ive codificado-los na janela do PowerPivot. Isso permite que eles sejam calculados na atualização de arquivos, mas eles não precisarão recalcular para cada operação de slicer que remove a sobrecarga de desempenho de nossa medida dinâmica final. Por razões que eu venha para mais tarde, eu também preciso da data de término do mês na minha tabela de fatos como eu não posso usar a data de término do mês na minha tabela de datas em minhas medidas. No entanto, posso puxar o mesmo valor em toda a minha tabela FACTTran usando a seguinte medida: Então, o que são essas mesas de mesas não vinculadas A razão para essas tabelas deve tornar-se aparente à medida que avançamos. Em resumo, eles vão ser usados ​​como parâmetros ou títulos em nosso relatório. A razão que eles existem e que theyre não ligados ao resto dos nossos dados é simplesmente porque eu não quero que eles sejam filtrados por nossas medidas. Em vez disso, eu quero que eles conduzam a filtragem. Initial PivotTable Setup Vou mostrar uma série de dados organizados em colunas mensais. O usuário receberá os cortadores para definir a data de término do mês (o último período a ser mostrado no relatório), o número de períodos para a média móvel (que será, em última instância, parte do cálculo do divisor) eo número de períodos para a tendência O número de colunas mensais que iremos exibir na nossa tendência). Podemos estabelecer estas fatias imediatamente e ligá-las ao pivô. Eu obviamente preciso de uma data de fim de mês como um cabeçalho de coluna, mas que um Até certo ponto Ive dado isso afastado mais cedo. Em suma, eu preciso usar meu campo MADatesMonthEndDate. A razão é que este campo não está ligado ao nosso conjunto de dados e, portanto, não será afetado por quaisquer outros filtros. Se eu usar um campo de data que faz parte do meu conjunto de dados ou parte de uma tabela vinculada, os valores disponíveis podem ser filtrados pelas seleções de usuários. Eu posso contornar isso usando uma expressão ALL () para me dar os valores corretos, mas o problema é que a coluna ainda é filtrada e meus resultados serão exibidos em uma coluna. É difícil de explicar até que você vê-lo por favor, vá em frente e tentar o seu valor bater a parede de tijolos para realmente entender Calculando Soma de Vendas para Últimos X Meses A primeira parte da nossa equação é calcular o valor total para as vendas em todos os períodos dentro Um período de tempo dinâmico a ser selecionado pelo usuário. Para isso, eu uso uma função Calculate que se parece com isto: Im usando uma medida base chamada CascadeValueAll que foi criado em Profit amp Loss A arte do subtotal em cascata. Im, em seguida, filtrar essa medida para limitar o meu conjunto de dados para os registros que se relacionam com as vendas e um tipo de dados de real (ou seja, eliminar o orçamento). Esta é a filtragem simples de uma função CALCULATE. No entanto, ele fica um pouco mais saboroso com o terceiro filtro que limita o conjunto de dados para uma série de datas que são dependentes das seleções de usuários em fatias e nosso título de coluna de data. A função DATESBETWEEN tem a sintaxe DATESBETWEEN (datas, startdate, enddate) e funciona como este: Eu definir o campo que requer a filtragem (DatesData). Ive descobriu que isso funciona melhor se esta é uma tabela vinculada de datas seqüenciais, sem quebras. Se você tiver alguma pausa, há uma chance de você não obter uma resposta como a resposta que você avalia para tem que estar disponível na tabela. Minha data de início é uma função DATEADD que calcula a data do cabeçalho da coluna menos o número de meses que o usuário selecionou na slicer de número médio de períodos de movimento. Eu uso a função LASTDATE (VALUES (MADatesNextMonthStartDate)) para recuperar o valor NextMonthStartDate da tabela MADates que se refere à data representada no cabeçalho da coluna. Eu então rebobinar pelo número de meses selecionados no cortador usando MAX (MAFunctionPeriodsMovingAverageNoPeriods) -1. O -1 é usado para voltar no tempo. A razão de eu usar NextMonthStartDate e um múltiplo de 1 é mais claramente explicado em Slicers para selecionar últimos períodos X. Minha data final é simplesmente o MonthEndDate como mostrado no cabeçalho da coluna do relatório. Isso é calculado usando LASTDATE (VALORES (MADatesMonthEndDate). Isso é ótimo, mas minha medida não está tomando qualquer conta da minha seleção de Períodos de Exibição Até a seleção e do Número de Tendência de Períodos que Ive selecionado. Nós, portanto, precisamos limitar a medida para executar apenas quando certas Os parâmetros são mantidos como verdadeiros com base nessas seleções. Eu só quero que valores sejam exibidos quando a minha data de título da coluna for: Menor ou igual à Data de Término do Mês selecionada em meus Períodos de Exibição Até Slicer AND Maior que ou igual ao Mês Date LESS o número selecionado de períodos no meu Trend n º de períodos slicer. Para fazer isso, eu uso uma instrução IF para determinar quando a minha função CALCULATE deve executar. Leve chamar essa medida SalesMovingAverageTotalValue A declaração IF funciona da seguinte forma: Primeiro eu preciso determinar Que eu estou avaliando apenas onde eu tenho um valor para MADateMonthEndDate. Se eu não fizer isso, eu recebo que o velho erro favorito na minha avaliação subsequente que diz que uma tabela de vários valores foi fornecido Eu, em seguida, avaliar para determinar se a minha data título da coluna (VALUES (MADatesMonthEndDate) é menor ou igual à data selecionada no slicer Month End Period (LASTDATE (datesDateMonthEnd) AND (ampamp) A minha data do cabeçalho da coluna é maior ou igual a uma data calculada que é X períodos anteriores aos períodos de exibição selecionados Up To como selecionado no Slicer. Eu uso uma função DATEADD para este semelhante à usada na minha função CALCULATE, exceto que estavam ajustando a data pelo valor selecionado no Trend No of Periods slicer. Com isso em vigor, temos as vendas totais para o período selecionado relacionadas com as seleções dos usuários. Portanto, minha tabela agora está limitada ao número de períodos de tendência selecionados e representa a data final do mês selecionada. Então agora nós apenas dividimos por Moving Average Nº de Períodos Right eh NO Weve calculou nossas vendas totais para o período referente às seleções dos usuários. Você seria perdoado por sugerir que simplesmente dividir pelo número de média móvel períodos selecionados. Dependendo de seus dados, você poderia fazer isso, mas o problema é que o conjunto de dados pode não conter o número selecionado de períodos, especialmente se o usuário pode selecionar uma data de término do mês que vai voltar no tempo. Como resultado, precisamos descobrir como os períodos estão presentes em nossa medida SalesMovingAverageTotalValue. Esta medida é essencialmente a mesma que minha medida SalesMovingAverageTotal. A única diferença real é que contamos os valores de data distintos em nosso conjunto de dados ao contrário de chamar a medida CascadeValueAll. Eu mencionei mais cedo que havia uma razão porque eu necessitei a data de término do mês a ser prendida em minha tabela de FACTTran e este é porque. Se eu usar qualquer outra tabela segurando a data de término do mês, essa tabela não vai ter sido filtrada da maneira que o conjunto de dados principal foi filtrado. Como exemplo, minha tabela Datas tem uma série de datas que abrange o período de tempo do meu conjunto de dados e muito mais. Como resultado, a avaliação em relação a esta tabela deduzirá que a tabela de fato tem datas que precedem meu conjunto de dados e, portanto, não há nenhuma avaliação se existe uma transação mantida no conjunto de dados para essa data. Como você pode ver, desde o meu conjunto de dados é executado a partir de 1 de julho de 2009, eu só tenho 9 períodos de dados para avaliar para a minha 31/03/2010 coluna. Se eu tivesse dividido por 12 (como por meu Moving Average No of slicer seleção), eu teria uma resposta muito errada. Obviamente, isso é um pouco artificial, mas é digno de consideração. E agora o bocado simples Eu posso compreender que as duas últimas medidas tomaram alguma absorção, especialmente elaborando quando os campos específicos da data devem ser usados. Para algum alívio de luz, a próxima medida não vai realmente imposto você Esta é uma divisão simples com um pouco de verificação de erro para evitar qualquer nasties. Quando tudo estiver em conjunto Uma vez que todas estas medidas são portáteis, posso criar outra tabela dinâmica da mesma forma que a anterior (com o SalesMovingAverageValue dado um alias da média móvel), mover algumas coisas, adicionar uma medida para as vendas reais Valor para o mês (eu não vou entrar em que agora, mas é uma medida simples CALCULATE com algum tempo de inteligência) e eu, em seguida, reconfigurar para se parecer com o seguinte: Posso então dirigir um gráfico de linha simples e aplicar uma linha de tendência para a minha medida real Com o gráfico convenientemente escondendo a minha grade de dados que o impulsiona. Como você pode ver, uma tendência na minha medida real mostra um declínio constante. Minha Média Móvel, no entanto, mostra uma tendência relativamente estável, senão ligeiramente melhorando. A sazonalidade de alguns outros picos está, obviamente, envolvida e a realidade é que ambas as medidas provavelmente precisam ser revisadas lado a lado. Para aqueles de vocês que lêem isso que estão interessados ​​em ver a pasta de trabalho deste exemplo, vou olhar para postar isso em um post futuro quando eu tomar esta análise um passo adiante para cobrir toda a PampL. Desculpe por fazer você esperar. Espero que isso ajude você a descobrir BillD Um Mais Ponto a Nota Aqueles águia eyed DAX pros lá fora, provavelmente, percebi que as minhas funções IF só contêm um cálculo para avaliar quando o teste lógico chega a uma resposta verdadeira. A razão é que a função assume BLANK () quando uma condição de avaliação falsa isnt fornecida. Eu não consegui descobrir se há algum impacto no desempenho usando este método em grandes conjuntos de dados. É até você o que você escolheu fazer e se qualquer um pode convencer-me porque codificando a condição falsa como o BLANCO () é a mais melhor prática, mim mudará rapidamente meus hábitos Este borne tem 6 comentários Renato Lyke diz:

Comments

Popular Posts