Monday 3 June 2019

Agregação média móvel


Prático Rx Training London 6-7 de outubro de 2017 Apresentado pelo autor de IntroToRx Aggregation Data nem sempre é valioso é a sua forma bruta. Às vezes, precisamos consolidar, reunir, combinar ou condensar as montanhas de dados que recebemos em pedaços de tamanho de mordida mais consumíveis. Considere dados em rápida mudança de domínios como instrumentação, finanças, processamento de sinal e inteligência operacional. Esse tipo de dados pode mudar a uma taxa de mais de dez valores por segundo. Pode uma pessoa realmente consumir isso. Talvez para consumo humano, os valores agregados, como médias, mínimos e máximos, podem ser mais utilizados. Continuando com o tema da redução de uma seqüência observável, analisaremos as funções de agregação que estão disponíveis para nós em Rx. Nosso primeiro conjunto de métodos continua em nosso último capítulo, pois eles tomam uma seqüência observável e reduzem a sequência com um único valor. Em seguida, avançamos para encontrar operadores que possam transição de uma sequência para um valor escalar, uma dobra funcional. Antes de avançarmos para a introdução dos novos operadores, criaremos rapidamente nosso próprio método de extensão. Usaremos esse método de extensão Dump para ajudar a construir nossas amostras. Classe estática pública SampleExtentions public static void DumpltTgt (esta fonte ltTgt IObservable, nome de cadeia) console igt. WriteLine (--gt. Name, i), exgt Console. WriteLine (falhou - gt. Name, ex. Message), () Gt Console. WriteLine (nome completo)) Aqueles que usam LINQPad reconhecerão que esta é a fonte de inspiração. Para aqueles que não usaram o LINQPad, eu recomendo isso. É perfeito para extrair amostras rápidas para validar um fragmento de código. LINQPad também suporta totalmente o tipo IObservableltTgt. Count é um método de extensão muito familiar para aqueles que usam LINQ no IEnumerableltTgt. Como todos os bons nomes de métodos, ele faz o que diz na lata. A versão Rx se desvia da versão IEnumerableltTgt, pois Rx retornará uma seqüência observável, não um valor escalar. A sequência de retorno terá um único valor sendo a contagem dos valores na sequência de origem. Obviamente, não podemos fornecer a contagem até que a sequência de origem seja concluída. Números de var Observável. Range (0,3) Se você espera que sua seqüência tenha mais valores do que um inteiro de 32 bits pode ser mantido, existe a opção de usar o método de extensão LongCount. Isso é exatamente o mesmo que Count, exceto que ele retorna um IObservableltlonggt. Min, Max, Soma e Média Outras agregações comuns são Min. Max. Soma e Média. Assim como o Conde. Todos retornam uma seqüência com um único valor. Uma vez que a fonte complete a seqüência de resultados, ela produzirá seu valor e depois será completada. Números variáveis ​​novo Assunto lt int gt () Os métodos Min e Max têm sobrecargas que permitem que você forneça uma implementação personalizada de um IComparerltTgt para classificar seus valores de uma maneira personalizada. O método de extensão média calcula especificamente a média (em oposição à mediana ou ao modo) da seqüência. Para seqüências de números inteiros (int ou long), a saída de Média será um IObservableltdoublegt. Se a fonte for de inteiros nulos, a saída será IObservableltdoublegt. Todos os outros tipos numéricos (flutuante, duplo, decimal e seus equivalentes anuláveis) resultarão na sequência de saída do mesmo tipo que a seqüência de entrada. Dobras funcionais Finalmente chegamos ao conjunto de métodos em Rx que atendem à descrição funcional do catamorphismfold. Esses métodos tomarão um IObservableltTgt e produzirão um T. O cuidado deve ser prescrito sempre que usar qualquer um desses métodos de dobra em uma seqüência observável, pois todos estão bloqueando. A razão pela qual você precisa ter cuidado com os métodos de bloqueio é que você está passando de um paradigma assíncrono para um síncrono e, sem cuidado, você pode introduzir problemas de concorrência, como travar UIs e deadlocks. Examinaremos mais profundamente esses problemas em um capítulo posterior quando analisarmos a concorrência. Vale a pena notar que, em breve, o. NET 4.5 e o Rx 2.0 fornecerão suporte para evitar esses problemas de concorrência. O novo async aguarda palavras-chave e recursos relacionados no Rx 2.0 pode ajudar a sair da mônada de forma mais segura. O método de extensão First () simplesmente retorna o primeiro valor de uma seqüência. Intervalo var Observável. Intervalo (TimeSpan. FromSeconds (3)) Bloqueará para 3s antes de retornar Se a seqüência de origem não tiver nenhum valor (ou seja, uma seqüência vazia), o primeiro método lançará uma exceção. Você pode atender a isso de três formas: use blocos trycatch em torno da chamada First () Use Take (1) em vez disso. No entanto, isso será assíncrono, não bloqueando. Use o método de extensão FirstOrDefault em vez disso O FirstOrDefault ainda será bloqueado até que a fonte produza qualquer notificação. Se a notificação for um OnError, isso será lançado. Se a notificação for um OnNext, esse valor será retornado, caso contrário, se for OnCompleted, o padrão será retornado. Como vimos em métodos anteriores, podemos optar por usar o método sem parâmetros no qual o valor padrão será padrão (T) (ou seja, nulo para tipos de referência ou o valor zero para tipos de valor), alternativamente podemos fornecer nosso próprio padrão Valor para usar. Uma referência especial deve ser feita para o relacionamento exclusivo que o método de extensão BehaviorSubject e First () tem. A razão por trás disso é que o BehaviorSubject é garantido para ter uma notificação, seja um valor, um erro ou uma conclusão. Isso efetivamente remove a natureza de bloqueio do método First extension quando usado com BehaviorSubject. Isso pode ser usado para fazer com que assuntos de comportamento atuem como propriedades. O último e o LastOrDefault bloquearão até que a origem seja concluída e, em seguida, retornar o último valor. Assim como o método First (), qualquer notificação OnError será lançada. Se a sequência estiver vazia, Last () lançará uma InvalidOperationException. Mas você pode usar LastOrDefault para evitar isso. O método de extensão única é para obter o único valor de uma seqüência. A diferença entre isso e o primeiro () ou o último () é que ajuda a afirmar sua suposição de que a seqüência apenas conterá um único valor. O método irá bloquear até que a fonte produza um valor e depois seja concluída. Se a seqüência produzir qualquer outra combinação de notificações, o método será lançado. Este método funciona especialmente bem com as instâncias AsyncSubject, pois produzem apenas uma sequência de valores únicos. Crie suas próprias agregações Se as agregações fornecidas não atendem às suas necessidades, você pode criar o seu próprio. Rx fornece duas maneiras diferentes de fazer isso. O método Agregado permite que você aplique uma função de acumulação para a seqüência. Para a sobrecarga básica, você precisa fornecer uma função que leva o estado atual do valor acumulado e o valor que a seqüência está empurrando. O resultado da função é o novo valor acumulado. Esta assinatura de sobrecarga é a seguinte: ltTSourcegt IObservable AggregateltTSourcegt (essa fonte ltTSourcegt IObservable, Func ltTSource, TSource, TSourcegt acumulador) Se você quisesse produzir sua própria versão de Sum para valores int, você poderia fazê-lo, fornecendo uma função que apenas se adiciona a O estado atual do acumulador. Var sum source. Aggregate ((acc, currentValue) gt acc currentValue) Esta sobrecarga do agregado tem vários problemas. Primeiro, é necessário que o valor agregado seja do mesmo tipo que os valores de seqüência. Nós já vimos em outros agregados como Average, isso nem sempre é o caso. Em segundo lugar, essa sobrecarga precisa de pelo menos um valor a ser produzido a partir da fonte ou o erro de saída com um InvalidOperationException. Deve ser completamente válido para nós usar o Agregado para criar nosso próprio Conde ou Soma em uma seqüência vazia. Para fazer isso, você precisa usar a outra sobrecarga. Essa sobrecarga requer um parâmetro extra que é a semente. O valor da semente fornece um valor acumulado inicial. Ele também permite que o tipo agregado seja diferente do tipo de valor. IObservable ltTAccumulategt AggregateltTSource, TAccumulategt (esta fonte ltTSourcegt IObservable, Func ltTAccumulate, TSource, acumulador TAccumulategt) Para atualizar nossa implementação Sum para usar esta sobrecarga é fácil. Basta adicionar a semente que será 0. Isso retornará 0 como a soma quando a seqüência estiver vazia, o que é exatamente o que queremos. Você também agora também pode criar sua própria versão do Count. Var sum source. Aggregate (0, (acc, currentValue) gt acc currentValue) var count source. Aggregate (0, (acc, currentValue) gt acc 1) ou usando para significar que o valor não é usado. Var count source. Aggregate (0, (acc,) gt acc 1) Como um exercício, escreva seus próprios métodos Min e Max usando o Agregado. Você provavelmente encontrará a interface IComparerltTgt útil e, em particular, a propriedade ComparerltTgt. Default estática. Quando você fez o exercício, continue as implementações do exemplo. Exemplos de criação de Min e Max de Agregado. ITINERÁVEL IObservable ltTgt MyMinltTgt (esta fonte Itbservable ltTgt) source. Aggregate (0, (acc, current) gt acc current) é equivalente a source. Scan (0, (acc, current) gt acc current).TakeLast () Como outro Exercício, use os métodos que cobrimos até agora no livro para produzir uma seqüência de mínimos de execução e máximos em execução. A chave aqui é que cada vez que recebemos um valor inferior a (ou mais do que para um operador Max) nosso acumulador atual, devemos empurrar esse valor e atualizar o valor do acumulador. No entanto, não queremos empurrar valores duplicados. Por exemplo, dada uma seqüência de 2, 1, 3, 5, 0, devemos ver saída como 2, 1, 0 para o mínimo de execução e 2, 3, 5 para o máximo em execução. Não queremos ver 2, 1, 2, 2, 0 ou 2, 2, 3, 5, 5. Continuar a ver um exemplo de implementação. Exemplo de um mínimo de execução: comparador var ComparerltTgt. Default Func ltT, T, Tgt minOf (x, y) gt comparaisonpare (x, y) lt 0. x: y var min source. Scan (minOf) Enquanto as únicas diferenças funcionais entre Os dois exemplos estão verificando maior em vez de menos, os exemplos mostram dois estilos diferentes. Algumas pessoas preferem a sensação do primeiro exemplo, outros como suas chaves e a verbosidade do segundo exemplo. A chave aqui foi compor o método de digitalização com os métodos Distinct ou DistinctUntilChanged. Provavelmente, é preferível usar o DistinctUntilChanged para que, internamente, não possamos manter um cache de todos os valores. O Partition Rx também oferece a capacidade de particionar sua sequência com recursos como o operador padrão LINQ GroupBy. Isso pode ser útil para levar uma única seqüência e ventilação para muitos assinantes ou talvez tomar agregados em partições. MinBy e MaxBy Os operadores MinBy e MaxBy permitem que você particione sua seqüência com base em uma função de seleção de chave. As funções do seletor de teclas são comuns em outros operadores do LINQ, como o IEnumerableltTgt ToDictionary ou GroupBy e o método Distinct. Cada método irá retornar os valores da chave que era o mínimo ou o máximo, respectivamente. Retorna uma seqüência observável contendo uma lista de zero ou mais elementos que possuem um valor mínimo de chave. Public static IObservable ltIListltTSourcegtgt MinByltTSource, TKeygt (esta fonte Itbservable ltTSourcegt, Func ltTSource, TKeygt keySelector) Tome nota que cada operador Min e Max possui uma sobrecarga que possui um comparador. Isso permite comparar tipos personalizados ou classificação personalizada de tipos padrão. Considere uma seqüência de 0 a 10. Se aplicarmos um seletor de chave que divide os valores em grupos com base em seu módulo de 3, teremos 3 grupos de valores. Os valores e suas chaves serão os seguintes: Func lt int. Int gt keySelector i gt i 3 Podemos ver aqui que a chave mínima é 0 e a chave máxima é 2. Se, portanto, aplicamos o operador MinBy nosso valor único a partir da seqüência seria a lista de 0,3,6,9 . A aplicação do operador MaxBy produz a lista 2,5,8. Os operadores MinBy e MaxBy renderizarão apenas um valor único (como um AsyncSubject) e esse valor será um IListltTgt com zero ou mais valores. Se ao invés dos valores da chave máxima mínima, você queria obter o valor mínimo para cada chave, então você precisaria olhar para o GroupBy. O operador GroupBy permite que você particione sua seqüência exatamente como o operador do GroupBy do IEnumerableltTgt faz. Da mesma forma que o IEnumerableltTgt o operador retorna um IEnumerableltIGroupingltTKey, Tgtgt. O operador IObservableltTgt GroupBy retorna um IObservableltIGroupedObservableltTKey, Tgtgt. Transforma uma seqüência para uma seqüência de grupos observáveis, cada uma das quais corresponde a um valor de chave exclusivo, contendo todos os elementos que compartilham esse mesmo valor de chave. public static IObservable ltIGroupedObservableltTKey, TSourcegtgt GroupByltTSource, TKeygt (esta fonte IObservable ltTSourcegt, Func ltTSource, TKeygt keySelector) public static IObservable ltIGroupedObservableltTKey, TSourcegtgt GroupByltTSource, TKeygt (esta fonte IObservable ltTSourcegt, Func ltTSource, TKeygt keySelector, IEqualityComparer ltTKeygt comparer) public static IObservable ltIGroupedObservableltTKey , TElementgtgt GroupByltTSource, TKey, TElementgt (esta fonte IObservable ltTSourcegt, Func ltTSource, TKeygt keySelector, Func ltTSource, TElementgt elementSelector) public static IObservable ltIGroupedObservableltTKey, TElementgtgt GroupByltTSource, TKey, TElementgt (esta fonte IObservable ltTSourcegt, Func ltTSource, TKeygt keySelector, Func ltTSource , TElementgt elementSelector, IEqualityComparer ltTKeygt, comparador) Eu acho as duas últimas sobrecargas um pouco redundantes, pois facilmente podemos simplesmente compor um operador Select para a consulta para obter a mesma funcionalidade. Da mesma forma que o IGroupingltTKey, o tipo Tgt amplia o IEnumerableltTgt. O IGroupedObservableltTgt apenas estende o IObservableltTgt adicionando uma propriedade Key. O uso do GroupBy efetivamente nos dá uma seqüência observável aninhada. Para usar o operador GroupBy para obter o valor mínimo máximo para cada tecla, podemos primeiro particionar a sequência e, em seguida, Min Max cada partição. Var source Observable. Interval (TimeSpan. FromSeconds (0.1)). Pegue (10) var group source. GroupBy (i gt i 3) Console. WriteLine (valor min. Grp. Key, minValue)), () gt Console. WriteLine (Completado)) O código acima funcionaria, mas não é uma boa prática ter essas chamadas de assinatura aninhadas. Perdemos o controle da assinatura aninhada, e é difícil de ler. Quando você se encontra criando inscrições aninhadas, você deve considerar como aplicar um padrão melhor. Neste caso, podemos usar SelectMany, que vamos ver no próximo capítulo. Var Origem Observável. Intervalo (TimeSpan. FromSeconds (0.1)). Pegue (10) var group source. GroupBy (i gt i 3) Observações aninhadas O conceito de uma seqüência de seqüências pode ser um tanto irresistível no início, especialmente se ambos os tipos de seqüência São IObservable. Embora seja um tópico avançado, vamos abordá-lo aqui, pois é uma ocorrência comum com o Rx. Eu acho mais fácil se eu posso conceituar um cenário ou exemplo para entender melhor os conceitos. Exemplos de Observables de Observables: partições de dados Você pode particionar dados de uma única fonte para que possa ser facilmente filtrada e compartilhada em muitas fontes. Os dados de particionamento também podem ser úteis para agregados como já vimos. Isso geralmente é feito com o operador GroupBy. Servidores de jogos online Considere uma seqüência de servidores. Novos valores representam um servidor online. O valor em si é uma seqüência de valores de latência que permite ao consumidor ver informações em tempo real de quantidade e qualidade de servidores disponíveis. Se um servidor desceu, a sequência interna pode significar isso ao completar. Fluxos de dados financeiros Novos mercados ou instrumentos podem abrir e fechar durante o dia. Estes, em seguida, transmitiriam informações de preços e poderiam ser concluídas quando o mercado fechar. Sala de bate-papo Os usuários podem participar de um bate-papo (sequência externa), deixar mensagens (seqüência interna) e deixar um bate-papo (completando a seqüência interna). Observador de arquivos À medida que os arquivos são adicionados a um diretório, eles podem ser vistos para modificações (seqüência externa). A seqüência interna pode representar mudanças no arquivo, e completar uma seqüência interna pode representar a exclusão do arquivo. Considerando esses exemplos, você pode ver o quão útil pode ser o conceito de observáveis ​​aninhados. Há um conjunto de operadores que funcionam muito bem com observáveis ​​aninhados como SelectMany. Fusão e mudança que olhamos nos futuros capítulos. Ao trabalhar com observáveis ​​aninhados, pode ser útil adotar a convenção de que uma nova seqüência representa uma criação (por exemplo, uma nova partição é criada, o novo host do jogo vem online, um mercado abre, os usuários se juntam a um bate-papo, criando um arquivo em um relógio diretório). Você pode então adotar a convenção para o que representa uma seqüência interna completa (por exemplo, o host do jogo está desconectado, o Mercado fecha, o bate-papo do usuário, o arquivo que está sendo assistido é excluído). A grande coisa com observáveis ​​aninhados é que uma seqüência interna completa pode efetivamente ser reiniciada criando uma nova seqüência interna. Neste capítulo, estamos começando a descobrir o poder do LINQ e como ele se aplica ao Rx. Nós encadearam métodos juntos para recriar o efeito que outros métodos já fornecem. Embora isso seja academicamente agradável, também nos permite começar a pensar em termos de composição funcional. Nós também vimos que alguns métodos funcionam bem com certos tipos: First () BehaviorSubjectltTgt. Single () AsyncSubjectltTgt. Single () Aggregate () etc. Cobrimos a segunda das nossas três classificações de operadores, o catamorphism. Em seguida, descobriremos mais métodos para adicionar ao nosso cinto de ferramentas de composição funcional e também descobrimos como a Rx trata do nosso terceiro conceito funcional, vinculativo. A consolidação de dados em grupos e agregados permite o consumo sensível de dados de massa. Os dados em movimento rápido podem ser muito esmagadores para sistemas de processamento em lote e consumo humano. O Rx oferece a capacidade de agregação e partição on-line, permitindo relatórios em tempo real sem a necessidade de produtos CEP ou OLAP caros. O readDAX recomendado adicional 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 requerem 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. Você pode usar as 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 valores de texto e não-numéricos (valores de texto não-numéricos e vazios como 0). AVERAGEX. Calcule a média em uma expressão avaliada em 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 este 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 para usar na média. Por exemplo, a seguinte fórmula calcula a média móvel dos últimos 7 dias, assumindo que você está usando uma tabela de data em 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 essa abordagem alternativa no padrão completo de média móvel. Você pode usar as funções DAX padrão para calcular a variância de um conjunto de valores. VAR. S. Retorna a variância de valores em uma coluna que representa uma amostra de população. VAR. P. Retorna a variância de valores em uma coluna que representa a população inteira. VARX. S. Retorna a variância de uma expressão avaliada em uma tabela que representa uma amostra de população. VARX. P. Retorna a variância de uma expressão avaliada em uma tabela que representa toda a população. Desvio padrão Você pode usar as funções DAX padrão 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 amostra de população. STDEV. P. Retorna o desvio padrão dos valores em uma coluna que representa toda a população. STDEVX. S. Retorna o desvio padrão de uma expressão avaliada em uma tabela que representa uma amostra de população. STDEVX. P. Retorna o desvio padrão de uma expressão avaliada em uma tabela que representa toda a população. A mediana é o valor numérico que separa a metade mais alta de uma população da metade inferior. Se houver um número ímpar de linhas, a mediana é o valor do meio (classificando as linhas do valor mais baixo para o valor mais alto). Se houver um número par de linhas, é a média dos dois valores médios. A fórmula ignora os 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 e a fórmula DAX correspondente para o cálculo mediano. Figura 1 Exemplo de cálculo mediano no Excel e DAX. O modo é o valor que aparece mais frequentemente em um conjunto de dados. A fórmula ignora os 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 há 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 do modo. Figura 2 Exemplo de cálculo do modo no Excel e no DAX. Percentile O percentil é o valor abaixo do qual uma determinada porcentagem de valores em um grupo cai. A fórmula ignora os 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. Os quartis são três pontos que dividem um conjunto de valores em quatro grupos iguais, cada grupo que compreende uma quarta parte dos dados. Você pode calcular os quartis usando o padrão de 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 implementações diferentes dependendo de modelos de dados e outros requisitos. Média móvel Normalmente, você avalia a média móvel fazendo referência ao nível de granularidade do dia. O modelo geral da fórmula a seguir possui esses marcadores: ltnumberofdaysgt é o número de dias para a média móvel. Ltdatecolumngt é a coluna de data da tabela de data se você tiver uma, ou a coluna de data da tabela que contém valores se não houver uma 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 seguinte modelo 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 possui 0 valor. Isso pode acontecer somente quando você possui uma tabela de datas separada, que pode conter dias para os quais não há transações correspondentes. Você pode corrigir o denominador para a média usando apenas o número de dias para os quais há transações usando o seguinte padrão, onde: ltfacttablegt é a tabela relacionada à tabela de datas e contendo 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 normal, enquanto você pode aplicar o padrão descrito acima também a tabelas de datas não regulares e a modelos que não possuem tabela de data. 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, esta data está incluída na tabela de datas, portanto, há 7 dias (de 11 de setembro a 17 de setembro) com apenas 6 dias com dados. Figura 3 Exemplo de um cálculo da Média Mover considerando e ignorando datas sem vendas. A Medida média móvel de 7 dias tem um número menor entre 11 de setembro e 17 de setembro, porque considera o 11 de setembro como um dia com 0 vendas. Se quiser ignorar dias sem vendas, use a medida Média móvel 7 dias sem zero. Esta poderia ser a abordagem certa quando você tiver uma tabela de data completa, mas deseja ignorar dias sem transações. Usando a fórmula de média móvel de 7 dias, o resultado está correto porque o AVERAGEX considera automaticamente 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, data ou 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, substitua ltnumberofdaysgt por uma medida que implementa o padrão da Tabela de Parâmetros). A mediana corresponde ao percentil 50, que você pode calcular usando o padrão Percentile. No entanto, o padrão Mediano permite otimizar e simplificar o cálculo mediano usando uma única medida, em vez das diversas medidas exigidas pelo padrão Percentile. Você pode usar essa abordagem quando você calcula a mediana para os valores incluídos em ltvaluecolumngt, conforme mostrado abaixo: Para melhorar o desempenho, você pode querer persistir o valor de uma medida em uma coluna calculada, se desejar 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 seguinte modelo, usando esses marcadores: ltgranularitytablegt é a tabela que define a granularidade do cálculo. Por exemplo, pode ser a tabela Data se você deseja calcular a mediana de uma medida calculada no nível do dia, ou pode ser VALORES (8216DateYearMonth) se você deseja calcular a mediana de uma medida calculada no nível do mês. Ltmeasuregt é a medida para calcular para cada linha de ltgranularitytablegt para o cálculo mediano. Ltmeasuretablegt é a tabela que contém dados usados ​​pelo ltmeasuregt. Por exemplo, se o ltgranularitytablegt for uma dimensão como 8216Date8217, então o ltmeasuretablegt será 8216Internet Sales8217 contendo a coluna de Quantidade de Vendas da Internet somada pela medida Total de Vendas da Internet. Por exemplo, você pode escrever a mediana de Internet Total Sales para todos os Clientes em Adventure Works da seguinte maneira: Dica O seguinte padrão: é usado para remover linhas de ltgranularitytablegt que não possuem 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 CALCULATETÁVEL com apenas ltgranularitytablegt se você quiser considerar os valores em branco do ltmeasuregt como 0. O desempenho da fórmula MedianX depende do número de linhas no Mesa iterada e sobre a complexidade da medida. Se o desempenho for ruim, você pode persistir o resultado do ltmeasuregt em uma coluna calculada do lttablegt, mas isso eliminará a capacidade de aplicar filtros ao cálculo mediano no momento da consulta. O Percentile Excel possui duas implementações diferentes do cálculo percentil com três funções: PERCENTILE, PERCENTILE. INC e PERCENTILE. EXC. Todos retornam o percentil K dos valores, onde K está no intervalo de 0 a 1. A diferença é que PERCENTILE e PERCENTILE. INC consideram K como um intervalo inclusivo, enquanto PERCENTILE. EXC considera o intervalo K de 0 a 1 como exclusivo . Todas essas funções e suas implementações DAX recebem um valor percentil como parâmetro, o que chamamos de valor do percentil K. ltKgt está no intervalo de 0 a 1. As duas implementações DAX do percentil requerem algumas medidas 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. ValueHigh. O valor acima da posição percentil. Percentile. O cálculo final do percentil. Você precisa das medidas ValueLow e ValueHigh caso o PercPos contenha uma parte decimal, pois então você deve interpolar entre ValueLow e ValueHigh para retornar o valor percentile correto. A Figura 4 mostra um exemplo dos cálculos feitos com fórmulas de Excel e DAX, usando ambos algoritmos de percentil (inclusivo e exclusivo). Figura 4 Cálculos de percentil usando fórmulas do Excel e o cálculo equivalente do DAX. 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 granularidade dada. Percentile Inclusive The Percentile A implementação inclusiva é a seguinte. Percentile Exclusive O Percentile A implementação exclusiva é a seguinte. PercentileX Inclusive A implementação de 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 Data se você deseja calcular o percentil de uma medida no nível do dia, ou pode ser VALORES (8216DateYearMonth) se você deseja calcular o percentil de uma medida no nível do mês. Ltmeasuregt é a medida para calcular para cada linha de ltgranularityablegt para cálculos percentis. Ltmeasuretablegt é a tabela que contém dados usados ​​pelo ltmeasuregt. Por exemplo, se o ltgranularitytablegt for uma dimensão tal como 8216Date, 8217, o ltmeasuretablegt será 8216Sales8217 contendo a coluna Montante somada pela medida Total Montante. Por exemplo, você pode escrever o PercentileXInc da quantidade total de vendas para todas as datas na tabela de data da seguinte forma: PercentileX Exclusive A implementação exclusiva do PercentileX é baseada no modelo a seguir, usando os mesmos marcadores usados ​​no PercentileX Inclusive: por exemplo, você Pode escrever o PercentileXExc do valor total das vendas para todas as datas na tabela de data da seguinte forma: Mantenha-me informado sobre os próximos padrões (boletim informativo). Desmarque para baixar livremente o arquivo. Publicado em 17 de março de 2017 por

No comments:

Post a Comment