MiddleData Analyst > SQL и данные > Python для анализа данных
Короткий ответ Рост числа строк после merge почти всегда означает, что ключ объединения не уникален в одной из таблиц (связь один-ко-многим или многие-ко-многим), и для каждой совпадающей строки левой таблицы находится несколько строк правой, что "размножает" результат. Как это работает подробнее merge сопоставляет каждую строку левой таблицы со всеми строками правой, где совпал ключ; если ключ в правой таблице повторяется (например, у пользователя несколько адресов доставки), для одного заказа в результате появится несколько строк — по одной на каждый адрес. Пример кода Что использовать на практике Практика. перед merge стоит проверить df2['key'].duplicated().sum() или df2['key'].value_counts(), чтобы понять, сколько раз повторяется ключ; после merge полезно сравнить len(result) с len(df1) — если они не совпадают при ожидаемой связи один-к-одному, это сигнал проблемы. Проверка. len(orders) равен 2, а len(merged) равен 3, потому что у user_id=10 два адреса — именно такая проверка числа строк до и после merge
data-qualityduplicates
MiddleData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Нужно определить для каждого пользователя неделю когорты (неделя первой активности), затем для каждой пары (неделя когорты, номер недели с момента входа) посчитать число уникальных активных пользователей и разделить на размер когорты. Как это работает подробнее сначала строим таблицу когорт (user_id → cohort_week), затем джойним с событиями, вычисляем week_number = date_part('week', event) - date_part('week', cohort) (или через разницу дат, поделённую на 7), группируем по (cohort_week, week_number) и делим на размер когорты. Пример кода Что использовать на практике Практика. использование date_trunc('week', ...) зависит от того, с какого дня недели считать (в PostgreSQL неделя по умолчанию начинается с понедельника, ISO-8601); для продуктов без выраженной недельной сезонности можно использовать дни вместо недель, но для B2C-продуктов с выраженной разницей будни/выходные недельные когорты обычно устойчивее к шуму. Подводные камни Частые ошибки. считают week_number простым вычитанием номеров кале
cohortsdate-trunc
JuniorData Analyst > SQL и данные > Качество данных
Короткий ответ Надёжнее всего искать повторы по устойчивому event_id. Если его нет, используют осторожно выбранный составной ключ из пользователя, события, времени и значимых свойств. Как это работает подробнее Клиент может повторить запрос, если не получил подтверждение, хотя сервер уже записал событие. Повторная доставка нормальна для схемы at-least-once, поэтому приёмник или слой трансформации должен быть идемпотентным. Поиск. Группировка показывает ключи, встречающиеся более одного раза. Проверка. Несколько найденных групп нужно просмотреть, чтобы не удалить легитимные повторные действия. Пример кода Что использовать на практике Генерируйте event_id до первой отправки и сохраняйте его при ретраях. Дедуплицируйте raw-данные оконной функцией, сохраняя правило выбора версии. Подводные камни Полное равенство строк. Техническое время получения у копий различается, поэтому DISTINCT может не помочь. Слабый ключ. Близкие по времени события одного пользователя не обязательно являются дублями.
deduplicationduplicates
JuniorSMM Manager > Общее > Брендбук и Tone of Voice
Короткий ответ Единообразие ToV помогает аудитории узнавать бренд независимо от площадки и формирует цельный образ, даже если формат подачи (длина текста, стиль визуала) в каждом канале адаптируется под специфику платформы. Как это работает подробнее «голос» бренда (лексика, характер, ценности) остаётся общим ядром, а «громкость» и форма подачи (длина постов, уместность мемов, частота публикаций) варьируются по площадке и её аудитории. Что использовать на практике Подход. SMM-менеджер держит единый документ ToV как основу, но может прописывать уточнения «как это звучит в Reels» и «как это звучит в канале Telegram», если площадки сильно отличаются аудиторией. Пример. Бренд b2b-сервиса: в VK — экспертные посты с тем же дружелюбно-профессиональным тоном, в Telegram-канале — те же темы, но короче и с элементами разговорной речи, при этом табу-слова и ценности одинаковы в обоих каналах. Проверка — выборочное сравнение 5 постов из каждого канала на совпадение базовых характеристик тона (формальность, юмор, ценности
brand-guidelinesbrand-management
JuniorPerformance Marketer > Google Ads > Сквозная аналитика и отчётность
Короткий ответ Расхождение может быть нормальным и объясняться разными моделями и окнами атрибуции: кабинет может засчитывать конверсию по показу или по более длинному окну клика, а GA4 — по своей модели атрибуции. Как это работает подробнее Google Ads и Meta используют собственные окна атрибуции (например, 7 дней по клику, 1 день по просмотру) и свою логику учёта, а GA4 — отдельную модель (data-driven или last-click по умолчанию), которая может засчитать ту же конверсию другому каналу. Дополнительно стоит учитывать, что часть пользователей блокирует cookie или использует режимы приватности браузера, из-за чего GA4 может вообще не увидеть часть кликов, которые кабинет уже засчитал. Что использовать на практике Практика. Небольшое расхождение (10-20%) — обычная ситуация; для диагностики сравнивают тренды (растёт или падает одинаково), а не абсолютные цифры. Разумно завести отдельный документ с описанием настроек атрибуции каждого источника, чтобы при возникновении вопросов не разбираться каждый раз заново, поч
attributionattribution-window
JuniorPerformance Marketer > Google Ads > Тестирование гипотез и запуск изменений
Короткий ответ На раннем этапе данные случайны и могут временно показывать преимущество одного варианта, которое исчезнет при накоплении большего объёма данных, поэтому досрочная остановка завышает число ложных «побед». Как это работает подробнее Чем чаще проверять промежуточные результаты и останавливать тест при первом удобном моменте, тем выше шанс случайно поймать временный всплеск в пользу одного из вариантов. Это явление иногда называют регрессией к среднему: экстремальные ранние значения метрики со временем сглаживаются по мере накопления более типичных наблюдений. Пример. На третий день теста вариант B показывает конверсию на 40% выше при 15 конверсиях; команда останавливает тест — а на 14-й день при 150 конверсиях разница исчезает, так как ранний результат был случайным всплеском. Что использовать на практике Практика. Заранее нужно определить срок или объём данных для завершения теста и придерживаться его, либо использовать методику, рассчитанную на периодическую проверку (sequential testing). Если
ab-testingbudget-allocation
JuniorData Analyst > Метрики и эксперименты > A/B-тесты
Короткий ответ Такая практика называется peeking и увеличивает фактическую вероятность ложноположительного результата намного выше заявленных 5%, потому что при каждой дополнительной проверке есть шанс случайно «поймать» значимость, даже если реального эффекта нет. Как это работает подробнее p-value колеблется день от дня из-за случайности; чем больше раз тест проверяют и останавливают по первому пересечению порога значимости, тем выше шанс остановиться именно в момент случайного выброса. Пример (симуляция): при alpha=0.05 и ежедневной проверке теста в течение 14 дней без реального эффекта фактическая вероятность хотя бы раз увидеть p<0.05 может превышать 20-30% вместо заявленных 5%. Проверка: сравнить дизайн теста с запланированной длительностью — если тест остановили раньше срока из-за «уже значимого» результата, вывод требует дополнительной осторожности. Что использовать на практике длительность теста и объём выборки фиксируют заранее (fixed horizon) и не останавливают тест раньше срока только потому, что
fixed-horizonoshibka-i-tipa
JuniorDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Обычная переменная в `.gitlab-ci.yml` или workflow-файле хранится в открытом виде в Git-истории и видна всем, у кого есть доступ к репозиторию; секреты нужно хранить в защищённом хранилище секретов CI-системы (CI/CD Variables, GitHub Actions Secrets) или во внешнем менеджере секретов (Vault, AWS Secrets Manager), откуда они подставляются в пайплайн во время выполнения, не попадая в код. Как это работает подробнее защищённые переменные CI-системы хранятся отдельно от репозитория, маскируются в логах и доступны только во время выполнения джобы через переменные окружения. Внешние менеджеры секретов дополнительно позволяют централизованно управлять доступом, ротацией и аудитом. Пример кода Что использовать на практике На практике. даже защищённые CI-переменные не абсолютная гарантия — нужно ограничивать, какие ветки/окружения могут их использовать (protected variables/environments), и быть аккуратным с выводом переменных в лог (`echo $DB_PASSWORD` выведет секрет, даже если он хранится правильно). П
cicd-and-release-managementci-cd-pipelines
JuniorDevOps Engineer > Контейнеры и доставка > Безопасность и DevSecOps
Короткий ответ Git хранит полную историю, поэтому секрет, попавший в коммит, остаётся доступным даже после удаления файла; секреты нужно передавать через переменные окружения, менеджер секретов или volume, а не хардкодить в исходный код. Как это работает подробнее Git — система с полной историей изменений; удаление строки в новом коммите не удаляет её из истории, секрет можно найти через git log/git blame или просто скачав архив репозитория. Любой, у кого есть доступ к репозиторию (включая форки, CI-логи, бэкапы), получает секрет. Пример кода Что использовать на практике Практика. секреты передают через переменные окружения, монтируемые файлы/volume или через специализированные системы (Vault, AWS Secrets Manager, Kubernetes Secret), которые разделяют доступ к конфигурации и доступ к значению секрета. Для публичных и приватных репозиториев одинаково важно включить сканирование на секреты (gitleaks, git-secrets) в CI. Проверка. Ожидаемое поведение: даже после удаления .env новым коммитом и git rm .env, старый
credential-rotationgit
JuniorPython Developer > Основы Python > Аутентификация и авторизация
Короткий ответ Хранение пароля в открытом виде или через быстрый хеш без соли делает базу уязвимой к мгновенной компрометации всех учётных записей при утечке; специализированные алгоритмы (bcrypt, argon2) с солью и настраиваемой стоимостью вычислений делают подбор пароля экономически невыгодным. Как это работает подробнее Соль — случайная строка, уникальная для каждого пользователя, добавляемая к паролю перед хешированием, что делает бесполезными заранее посчитанные радужные таблицы. bcrypt/argon2 дополнительно намеренно медленные и настраиваемые по «cost factor», в отличие от MD5/SHA-256, которые проектировались быстрыми. Пример кода Что использовать на практике Практика. В Python для этого используют библиотеки passlib, bcrypt или встроенные механизмы фреймворка (Django использует PBKDF2/argon2 по умолчанию); соль генерируется автоматически и хранится вместе с хешем в одной строке. Подводные камни Риск. Пишут собственную схему хеширования «для скорости»; сравнивают хеши через обычный == вместо constant-time
argon2hashing