Литература по Power BI

18540

Привет, друзья! Спешу рассказать вам о книгах в моем переводе по Power BI и DAX, поделиться фрагментом из книги и предложить промо-код от переводчика на их покупку со скидкой 20%!

Но сначала хотелось бы представиться – меня зовут Александр Гинько, и я перевожу книги по программированию и бизнес-аналитике для издательства «ДМК Пресс». Книги, которыми я хочу поделиться с вами сегодня, – это «АНАЛИЗ ДАННЫХ ПРИ ПОМОЩИ MICROSOFT POWER BI И POWER PIVOT ДЛЯ EXCEL» и «ПОДРОБНОЕ РУКОВОДСТВО ПО DAX» от знаменитых итальянских авторов Марко Руссо и Альберто Феррари. Обе книги за короткое время (на русском они вышли только в 2020 году) уже успели стать бестселлерами, а последняя является единственным на данный момент наиболее полным руководством по языку DAX, без которого не обходится ни один сколько-нибудь серьезный проект на базе Power BI или Power Pivot.

 

От себя я бы посоветовал начать именно с руководства по DAX, после чего книга по анализу данных зайдет гораздо легче, поскольку в ней достаточно фрагментов кода на языке DAX.

В руководстве вы познакомитесь не только с базовыми аспектами языка DAX, такими как типы данных, операторы, вычисляемые столбцы и таблицы, меры, переменные, агрегаторы и итераторы, функции, контексты вычисления, модификаторы, группы и элементы вычислений, контексты фильтра, иерархии, но и погрузитесь в самые недра движка DAX – святая святых, к которой относятся вычисляемые и виртуальные связи, двунаправленная кросс-фильтрация, управление гранулярностями, исправление неоднозначностей в связях. На закуску вам будет представлена информация повышенной сложности – всё о внутренней архитектуре движков DAX, выборе аппаратного обеспечения, оптимизации движка VertiPaq и анализе плана запросов при помощи DAX Studio.

Что касается книги «АНАЛИЗ ДАННЫХ ПРИ ПОМОЩИ MICROSOFT POWER BI И POWER PIVOT ДЛЯ EXCEL», то, читая ее, вы погрузитесь в мир моделирования данных, узнаете о различных схемах, научитесь использовать модель с главной и подчиненной таблицами, множественными таблицами фактов, разберетесь в подробностях, как работать с датой и временем, историческими атрибутами, снимками, связями, разными уровнями гранулярности, сегментацией данных. Также вы узнаете, как работать с разными валютами.

Кроме того, хотелось бы анонсировать выпуск новой книги от тех же авторов – «Шаблоны DAX» (DAX Patterns), перевод которой я заканчиваю. Выйти она должна уже до конца февраля этого года. В этой книге будут представлены все наиболее популярные шаблоны, с которыми приходится сталкиваться разработчикам на DAX. Это и вычисления, связанные с логикой операций со временем, причем на основе месяцев, кварталов, недель и пользовательских календарей, и полуаддитивные вычисления, и расчет показателей нарастающим итогом, и таблицы параметров, и статическая и динамическая сегментация, ABC-анализ, ранжирование, иерархии и многое другое. В моей ленте на фейсбуке обязательно будет новость о выходе этой книги с обязательным промо-кодом на скидку от переводчика!

Обе книги можно приобрести на сайте издательства: ПОДРОБНОЕ РУКОВОДСТВО ПО DAXАНАЛИЗ ДАННЫХ ПРИ ПОМОЩИ MICROSOFT POWER BI И POWER PIVOT ДЛЯ EXCEL. Но главное, что вы можете приобрести их с существенной скидкой в 20%, воспользовавшись моим персональным промокодом от переводчика: Ginko_Power BI_DAX.

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

Тест на понимание контекстов вычисления

Перед тем как приступить к изучению более сложных аспектов контекстов вычисления, полезно будет пройти небольшую проверку на уже полученные знания на паре примеров. Пожалуйста, не смотрите ответ сразу, остановитесь и попытайтесь ответить на поставленный вопрос самостоятельно и только после этого сверьтесь с описанием. В качестве подсказки можем напомнить вам нашу дежурную мантру: «Контекст фильтра фильтрует, контекст строки осуществляет итерации по таблице. И наоборот – контекст строки НЕ фильтрует, а контекст фильтра НЕ осуществляет итерации по таблице».

Использование функции SUM в вычисляемых столбцах

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

Sales[SumOfSalesQuantity] = SUM ( Sales[Quantity] ) 

Помните, что внутри движок DAX преобразует эту формулу в выражение с итератором следующего вида:

Sales[SumOfSalesQuantity] = SUMX ( Sales; Sales[Quantity] ) 

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

  1. Значение столбца Quantity для текущей строки, свое для каждой записи.
  2. Итог по столбцу Quantity, одинаковый для всех строк.
  3. Ошибку, поскольку мы не можем использовать функцию SUM в вычисляемом столбце.

Остановитесь и подумайте, как бы вы ответили на этот вопрос.

Вопрос вполне правомочный. Ранее мы говорили, что подобную формулу можно прочитать так: «Получить сумму по количеству для всех строк, видимых в текущем контексте фильтра». А поскольку код выполняется для вычисляемого столбца, DAX будет проводить вычисление построчно в рамках контекста строки. В свою очередь, контекст строки не фильтрует таблицу. Единственный контекст, который способен это делать, – контекст фильтра. Все это ставит перед нами новый вопрос: а каким будет контекст фильтра в момент вычисления этого выражения? Ответ достаточно прост: контекст фильтра будет пустым. Вообще, контекст фильтра создается при помощи визуальных элементов отчета и дополнительных условий в запросе, а значения в вычисляемом столбце рассчитываются в момент обновления данных, когда никакие фильтры еще не наложены. Таким образом, функция SUM применяется ко всей таблице Sales, агрегируя значения столбца Sales[Quantity] для всех записей таблицы Sales.

Так что верным будет второй ответ. В вычисляемом столбце будет одинаковое значение для всех строк, и оно будет отражать общий итог по столбцу Sales[Quantity]. На рис. 4.8 показан вывод отчета с вычисляемым столбцом SumOfSalesQuantity.

Из этого примера видно, что два контекста вычисления могут мирно сосуществовать и при этом не взаимодействовать друг с другом. Оба контекста влияют на итоговые результаты, но делают они это по-разному. Агрегирующие функции вроде SUM, MIN и MAX используют только контекст фильтра, игнорируя при этом контекст строки. Если вы выбрали первый вариант ответа, что делают многие студенты, это нормально. Это означает, что вы по-прежнему путаете контекст фильтра с контекстом строки. Еще раз повторим, что контекст фильтра фильтрует, контекст строки осуществляет итерации по таблице. Первый ответ выбирают те, кто полагаются на интуицию, и теперь вы понимаете, почему. Если же вы сделали правильный выбор, что ж, поздравляем – значит, эта глава помогла вам понять разницу между различными контекстами.

Использование ссылок на столбцы в мерах

Вторая задача будет из противоположной области. Представьте, что вы пишете формулу для расчета валовой прибыли с использованием меры, а не вычисляемого столбца. У нас есть столбцы с ценой (Net Price) и себестоимостью (Unit Cost) за единицу товара, и мы пишем следующее выражение:

GrossMargin% := ( Sales[Net Price] - Sales[Unit Cost] ) / Sales[Unit Cost] 

Какой результат мы получим? Как и в первой задаче, мы предлагаем вам три варианта ответа на выбор:

  1. Выражение выглядит корректно, пора запускать отчет.
  2. Здесь есть ошибка, такую формулу писать нельзя.
  3. Такое выражение написать можно, но оно вернет ошибку при формировании отчета.

Как и в первом случае, остановитесь ненадолго, подумайте над ответом и только потом продолжайте чтение.

В этом коде мы ссылаемся на столбцы Sales[Net Price] и Sales[Unit Cost] без использования агрегирующих функций. Так что DAX придется вычислять значение по каждому из столбцов для конкретной строки. Но у движка нет возможности определить, с какой именно строкой он имеет дело в данный момент, поскольку мы не запускали итерации по таблице, а код написали не в вычисляемом столбце, а в мере. Иными словами, здесь в распоряжении DAX нет контекста строки, который мог бы помочь извлечь значение из нужного нам столбца в рамках этого выражения. Помните, что при создании меры автоматически не появляется контекст строки, это происходит только при создании вычисляемого столбца. Если нам нужен контекст строки внутри меры, необходимо воспользоваться итерационными функциями.

Таким образом, и здесь правильным вариантом ответа будет второй. Мы не можем написать такую формулу, поскольку она синтаксически неверна, и ошибка возникнет непосредственно в момент сохранения формулы.

Спасибо, на этом все. Добавляйтесь в друзья и подписывайтесь на фейсбуке, и вы будете в курсе всех последних новостей по моим переводам в области BI.