Power BI

Power BI от Microsoft — BI-платформа: импорт данных (Power Query), модель (DAX), интерактивные дашборды и публикация в веб-службу для команды.

Уровень: начальный 18 разделов ⏱ 4 часа

1. Компоненты Power BI

2. Загрузка данных

Источники: Excel, CSV, SQL Server, MySQL, PostgreSQL, API, веб-страницы.

Получить данные → SQL Server → вписать сервер и БД
→ Выбрать таблицы → Загрузить условно или Преобразовать

3. Power Query и очистка

Названия столбцов в Power Query нормализуй сразу (без пробелов и кириллицы в коде DAX жёстче) — это экономит часы позже.

4. Модель данных: таблицы и связи

Модель (star schema): таблица фактов (продажи) + таблицы измерений (даты, клиенты, товары). Связи: один-ко-многим по ключам, фильтры распространяются в обе стороны.

5. DAX: меры и вычисляемые столбцы

Revenue = SUM(Sales[Amount])
RevenuePY = CALCULATE([Revenue], SAMEPERIODLASTYEAR(Date[Date]))
YoY = DIVIDE([Revenue] - [RevenuePY], [RevenuePY], 0)

Quantity sold = DISTINCTCOUNT(Sales[OrderID])
ReturnRate = DIVIDE([Returns], [Orders])

Меры вычисляются в момент запроса — экономьте вычисляемые столбцы.

6. Визуализации

7. Календарная таблица

Calendar = CALENDAR(DATE(2024,1,1), DATE(2026,12,31))

Year = YEAR(Calendar[Date])
MonthName = FORMAT(Calendar[Date], "MMM")

Без отдельного календаря функции времени (отклонение по годам, месяц-к-месяцу) не работают корректно.

8. Публикация и service

9. Автообновление

Планировщик обновления (в час) для источников в службе; шлюз (gateway) для локальных БД и файлов. Для живого стриминга — push-API.

10. Лучшие практики

Import-модели тянут данные в память: большие факт-таблицы делай агрегированными (таблицы агрегаций) или DirectQuery.

11. DAX: контекст фильтра и CALCULATE

Базовый приём DAX — переопределение контекста фильтра функцией CALCULATE. Она меняет фильтры для выражения во время вычисления меры:

Sales 2026 = CALCULATE([Revenue], Year[Year] = 2026)
Region North = CALCULATE([Revenue], Customer[Region] = "Север")
Share = DIVIDE([Revenue], CALCULATE([Revenue], ALL(Product)))

ALL снимает фильтры по таблице или колонке — так считается доля или итог по всему набору.

ФункцияНазначение
CALCULATEизменить контекст фильтрации
ALL / ALLEXCEPTснять фильтры
FILTERзадать произвольное условие по строкам
KEEPFILTERSдобавить фильтр, не отбрасывая остальные
Сначала пропиши меры простыми выражениями, а CALCULATE добавляй только там, где нужен другой контекст — это частая ловушка новичков.

12. Time Intelligence

Функции времени требуют отдельного календаря со сплошным рядом дат. Без него сравнения периодов дают неверные результаты.

Sales PY = CALCULATE([Revenue], SAMEPERIODLASTYEAR(Date[Date]))
Sales MTD = TOTALMTD([Revenue], Date[Date])
Sales QTD = TOTALQTD([Revenue], Date[Date])
MoM = DIVIDE([Revenue] - [RevenuePrevMonth], [RevenuePrevMonth])
Календарь должен заканчиваться в будущем, иначе отчёты «съедают» последние данные при сравнении с прошлым годом.

13. Row-Level Security (RLS)

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

// правило для роли "Менеджер" в Power BI Desktop
[Region] = USERPRINCIPALNAME()

Правила создаются в Power BI Desktop на вкладке Modelling → Manage roles, а затем роли назначаются в службе: Workspace → Security. Для динамики используй USERPRINCIPALNAME и справочник прав.

RLS — это проверка в отчёте, а не в базе данных: чувствительные уровни всегда дублируй на стороне источника.

14. Макет отчёта: закладки и drill-through

Закладки (bookmarks) сохраняют состояние страницы: фильтры, видимость панелей. Так делают переключение метрик по кнопкам и «листающиеся» дашборды.

Создание: View -> Bookmarks -> Add
Кнопка:   Insert -> Buttons -> Bookmark
Чистый макет: единая шрифтовая сетка, палитра из фирменного стиля и не более 2–3 KPI в строке. Глаз хуже считывает шесть и больше значений подряд.

15. Язык M в Power Query

Когда стандартных кнопок не хватает, шаги редактируются прямо на языке M — каждый шаг запроса это строка в панели Advanced Editor. Базовые конструкции:

let
    Source = Csv.Document(File.Contents("orders.csv")),
    Тип    = Table.TransformColumnTypes(Source, {{"price", type number}}),
    Фильтр = Table.SelectRows(Тип, each [price] > 100),
    Итог   = Table.Group(Фильтр, {"region"}, {{"sum", each List.Sum([price]), type number}})
in
    Итог
Сделай шаги «лестницей»: один шаг — одно изменение. Так проще понять логику и переиспользовать куски запроса в других загрузках.

16. Иерархии, меры и категории: моделирование

Хорошая модель предсказуемо отвечает на вопросы. Частые приёмы моделирования:

// иерархический календарь: год -> квартал -> месяц
Месяц = FORMAT(Calendar[Date], "YYYY-MM")

// категоризация продаж
Класс = SWITCH(TRUE(),
    [Revenue] > 1000000, "A",
    [Revenue] >  400000, "B",
    "C")

// «разряд»: бакеты значения
Bucket = SWITCH(TRUE(), [Margin] < 0.05, "low", [Margin] < 0.15, "mid", "high")
Слишком много измерений «нарезают» меру пересечениями и замедляют отчёт. Лучше 3–4 нужных измерения, чем десять «на всякий случай».

17. Оптимизация отчёта: от запроса до визуала

Медленный дашборд почти всегда лечится до лишней сложности DAX:

ПричинаРешение
лишние строки в Power Queryфильтруй на источнике, убирай ненужные колонки
высококардинальные колонкиснижай по необходимости, обрезай текст
слишком много визуалов на страницудекомпозируй страницу, скрывай до необходимости
мера-«тяжеловес»выноси подзапросы в отдельные меры
Оптимизация: View -> Performance Analyzer
-> Start recording -> Refresh visual
Начни с самого медленного визуала и упрости его запрос; часто выигрыш от одной меры больше, чем от пересборки всей модели.

18. Совместная работа: workspaces, pipelines и версии

Power BI в команде живёт по процессу: разработка → тест → прод. Рабочие области и deployment pipelines разводят среды:

Деплой: Power BI Service -> Deployment Pipelines
-> Создать pipeline (Dev/Test/Prod) и переносить контент
Перед переносом в Prod обнови параметры источника и проверь, что RLS-роли не «уехали». Автоматизация через API и CI поднимет процесс ещё выше.

19. Режимы подключения: Import vs DirectQuery

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

РежимКогда выбиратьОграничение
Importразумный объём, нужна скоростьпамять и время загрузки
DirectQueryбольшие данные, актуальность в реальном временилатентность, нагрузка на источник
LiveAnalysis Services/Tabular уже в работеменьше возможностей в отчёте
DirectQuery поддерживает не весь DAX (ряд функций времени работает иначе) — проверь совместимость мер до выбора режима.

20. QA отчёта: проверка чисел

Красивая визуализация неверного числа опаснее, чем его отсутствие. Перед показом отчёта пользователям прогони проверку:

ПроверкаКак выполнить
итог vs источникSELECT SUM() в SQL и сравнение с визуалом
NULL в мерахпроверить avg/sum на пустых строках
фильтры страницысрезы, drill-through и скрытые фильтры
граничные датыпервый и последний день периода
Мера "Контроль продаж" =
  [Продажи из отчёта] - SUM(sales[amount])
Лучший QA-инструмент — второй человек, который сверяет цифры «от бизнеса». Свежий взгляд находит то, что привычный пропускает.

21. Параметры и шаблоны отчёта

Повторяющийся контент (ежемесячные отчёты по филиалам, отчёты по проектам) выноси в шаблоны. Параметры Power Query и переменные отчёта делают одну модель переиспользуемой:

// Параметр в Power Query
#"Загрузка региона" = RegionParam <> null
  and Source[region] = RegionParam
Параметризация снижает дублирование: правка модели в одном месте обновляет все отчёты, собранные из шаблона.

22. Python и R в Power BI

Когда Power Query упирается в логику, на помощь приходят сценарии Python и R — и в Power Query (в кастомном шаге), и в визуалах. Пример сценария в Power Query:

let
  Source = Excel.CurrentWorkbook(){[Name="Sales"]}[Content],
  Cleaned = Python.Execute("
import pandas as pd
df = dataset[dataset['amount'] > 0]
df['month'] = df['date'].dt.to_period('M')
", [dataset=Source]),
  toTable = Table.FromRecords(Cleaned)
in
  toTable
Не дублируй тяжёлые расчёты и в M, и в Python: единая точка правды (например, скрипт-пайплайн) упрощает поддержку, остальное оставляй модели.

Что дальше

Из визуалов дополняйся из Microsoft AppSource, а данные готовь в SQL, Pandas или на warehouse (см. ClickHouse).

← Вернуться к курсам