JuniorPerformance Marketer > Google Ads > Частота и креативы
Короткий ответ Frequency cap — это ограничение числа показов одного объявления одному пользователю за заданный период (например, не более 3 раз за 7 дней), которое задаётся на уровне кампании или ad set'а там, где платформа это поддерживает. Как это работает подробнее Платформа отслеживает число показов на уникального пользователя и прекращает показывать объявление этому пользователю после достижения лимита в указанном окне времени, перераспределяя бюджет на показ другим людям из аудитории. Что использовать на практике На практике. Частотный лимит чаще доступен для охватных целей и ручных/контролируемых стратегий показа; он помогает избежать переутомления аудитории, но слишком низкий лимит может ограничить расход бюджета, если аудитория небольшая. Пример. Настройка: «не более 2 показов на пользователя за 7 дней» для охватной кампании. Проверка: метрика Frequency в отчёте не должна превышать заданный лимит в среднем по аудитории. Подводные камни Частая ошибка. Частая ошибка — ставить одинаковый частотный лимит
ad-platformsads-scripts
JuniorPerformance Marketer > Google Ads > Аудитории и ретаргетинг
Короткий ответ Окно ретаргетинга — это период, за который учитываются действия пользователя (например, визит на сайт) для включения его в аудиторию; оно влияет на размер аудитории и на то, насколько «свежим» или «тёплым» является контакт с пользователем. Как это работает подробнее Аудитория «посетители сайта за 7 дней» включает только тех, кто заходил в последнюю неделю, тогда как «за 30 дней» — более широкий список, но с пользователями, которые заходили давно и могли потерять интерес. Что использовать на практике На практике. Короткое окно подходит для товаров с быстрым циклом решения (например, импульсные покупки), длинное — для дорогих товаров/услуг с долгим обдумыванием; выбор зависит от специфики продукта, а не от настроек «по умолчанию». Пример. Аудитория «Посетители страницы товара за 7 дней» против «за 30 дней» — вторая обычно больше по размеру, но может показывать более низкий CTR/CVR из-за давности визита. Проверка: сравнить CPA каждой аудитории отдельно. Подводные камни Частая ошибка. Частая ошибка
ad-platformsaudience-targeting
MiddlePython Developer > Основы Python > SQL-запросы
Короткий ответ Оконные функции вычисляют значение для каждой строки на основе «окна» связанных строк (OVER (PARTITION BY ... ORDER BY ...)), не сворачивая результат в одну строку на группу, в отличие от обычных агрегатных функций с GROUP BY; ROW_NUMBER() нумерует строки внутри партиции, RANK() делает то же самое, но учитывает повторы значений при сортировке. Как это работает подробнее PARTITION BY делит результат на логические группы без потери отдельных строк, ORDER BY внутри OVER определяет порядок для вычисления ранга/номера/смещения; функция вычисляется для каждой исходной строки. Пример кода Что использовать на практике Практика. Типичные задачи — выбор «последней записи на пользователя» (ROW_NUMBER() + фильтр = 1), топ-N в каждой категории, скользящие суммы/средние — это часто проще и быстрее, чем аналогичная логика через self-join. Подводные камни Ошибка. Путают RANK() и ROW_NUMBER() — при одинаковых значениях ORDER BY RANK() присвоит одинаковый ранг нескольким строкам и «пропустит» следующие номера, а
postgresqlquerying
JuniorPython Developer > Основы Python > Модули, пакеты и окружение
Короткий ответ Оператор import подключает модуль целиком, и обращения к его объектам идут через имя с точкой, например math.sqrt(16). Оператор from...import переносит выбранные имена прямо в текущее пространство имён, после чего они используются без имени модуля. Синтаксис: from имя_модуля import имя1, имя2. Как это работает подробнее Выбор между двумя операторами — вопрос читаемости и контроля пространства имён. Импорт целиком. import делает происхождение имён очевидным, но требует длинных квалифицированных обращений. Импорт имён. from...import сокращает код, однако при неудачных именах возможны коллизии. Импорт звёздочкой. from module import * заносит все имена разом, загрязняет пространство имён и может переопределить существующие имена. Псевдонимы. Длинные или конфликтующие имена переименовывают через as, например import numpy as np. Особенность импорта. При import a.b имя b должно быть модулем или пакетом, тогда как from a import b позволяет импортировать и произвольное имя, объявленное в пакете. Пример
from-importimport
JuniorPython Developer > Основы Python > Основы Python
Короткий ответ Отрицательные индексы нумеруют элементы с конца последовательности: -1 — последний элемент, -2 — предпоследний и так далее. Они поддерживаются всеми встроенными последовательностями и избавляют от вычисления длины при доступе к «хвосту» данных. Как это работает подробнее При положительной индексации отсчёт идёт от начала, при отрицательной — от конца коллекции. Сопоставление. Индекс -1 соответствует последнему элементу, а индекс, равный минус длине коллекции, — первому, поэтому фактический размер знать не нужно. Поддержка. Отрицательная индексация работает для списков, кортежей и строк. Сочетание со срезами. Отрицательные индексы применимы и в срезах: arr[-3:] возвращает три последних элемента, а arr[::-1] разворачивает последовательность. Пример кода Что использовать на практике Последний элемент. Вместо arr[len(arr) - 1] пиши arr[-1]: это короче, читаемее и не зависит от размера коллекции. Хвост данных. Получай последние элементы очереди, конец строки и другие «хвостовые» данные отрицательным
indiceslists
JuniorData Analyst > SQL и данные > Статистика и теория вероятностей
Короткий ответ Ошибка первого рода — отвергнуть верную нулевую гипотезу (ложное срабатывание, «увидели эффект, которого нет»); ошибка второго рода — не отвергнуть неверную нулевую гипотезу (пропуск реального эффекта, «не заметили эффект, который есть»). Как это работает подробнее вероятность ошибки первого рода контролируется выбранным уровнем значимости альфа; вероятность ошибки второго рода (бета) зависит от размера реального эффекта, размера выборки и изменчивости данных — мощность теста (1−бета) показывает способность теста обнаружить реальный эффект. Что использовать на практике На практике. эти две ошибки находятся в компромиссе: ужесточение альфа (снижение риска ложного срабатывания) при прочих равных увеличивает риск пропустить реальный эффект, если не увеличить размер выборки. В задачах, где цена ложного внедрения высока (рискованные изменения), разумно использовать более строгий альфа; там, где цена упущенной возможности высока, важнее следить за мощностью теста. На практике полезно явно обсуждать с
hypothesis-testingstatistical-power
MiddlePython Developer > Основы Python > Тестирование кода
Короткий ответ Параметризация позволяет прогнать один и тот же тест на нескольких наборах аргументов, не дублируя код. В pytest это делает декоратор @pytest.mark.parametrize, которому передаётся строка с именами параметров и список кортежей значений. Как это работает подробнее Декоратор описывает данные, а pytest выполняет тест по разу на каждый набор. Объявление. Декоратор @pytest.mark.parametrize получает строку с именами параметров и список кортежей значений для этих параметров. Выполнение. Тест запускается отдельно для каждого кортежа, и сбой одного набора не останавливает остальные. Отчёт. Каждый прогон выводится отдельно, с указанием значений параметров в имени теста, например test_add[5-5-10]. Граничные случаи. Вместо копий функции вида test_add_1 пишется одна функция, а данные перечисляются в декораторе. Пример кода Что использовать на практике Наборы данных. Перечисляй входные значения и ожидаемый результат в списке кортежей. Краевые случаи. Проверяй граничные значения одним параметризованным тестом
markersparametrization
JuniorSMM Manager > Общее > Парсинг и данные
Короткий ответ Парсинг — это автоматический сбор открытых данных (например, список подписчиков сообщества конкурента или статистика активности аудитории) с помощью специализированных сервисов для последующего анализа. Как это работает подробнее сервис парсинга обращается к открытым данным площадки через API или публичные страницы и собирает их в таблицу: список пользователей, их активность, демографию (там, где это доступно и разрешено правилами площадки). Что использовать на практике Действия. На базовом уровне парсинг используют для изучения аудитории конкурентов (сколько подписчиков, какая активность на постах) или для выгрузки списка активных комментаторов. Также. Важно использовать только официально разрешённые площадкой методы и не собирать персональные данные без оснований. Проверка. Перед запуском кампании менеджер парсит количество подписчиков и среднюю активность (лайки/комментарии на пост) трёх сообществ-конкурентов за месяц. Проверка: данные сведены в таблицу и сверены вручную на 2–3 постах каждог
benchmarkingdata-parsing
JuniorPython Developer > Основы Python > Тестирование кода
Короткий ответ AAA — это структура теста из трёх частей: подготовка данных и окружения (Arrange), вызов проверяемого кода (Act) и проверка результата (Assert); она делает тесты читаемыми и предсказуемыми по структуре. Как это работает подробнее В Arrange создаются входные данные, моки и зависимые объекты, необходимые именно для этого сценария. В Act вызывается ровно та функция или метод, поведение которых проверяется, и больше ничего. В Assert сравнивается фактический результат с ожидаемым, обычно одним или несколькими логически связанными утверждениями об одном и том же поведении. Пример кода Что использовать на практике Практика. Явное разделение частей (даже просто пустой строкой или комментарием) облегчает чтение теста спустя время и ревью — сразу видно, что именно подготовлено, что вызывается и что именно проверяется. Это особенно важно в длинных тестах с несколькими моками или сложной подготовкой данных, где легко потерять нить повествования. Подводные камни Риск. Перемешивать Act и Assert, вызывая функ
arrange-act-assertpython
MiddlePython Developer > Основы Python > Надёжность сервисов
Короткий ответ Bulkhead изолирует ресурсы (пулы соединений, потоки) для разных зависимостей так, чтобы перегрузка/сбой одной зависимости не исчерпывала общий ресурс и не блокировала работу с остальными. Как это работает подробнее Вместо одного общего пула соединений/потоков на все исходящие вызовы выделяют отдельный пул с ограниченным размером под каждую зависимость; если пул для зависимости A исчерпан, вызовы к B продолжают использовать свой отдельный пул. Пример кода Что использовать на практике Практика. Применяют вместе с таймаутами и circuit breaker — bulkhead ограничивает «ширину» ущерба, а breaker снижает число бесполезных попыток к деградировавшей зависимости. Подводные камни Риск. Использовать единственный общий thread pool для вызовов к десяткам внешних сервисов; делать bulkhead слишком маленьким, что искусственно ограничивает throughput даже при здоровой зависимости.
bulkheadfault-tolerance