Power BI
Power BI от Microsoft — BI-платформа: импорт данных (Power Query), модель (DAX), интерактивные дашборды и публикация в веб-службу для команды.
1. Компоненты Power BI
- Power BI Desktop — бесплатное приложение для разработки отчётов.
- Power BI Service — облако: публикация, дашборды, шеринг.
- Power Query — загрузка и очистка данных.
- DAX — язык формул для вычисляемых мер.
2. Загрузка данных
Источники: Excel, CSV, SQL Server, MySQL, PostgreSQL, API, веб-страницы.
Получить данные → SQL Server → вписать сервер и БД
→ Выбрать таблицы → Загрузить условно или Преобразовать3. Power Query и очистка
- Удаление столбцов, фильтры, объединение запросов (Merge/Append).
- Трансформация типов и дат; заполнение пропусков.
- Каждое действие записывается шагом в редакторе — легко откатить.
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. Визуализации
- KPI-карточки, линейные графики по времени.
- Столбчатые/круговые диаграммы, таблицу-матрица.
- Срез (slicer) и фильтры страницы/отчёта.
- Performance Analyzer (вкладка View) подсвечивает, какие визуалы тормозят.
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. Лучшие практики
- Меры вместо вычисляемых столбцов: меньше памяти, быстрее отчёты.
- Фильтрация в Power Query, а не в DAX — прозрачнее.
- Тюнинг: Performance Analyzer; фильтры — в Power Query, меры — в DAX.
- Используй AppSource для готовых визуалов и виджетов.
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 | добавить фильтр, не отбрасывая остальные |
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])SAMEPERIODLASTYEAR— сравнение с прошлым годом;TOTALMTD / TOTALQTD / TOTALYTD— накопление за период;DATEADD— сдвиг на произвольное число периодов;- помечай календарь флагом
IsWorkday, чтобы считать только рабочие дни.
13. Row-Level Security (RLS)
RLS ограничивает данные по роли пользователя: менеджер видит только свой регион, бухгалтер — всё.
// правило для роли "Менеджер" в Power BI Desktop
[Region] = USERPRINCIPALNAME()Правила создаются в Power BI Desktop на вкладке Modelling → Manage roles, а затем роли назначаются в службе: Workspace → Security. Для динамики используй USERPRINCIPALNAME и справочник прав.
- проверяй RLS в режиме «View as» от имени конкретной роли;
- RLS работает и в DirectQuery, и в Import-моделях;
- секретные данные в отчёте с RLS не попадут к чужой роли.
14. Макет отчёта: закладки и drill-through
Закладки (bookmarks) сохраняют состояние страницы: фильтры, видимость панелей. Так делают переключение метрик по кнопкам и «листающиеся» дашборды.
Создание: View -> Bookmarks -> Add
Кнопка: Insert -> Buttons -> Bookmark- drill-through — переход на детализированный отчёт с сохранением фильтров;
- закрепляй навигационные кнопки в одинаковом месте каждой страницы;
- настраивай tooltips страницы для быстрого контекста без лишних экранов.
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
Итог- каждый шаг переиспользуем: откат к середине запроса не ломает начало;
- функции
each— компактная запись анонимных функций; - структурируй обработку: фильтры и типы раньше, объединения позже.
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")- иерархии в Dimensions: не плюсуй географию в одну плоскую таблицу;
- категории считай мерами или вычисляемыми колонками с осторожностью — колонки жгут память;
- невидимые меры-«справочники» держи в одной таблице параметров.
17. Оптимизация отчёта: от запроса до визуала
Медленный дашборд почти всегда лечится до лишней сложности DAX:
| Причина | Решение |
|---|---|
| лишние строки в Power Query | фильтруй на источнике, убирай ненужные колонки |
| высококардинальные колонки | снижай по необходимости, обрезай текст |
| слишком много визуалов на страницу | декомпозируй страницу, скрывай до необходимости |
| мера-«тяжеловес» | выноси подзапросы в отдельные меры |
Оптимизация: View -> Performance Analyzer
-> Start recording -> Refresh visual18. Совместная работа: workspaces, pipelines и версии
Power BI в команде живёт по процессу: разработка → тест → прод. Рабочие области и deployment pipelines разводят среды:
- dev-область: эксперименты, новые меры и визуалы;
- test-область: проверка на полных данных и RLS;
- prod-область: уже показанная руководству сборка;
- версии: Power BI Desktop хранит историю, но человек решает, что «выкатывать».
Деплой: Power BI Service -> Deployment Pipelines
-> Создать pipeline (Dev/Test/Prod) и переносить контент19. Режимы подключения: Import vs DirectQuery
Способ подключения определяет архитектуру отчёта. Import тянет данные в память (быстрые визуалы, агрегации), DirectQuery запрашивает источник на каждый визуал:
| Режим | Когда выбирать | Ограничение |
|---|---|---|
| Import | разумный объём, нужна скорость | память и время загрузки |
| DirectQuery | большие данные, актуальность в реальном времени | латентность, нагрузка на источник |
| Live | Analysis Services/Tabular уже в работе | меньше возможностей в отчёте |
- смешивай: Composite Model — часть таблиц Import, часть DirectQuery;
- для DirectQuery заводи агрегационные таблицы, чтобы не грузить деталью;
- не переключай режим «на лету» в конце проекта — это меняет и производительность, и возможности DAX.
20. QA отчёта: проверка чисел
Красивая визуализация неверного числа опаснее, чем его отсутствие. Перед показом отчёта пользователям прогони проверку:
| Проверка | Как выполнить |
|---|---|
| итог vs источник | SELECT SUM() в SQL и сравнение с визуалом |
| NULL в мерах | проверить avg/sum на пустых строках |
| фильтры страницы | срезы, drill-through и скрытые фильтры |
| граничные даты | первый и последний день периода |
Мера "Контроль продаж" =
[Продажи из отчёта] - SUM(sales[amount])21. Параметры и шаблоны отчёта
Повторяющийся контент (ежемесячные отчёты по филиалам, отчёты по проектам) выноси в шаблоны. Параметры Power Query и переменные отчёта делают одну модель переиспользуемой:
- параметры Power Query: язык, дата начала, регион — передаются при обновлении данных;
- шаблон .pbix: одна визуальная схема, разные источники;
- параметры отчёта в сервисе: переопределяй значения при настройке источника данных;
- храни шаблон в dev-области и копируй в prod через pipelines — версии не разъедутся.
// Параметр в Power Query
#"Загрузка региона" = RegionParam <> null
and Source[region] = RegionParam22. 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- полная цепочка данных: готовь витрину в Python-пайплайне, а не только внутри отчёта;
- визуалы Python/R — для сложных графиков, которых нет в стандартной библиотеке;
- помни про таймауты и тестовые наборы — сценарии на больших данных могут упираться в 10-минутный лимит обновления.
Что дальше
Из визуалов дополняйся из Microsoft AppSource, а данные готовь в SQL, Pandas или на warehouse (см. ClickHouse).