Вычисления в контексте строки и особенности работы CALCULATE

Всем привет!

Сегодня поговорим о том, каким образом работает функция CALCULATE при её использовании в расчётах, которые выполняются в контексте строки, а конкретно в вычисляемых столбцах.

Если Вы заглянули на эту страницу, то наверняка знаете, что функция CALCULATE позволяет изменить контекст расчёта при помощи фильтров, а при использовании в контексте строки — выполняет преобразование контекста строки в контекст фильтра. Базовые сценарии использования CALCULATE достаточно просты для освоения и понимания, а вот понять и принять то, как работает преобразование контекста уже сложнее. Давайте разбираться.

Рис. 1. Пример данных

Как Вы видите, набор данных достаточно простой. Допустим, я хочу рассчитать какую долю от общих продаж продавца составляет каждая отдельная транзакция. Если решать эту задачу мерой, то всё достаточно просто:

% от продаж продавца =
DIVIDE (
    SUMX ( ‘Продажи’; [Кол-во] * [Стоимость за единицу] );
    CALCULATE (
        SUMX ( ‘Продажи’; [Кол-во] * [Стоимость за единицу] );
        ALLEXCEPT ( ‘Продажи’; ‘Продажи'[Продавец] )
    )
)

Делимое рассчитывается в контексте фильтра, определенном в визуальном элементе, а в делителе используется Calculate в комбинации с модификатором контекста ALLEXCEPT, примененным к таблице ‘Продажи’ и столбцу [Продавец], который указывает на необходимость игнорирования любых фильтров, примененных ко всем столбцам таблицы ‘Продажи’, кроме столбца [Продавец] в контексте фильтра.

Рис. 2. Пример меры

А теперь также, но в вычисляемом столбце

Теперь выполним точно такой же расчёт при помощи вычисляемого столбца. Для удобства в первую очередь добавим новый столбец: Итого = [Кол-во] * [Стоимость за единицу]

Рис. 3. Простой вычисляемый столбец

Как Вы видите, для расчета значений в каждой строке используются только данные, содержащиеся в ней самой. Как в динамических таблицах Excel. Если же Вы создадите вычисляемый столбец при помощи формулы Итог без Calculate = SUM ( ‘Продажи'[Итого] ), то увидите, что в каждой строке столбца [Итог без Calculate] содержится одинаковое значение, равное сумме всех значений в столбце [Итого]

Рис. 4. Вычисляемый столбец возвращает сумму всех значений исходного

Это происходит потому, что в контексте строки не существует никакой информации о том, какие фильтры должны быть применены к таблице ‘Продажи’, в результате на вход функция SUM получает все значения из столбца ‘Итого’ и суммирует их. Как только я добавлю в формулу вычисляемого столбца функцию CALCULATE, его поведение изменится.

Рис. 5. Преобразование контекста при помощи CALCULATE

Функция CALCULATE выполняет преобразование контекста строки в контекст фильтра и уже затем выполняется вычисление. По сути значение в каждом столбце строки используется в качестве фильтра, который применяется к таблице продажи.

Так в строке, выделенной зеленой рамкой формируется следующий набор фильтров:

ПродавецФруктКол-воСтоимость за единицуИтогоИтог без Calculate
Продавец 2Апельсин10505004 245

После применения такого набора фильтров к таблице «Продажи» в ней останется только одна строка со значением в столбце итого — 500. Соответственно, значение в столбце [Итог с Calculate] также будет равно 500.

Рис. 6. Преобразование контекста — пример 1.

А вот в строках, выделенных красным мы видим уже результат, отличающийся от других строк. Несмотря на то, что значение в столбце [Итого] в каждой из них равно 250, столбец  [Итог с Calculate] содержит результат 500, что наглядно иллюстрирует то, как работает преобразование контекста. Для каждой из двух строк формируется одинаковый набор фильтров:

ПродавецФруктКол-воСтоимость за единицуИтогоИтог без Calculate
Продавец 1Апельсин5502504 245

В результате применения такого набора фильтров к таблице ‘Продажи’ в ней останутся 2 строки со значениями в столбце [Итого]=250. 250+250 = 500, что и отображается в новом вычисляемом столбце

Рис. 7. Преобразование контекста — пример 2.

На следующем шаге рассчитаем сумму продаж по каждому продавцу. Кажется, что всё достаточно просто и нужно всего лишь добавить функцию FILTER: Продажи каждого продавца =
CALCULATE (
    SUM ( ‘Продажи'[Итого] );
    FILTER ( ‘Продажи’; ‘Продажи'[Продавец] = ‘Продажи'[Продавец] )
)
Но не тут то было — столбец  опять содержит сумму всех строк в таблице ‘Продажи’.

Рис. 8. Calculate выполняет преобразование контекста только для первого аргумента

Давайте разберемся, каким образом работает функция CALCULATE в вычисляемых столбцах.

Когда функция CALCULATE используется в формуле вычисляемого столбца, то она преобразует контекст строки в контекст фильтра только для первого аргумента функции. Это значит, что в данном случае на функцию FILTER не действует перенос контекста и на вход Filter получает таблицу полностью.

Порядок расчета следующий:

  1. Производится расчет Filter в текущем контексте фильтра.
  2. Выполняется преобразование контекста строки в контекст фильтра для первого аргумента.
  3. Производится применение Filter, рассчитанных на первом шаге.
  4. Производится расчет первого аргумента CALCULATE

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

VAR _F =
    FILTER ( ‘Продажи’; ‘Продажи'[Продавец] = ‘Продажи'[Продавец] )
VAR _CT =
    FILTER (
        ‘Продажи’;
        ‘Продажи'[Продавец] = «Продавец 1»
            && ‘Продажи'[Фрукт] = «Апельсин»
            && ‘Продажи'[Кол-во] = 5
            && ‘Продажи'[Стоимость за единицу] = 50
    )
RETURN
    CALCULATE ( CALCULATE ( SUM ( ‘Продажи'[Итого] )_F )_CT )

Поскольку внутренний CALCULATE рассчитывается после внешнего, то он имеет приоритет и дополняет или переопределяет модификаторы контекста, определенные во внешних CALCULATE. В данном случае, фильтр _F возвращает таблицу ‘Продажи’ (все столбцы) целиком, т.е. допускает больший набор значений, чем фильтр _СT, сформированный в результате переноса контекста и перезаписывает его.

Как же получить корректный результат? Есть два варианта — использовать переменные или функцию EARLIER.

Вариант с использованием Var:

Продажи каждого продавца =
VAR _salesman = ‘Продажи'[Продавец]
RETURN
    CALCULATE (
        SUM ( ‘Продажи'[Итого] );
        FILTER ( ‘Продажи’; ‘Продажи'[Продавец] = _salesman )
    )

В этом случае значение переменной _salesman рассчитывается в контексте строки, для каждой строки получает значение из столбца [Продавец], запоминает его и передаёт в Filter в виде скалярного значения.

В итоге для первой строки таблицы по сути формируется следующее метавыражение:

VAR _F =
    FILTER ( ‘Продажи’; ‘Продажи'[Продавец] = «Продавец 1» )
VAR _CT =
    FILTER (
        ‘Продажи’;
        ‘Продажи'[Продавец] = «Продавец 1»
            && ‘Продажи'[Фрукт] = «Апельсин»
            && ‘Продажи'[Кол-во] = 5
            && ‘Продажи'[Стоимость за единицу] = 50
    )
RETURN
    CALCULATE ( CALCULATE ( SUM ( ‘Продажи'[Итого] )_F )_CT )

Поскольку фильтр _F также содержит все столбцы таблицы, то он перезаписывает фильтр, сформированный в результате переноса контекста (_CT).

Устаревший и менее производительный вариант, который мы обречены использовать в PowerPivot — функция EARLIER.

Рис. 9. Функция EARLIER

Продажи Earlier =
CALCULATE (
    SUM ( ‘Продажи'[Итого] );
    FILTER ( ‘Продажи’; ‘Продажи'[Продавец] = EARLIER ( ‘Продажи'[Продавец] ) )
)

Функция EARLIER в данном случае получает значение в столбце Продавец в контексте строки отдельно от остальных частей формулы. В реальности все еще сложнее, поскольку у функции EARLIER есть необязательный параметр «Уровень». Если мы не указываем значение уровня, то используется значение 1. Что это значит для нас?

Выражение =  EARLIER ( ‘Продажи'[Продавец];1) или EARLIER ( ‘Продажи'[Продавец] ) рассчитывается во внешнем, относительно определенного функцией FILTER, контексте строки – т.е. в контексте строки основной таблицы ‘Продажи’, поэтому для первой строки возвращает значение «Продавец 1» и т.д. Если Вы можете использовать переменные в DAX коде, то настоятельно рекомендую использовать их вместо функции EARLIER.

Надеюсь, что после прочтения статьи Вам стало понятнее как выполняются расчёты в контексте строки и Вы сможете применять свои знания на практике.

А еще — полезные материалы есть здесь.


Bad — Practices при создании отчета. Таблицы — часть вторая.

Всем привет! Продолжаю разбирать Bad-practice при использовании таблиц в  Power BI. Далее под словом «таблица» понимаем любой табличный визуальный элемент. Начало можно прочитать здесь.

Bad Practice № 7. Не использовать заголовки таблиц.

Заголовок таблицы, да и любого другого визуального элемента позволяет дать пользователю отчета больше информации о том, что именно он видит. При этом игнорирование заголовков не позволяет достичь значимого увеличения доступного пространства холста.

Стоит отметить, что текст заголовка можно делать динамическим. Особенно это важно при печати отчета с примененными фильтрами.

Bad Practice № 8. Пытаться запихнуть в таблицу максимум информации.

Достаточно часто встречаются ситуации, когда либо заказчик просит, либо разработчик по своей инициативе добавляет в таблицу или матрицу огромное количество информации. При этом преследуется достаточно благая цель — дать пользователям возможность экспортировать ту информацию, которую они хотят… Обычно затем возникают три вопроса:

  1. Почему Power BI не показывает всю информацию в таблице?
  2. Как обойти ограничение Power BI на экспорт данных?
  3. Как заставить отчёт работать быстрее?

На всякий случай напомню еще раз — Power BI это инструмент анализа данных, а не их экспорта. Если нужно экспортировать небольшой объем информации — это сделать легко и быстро, можно даже подключиться к модели данных напрямую из Excel. Но не нужно пытаться заставить его выполнять задачи, для которых сервис не предназначен.

Итак, почему же «большие» таблицы это плохо? Очень просто — значение в каждой ячейке таблицы рассчитывается по отдельности.

В таблице, показанной на рис. 1, значение меры «Прибыль» рассчитывается 7 раз — один раз для каждой страны + Итог. Если запустить анализатор производительности, то увидим, что DAX-запрос выполняется 9 мс, что вроде как очень мало.

Рис. 1. Простая таблица.
Рис. 2. Время выполнения DAX-запроса

Изменим тип визуального элемента на матрицу и добавим новое измерение — год. Теперь в матрице 6 значений в строках и 4 значения в столбцах. Общее количество расчетов меры = (R+1)*(C+1), где R — количество строк и C — количество столбцов. Итого: 35 раз. DAX-запрос выполняется уже 19 мс, что тоже немного. И вроде бы, разница незаметна… Есть одно «Но» — я работаю с достаточно качественной моделью данных и использую меру, в которой из функций один лишь SUM.

Обратите внимание — на этом и последующих рисунках видно, что я допустил очень грубую ошибку при разработке отчета? Если не догадались какую — ответ в предыдущем посте.

Рис. 3. Матрица с небольшим количеством значений

Рассмотрим другой пример — матрица с иерархией дат и мерой, которая всего-лишь считает накопительный итог с начала года —

Продажи с начала года =
TOTALYTD ( [Продажи (онлайн (руб.))]; ‘DimDate'[FullDateAlternateKey] )

DAX-запрос выполняется уже 403 секунды.

Кстати, на скриншоте видно, что на уровне дней моя мера с TotalYTD работает некорректно. Подумайте почему 🙂 Ответ в конце этого поста.

Рис. 4. Матрица с накопительным итогом

Добавим еще измерение, увеличив количество столбцов и срез на страницу, чтобы исключить влияние кэширования. Запрос уже выполняется 608 мс, при этом возвращается пустая матрица:

Рис. 5. Пустая матрица
Рис. 6. Время выполнения запроса для пустой матрицы.

Теперь делаем еще несколько замеров:

  1. Добавляю в ту же матрицу меру — Накопительный итог за тот же период прошлого года — запрос DAX будет выполняться в районе 1100 секунд, что практически в 2 раза больше  
  1. Убираю добавленную меру и применяю условное форматирование на основании значений меры Отклонение к прошлому году — время выполнения запроса практически такое-же, как в предыдущем случае. Это говорит о том, что при использовании условного форматирования та мера, на основании которой применяется формат всё равно рассчитываются.

На закуску — Вы разработали отчет, в котором красивая матрица с большим количеством столбцов и мер, добавили несколько фильтров на страницу. Даже оптимизировали часть расчётов и выключили автоматические дату и время. Кажется, что всё хорошо — страница пересчитывается за жалкие 5 секунд. Главное не забыть, что опубликованным отчётом могут пользоваться несколько десятков или сотен человек одновременно, а таких отчётов у Вас уже опубликовано 10 или 15. Поскольку компания крупная — Вы даже купили Premium P1.

Вопрос — как скоро будут использованы все доступные вычислительные ресурсы?

Как с этим жить?

  1. Избегать использования широких таблиц со множеством мер на страницах отчётов.
  2. Активнее используйте страницы детализации, вместо того, чтобы добавлять кучу фильтров на страницу с одной матрицей.
  3. Если таблицы нужны исключительно для того, чтобы позволить пользователям смотреть данные в максимальном количестве разрезов после экспорта в Excel — научите их создавать свои пользовательские отчеты и фильтры.
  4. Если Вы активно используете в широких и длинных таблицах меры — рассмотрите возможность замены мер на столбцы, рассчитанные в Power Query или источнике данных. Но применяйте этот метод с осторожностью.
  5. Если пользователям жизненно важно строить именно табличные отчёты — покажите им, как работает Power Query в Excel и научите подключаться к источнику данных.
  6. Функция Analyze in Excel по-своему прекрасна, но если пользователи будут активно с ней работать и добавлять меры в сводные таблицы или Cube-формулы — это также может «повесить» вашу модель. Отчеты также будут грузиться медленней.

Bad Practice № 9. Использовать таблицы с темной заливкой.

Буду краток — отчёты с таблицами распечатывают значительно чаще, чем с графиками. Вы хотите всё переделывать?

На этом завершаю цикл про «табличные» Bad Practices. Всем быстрых отчётов и пишите вопросы в комментариях.

P.S. Если любите видео, то кое-что интересное есть на Youtube-канале IQBI.

Ход рассуждений для ответа: Посмотрев на рис. 4. можно заметить, что используется встроенная иерахия дат. Поскольку мера все-таки что-то считает, то в матрице использован столбец дат из корректной таблицы DimDate. Это говорит о том, что таблица DimDate не отмечена как таблица дат, поскольку в этом случае встроенные иерархии даты были бы отключены. Но это не объясняет полностью ошибку. Скорее всего связь между таблицей фактов и таблицей дат создана не между столбцами с типом данных «Дата» а между какими-то другими.

Ответ: В свойствах таблицы DimDate не отмечено, что она является таблицей дат, при этом связь между таблицей фактов и таблицей дат создана по столбцам с типом данных «Целое число».

Если Вы дочитали до этого места, то большая просьба — когда задаете вопросы в профильных группах, то по возможности готовьте пример модели, просто с урезанными данными. Гадание на скриншотах — достаточно затратно по времени….

Bad — Practices при создании отчета. Таблицы. Часть первая.

Всем привет! Продолжаю серию про Bad-practice при создании отчетов в Power BI. На этот раз поговорим про использование таблиц (дальше в статье под словом «таблица» понимаем любой табличный визуальный элемент).

Я не говорю, что таблицы это абсолютное зло и их не должно быть в отчетах Power BI, но при добавлении таблиц и матриц стоит задумываться о том, каким образом пользователи будут работать с отчетом и какие выводы они должны сделать.

Перед разбором плохих практик хочу напомнить, что в Power BI существуют два визуальных элемента «из коробки», которые позволяют отобразить данные в виде таблицы — это таблица (1 на рисунке ниже)  и матрица (2 на рисунке ниже).

Рис. 1. Таблица и матрица

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

Более подробно об этих визуальных элементах можно почитать в официальной документации Microsoft:

Bad Practice №1. Заставлять пользователя использовать полосы прокрутки (применимо к любым визуальным элементам)

Рис. 2. Использование полос прокрутки

Основные причины, по которым не стоит так делать:

  1. Отчёт Power BI в первую очередь предназначен для визуального восприятия, поэтому пользователь должен видеть всю значимую информацию перед глазами. При наличии важной информации за пределами видимой области пользователь может на нее не обратить внимания.
  2. При печати или экспорте отчета в виде презентации/картинки будет сохранено то, что видно на экране, поэтому вся остальная информация потеряется
  3. Такие таблицы просто некрасивы и неудобны для работы.

В приведенном примере к тому же используется иерархия, причем состоящая из 4-х уровней. Посмотрите, что получается при раскрытии такой иерархии. Пользователь отчета видит только часть цифр, при этот абсолютно непонятно, что это за данные — не видно ни какой это период, на какая категория товара и т.д.

Рис. 3. Не самая удачная матрица с раскрытой иерархией

Как с этим жить?

  1. Выделяйте больше места для расположения визуального элемента так, чтобы не возникало потребности в прокручивании. Это верно для любых визуальных элементов в Power BI.
  2. Если не удается отобразить всю информацию без появления полос прокрутки — убедитесь, что по умолчанию отображается наиболее важная и значимая информация.
  3. Если нужно отображать большие объемы информации в табличном виде — используйте функцию «Анализировать в Excel», которая позволяет подключиться к модели данных Power BI из Excel и анализировать данные при помощи сводных таблиц и КУБ (CUBE) формул.

Bad Practice №2. Использование длинных имен в заголовках столбцов и строк.

Эта ошибка очень тесно связана с ошибками именования мер и столбцов в модели данных. Начинающие разработчики отчётов как-правило бросаются в одну из двух крайностей — дают либо очень короткие, либо очень длинные имена мерам. При добавлении же меры или измерения в визуальный элемент — оставляют название как есть

Рис. 4. Слишком длинное название столбца

На примере видно, что слишком длинное название столбца приводит к тому, что половина пространства визуального элемента не используется, но при этом часть данных вышла за границы видимости и появилась горизонтальная полоса прокрутки… Думаю, что дополнительных комментариев здесь не требуется.

Что делать?

  1. Избегать использования длинных имен, где это возможно. Например, в данном случае мере «Продажи (онлайн + оффлайн) по дате доставке» можно было легко дать имя «Продажи всего по дате доставки».
  2. Использовать перенос текста в заголовке. В матрице и таблице перенос по словам настраивается отдельно для заголовков строк (только для матрицы), столбцов и значений. Включен по умолчанию.
Рис. 5. Перенос слов в столбце
  1. Отключать функцию «Автоподбор ширины столбца». Эта функция также доступна в секции «Заголовки столбцов» в секции «Формат» панели «Визуализации и включена по-умолчанию. Этот пункт более применим в случае, когда текст заголовков столбцов может меняться в зависимости от значений фильтров или других визуальных элементов в отчете..
  2. Переименовывать меры и измерения с длинными названиями на уровне визуального элемента
Рис. 6. Переименование поля в конкретном визуальном элементе
  1. Выводить длинный текст в заголовок таблицы. Если в визуальном элементе только один столбец фактов, либо несколько столбцов с родственной информацией, то достаточно легко подобрать корректное имя таблице, которое позволит пользователям отчёта понять о чем идет речь
Рис. 7. Использование названия в таблице

Bad-practice № 3. Использовать различные языки в названиях и данных разных языков.

Эта ошибка относится не только к таблицам. В принципе — в отчете you must not использовать разные Sprachen.

Рис. 8. Использование различных языков в отчете

Что делать?

  1. Убедиться, что во всех визуальных элементах на странице отчета используются названия на одном языке.
  2. Убедиться, что все сокращения и аббревиатуры также на одном языке. Например для отчета на английском языке — Sales LY, на руссском — Продажи Пр. Год.
  3. Если Вы подготавливаете модель к использованию с функционалом вопросов и ответов — используйте синонимы и лингвистические схемы. Это отдельная большая тема, в которую пока не углубляюсь.
  4. Отключить автоматические дату и время для всех отчётов. Это можно сделать в параметрах в секции «Глобальные» — «Загрузка данных» для всех отчетов и в секции «Текущий файл» — «Загрузка данных» для конкретного файла. Напоминаю, что в случае, если эта функция включена, то Power BI Desktop автоматически создает иерархии для всех полей с типом «Дата» и «Дата и время». С одной стороны это очень удобно, но с другой стороны это приводит к существенному замедлению скорости работы модели (это тема для отдельного разговора), а язык иерархий задается один раз — при создании модели данных и затем не может быть изменен.
Рис. 9. Отключение автоматических даты и времени.
  1. Поскольку календарь всё-таки нужен — используйте календарь, созданный в Power Query. Функцию для создания календаря можно скачать, например, здесь: https://raw.githubusercontent.com/dmitriysolovev/powerbi/master/fnDateTableRus
  2. (Не обязательно) В определенных случаях имеет смысл изменять названия строк и столбцов итогов. По умолчанию для них используется язык модели данных, но при публикации отчета в сервис powerbi.com — будет использоваться язык браузера, что может привести к нарушению стройности отчета.
  3. По возможности используйте форматы дат без использования названий дней и месяцев. Например 1/05/2010 вместо 1-Мая-2010г.

Bad-practice № 4. Использовать таблицы без условного форматирования

Таблица — далеко не самый наглядный инструмент показа данных — цифр и текста много, все сливается и непонятно что вообще происходит. Например, в таблице, показанной на рисунке — идут продажи хуже или лучше по сравнению с прошлым годом/планом?

Рис. 10. Пример таблицы без условного форматирования

Другой пример — если приглядеться, то можно понять, что происходит. Но это неправильно. Мы же ведь разрабатываем отчёты, чтобы упростить процесс принятия решений, а не для того, чтобы заставлять пользователей рассматривать цифры под лупой. Не так ли?

Рис. 11. Еще один пример таблицы без условного форматирования

Что делать?

  1. Использовать условное форматирование в таблицах. Это достаточно просто сделать в настройках поля.
Рис. 12. Как добавить условное форматирование для столбца в таблице
  1. Использовать устоявшиеся цветовые сочетания для условного форматирования. Например, все привыкли, что красный означает, что дела идут плохо, а зеленый — всё в порядке.
  2. Если предполагаете, что отчет будет использоваться для печати  — используйте значки.
  3. Не стоит злоупотреблять условным форматированием — если в таблице много столбцов — применяйте условное форматирование только к наиболее значимым из них, либо можете добавить отдельный столбец, в котором будет использоваться значок для отображения общего статуса.
Рис. 13. Пример таблицы с условным форматированием

В целом тема условного форматирования достаточно глубокая и сегодня рассмотрим только самые основные моменты. Немного устаревшую, но очень информативную статью о настройке условного форматирования в таблицах можно найти в официальной документации: https://docs.microsoft.com/ru-ru/power-bi/desktop-conditional-table-formatting

Отличное видео о настройке условного форматирования по другому столбцу (англ.): https://www.youtube.com/watch?v=FgnPIaxpdJ0

Bad-Practice №5 Неверный подбор измерений для столбцов и строк.

Осмысленность подбора измерений для таблицы. Каждый раз, когда Вы создаете визуальный элемент или отчет, стоит задавать себе вопросы — «Какой вывод должен сделать пользовать этого отчета?», «Удобно ли мне работать с этим отчетом?». Как только Вы их начнете себе задавать — Вы обнаружите, что многие из визуальных элементов содержат избыточный или недостаточный набор данных или просто неудобны для работы.

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

Рис. 14. Не самый удачный подбор измерений

Выбор измерений для столбцов и строк — Достаточно часто начинающие разработчики добавляют измерение с большим или часто меняющимся количеством или значениями в секцию столбцов. Это не совсем правильно, поскольку приводит либо к появлению «широкой таблицы», которая неудобна для анализа, либо ширина столбцов будет постоянно изменяться (поскольку обычно не отключают автоподбор ширины столбца в настройках). Так, например, календарные периоды стоит использовать в качестве измерения строк, а не столбцов.

Bad-Practice №6 Игнорирование форматов данных

К сожалению, часть разработчиков отчетов не уделяет достаточного внимания форматам данных. В результате встречаются подобные ляпы:

Рис. 15. Неверный выбор форматов данных

В этой таблице сразу несколько грубых ошибок связанных, с форматированием:

  1. Для типа данных «Дата» выбран формат «Дата/время». Зачем? Он только «съедает» драгоценное пространство отчета и не добавляет никакой полезной информации.
  2. У столбцов SalesAmount, TotalProductCost и TaxAmt  не задан формат данных «Валюта», поэтому пользователь отчета вынужден догадываться о чем идет речь.Что мы видим — рубли, доллары, может быть штуки, а может быть что-то еще…

Форматы данных это также достаточно большая тема, поэтому выделю несколько основных моментов:

  1. Всегда задавайте корректный формат данных для финансовых показателей. Пользователь не должен догадываться о какой валюте идёт речь.
  2. Задавайте тот уровень точности, который требуется. Если размер среднего чека равен сотням тысяч долларов или рублей, то никому не интересная точность данных до четвертого знака после запятой. Тип единиц (нет, тысячи, миллионы и т.д.), а также число десятичных знаков можно задать как в настройках формата столбца/меры, так и в настройках форматирования поля в свойствах конкретного визуального элемента
  3. Тоже самое касается дат — в большинстве случаев нет никакого смысла отображать время.
  4. Используйте разделители разрядов. Это делает числа намного более понятными.
Рис. 16. Настройка форматирования поля на уровне визуального элемента

Продолжение следует 🙂

Таблицы и матрицы в Power BI. Расчет процентов и показ пустых значений.

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

Итак, ниже Вы найдете ответы на вопросы:

  1. Как отобразить % по строке в таблице Power BI?
  2. Как в таблице отобразить товары, для которых нет продаж?
  3. Почему товары, для которых нет продаж все равно не видны в моей таблице?
  4. А есть ли в Power BI аналог сводной таблицы Excel?

В Power BI существуют два визуальных элемента «из коробки», которые позволяют отобразить данные в виде таблицы — это таблица (1 на рисунке ниже)  и матрица (2 на рисунке ниже). Если проводить аналогию с Microsoft Excel, то таблица близка к обычному листу Excel, а матрица — к сводной таблице.

Рис 1. Значки таблицы и матрицы в Power BI

Таблица — основные возможности.

Это достаточно простой визуальный элемент, в котором помимо внешнего вида и фильтров  Вы можете настраивать:

  1. Как и по какому столбцу будут отсортированы данные (если нужно отсортировать по более, чем одному столбцу, то следует зажать клавишу Shift)
  2. Что будет показано в числовом столбце — фактическое значение (среднее, сумма и т.д.) или % от общего по столбцу (см. рис. 2)
  3. Отображать или не отображать измерения, для которых отсутствуют числовые данные (по умолчанию не отображать) — см. рис. 3. Эта настройка актуальна только в том случае, если нет ни одного столбца, для которого включено отображение % от общего по столбцу (см. рис. 4).
Рис. 2. Выбор способа отображения для числового столбца в таблице
Рис. 3. Как включить показ пустых значений в таблице Power BI
Рис. 4. Ошибка показа пустых значений при использовании столбца с общим процентов

Более подробно про функционал таблиц можно почитать в официальной документации: https://docs.microsoft.com/ru-ru/power-bi/visuals/power-bi-visualization-tables

Матрица — поддержка иерархий и % по строкам

Как уже упоминал выше — матрица в Power BI это в какой-то мере аналог сводных таблиц Excel. Здесь уже значительно больше возможностей, чем в таблице. Кратко рассмотрим основные из них:

  1. Поддержка иерархий — достаточно добавить несколько измерений в секцию «Строки» или «Столбцы:
Рис. 5. Поддержка иерархий в матрице
  1. Проценты можно рассчитывать не только по столбцу, но и по строке и от общего значения:
Рис. 6. Настройка способа отображения значений в матрице
Рис. 7. — Проценты итогов в матрице

Более подробно про функционал матриц можно и нужно почитать в официальной документации: https://docs.microsoft.com/ru-ru/power-bi/visuals/desktop-matrix-visual

Bad — Practices при создании отчетов. Использование настраиваемых цветов вместо тем

Добрый день!

Давайте разберем некоторые ошибки при создании отчетов.

Пока не будем фокусироваться на таких вещах, как подбор цветов и правила размещения визуальных элементов, а рассмотрим явные технические ошибки:

Bad Practice № 1. Использование настраиваемых цветов, а не цветов темы.

Рис. 1. Использование настраиваемого цвета для объекта визуального элемента.

Почему это плохо?

  1. Огромное количество ручного труда. Если изменение цветов темы делается один раз и затрагивает все визуальные элементы, то использование настраиваемых цветов подразумевает ручную настройку  каждого визуального элемента, что сильно увеличивает трудоемкость.
  2. Настроенные вручную цвета имеют приоритет над настройками темы. Это значит, что при необходимости изменения цветовой схемы Вам придется каждый визуальный элемент перенастраивать по отдельности.

Где и как изменить тему для отчета?

Весь функционал работы с темами доступен на вкладке ленты «Представление» в секции «Темы». Для того, чтобы применить одну из стандартных тем, достаточно кликнуть на плитку темы.

Рис. 2. Выбор темы отчёта

Обратите внимание на поведение объектов визуальных элементов после применения темы. На первом рисунке вид «до», на втором «после»:

Рис. 3. Два визуальных элемента до изменения темы
Рис. 4. Два визуальных элемента после изменения темы.

Обратите внимание на изменения:

  1. Заголовок визуального элемента слева использует настроенный белый фон — он остался без изменения. Размер шрифта в обоих визуальных элементах изменился (поведение не совсем ожидаемо и похоже на баг). Цвет шрифта — остался без изменений, т.к. и черный и белый цвета присутствуют  во всех темах и, соответственно, остаются неизменными при переключении тем.
  2. Легенда — слева использовался белый цвет шрифта и он остался неизменным, поскольку в новой теме он также присутствует.
  3. Желтый цвет на диаграмме слева был настроен вручную и он остался без изменений, светло-голубой изменился на цвет новой темы, черный в обоих случаях остался без изменений, поскольку он присутствует в обоих темах.

Каким образом происходит замена цветов?

  1. Черный и белый остаются без изменений
  2. Цвет 1 старой темы меняется на цвет 1 новой темы и т.д. Отсчет начинается от первого цвета справа от черного. См. рисунки ниже:
Рис. 5. Выбор цветов в первоначальной схеме.
Рис. 6. Выбор цветов в новой схеме.

Выводы:

  1. Везде, где возможно, используйте стандартные цвета и шрифты темы. Это позволит сократить трудоемкость разработки и сопровождения отчетов.
  2. При необходимости использования корпоративных цветов в отчете — создайте свою тему вместо использования настраиваемых цветов и шрифтов в визуальном элементе.
  3. Темы позволяют настраивать не только цвета и шрифты визуальных элементов, но и многие другие объекты  визуального представления отчета.

Добавляем жизни в таблицы и матрицы Power BI. Часть 2 — индикаторы в виде шкал

Привет!

В прошлом посте я показывал каким образом можно добавлять динамические индикаторы в матрицы и таблицы.
Теперь давайте подробно разберем как это работает и как можно достаточно быстро создавать свои динамические индикаторы. Если кратко, то мера возвращает код svg-изображения, а категория данных «URL-адрес изображения» указывает Power BI на то, что данную меру нужно отрисовать как картинку. Начнем по порядку.
SVG — стандарт векторных изображений, которые определяются не особо сложным для чтения человеком кодом и без особых проблем отрисовываются всеми современными браузерами. Сегодня не буду вдаваться в спецификацию стандарта svg, а просто разберу пошагово процесс создания индикатора:

Шаг 1. Создаем svg-контейнер:

<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′></svg>
Здесь есть два важных момента:
1. Если Вы создаете svg-изображение в каком-либо редакторе, то все значения параметров заключаются в двойные кавычки. Для того, чтобы код заработал в Power BI кавычки должны быть одинарными.
2. Для того, чтобы Power BI корректно отрисовал SVG-изображение, перед объявлением svg-контейнера нужно добавить следующий текст (включая запятую на конце): data:image/svg+xml;utf8,

Шаг 2. Добавляем окружность:

Далее внутри svg-контейнера добавляем окружность для основного цвета шкалы:
<circle r=’40’ cx=’50’ cy=’50’ stroke=’green’ stroke-width=’10’ fill=’none’></circle>
r — радиус окружности
cx,cy — координаты центра окружности
stroke и stroke-width — цвет и толщина внешнего контура
fill — цвет заливки круга.

Не забываем «обернуть» код svg-изображения в кавычки при написании меры. Если всё сделали правильно, то на этом этапе мера будет возвращать зеленую окружность:
Circle_Measure =
«data:image/svg+xml;utf8,»
«<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’green’ stroke-width=’10’ fill=’none’></circle>»
«</svg>»

 

 

 

 

Шаг 3. Получаем полуокружность:

Для того, чтобы превратить окружность в полукруг, используем параметр stroke-dasharray, который превращает сплошную кривую в штриховую и принимает на вход два значения: длина штриха и длина пробела. Поскольку требуется получить полукруг, то длина штриха должна быть равна половине длины окружности, а длина промежутка быть больше, так что зададим ее равной длине окружности. Напомним, что длина окружности L рассчитывается по формуле L = 2*Pi*R, где R это радиус окружности. В нашем примере: stroke-dasharray = «125.6 ,251.2» и мера принимает вид:

Half_Circle_Measure =
«data:image/svg+xml;utf8,»
«<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’green’ stroke-width=’10’  fill=’none’ «
«stroke-dasharray = ‘125.6 ,251.2’></circle>»
«</svg>»

 

 

 

 

 

Шаг 4. Поворачиваем полуокружность:

Созданная нами мера отрисовывает нижнюю половину окружности, поэтому нам нужно ее повернуть, чтобы достичь желаемого результата. Обратите внимание, что отрисовка линии начинается с крайней правой точки  (X = cx+r, Y = cy)  окружности по часовой стрелки. Для выполнения поворота используется параметр «tranform»:  transform= «rotate(Угол поворота,X,Y)», где X,Y — координаты точки, вокруг которой будет осуществлен поворот. В нашем случае они совпадают с координатами центра окружности: transform= «rotate(180,50,50)» и мера принимает вид:

Green_Scale =
«data:image/svg+xml;utf8,»
«<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’green’ stroke-width=’10’  fill=’none’ «
«stroke-dasharray = ‘125.6 ,251.2’ transform= ‘rotate(180,50,50)’></circle>»
«</svg>»

 

 

 

Шаг 5. Добавляем красный и желтый участки шкалы:

Теперь нужно добавить красную часть шкалы. Для этого также будет использоваться окружность. Представим, что красная зона должна занимать 0,4 всей шкалы. Параметр stroke-dasharray принимает вид: «stroke-dasharray = ‘125.6 x 0,4 ,251.2’.  Для того, чтобы красная дуга находилась в верхней части окружности задаем такое же значение параметра transform, как и для зеленой полуокружности.

Red_Scale =
«data:image/svg+xml;utf8,»
«<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’red’ stroke-width=’10’  fill=’none’ «
«stroke-dasharray = ‘50.24 ,251.2’ transform= ‘rotate(180,50,50)’></circle>»
«</svg>»

Желтая часть рассчитывается также как и красная. Пусть она должна занимать 0,3 шкалы. В этом случае длина дуги должна быть 0,7 длины полуокружности = 0,4 длина красной зоны + 0,3 длина желтой зоны.

Yellow_Scale =
«data:image/svg+xml;utf8,»
«<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’yellow’ stroke-width=’10’  fill=’none’ «
«stroke-dasharray = ‘87.92 ,251.2’ transform= ‘rotate(180,50,50)’></circle>»
«</svg>»

 

 

 

Шаг 6. Объединяем шкалы и добавляем указатель:

Теперь скомбинируем все дуги в одно изображение. Здесь от перемены мест слагаемых сумма поменяется, поэтому зеленый участок должен быть отрисован первым, желтый вторым, а красный третьим:

Gauge_scale =
«data:image/svg+xml;utf8,»
«<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’green’ stroke-width=’10’  fill=’none’ « //Зеленая дуга
«stroke-dasharray = ‘125.6 ,251.2’ transform= ‘rotate(180,50,50)’></circle>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’yellow’ stroke-width=’10’  fill=’none’ «
«stroke-dasharray = ‘87.92 ,251.2’ transform= ‘rotate(180,50,50)’></circle>» //Жёлтая дуга
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’red’ stroke-width=’10’  fill=’none’ «
«stroke-dasharray = ‘50.24 ,251.2’ transform= ‘rotate(180,50,50)’></circle>» //Красная дуга
«</svg>»

 

 

 

В качестве последнего штриха добавим указатель. Для него используем обычную линию, которую повернем на требуемый градус:

Line =
«data:image/svg+xml;utf8,»
«<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′>»
«<line x1=’50’ y1=’50’ x2=’10’ y2=’50’ stroke=’black’ stroke-width=’2′ transform=’rotate(60,50,50)’ />»
«</svg>»

X1, y1 ,x2, y2 — координаты начала и конца линии, соответственно. Поскольку требуется, чтобы длина линии равная радиусу внутренней дуги шкалы, то координату x2 задаем равной толщине дуги.

 

 

 

 

Итоговый вид меры:

Static_gauge =
«data:image/svg+xml;utf8,»
«<svg xmlns=’http://www.w3.org/2000/svg’ x= ‘0px’ y = ‘0px’ width=’100′ height=’100′>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’green’ stroke-width=’10’  fill=’none’ « //Зеленая дуга
«stroke-dasharray = ‘125.6 ,251.2’ transform= ‘rotate(180,50,50)’></circle>»
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’yellow’ stroke-width=’10’  fill=’none’ «
«stroke-dasharray = ‘87.92 ,251.2’ transform= ‘rotate(180,50,50)’></circle>» //Жёлтая дуга
«<circle r=’40’ cx=’50’ cy=’50’ stroke=’red’ stroke-width=’10’  fill=’none’ «
«stroke-dasharray = ‘50.24 ,251.2’ transform= ‘rotate(180,50,50)’></circle>» //Красная дуга
«<line x1=’50’ y1=’50’ x2=’10’ y2=’50’ stroke=’black’ stroke-width=’2′ transform=’rotate(120,50,50)’ />» //Указатель
«</svg>»

Заключительный шаг:

Теперь все, или почти все числовые значения можно определить в виде параметров. Обратите особое внимание, что в результате расчетов практически все параметры могут быть дробными с большим количеством десятичных знаков. Это может привести к тому, что изображение будет некорректно сформировано (задайте угол поворота, например, 76.12433648353), поэтому рекомендую использовать DAX функцию ROUND и округлять получившиеся значения параметров до целого числа или до 1-2 десятичных знаков.

Заканчивая статью хочется сказать, что возможность вывода результата расчета мер в виде изображения добавляет потрясающие возможности по форматированию различных KPI-показателей. Стоит лишь немного изучить спецификацию формата SVG и пользователи Ваших отчетов будут пищать от восторга.

Пример можно скачать здесь.

 

Добавляем жизни в таблицы и матрицы Power BI. Часть 1 -индикаторы на основе мер с категориями данных

Всем привет!

Абсолютное большинство заказчиков очень активно работает с таблицами Excel, включая условное форматирование, разного рода спарклайны, светофоры и т.д. И если возможности условного форматирования в таблицах и матрицах уже несколько месяцев удовлетворяют большинство потребностей бизнес-пользователей (не считая того, что нельзя форматировать промежуточные итоги в матрицах), светофоры можно неплохо делать комбинацией Unichar() и условного форматирования, то , например, со спарклайнами немного помучиться.

В августе 2018 года команда Power BI добавила возможность задавать категорию данных для мер. На мой взгляд эта очень важное обновление для всех, кто активно использует отчеты с таблицами в Power BI. Давайте посмотрим почему.

В этой части рассмотрим способ добавления индикаторов в матрицу/таблицу без задействования внешних изображения?

Дано: Матрица, в которой показаны сравнение продаж с прошлым годом в разрезе штатов и городов. Шеф просит добавить индикаторы.

Решение: Шаг 1. Добавляем меру, которая в зависимости от входных условий возвращает изображение в формате svg нужного цвета.

KPI_simple =
//Укажите меру. на основании которой будет определяться цвет
VAR SourceMeasure = [%Total_with_Tax_PY_Var] //Здесь можно изменить цвета индикатора.
// Можно указывать как HEX-коды.
// так и названия цветов на английском - red. yerllow. green и т.тд.
VAR Color =
    SWITCH (
        TRUE ();
        SourceMeasure < 0"#cc3232";
        SourceMeasure < 0,25"#e7b416";
        "#99c140"
    )
VAR Size = 30 // определяет размер SVG изображения в пикселях
//Формируем SVG -изображение
VAR Output_circle = "data:image/svg+xml;utf8," & "<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' width='" & Size & "' height='" & Size & "'>" & "<circle cx='" & Size / 2 & "' cy='" & Size / 2 & "' r='" & Size / 2 & "' fill='" & Color & "' stroke='none' stroke-width='3'/>" & "</svg>"
RETURN
    /*Логику HASONEVALUE стоит подкорректировать в случае.
если планируется использовать матрицу с промежуточными итогами.
Внутри HASONEVALUE должен присутсвовать столбец.
который находится на нижнем уровне иерархии.
В противном случае вместо кружка в подитогах будет отображаться код SVG элемента*/
    IF (
        HASONEVALUE ( 'Cities'[City] )
&& SourceMeasure <> BLANK ();
        Output_circle;
        BLANK ()
    )

Шаг 2. Кликаем на созданную меру, на вкладке «Моделирование» находим пункт «Категория данных», выбираем «URL-адрес изображения».


Шаг 3. Добавляем меру в матрицу

 

 

 

 

 

 

 

 

Более сложная мера, которая возвращает разные изображения для разных состояний:

KPI_3_position =
//Укажите меру. на основании которой будет определяться цвет
VAR SourceMeasure = [%Total_with_Tax_PY_Var] //Здесь можно изменить цвета индикатора.
// Можно указывать как HEX-коды.
// так и названия цветов на английском - red. yerllow. green и т.тд.
VAR Color =
    SWITCH (
        TRUE ();
        SourceMeasure < 0"#cc3232";
        SourceMeasure < 0,25"#e7b416";
        "#99c140"
    )
VAR Size = 30 // определяет размер SVG изображения в пикселях
//Формируем SVG -изображение
VAR Circle = "<circle cx='" & Size / 2 & "' cy='" & Size / 2 & "' r='" & Size / 2 & "' fill='" & Color & "' stroke='none' stroke-width='3'/>"
VAR Rect = "<rect width='" & Size & "' height='" & Size & "' fill='" & Color & "' />"
VAR Triangle = "<polygon points='0.0 " & Size / 2 & "." & Size & "." & Size & ".0' fill='" & Color & "'/>"
VAR Shape_ =
    SWITCH (
        TRUE ();
        SourceMeasure < 0Triangle;
        SourceMeasure < 0,25Rect;
        Circle
    ) //Задаем логику выбора изображения в зависимости от состояния показателя
VAR Output = "data:image/svg+xml;utf8," & "<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' width='" & Size & "' height='" & Size & "'>" & Shape_ & "</svg>"
RETURN
    /*Логику HASONEVALUE стоит подкорректировать в случае.
если планируется использовать матрицу с промежуточными итогами. 
Внутри HASONEVALUE должен присутсвовать столбец.
который находится на нижнем уровне иерархии. 
В противном случае вместо кружка в подитогах будет отображаться код SVG элемента*/
    IF (
        HASONEVALUE ( 'Cities'[City] )
            && SourceMeasure <> BLANK ();
        Output;
        BLANK ()
    )

 

Скачать пример можно здесь.

Обзор обновлений Power BI Desktop за август 2018 года

Всем привет!

Релиз Power BI Desktop за август 2018 (скачать можно здесь) содержит меньше интересных обновлений, чем июльский и намного меньше, чем ожидаемый в октябре 2018. Но, тем не менее, здесь есть ряд интересных функций, которые очень многие ждали не один год. Давайте посмотрим на них чуть подробнее.

Работа с отчетами:

  • Экспорт отчетов в PDF.
  • Возможность группировки закладок
  • Глобальная доступность тем
  • Создание визуальных элементов Python (предварительный функционал)

Аналитика

  • Условное форматирование ячеек в таблицах по значениям

Моделирование

  • Категории данных для мер

Работа с отчетами

Экспорт отчетов в PDF

Наверное, одна из самых ожидаемых функций для тех, кто по каким-либо причинам пользуется только Power BI Desktop и не имеет возможность использовать powerbi.com чтобы поделиться отчетами с коллегами и руководством. Теперь можно экспортировать все видимые страницы отчета Power BI Desktop в PDF. Для этого в меню «Файл» выберите пункт «Экспорт в PDF». К сожалению, в сервисе пока нет такой кнопки, но Вы можете использовать стандартную функцию печати и затем выбрать pdf-принтер.

На что нужно обратить внимание:

  1. Во время экспорта Вы не можете взаимодействовать с отчетом. Как только Вы начнете экспортировать отчет в PDF Power BI Desktop откроет диалоговое окно с информацией о том, что он занят и будет по очереди открывать каждую видимую страницу. Если что-то пойдет не так или Вам срочно потребуется покликать на страницы отчета, то Вы всегда можете нажать кнопку «Отмена»
  2. Печатаются все видимые страницы отчета, т.е. Вы пока не можете выбрать какие страницы экспортировать в PDF. Порядок страниц в файле pdf точно такой же, как и в Power BI Desktop.
  3. Файл pdf автоматически создается во временной папке и после завершения экспорта открывается в браузере или приложении для просмотра pdf. Оттуда Вы можете сохранить файл в нужную Вам папку.
  4. Не поддерживается печать подложек (ни цвет, ни картинка). Если нужно, чтобы отчет распечатался с учетом подложки — установите такой же цвет или изображение как фон страницы.

Группировка закладок

Честно говоря, не понимаю, почему этот функционал нельзя было реализовать сразу или, хотя бы, вместе с глобальной доступностью закладок. С этой возможностью отчеты, в которых используются десятки и сотни закладок снова можно нормально поддерживать. Также функционал будет интересен в случаях, когда один отчет используется в работе разными группами людей, так как позволяет логически сгруппировать визуальные объекты для различных демонстраций и т.д.

Для того, чтобы создать группу закладок:

  1. Зажмите клавишу Ctrl и выделите несколько закладок.
  2. Кликните на три точки справа от названия любой из закладок и выберите в меню пункт «Группировать».

Группы закладок можно сворачивать, разворачивать. Переименование и разгруппировка доступны в настройках группы закладок.

Глобальная доступность тем.

В июле 2018 года функционал тем был расширен и теперь при помощи тем можно контролировать большинство настроек визуальных элементов, а также фон страниц и отчета целиком. Теперь темы доступны в Power BI Desktop «из-коробки» и будут добавлены в ближайшее обновление Power BI Report Server, что не может не радовать.

Создание визуальных визуальных элементов Python (предварительный функционал)

Поддержку Python в Power BI ждали очень долго и хотели очень многие. Так что возрадуйтесь, первый шаг сделан. Пока речь идет только про создание визуальных элементов, но интеграция с R также начиналась с возможности создания графиков.

Функционал предварительный, так что для того, чтобы насладиться им, помимо установки Python IDE потребуется его включить:

  1. Запускаем Power BI Desktop и в меню «File» выбираем пункт «Параметры и настройки»->«Параметры»
  2. В открывшемся окне находим пункт «Предварительные версии возможностей» и ставим галочку возле пункта «Поддержка Python«. Жмем кнопку «ОК». Power BI Desktop сообщит, что для включения этой возможности потребуется перезапуск программы. Соглашаемся и перезапускаем Power BI Desktop.

Аналитика

Условное форматирование на основе значений

Теперь в таблицах и матрицах можно настраивать условное форматирование по значению поля. Что это дает — Вы можете создать столбец или меру, которые будут возвращать название цвета или HEX-код цвета и задать условное форматирование столбца на основании этого столбца или меры.

Зачем это нужно: если у Вас есть много различных KPI, которые нужно подсвечивать по тем или иным правилам, то логику этих самых правил можно вынести в меру и затем ее использовать в разных таблицах и матрицах вместо того, чтобы описывать правила условного форматирования в каждой таблице, матрице по-отдельности.

Моделирование

Категории данных для мер

Вот этого функционала мне реально не хватало во многих отчетах. Категорию данных (URL, Долгота, Широта, Страна и т.д.) давно можно было задавать для столбцов, а теперь этот функционал доступен для мер, что не может не радовать. Типичный кейс — мера возвращает какое-либо текстовое значение, например название ссылку на страницу с информацией о заказчике в CRM-системе. Или по клику на значение в таблице нужно открыть другой отчет Power BI, отфильтрованный определенным образом. С сегодняшнего дня нам достаточно задать категорию данных для меры как «URL» и наслаждаться результатом.

Как использовать визуальные подсказки в отчетах Power BI

В очередном обновлении Power BI Desktop (март 2018, версия 2.56.5023.861) стала доступна очень крутая возможность использования страниц отчетов в качестве подсказок визуальных элементов (Report page tooltips). По состоянию на март 2018 года этот функционал является предварительным, поэтому для его включения потребуется выполнить несколько действий.

Как включить возможность использования страниц отчета в качестве подсказок (report page tooltips)?

  1. Запускаем Power BI Desktop и в меню «File» выбираем пункт «Параметры и настройки»->»Параметры».
  2. В открывшемся окне находим пункт «Предварительные версии возможностей» и ставим галочку возле пункта «Report page tooltips». Жмем кнопку «ОК». Power BI Desktop сообщит, что для включения этой возможности потребуется перезапуск программы. Соглашаемся и перезапускаем Power BI Desktop.

Как создать страницу отчета, которая будет использоваться в качестве подсказки?

  1. Создаем новую страницу в отчете и называем ее понятным образом, например, «Подсказка».
  2. Переходим в параметры страницы и в разделе «Сведения о странице» включаем пункт «Подсказка».
  3. Переходим в раздел «Размер страницы» и устанавливаем размер «Подсказка». Это новый стандартный размер страницы, адаптированный для использования страниц в качестве подсказок.
  4. Теперь страница отчета подготовлена к использованию в качестве подсказки

Как настроить страницу отчета для использования в качестве подсказки визуального элемента?

  1. Выбираем целевой визуальный элемент и переходим в меню формат.
  2. Находим раздел «Подсказка» и включаем пункт «Страница отчета».
  3. Выбираем нужную страницу.
  4. Готово!

С какими визуальными элементами работает?

Функционал «Report page tooltips» доступен для почти встроенных графиков, в которых присутствуют оси, измерения. Если смотреть на раздел «Визуализации», то для всех графиков левее или выше воронки (включительно), кроме комбо-чартов. Для таблиц и матриц — недоступно, так же как и для всех пользовательских визуализаций. Очень хочется верить, что в будущем будет доступно для таблиц и матриц.

 

Несколько рекомендаций и особенностей использования.

Поскольку функционал «Report page tooltip» является предварительным, то в определенных случаях могут возникать сбои. Это нормально, если с чем-то столкнетесь — используйте кнопку «Send a frown» и отправляйте отчет об ошибке в продуктовую группу, это поможем всем нам получить максимально стабильную версию в будущем.

Согласно статье в блоге Power BI есть следующие особенности работы:

  1. При использовании линейных графиков подсказка будет показана для всех линий сразу, т.е. значения легенды не будут использованы в качестве фильтра для среза.
  2. При использовании «кросс-фильтров» подсказка будет работать только для тех данных, которые относятся к выделенному диапазону, даже при наведении на затененные области.

Для себя отметил следующие моменты:

  1. Нельзя просто так взять и изменить тип визуализации для которой назначен «Report page tooltip», настройки будут обнулены.
  2. В Power BI Desktop может возникать ошибка, если Вы удалили страницу, назначенную для использования в качестве подсказки.
  3. Если прикрепить визуальный элемент с «Report page tooltip» на дашборд — показывается стандартная подсказка.
  4. Также не работает в случае публикации отчета в интернет («Publish to web»). Есть подозрение, что не работает и для Power BI Embedded.

Размер страницы с шаблоном tooltip достаточно мал, поэтому не получится разместить на нем большое количество графиков, да и не нужно. В идеале это должен быть один график, может быть несколько карточек и пояснительный комментарий. В качестве пояснительного комментария могут быть использованы разрезы (dimensions) тех страниц, на которых Вы планируете использовать визуальные подсказки.

Поскольку страниц-подсказок может быть множество, то чтобы не захламлять отчет и не вводить конечных пользователей в заблуждение, стоит делать такие страницы скрытыми.

«Report page tooltip» никаким образом не связан с функционалом детализации «drill-through», поэтому никаких дополнительных фильтров на страницы-подсказки добавлять не требуется. Контекст передается автоматически, если конечно Ваши данные связаны между собой.

Пример отчета с подсказками можно скачать здесь.

Условное форматирование графических объектов в Power BI Desktop при помощи Unichar() и Infographic Designer

Всем привет!

Недавно поступил интересный запрос от заказчика — «Хотим, чтобы в зависимости от значения KPI окружность становилась красной или зеленой соответственно»

В сети можно найти немало примеров реализации KPI в Power BI (например: https://sqldusty.com/2015/08/28/5-tips-for-powerbi/), но, к сожалению, ни одно из них не подходило заказчику. И тогда на помощь пришел Infographic Designer и одна из относительно новых функций DAX — Unichar(), которая возвращает соответствующий знак Unicode. Отличное описание этой функции с примерами можно найти в блоге Chris Webb.

Итак:

  1. Создаем меру, которая возвращает окружность:
    Круг =
    UNICHAR ( 9711 )
  2. Создаем меру, которая будет использоваться для контроля цвета окружности, хотя она и является избыточной:
    Контроль цвета =
    IF ( [Итоговая прибыль] < 001 )
  3. Импортируем Infographic Designer
  4. Добавляем импортированный визуальный элемент на страницу и перетаскиваем созданные ранее меры. Если всё сделано правильно, то отобразится небольшая черная окружность.
  5. В настройках подбираем нужный нам размер шрифта и переходим к конфигурированию условного форматирования.
  6. Дальше потребуется задать меру, на основании значения которой будет меняться форматирование, контрольные точки и, собственно, требуемые цвета.
  7. После этого остается только скрыть заголовок визуального элемента и разместить окружность в нужном месте.

 

Скачать пример можно здесь.