MiddleData Analyst > SQL и данные > Визуализация и BI
Короткий ответ Derived table нужна, когда метрика требует многошаговой агрегации/предварительного джойна (например, когортное удержание фиксирует дату когорты и отдельно считает активность в последующих периодах), что невозможно выразить одной мерой над базовым explore. Как это работает подробнее Меры и измерения LookML работают в рамках одного дерева джойнов на запрос; когортное удержание требует сначала зафиксировать когорту пользователя (например, месяц регистрации), а затем отдельно посчитать активность в каждом последующем периоде относительно неё — такая двухшаговая логика естественно выражается через derived table, которую Looker затем открывает как новый explore. Пример кода Что использовать на практике Применение. Стройте derived table с явным шагом агрегации (cohort_month, period_number, active_users), кэшируйте результат через persist_for, если вычисление дорогое, джойньте обратно для дашборда; явно документируйте гранулярность derived table для тех, кто будет строить на ней джойны. Проверка. сумма
cohort-analysisderived-tables
MiddlePerformance Marketer > Google Ads > Инструменты и автоматизация
Короткий ответ Сначала зафиксируйте одинаковые аккаунт, период, валюту и уровень детализации, затем проверьте время обновления, фильтры, кэш и дубли при объединении данных. Сравнивайте один источник и один завершённый день до изменения формул дашборда. Как это работает подробнее Зафиксируйте настройки отчёта и кабинета, включая часовой пояс и границы суток. Проверьте, когда обновился источник, нет ли фильтрации строк или различий в валюте, а затем проследите путь расхода от исходной выгрузки до модели BI. При blending или отношениях проверьте уникальность ключей и то, что соединение не повторяет значения. Порядок проверок. Сначала сопоставьте исходный экспорт платформы, затем слой хранения, расчёт и визуализацию. Контрольная выборка. Возьмите одну кампанию и дату: на меньшем срезе легче обнаружить дубликат или потерянную строку. Пример кода Что использовать на практике Документируйте сравнение. Запишите диапазон дат, часовой пояс, время обновления, фильтры и выбранную метрику. Меняйте один слой. Исправляйте в
data-blendingdata-reconciliation
MiddlePerformance Marketer > Google Ads > Масштабирование бюджета
Короткий ответ Campaign Budget Optimization распределяет бюджет в пользу ad set'а, который в моменте выглядит эффективнее по сигналам алгоритма (не всегда совпадает с ROAS за длинный период), поэтому нужно сравнить производительность сетов за одинаковый и достаточный период и проверить, не находится ли обделённый сет в фазе обучения из-за недавних правок. Как это работает подробнее CBO в реальном времени перераспределяет бюджет между активными ad set'ами на основе прогнозируемой ценности результата по каждому показу, поэтому сет с более быстрым откликом или более дешёвыми конверсиями в моменте получает больше показов, даже если по факту его долгосрочный ROAS ниже. Что использовать на практике На практике. Нужно сравнить метрики обоих сетов за одинаковое окно (7-14 дней), проверить частоту правок каждого сета и при необходимости временно использовать раздельные бюджеты ad set budget вместо CBO, чтобы гарантировать минимальный расход на нужный сегмент, либо задать минимальный расход через правила/ограничения CB
ad-platformsbudget-scaling
MiddleData Analyst > SQL и данные > Python для анализа данных
Короткий ответ Перед выводом о реальном падении стоит последовательно проверить: не изменился ли объём и структура исходных данных (дубликаты, пропуски), не "потерялись" ли строки при merge/фильтрации, применяется ли тот же период и та же логика расчёта, что и в прошлый раз, и только после этого делать содержательный вывод. Как это работает подробнее типичный чек-лист включает: сравнение количества строк исходных данных за оба периода (df.shape, nunique по ключу), проверку доли пропусков в ключевых полях, проверку, не изменился ли результат merge по числу строк (размножение или потеря), и повторный просчёт метрики на "сырых" данных без промежуточных трансформаций, чтобы исключить ошибку в коде. Пример кода Что использовать на практике На практике. полезно держать под рукой "контрольные" агрегаты с предыдущего запуска отчёта (например, сохранённые в отдельном файле или таблице), чтобы быстро сравнивать не только итоговую метрику, но и промежуточные шаги расчёта; если расхождение находится на конкретном шаге па
data-qualitydebugging
JuniorData Analyst > SQL и данные > Визуализация и BI
Короткий ответ Slicer — это визуальный, видимый на холсте интерактивный элемент фильтрации, которым может управлять конечный пользователь; фильтр на панели Filters настраивается автором отчёта и часто скрыт от обычного зрителя. Как это работает подробнее Slicer сам является визуалом (выпадающий список, диапазон дат и т.п.), привязанным к полю, и влияет на другие визуалы страницы или всего отчёта в зависимости от области применения; панель Filters задаёт условия на уровне визуала/страницы/отчёта, настроенные автором. Что использовать на практике Рекомендация. Используйте slicer для фильтров, которыми пользователь должен управлять сам (период, регион). Рекомендация. Используйте Filter pane для фиксированной бизнес-логики (например, исключение тестовых аккаунтов), которую нельзя случайно снять. Подводные камни Риск. Вынос критичного фильтра «исключить тестовые данные» в slicer, который пользователь может случайно сбросить. Риск. Избыточное число slicer'ов, замедляющее работу отчёта на большой модели данных.
dashboardsfilters
SeniorPython Developer > Основы Python > Транзакции и конкурентность
Короткий ответ Основная причина, при которой autovacuum не может очистить устаревшие версии строк, — долго открытые транзакции (включая «зависшие» idle in transaction соединения) или не продвигающиеся replication slots, которые удерживают старый снимок MVCC; решение — контроль длительности транзакций на уровне приложения/пула (таймауты), мониторинг age транзакций и слотов, и более агрессивная настройка autovacuum для горячих таблиц. Как это работает подробнее PostgreSQL использует MVCC — каждое UPDATE/DELETE создаёт новую версию строки, старая остаётся, пока активная транзакция потенциально может её видеть; autovacuum не может продвинуться дальше самой старой активной транзакции или replication slot — отсюда bloat даже при формально работающем autovacuum. Сравнение Компромисс. Слишком агрессивные настройки autovacuum снижают bloat, но увеличивают фоновую нагрузку на I/O/CPU, заметную на пиковой нагрузке; слишком редкий vacuum экономит ресурсы в моменте, но накапливает bloat, замедляющий Seq Scan и индексы — р
autovacuumconcurrency
MiddlePython Developer > Основы Python > ООП и модель объектов
Короткий ответ Атрибут, объявленный прямо в теле класса (а не внутри __init__ через self.attr), принадлежит самому классу и является общим для всех экземпляров; если это изменяемый объект (список, словарь) и к нему обращаются через self.attr.append(...), все экземпляры мутируют один и тот же общий объект — исправление: инициализировать список индивидуально для каждого экземпляра внутри __init__. Как это работает подробнее Атрибут класса (class Order: items = []) создаётся один раз при определении класса и хранится в namespace самого класса, а не в __dict__ каждого экземпляра. Чтение self.items находит этот общий атрибут (Python сначала ищет в __dict__ экземпляра, не находит и поднимается к классу), но self.items.append(x) не создаёт новый атрибут экземпляра — он мутирует тот самый общий объект класса, поэтому изменение видно через любой экземпляр. Пример кода Что использовать на практике Практика. Диагностируют такую проблему, сравнивая id(order1.items) и id(order2.items) — совпадающий id подтверждает, что эт
dunder-methodsobject-initialization
MiddlePython Developer > Основы Python > Функции и области видимости
Короткий ответ Повторная конкатенация строк через += в цикле на больших объёмах данных квадратично деградирует по времени, так как строки в Python неизменяемы и каждая конкатенация создаёт новую строку, копируя все предыдущие символы; решение — собирать части в список и объединить один раз через ''.join(parts) в конце. Как это работает подробнее Строка — неизменяемый объект, поэтому result += chunk не дополняет существующую строку "по месту", а создаёт новый объект, копируя все символы старой строки плюс новый фрагмент. При N итерациях суммарный объём скопированных символов растёт квадратично (1+2+...+N), хотя CPython в некоторых случаях оптимизирует этот паттерн для простых локальных переменных, такая оптимизация не гарантирована языком и не работает надёжно, например, при накоплении в атрибуте объекта или списке. Пример кода Что использовать на практике Практика. Профилировать такую проблему можно через cProfile/timeit на реальном объёме данных, сравнивая время при росте N: квадратичная деградация видна по
functions-scopeperformance
SeniorPython Developer > Основы Python > Потоки и синхронизация
Короткий ответ Нужно архитектурно свести к минимуму ситуации одновременного удержания нескольких локов, а там, где это невозможно, ввести единый документированный порядок захвата локов во всём коде и таймауты на acquire с логированием, чтобы потенциальный дедлок проявлялся как диагностируемая ошибка, а не бесконечное зависание. Как это работает подробнее Классический дедлок с несколькими локами требует одновременного удержания больше одного лока разными потоками в противоположном порядке; редкость и труднообъяснимость обычно означает, что условие возникает только при специфичной гонке по времени между путями кода, которые в обычных тестах не пересекаются достаточно часто. Компромисс. Полный отказ от нескольких одновременно удерживаемых локов устраняет риск дедлока почти полностью, но может создать излишнюю последовательность там, где логически возможен параллелизм, снижая throughput; введение таймаутов на acquire делает дедлоки наблюдаемыми и некатастрофическими, но требует продумать обработку отказа захвата
concurrencydeadlocks
JuniorData Analyst > SQL и данные > Визуализация и BI
Короткий ответ Dimension — это категориальное поле для группировки и разреза данных (например, категория, регион); Measure — числовое поле, которое агрегируется функцией вроде SUM или AVG (например, сумма заказа). Как это работает подробнее Tableau автоматически классифицирует поля на «синие» (измерения) и «зелёные» (меры) по типу данных; измерения задают гранулярность представления, меры агрегируются выбранной функцией. Что использовать на практике Рекомендация. Числовое поле иногда используют как измерение (например, дискретный Год), а измерение можно поместить на полку мер для подсчёта количества. Рекомендация. Всегда проверяйте, что функция агрегации (SUM/AVG/COUNT DISTINCT) соответствует смыслу метрики. Подводные камни Риск. Оставить агрегацию SUM по умолчанию там, где нужна AVG или COUNT DISTINCT (например, некорректное суммирование уже посчитанной доли). Риск. Трактовать ID-поле как меру и случайно его суммировать.
aggregationdimensions