Нахождение процентиля вычисленной меры в PowerPivot / DAX

#dax #powerpivot

#dax #powerpivot

Вопрос:

Ниже приведена таблица, похожая на набор данных, над которым я работаю (хотя и намного проще), для которой я хотел бы рассчитать некоторые меры, а затем найти процентили мер.

 Table Name: Data
Owner  AgeRating   OtherRating
  A        1            2
  A        4            4
  A        4            6
  B        3            3
  B        3            9
  B        7            4
  C        8            8
  C        4            2
  

Сначала — небольшая справка: я начинаю с того, что беру среднее значение оценок (по владельцу), а затем нормализую все оценки, деля каждый рейтинг на максимальный рейтинг владельца — это создает меру, из которой я хотел бы получить процентиль:

 NormAgeRating=
average(Data[AgeRating])/
calculate(
    maxx(
        SUMMARIZE(Data,[Owner],"avg",average([AgeRating]))
       ,[avg]
    )
   ,all(Data[owner])
)
  

У меня есть сводная таблица, владельцем которой являются строки, которая затем выглядит как

 Owner NormAgeRating
 A        .5
 B       .72
 C        1
  

Теперь вопрос:
Я хотел бы получить .33 percentile.inc нового NormAgeRating . Я хотел бы использовать это, чтобы классифицировать каждого владельца по группам (<= 33% ile или> 33% ile)
Это то, к чему я пытаюсь добраться:

 Owner NormAgeRating   33%ile   classification
 A        .5            .64     bottom
 B       .72            .64     top
 C        1             .64     top
  

Я безуспешно пробовал это и многие другие варианты с разными groupby и т. Д. И Постоянно получаю неправильное значение:

 33%ile=percentilex.inc(all(data[owner]),[NormAgeRating],0.33)
  

Любая помощь будет с благодарностью

Обновление: когда я пытаюсь sumx countx и averagex в форме:

 =
averagex(
    SUMMARIZE(
        all(Data[Owner]),
        [Owner],
        "risk",[NormAgeRating]),
    [risk]
)
  

Я получаю правильные значения, поэтому я не уверен, почему использование percentilex.inc/exc приведет к неправильным значениям…

Ответ №1:

ПРОЦЕНТИЛЕКС (и все функции итератора) обрабатывает строку за строкой в таблице в первом аргументе. Поэтому вам нужно, чтобы эта таблица имела желаемую степень детализации, прежде чем пытаться вычислить процентиль, что означает, что вам нужно суммировать Data[Owner] , чтобы у вас была уникальная строка для каждого владельца, а не перебирать необработанный столбец.

Имея это в виду, обе меры могут быть записаны аналогично:

 NormAgeRating = 
DIVIDE (
    AVERAGE ( Data[AgeRating] ),
    MAXX (
        SUMMARIZE (
            ALL ( Data[Owner] ),
            Data[Owner],
            "Avg", AVERAGE ( Data[AgeRating] )
        ),
        [Avg]
    )
)

33%ile = 
PERCENTILEX.INC (
    SUMMARIZE (
        ALL ( Data[Owner] ),
        Data[Owner],
        "Risk", [NormAgeRating]
    ),
    [Risk],
    0.33
)
  

Комментарии:

1. Привет, Алексис — Спасибо за ответ. Я попробовал это точно, и столбец оказался пустым без значений. Смотрите Обновление выше, я смог использовать тот же метод только с averagex, и он дал мне правильный ответ. Есть ли какое-либо ограничение для процентилекса, о котором я не знаю?

2. Это сработало для меня, когда я реплицировал данные вашего примера. Возможно, с вашим PBIX происходит что-то, чего не видно из того, что вы показали. i.stack.imgur.com/M6je0.png