MiddlePerformance Marketer > Google Ads > Рекламные платформы и форматы
Короткий ответ Broad match расширяет запросы по смыслу, а Smart Bidding оптимизируется под заданную конверсию. Если сигнал слабый или данных мало, алгоритм может покупать клики по нерелевантным запросам и повышать число формальных конверсий без роста квалифицированных продаж. Как это работает подробнее Алгоритм учится на переданном событии. Если конверсией считается клик или неквалифицированная заявка, рост таких событий не обязательно означает прирост продаж. Поисковые запросы показывают, куда ушёл бюджет. Сигнал. Передавай событие, близкое к покупке или квалифицированному лиду. Контроль. Сверяйся с CRM и регулярно веди минус-слова. Что использовать на практике Проверь качество и объём конверсий, затем ограниченно тестируй broad match, анализируя запросы, расходы и квалификацию. Подводные камни Не считай автоматические ставки гарантией релевантности: система оптимизирует заданную метрику, даже если она слабо связана с выручкой.
broad-matchconversion-quality
MiddlePerformance Marketer > Google Ads > Трекинг и аналитика
Короткий ответ Пиксель зависит от браузера и cookie; CAPI или S2S передаёт событие напрямую платформе и может использовать click ID или хешированные first-party данные. Как это работает подробнее Клиентский пиксель зависит от того, загрузится ли скрипт в браузере пользователя и сохранится ли cookie для связи с кликом; CAPI/S2S отправляет те же или более надёжные события с сервера сайта или CRM, используя собственные идентификаторы, например хешированный email или click ID, что снижает зависимость от браузерных ограничений. Степень потери данных сильно различается по браузерам и регионам — доля пользователей Safari с активным ITP заметно выше на части рынков, что делает проблему более острой для бизнесов с высокой долей iOS-аудитории. Что использовать на практике Сочетайте пиксель и серверную передачу, связывайте дубликаты общим event_id и проверьте правовые основания и правила согласия в регионах пользователей. Подводные камни CAPI не устраняет ограничения приватности и без дедупликации может посчитать одну п
conversions-apicookie-consent
MiddlePython Developer > Основы Python > Тестирование кода
Короткий ответ Тесты начинают зависеть от порядка, когда делят общее изменяемое состояние — глобальные переменные, данные в тестовой БД без отката, кеш, файлы на диске — и один тест неявно опирается на состояние, оставленное предыдущим; решение — явная изоляция через фикстуры с очисткой/откатом перед или после каждого теста. Как это работает подробнее Если тест A создаёт запись в БД и не удаляет её, а тест B неявно рассчитывает на пустую таблицу (например, проверяет count() == 0), результат теста B зависит от того, выполнялся ли тест A раньше. Запуск тестов в случайном порядке (pytest-randomly) — хороший способ быстро выявить такие скрытые зависимости. Пример кода Что использовать на практике Практика. Надёжная изоляция обычно достигается транзакционным откатом БД между тестами, пересозданием моков в каждой фикстуре function-уровня вместо модульных глобальных моков, и избеганием мутируемых global/module-level переменных в тестируемом коде либо их явным сбросом в фикстуре. Подводные камни Риск. Использовать mo
pythonshared-state
JuniorPython Developer > Основы Python > Производительность базы данных
Короткий ответ Принцип наименьших привилегий требует выдавать приложению только права, необходимые для его работы (SELECT/INSERT/UPDATE/DELETE на нужных таблицах), чтобы при компрометации приложения ущерб был ограничен, а не распространялся на всю базу данных, включая возможность удалять таблицы или читать чужие схемы. Как это работает подробнее В большинстве СУБД можно создать отдельного пользователя/роль с ограниченным набором грантов на конкретные таблицы и операции, отдельно от учётной записи администратора, используемой для миграций и обслуживания. Пример кода Что использовать на практике Практика. Для обычного рабочего процесса приложения достаточно CRUD-прав на свои таблицы; права на DDL (создание/удаление таблиц) и системные таблицы обычно нужны только отдельной учётной записи для миграций, запускаемой отдельно от основного приложения. Подводные камни Риск. Используют одного и того же пользователя БД для приложения и для миграций «для простоты»; выдают права на все таблицы схемы, хотя сервис работает
access-controldatabases
JuniorData Analyst > SQL и данные > Качество данных
Короткий ответ Храните момент времени в UTC, а бизнес-день вычисляйте после явного преобразования в согласованную таймзону. Часовую зону метрики нужно документировать. Как это работает подробнее Операция DATE(timestamp) использует календарную дату переданного значения. Если источники записывают локальное время без зоны, события одного момента могут попасть в разные дни. UTC. Удобен как единая шкала хранения и обмена. Локальная зона. Нужна при расчёте суток пользователя, магазина или бизнеса. Пример кода Что использовать на практике Храните timezone-aware timestamp и определяйте, чьи именно сутки использует отчёт. Тестируйте границы около полуночи и переходов на летнее время для соответствующих регионов. Подводные камни Двойная конвертация. Неверное предположение о типе исходного timestamp сдвинет время дважды. Фиксированный офсет. Значение вроде UTC+3 не заменяет именованную зону в регионах с DST.
daily-metricsdate-trunc
JuniorPerformance Marketer > Google Ads > Стратегии ставок
Короткий ответ Многие платформы считают крупные изменения бюджета, аудитории, цели оптимизации или замену большей части креативов «значительным редактированием», которое сбрасывает накопленную статистику обучения, и алгоритм снова начинает собирать данные почти с нуля. Как это работает подробнее Алгоритм строит прогноз вероятности результата на основе недавней истории при конкретных условиях (кому показывали, с каким бюджетом, с какой целью). Существенное изменение этих условий делает старую историю менее релевантной, и система переоценивает ставки заново. Что использовать на практике На практике. Если кампания работает стабильно, изменения лучше вносить редко и некрупными шагами, группируя их, а не вносить правки каждый день по отдельности. Пример. За 5 дней подряд внесено 5 разных изменений бюджета. Статус ad set'а в Meta Ads Manager постоянно возвращается в «Learning». Проверка: журнал изменений (Edit history) кампании показывает частоту и тип правок. Подводные камни Частая ошибка. Частая ошибка — ежедневн
ad-platformsbidding-strategies
MiddleData Analyst > SQL и данные > Python для анализа данных
Короткий ответ Полное совпадение всех столбцов строки — более строгое условие, чем совпадение бизнес-ключа (например, order_id); если в таблице несколько версий одного заказа с разными статусами, проверка полных дубликатов их не найдёт, и в итоге дашборд, считающий по order_id, и источник, считающий по строкам, дадут разные числа. Как это работает подробнее df.duplicated() без параметров сравнивает все столбцы, а df.duplicated(subset=['order_id']) — только указанный ключ; если каждая версия заказа отличается хотя бы одним полем (например, временной меткой обновления), полные дубликаты не обнаруживаются, хотя по бизнес-смыслу должна быть одна запись на заказ. Пример кода Что использовать на практике Практика. при расхождении дашборда и источника стоит первым шагом сравнить df['order_id'].nunique() с len(df) — если они не равны, источник содержит несколько строк на один бизнес-объект, и нужно явно решить, какую версию считать "актуальной" (например, keep='last' по дате обновления) до агрегации. Проверка. len(df
business-keydashboards
MiddleData Analyst > SQL и данные > Python для анализа данных
Короткий ответ apply вызывает функцию отдельно для каждого элемента или строки через интерпретатор Python, тогда как векторизованные операции (например, встроенная арифметика pandas/NumPy) выполняются скомпилированным кодом сразу над всем массивом, что обычно намного быстрее на больших данных. Как это работает подробнее векторизованные операции (df['a'] + df['b'], str.contains, np.where) написаны на C и обрабатывают весь столбец за один проход без накладных расходов на вызов функции Python для каждой строки; apply(lambda row: ..., axis=1) для каждой строки создаёт отдельный объект Series и вызывает Python-функцию, что существенно медленнее на больших таблицах. Пример кода Что использовать на практике Практика. apply оправдан, когда логику действительно нельзя выразить встроенными операциями — например, сложная условная логика, зависящая от нескольких столбцов одновременно нестандартным образом, или вызов внешней функции/API; для простых случаев обычно есть векторизованная альтернатива (np.where, np.select, st
applynumpy
MiddleData Analyst > SQL и данные > SQL
Короткий ответ AVG(amount) игнорирует строки с NULL и делит сумму только на количество заказов с заполненной суммой, поэтому при наличии «битых» заказов с NULL вместо суммы средний чек окажется завышен или занижен по сравнению с ожиданием «сумма всех заказов / общее число заказов». Как это работает подробнее Как это работает: агрегатные функции в SQL по умолчанию пропускают NULL-значения при вычислении; то есть AVG фактически считает SUM(ненулевых значений) / COUNT(ненулевых значений), а не делит на общее количество строк в группе (COUNT(*)). Пример кода Что использовать на практике На практике: перед доверием к AVG важно явно проверить, сколько строк имеют NULL в этом поле (COUNT(*) - COUNT(amount)), и понять причину — технический сбой интеграции, легитимный «пустой» заказ (например, отменённый до оплаты) или что-то ещё. Если NULL на самом деле должен означать 0, нужно явно привести это через COALESCE(amount, 0) до агрегации, а не полагаться на поведение AVG по умолчанию. Проверка: Если total_orders = 1000,
aggregationaverage
JuniorData Analyst > SQL и данные > SQL
Короткий ответ COUNT(*) считает строки независимо от их содержимого. COUNT(column_name) игнорирует строки, в которых выбранный столбец равен NULL. Как это работает подробнее Большинство агрегатных функций не учитывает NULL. Для COUNT(column_name) это означает подсчёт только известных значений, тогда как звёздочка обозначает саму строку. COUNT(DISTINCT column_name) делает ещё один шаг: исключает NULL и считает количество различных ненулевых значений. Пример кода Что использовать на практике Полнота данных. Сравните общее число строк с числом заполненных email; разность покажет пропуски. После LEFT JOIN. Для числа связанных записей считайте ненулевой ключ правой таблицы, а не COUNT(*). Подводные камни Нулевое значение. Число 0 и пустая строка учитываются; исключается только NULL. Дубликаты. Обычный COUNT(column_name) не устраняет повторяющиеся значения.
aggregationscount