Saturday 16 September 2017

Movendo Média Powerpivot


SQL Server Denali PowerPivot Alberto Ferrari já escreveu sobre o cálculo de médias móveis em DAX usando uma coluna calculada. Eu gostaria de apresentar uma abordagem diferente aqui usando uma medida calculada. Para a média móvel I8217m calculando uma média móvel diária (nos últimos 30 dias) aqui. Para o meu exemplo, I8217m usando o livro PowerPivot que pode ser baixado como parte dos Projetos de Modelos Tabulares SSAS das amostras Denali CTP 3. Nesta publicação, I8217m desenvolvendo a fórmula passo a passo. No entanto, se você estiver com pressa, você pode querer diretamente para os resultados finais abaixo. Com o ano de calendário de 2003 no filtro, a data em colunas e o valor das vendas (da tabela de Vendas na Internet) nos detalhes, os dados da amostra se parecem com isto: Em cada contexto da linha8217s, a expressão DateDate fornece o contexto atual, ou seja, a data dessa linha . Mas, a partir de uma medida calculada, não podemos referir esta expressão (como não existe uma linha atual para a tabela Data), em vez disso, devemos usar uma expressão como LastDate (DateDate). Então, para obter os últimos trinta dias, podemos usar essa expressão. Agora, podemos resumir nossas vendas na internet para cada um desses dias usando a função de resumo: Resumir (160 DatasInPeriod (DateDate, LastDate (DateDate), - 30, DIA) 160, DateDate 160. quotSalesAmountSumquot 160. Sum (Internet SalesSales Amount)) E, finalmente, usamos a função DAX AverageX para calcular a média desses 30 valores: Quantidade de Vendas (30d avg): AverageX (160 Summarize (160160160 DatesInPeriod (DateDate, LastDate (DateDate), - 30, DIA) 160160160, DateDate 160160160. quotSalesAmountSumquot 160160160. Soma (Internet SalesSales Amount) 160) 160, SalesAmountSum) Este é o cálculo que estamos usando na nossa tabela de vendas na Internet, conforme mostrado na imagem abaixo: Ao adicionar este cálculo à tabela dinâmica a partir de cima, o resultado parece assim: Olhando para o resultado, parece que não temos dados antes de 1º de janeiro de 2003: o primeiro valor para a média móvel é idêntico ao valor do dia ( Lá estão E nenhuma linha antes dessa data). O segundo valor para a média móvel é na verdade a média dos dois primeiros dias e assim por diante. Isso não é bastante correto, mas I8217m voltando a esse problema em um segundo. A captura de tela mostra a computação para a 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 captura de tela a seguir, usei duas categorias de produtos para a série de dados: como nossa medida calculada funciona em níveis de agregação maiores Para descobrir, I8217m usando a hierarquia do Calendário nas linhas (em vez da data). Por simplicidade, removi os níveis de semestre e trimestre usando as opções da tabela dinâmica do Excel8217s (opção de campos de exibição). 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 em janeiro (valor de 14,215.01 também aparece na captura de tela acima como valor para 31 de janeiro). Se este fosse o requisito de negócios (o que parece razoável para uma média diária), a agregação funciona bem em um nível mensal (caso contrário, teremos que ajustar nosso cálculo e este será um tópico da próxima publicação). Mas, embora a agregação faça sentido em um nível mensal, se expandimos essa visão para o nível do dia, você observa que nossa medida calculada simplesmente retorna o valor das vendas para esse dia, e não a média dos últimos 30 dias. Como isso pode ser. O problema resulta do contexto em que calculamos a nossa soma, como destacado no seguinte código: Valor de Vendas (30d avg): AverageX (160 Resumir (160160160 datasinperiod (DateDate, LastDate (DataDate), - 30, DIA) 160160160, DateDate 160160160. quotSalesAmountSumquot 160160160. Soma (Internet SalesSales Amount) 160) 160, SalesAmountSum) Uma vez que avaliamos essa expressão ao longo do período de datas, o único contexto que é substituído aqui é DateDate. Em nossa hierarquia, utilizamos diferentes atributos de nossa dimensão (Ano Calendário, 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 o contexto atual do dia8217s ainda está presente para cada linha. Para deixar as coisas claras, desde que avaliemos esta expressão fora do contexto de uma data, tudo está bem à medida que a seguinte consulta DAX é executada pelo Management Studio na perspectiva de vendas da Internet do nosso modelo (usando o banco de dados tabular com os mesmos dados ): Avaliar (160160160 Resumir (160160160160160160160 datasinperiod (DateDate, date (2003,1,1), - 5, DIA) 160160160160160160160, DateDate 160160160160160160160. quotSalesAmountSumquot 160160160160160160160. Sum (Internet SalesSales Amount) 160160160)) Aqui, reduzi o período de tempo Para 5 dias e também definir uma data fixa, pois LastDate (8230) resultaria na última data da minha tabela de dimensão da data para a qual nenhum dado está presente nos dados da amostra. Aqui está o resultado da consulta: No entanto, depois de configurar um filtro para 2003, nenhuma linha de dados fora de 2003 será incluída na soma. Isso explica a observação acima: parecia que só temos dados a partir de 1º de janeiro de 2003. E agora, sabemos o porquê: o ano de 2003 estava no filtro (como você pode ver na primeira captura de tela desta postagem) e Portanto, estava presente no cálculo da soma. Agora, tudo o que temos a fazer é se livrar desses filtros adicionais, porque nós já filtramos nossos resultados por Data. A maneira mais fácil de fazer isso é usar a função Calcular e aplicar ALL (8230) para todos os atributos para os quais queremos remover o filtro. Como temos alguns desses atributos (Ano, Mês, Dia, Dia da Semana, 8230) e queremos remover o filtro de todos eles, mas o atributo de data, a função de atalho ALLEXCEPT é muito útil aqui. Se você tiver um fundo MDX, você se perguntará por que nós não precisamos ter um problema semelhante ao usar o SSAS no modo OLAP (BISM Multidimensional). A razão é que o nosso banco de dados OLAP tem relações de atributos, então, depois de definir o atributo data (chave), os outros atributos também são alterados automaticamente e nós não precisamos cuidar disso (veja minha postagem aqui). Mas, no modelo tabular, não temos relacionamentos de atributos (nem mesmo um verdadeiro atributo de chave) e, portanto, precisamos eliminar filtros indesejados de nossos cálculos. Então, aqui estamos com o valor das vendas 8230 (30d avg): AverageX (160 Resumir (160160160 datesinperiod (DateDate, LastDate (DataDate), - 30, DIA) 160160160, DateDate 160160160. quotSalesAmountSumquot 160160160. calcular (Sum (Internet SalesSales Amount) , ALLEXCEPT (Date, DateDate)) 160), SalesAmountSum) E esta é a nossa tabela dinâmica final no Excel: para ilustrar a média móvel, aqui é o mesmo extrato de dados em uma vista de gráfico (Excel): embora filtrássemos nossos dados em 2003, a média móvel para os primeiros 29 dias de 2003 corretamente leva em conta os dias correspondentes de 2002. Você reconhecerá os valores dos 30 e 31 de janeiro da nossa primeira abordagem, pois foram os primeiros dias para os quais nosso primeiro cálculo teve uma quantidade suficiente de dados (30 dias completos). Estou tentando criar uma média móvel no meu modelo. Procurando ajuda. Eu tentei seguir os detalhes no blog de Alberto Ferraris aqui. Mas não consegui melhorar a medida DayNumber, a sintaxe não pareceu correta e não consegui corrigi-la. Meu modelo possui uma tabela de fatos contendo uma lista de casos, juntando-se a uma tabela de data na Data criada. Eu tenho um segundo relacionamento (Inativo) na tabela Data na coluna ClosedDate. Eu tenho uma medida: Case Closed Count: CALCULATE (COUNTROWS (Case), USERELATIONSHIP (CaseClosedDateKey, DateDateKey)). Gostaria de obter uma medida recebendo a soma de Case Closed Count nos últimos três dias do contexto atual. Eu então planejo dividir esse número em 3 para obter a média móvel de 3 dias. Uma outra parte da lógica que eu gostaria de considerar - se o último dia é HOJE, os 3 dias anteriores são usados ​​- os dados são atualizados a cada 15 minutos, de modo que, às 09:00 da manhã, desviaria a média, como Não é um dia totalmente completo. Qualquer assistência é apreciada. Domingo, 17 de fevereiro de 2013 5:25 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 Favor marcar respostas corretas e postagens úteis brentgreenwood. blogspot Editado por Brent Greenwood Editor segunda-feira, 18 de fevereiro de 2013 4:08 PM Proposta como resposta por Ed Price - MSFT empregado da Microsoft, proprietário quinta-feira, 22 de agosto, 2013 7:39 PM Marcado como resposta por Ed Price - empregado Microsoft MSFT, proprietário Terça-feira, 17 de setembro de 2013 6:39 AM Segunda-feira, 18 de fevereiro de 2013 4:08 PM Em sua postagem, Alberto faz uso da função EARLIER que retorna Um valor de um contexto de linha anterior. Isso funciona apenas em uma expressão de iteração, quando esta expressão é avaliada em um contexto de linha existente (outra expressão de iteração ou uma coluna calculada). O seguinte satisfaz o requisito (não testado) Contagem fechada de caso - Últimos 3 dias: CALCULAR ( PAÍSES (Caso). USERELATIONHIP (CaseClosedDateKey, DateDateKey). DATESBETWEEN (DATEADD (DateDateKey, -3, Day). DateDateKey)) O último pode ser feito com uma expressão IF usando a função HOJE () e a adaptação do padrão acima. Proposta como resposta por Ed Price - empregado MSFT Microsoft, proprietário Quinta-feira, 22 de agosto de 2013 7:40 PM Segunda-feira, 18 de fevereiro de 2013 11:51 AM 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 Favor marcar respostas corretas e postagens úteis brentgreenwood. blogspot Editado por Brent Greenwood Editor segunda-feira, 18 de fevereiro de 2013 4:08 PM Proposta como resposta por Ed Price - MSFT empregado da Microsoft, proprietário quinta-feira, 22 de agosto, 2013 7:39 PM Marcado como resposta por Ed Price - empregado Microsoft MSFT, proprietário Terça-feira, 17 de setembro de 2013 6:39 AM Segunda-feira, 18 de fevereiro de 2013 4:08 PMPost navigation Cálculo de uma média móvel no PowerPivot Há duas semanas prometi Fale sobre como gerar uma média móvel no PowerPivot, mas na semana passada eu me desviei informando sobre uma ótima maneira de exibir vídeos do YouTube em suas páginas do SharePoint usando uma parte da web encontrada no CodePlex que alguns dos membros da minha equipe de trabalho encontraram. Era tão fácil de implementar, eu só tinha que compartilhá-lo com todos vocês. No entanto, retornando ao tópico do cálculo de uma média móvel, a primeira pergunta pode ser o que é uma média móvel e, em seguida, por que você quer usar uma. Uma média móvel é simplesmente a soma de dois ou mais valores dependentes do tempo em que a soma é então dividida pelo número de valores utilizados. Por exemplo, se eu estivesse falando sobre os preços das ações, talvez eu queira usar algo como uma média móvel de 7 dias para atenuar o efeito de picos de dia individuais ou quedas no preço das ações que não são indicativos da tendência geral de estoque. (Alguns investidores de longo prazo usam médias móveis ainda mais longas.) Isso não significa que, se um estoque cair ou diminuir, eu me sentaria até que a média móvel me diga para agir. Qualquer investidor de boa ação irá dizer-lhe que existem muitos outros fatores internos e externos a uma empresa que poderia forçar sua mão para vender ou comprar qualquer estoque específico. Mas o ponto é, e esta é a resposta para a segunda pergunta, uma média móvel atenua a aleatoriedade para que eu possa ver mais facilmente o padrão geral dos números que eu estou rastreando. Ok, então suponho que eu trabalho para a Contoso e queria saber se as vendas estão subindo, caindo ou geralmente planas. Se eu olhar para as vendas diárias, é provável que os números flutuem para cima e para baixo em nenhum padrão específico impedindo-me de detectar uma tendência geral. A figura a seguir mostra as vendas contábeis diárias da Contoso durante um período de 3 meses durante o verão de 2008. Eu escolhi mostrar os dados como um gráfico para ajudar a mostrar como as vendas flutuam por dia revelando informações que eu não poderia ver tão facilmente que eu Criou uma tabela dos mesmos valores. Claro, eu poderia traçar um ano inteiro ou mais, mas para ver dias individuais, eu teria que ampliar o gráfico substancialmente. No entanto, mesmo com este período de tempo menor, posso ver que as vendas flutuam bastante bem. Mas eu posso pedir que as vendas aumentem, diminuam ou permaneçam iguais. Se eu tiver um bom olho, posso dizer que as vendas atingem o pico em relação ao final de julho e, em seguida, recuam um pouco enquanto o gráfico se move em agosto. Mas isso não é tão óbvio quanto o fato de que há uma grande quantidade de flutuações diárias. Então, como posso exibir as tendências visualmente com o Moving Average Sales. Agora, com o propósito desta ilustração, vou criar uma média móvel de quatro dias, mas honestamente, não há um número certo de períodos em uma média móvel. Na verdade, eu deveria experimentar diferentes períodos de tempo para ver qual período de tempo me permite detectar não só as tendências gerais, mas também neste caso, onde estou exibindo vendas na loja, em mudanças sazonais. Eu já sei que se eu exibir dados por dia, eu posso usar a seguinte fórmula para calcular as vendas diárias de apenas nosso canal de loja. (Sim, eu poderia simplesmente usar o SalesAmount e aplicar um slicer de canais para usar apenas as vendas da loja, mas deixa o exemplo.) Posso então usar essa medida calculada para calcular as vendas de dias anteriores para qualquer dia criando a seguinte medida. StoreSales1DayAgo: CALCULATE (StoreSales, DATEADD (DimDateDateKey, -1, dia)) Você pode adivinhar que a fórmula para calcular as vendas há dois dias e três dias, respectivamente: StoreSales2DayAgo: CALCULATE (StoreSales, DATEADD (DimDateDateKey, - 2, dia)) StoreSales3DayAgo: CALCULATE (StoreSales, DATEADD (DimDateDateKey, -3, dia)) Com estes quatro valores calculados para cada dia, posso calcular a soma desses valores e dividir por 4 para obter uma média móvel de 4 dias usando O seguinte valor calculado: FourDayAverage: (StoreSales StoreSales1DayAgo StoreSales2DayAgo StoreSales3DayAgo) 4.0 Agora, se eu voltar para a página do meu gráfico, eu deveria ver que o Excel atualiza a lista de campos para incluir as novas medidas calculadas. Se eu adicionar o campo FourDayAverage à caixa Valores criando uma segunda série no gráfico, agora tenho as vendas diárias reais e a média móvel de quatro dias exibida no mesmo gráfico. O único problema é que eu também gostaria de alterar o formato do gráfico para exibir as vendas diárias (minha primeira série de dados) como colunas e minha média móvel (minha segunda série de dados) como uma linha. Quando eu clicar com o botão direito do mouse no gráfico e selecionar Alterar tipo de gráfico, eu posso selecionar Combo como o tipo de gráfico como mostrado na figura a seguir. Nesse caso, o gráfico da Linha de Colunas em Cluster é exatamente o que eu quero. Como adicionei a série de média móvel à última área de Valores, torna-se, por padrão, a linha e todas as outras séries de dados aparecem como colunas em cluster. Como eu só tenho um valor para cada dia, o gráfico mostra uma coluna individual por dia. Se eu tivesse inserido minhas séries de dados na área de Valores na ordem errada, eu poderia simplesmente usar essa caixa de diálogo para selecionar o tipo de gráfico para cada série. Quando eu clicar em OK nesta caixa de diálogo, meu gráfico agora se parece com o seguinte, o que mostra mais claramente a maior tendência geral e menor flutuação diária. Mas espere, há uma maneira mais fácil de fazer isso. Por que sim existe. Mas para aprender a fazer isso, você terá que esperar até a semana que vem. Postar navegação Meus arquivos Assinatura de e-mail Tópicos sobre os quais eu falo

No comments:

Post a Comment