❤12🔥6🙊4
SQL-лайфхаки, которые экономят время
В SQL есть не только must have синтаксис, без которого ты не сможешь решить поставленную задачу, но есть и маленькие трюки, которые либо делают твою жизнь проще, либоты нихуя не понимаешь зачем люди это делают 😁 (ps первое время я долго был вторым в этой дихотомии)) )
1️⃣ GROUP BY и ORDER BY по номерам колонок
Иногда в SELECT лежат длиннющие названия полей, вычисления или CASE’ы - и повторять их в GROUP BY/ORDER BY просто максимально в падлу.
Есть классный лайфхак: использовать порядковые номера столбцов.
1 → первый столбец в SELECT
2 → второй столбец в SELECT и так далее
В чем value?
*️⃣ Короче
*️⃣ Легче читать
*️⃣ Легче рефакторить - поменял название поля в SELECT → ничего не упало
2️⃣ Запятая перед неймом колонки
Ставить запятую в начале строки — не баг, а фича😁
Эту штуку поначалу многие видят и думаю: «что за извращение?»
А потом спустя месяц — сами начинают так писать
Пример запроса:
И вот зачем это нужно 👇
Теперь мы можем быстро закомментить любой столбец:
Работает всегда, кроме первой строки — для этого выбираем первой ту, которую планируем оставлять в покое...
3️⃣ WHERE 1=1 / TRUE
Когда фильтров много, запрос превращается в кашу, где потеряться проще простого. А еще хуже — временно выключаешь один фильтр, ломаешь синтаксис, и потом 10 минут как дурачок ищешь, куда делся несчастный AND.
Пример запроса:
а теперь, если нужно что-то отключить, просто комментируешь:
И работает это всегда, вне зависимости от порядка фильтров.
В чем value?
*️⃣ Никаких синтаксических ошибок
*️⃣ Удобно включить/выключать фильтры
Пишите в комментах, какие приемы вы уже используете в своих запросах 👇
Подпишись и при желании поддержи канал бустом.
P.S. Сделать это можно здесь (для Premium — бесплатно).
А также ставь реакции:
🍌 — не знал, буду юзать
🍌 — использую все из этого
🍌 — все и так работает, так что оставь себе и не еби мозг
@data_driven_bogdan
В SQL есть не только must have синтаксис, без которого ты не сможешь решить поставленную задачу, но есть и маленькие трюки, которые либо делают твою жизнь проще, либо
Иногда в SELECT лежат длиннющие названия полей, вычисления или CASE’ы - и повторять их в GROUP BY/ORDER BY просто максимально в падлу.
Есть классный лайфхак: использовать порядковые номера столбцов.
SELECT
transaction_dt::date,
product_id,
COUNT(*) AS cnt_prd
FROM orders
GROUP BY 1, 2
ORDER BY 1;
2 → второй столбец в SELECT и так далее
В чем value?
Ставить запятую в начале строки — не баг, а фича
Эту штуку поначалу многие видят и думаю: «что за извращение?»
А потом спустя месяц — сами начинают так писать
Пример запроса:
SELECT
order_date
, frmt_id
, cheque_id
, SUM(price * qnt ) as revenue
FROM orders;
И вот зачем это нужно 👇
SELECT
order_date
-- , frmt_id
, cheque_id
, SUM(price * qnt ) as revenue
FROM orders;
Работает всегда, кроме первой строки — для этого выбираем первой ту, которую планируем оставлять в покое...
Когда фильтров много, запрос превращается в кашу, где потеряться проще простого. А еще хуже — временно выключаешь один фильтр, ломаешь синтаксис, и потом 10 минут как дурачок ищешь, куда делся несчастный AND.
Пример запроса:
WHERE 1=1
AND order_date >= '2025-01-01'
AND city = 'Moscow'
AND is_cancelled = 0
а теперь, если нужно что-то отключить, просто комментируешь:
WHERE 1=1
-- AND order_date >= '2025-01-01'
AND city = 'Moscow'
AND is_cancelled = 0
И работает это всегда, вне зависимости от порядка фильтров.
В чем value?
Пишите в комментах, какие приемы вы уже используете в своих запросах 👇
Подпишись и при желании поддержи канал бустом.
P.S. Сделать это можно здесь (для Premium — бесплатно).
А также ставь реакции:
@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9 8 7 3😁1 1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7
Causal Inference: как оценивать эффект, когда A/B — не вариант (Ч. 1)
В какой-то момент на работе мне понадобилось глубже разобраться, как оценивать эффекты, когда классический A/B-тест провести невозможно (частая специфика оффлайна). Начал копать про Causal Inference — и оказалось, что это прям отдельный мир со своими подходами и подводными камнями.
Сразу дисклеймер:
ниже — не истина в последней инстанции.
Не считаю себя гуру в Causal Inference, поэтому буду рад, если кто-то более опытный в этой теме дополнит или поспорит 👇
Что такое Causal Inference❓
Попробую простыми словами
Causal Inference — это набор подходов, которые позволяют ответить на вопрос:
👉 «А что именно изменилось из-за нашего действия, а не просто совпало?»
То есть мы хотим отделить*️⃣ эффект фичи / акции / изменения
от*️⃣ сезонности, тренда, шума и внешних факторов.
Почему A/B-тесты не всегда возможны❓
*️⃣ Эксперимент сложно или невозможно провести
Технические, бизнес- или этические ограничения, либо просто нет времени и ресурсов на полноценный A/B.
*️⃣ Группы уже сформированы неслучайно
Пользователи изначально разные, и прямое сравнение даёт смещённый результат.
*️⃣ Нужно оценить эффект задним числом
Изменения уже внедрены, а понять — был ли от них эффект — всё равно нужно.
*️⃣ Требуется уточнить результаты A/B
Даже в случайных тестах группы могут различаться — и без корректировок оценка получается шумной.
В таких случаях приходится восстанавливать контрфакт - что было бы, если бы изменения не было, чтобы уже оттуда вычленить эффект
Разберем три популярных подхода Causal Inference
и начнем с
1️⃣ Difference-in-Difference (DiD)
Идея:
мы сравниваем не сами значения метрики, а то, как она изменилась после вмешательства — относительно своего тренда, который мы построили от контрольной группы.
Условия применимости DiD (❗️ очень важно❗️ ):
*️⃣ Параллельный тренд — до изменений группы должны вести себя похоже
*️⃣ Независимость объектов — метрики участников не влияют друг на друга (студенты не влияют на активность друг друга/ просмотры в web, не влияют на просмотры в ios и тд)
*️⃣ Отсутствие других вмешательств в тот же момент времени
Если хотя бы одно условие нарушено — оценка эффекта становится сомнительной.
Как это работает:
1️⃣ Берем две группы участников (метрику):
*️⃣ тестовую (тут легко, на нее идет эффект от фичи/акции)
*️⃣ контрольную (тут сложнее, нужно выбрать контроль с похожим поведением, в зависимости от контекста задачи/бизнеса - это должна быть либо другая метрика, но с похожим трендом или может быть другие люди, но с похожим трендом по такой же метрике)
2️⃣ Выбираем метрику, по которой у групп параллельный тренд
(повторюсь - до изменений они ведут себя похоже, тк это важный assumption в DiD)
3️⃣ Смотрим период до момента X (X - начало воздействия эффекта на тестовую группу)
Если метрика в обеих группах растет / падает синхронно — это хороший знак
4️⃣ После момента X:
*️⃣ контрольная группа продолжает двигаться по старому тренду
*️⃣ в тестовой группе происходит изменение - она отклоняется от тренда (или нет, тогда это может нам говорить о том, что эффекта нет)
5️⃣ Сравниваем:
насколько метрика тестовой группы отклонилась (остановимся на ситуации, где отклонение есть) от своего ожидаемого тренда, который мы восстанавливаем по динамике тренда контрольной группы
Ключевая логика DiD:
если бы изменений не было, тестовая группа продолжила бы двигаться параллельно контрольной
=> Вся суть метода держится именно на этом предположении.
Как выбрать метрику с похожим трендом❓ но напрямую не зависимые от нашего изменения
Помогут проверки на синхронность, например корреляция Пирсона/Спирмена
Пишите в комментах, слышали ли вы что-то про Causal Inference и DiD в частности👇
Дальше будет еще 2 части про популярные методы CI
Подпишись и при желании поддержи канал бустом.
P.S. Сделать это можно здесь (для Premium — бесплатно).
@data_driven_bogdan
В какой-то момент на работе мне понадобилось глубже разобраться, как оценивать эффекты, когда классический A/B-тест провести невозможно (частая специфика оффлайна). Начал копать про Causal Inference — и оказалось, что это прям отдельный мир со своими подходами и подводными камнями.
Сразу дисклеймер:
ниже — не истина в последней инстанции.
Не считаю себя гуру в Causal Inference, поэтому буду рад, если кто-то более опытный в этой теме дополнит или поспорит 👇
Что такое Causal Inference
Попробую простыми словами
Causal Inference — это набор подходов, которые позволяют ответить на вопрос:
👉 «А что именно изменилось из-за нашего действия, а не просто совпало?»
То есть мы хотим отделить
от
Почему A/B-тесты не всегда возможны
Технические, бизнес- или этические ограничения, либо просто нет времени и ресурсов на полноценный A/B.
Пользователи изначально разные, и прямое сравнение даёт смещённый результат.
Изменения уже внедрены, а понять — был ли от них эффект — всё равно нужно.
Даже в случайных тестах группы могут различаться — и без корректировок оценка получается шумной.
В таких случаях приходится восстанавливать контрфакт - что было бы, если бы изменения не было, чтобы уже оттуда вычленить эффект
Разберем три популярных подхода Causal Inference
и начнем с
Идея:
мы сравниваем не сами значения метрики, а то, как она изменилась после вмешательства — относительно своего тренда, который мы построили от контрольной группы.
Условия применимости DiD (
Если хотя бы одно условие нарушено — оценка эффекта становится сомнительной.
Как это работает:
(повторюсь - до изменений они ведут себя похоже, тк это важный assumption в DiD)
Если метрика в обеих группах растет / падает синхронно — это хороший знак
насколько метрика тестовой группы отклонилась (остановимся на ситуации, где отклонение есть) от своего ожидаемого тренда, который мы восстанавливаем по динамике тренда контрольной группы
Ключевая логика DiD:
если бы изменений не было, тестовая группа продолжила бы двигаться параллельно контрольной
=> Вся суть метода держится именно на этом предположении.
Как выбрать метрику с похожим трендом
Помогут проверки на синхронность, например корреляция Пирсона/Спирмена
Пишите в комментах, слышали ли вы что-то про Causal Inference и DiD в частности👇
Дальше будет еще 2 части про популярные методы CI
Подпишись и при желании поддержи канал бустом.
P.S. Сделать это можно здесь (для Premium — бесплатно).
@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥6❤🔥5🤝1
Новогодний корпоратив — официально прошел на ура
Наелись — ✔️
Напились — ✔️
Отдохнули — ✔️
Выиграли в конкурсе — ✔️
И заплатили за это — 0 ₽ 💸
Редкий случай, когда все по плану и даже лучше!
Год можно закрывать с чистой совестью🤩
@data_driven_bogdan
Наелись — ✔️
Напились — ✔️
Отдохнули — ✔️
Выиграли в конкурсе — ✔️
И заплатили за это — 0 ₽ 💸
Редкий случай, когда все по плану и даже лучше!
Год можно закрывать с чистой совестью🤩
@data_driven_bogdan
❤11🔥4 1 1
Сегодня хочу порекомендовать вам канал Змеиный Анализ на который я наткнулся совсем недавно. Это канал Кямрана, он бывший бэкенд-разработчик, который осознанно свичнулся в аналитику.
И, да, это было одно из лучших карьерных решений.
Почему принял такое решение❓
Он подробно рассказал об этом в этом посте
📊 В аналитике он уже почти 3 года
Недавно сменил компанию, прошёл весь путь собеседований и онбординга заново, со свежей головой и актуальным рынком.
Сейчас он:
➖ работает аналитиком в коммерческом продукте
➖ консультирует и менторит ребят, которые только вкатываются в аналитику
➖ помогает понять, куда идти, что учить и как не слить год впустую
В этом канале вы найдете:
Весь его путь и как пришел в IT
Почему решил свичнуться из BACKEND разработки в АНАЛИТИКУ.
Топ пять инструментов для анализа данных
Советы для аналитика данных. Как стать лучше?
Как нашел новую работу с оффером 180к, спустя два месяца собесов
Если ты:
➖ думаешь о свиче в аналитику
➖ уже учишься, но не понимаешь, что делать дальше
➖ или хочешь аналитику с мозгами разработчика, а не «таблички ради табличек»
👉 Подписывайся. У него полезно.
И, да, это было одно из лучших карьерных решений.
Почему принял такое решение
Он подробно рассказал об этом в этом посте
Недавно сменил компанию, прошёл весь путь собеседований и онбординга заново, со свежей головой и актуальным рынком.
Сейчас он:
В этом канале вы найдете:
Весь его путь и как пришел в IT
Почему решил свичнуться из BACKEND разработки в АНАЛИТИКУ.
Топ пять инструментов для анализа данных
Советы для аналитика данных. Как стать лучше?
Как нашел новую работу с оффером 180к, спустя два месяца собесов
Если ты:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤7👍7🍌1 1
Обзор собеседования (Ч. 1)
Компания: USETECH (аутстафф)
Вилка: +-250к net
Должность: Дата аналитик
Формат: Удаленный
Этапы собеседования:
HR – Тех. собес 1 (внутренний) – Тех. собес 2 (у заказчика) – Offer
Грейд: Middle / Middle +
Дата собеседования: декабрь 2025
Давно не было обзоров и вот опять! Тех. собес был оч длинный - около 1.5-2х часов
Cначала сама галера собесит, дальше уже напрямую заказчик. Как сказала HR, иногда могут сразу напрямую к заказчику направить на собес (минуя внутренний тех. этап).
Из явных плюсов - удобно для второй работы, тк могут оформлять по ИП/ГПХ.
Сам обзор разобью на 2 части - материала много и он показался интересным. В данной части разберем техничку SQL + Python, а в след. блоке обсудим теор/практические вопросы, которые поднимались на собесе.
Технический блок: SQL + Python
1️⃣ Выручка по месяцам
Посчитать месячную выручку по таблице orders.
Решение:
2️⃣ Клиенты с повторными заказами
Найти клиентов, у которых больше одного заказа.
Решение:
3️⃣ Порядковый номер заказа клиента
Пронумеровать заказы каждого клиента по дате.
Решение:
4️⃣ Доля сотрудников с зарплатой выше порога
Посчитать долю сотрудников с зарплатой выше 50 000.
employee_salaries (employee_id, salary)
Решение:
ps проверяют знание FILTER и понимание целочисленного деления (в SQL int / int дает 0 без приведения к float, те если не умножим числитель/знаменатель на 1.0/ не переведем его в float - в выводе будет 0)
5️⃣ Корреляция зарплаты и перформанса
Оценить корреляцию между зарплатой и performance score.
employee_salaries (employee_id, salary, performance_score)
Решение:
ps база по статистике + допом был вопрос почему корреляция не равна причинности
(показывает наличие связи, но не объясняет (не)влияния друг на друга)
6️⃣ Средняя зарплата и разброс по департаментам
Посчитать среднюю зарплату и стандартное отклонение по департаментам.
employee_salaries (employee_id, department_id, salary)
Решение:
ps базовая статистика в SQL
Python
7️⃣ Агрегация по категориям
Посчитать суммарные net sales по категориям.
df (category, net_sales)
Решение:
ps база по работе с пандас
8️⃣ Флаг «выше среднего»
Создать бинарный флаг: продажи выше среднего. df (sales)
Решение:
9️⃣ MinMaxScaler
Нормализовать продажи через MinMaxScaler
df (sales) (Написать самому, без import'a)
Решение:
ps это один из подходов к нормализации данных - приведение признаков к единому масштабу [0;1], чтобы признаки были сопоставимы между собой (часто требуется для обучения моделей). Альтернатива - стандартизация, данные приводятся к среднему 0 (от значения отнимается среднее) и стандартному отклонению 1 (делится на стандартное отклонение)
1️⃣ 0️⃣ NaN / None / NA
*️⃣ None - объект Python (NoneType), обозначает отсутствие значения, используется без дополнительных библиотек
*️⃣ NaN - специальное числовое значение типа float («не число»), применяется для пропусков в числовых данных (math / numpy / pandas)
*️⃣ NA - тип pandas NA, используется в pandas как универсальное обозначение пропусков и совместим с NaN
В целом, задачки не сложные, по теор. блоку спрос был посерьезнее, но это уже во 2 части
А ты бы решил все задачки?👇
@data_driven_bogdan
Компания: USETECH (аутстафф)
Вилка: +-250к net
Должность: Дата аналитик
Формат: Удаленный
Этапы собеседования:
HR – Тех. собес 1 (внутренний) – Тех. собес 2 (у заказчика) – Offer
Грейд: Middle / Middle +
Дата собеседования: декабрь 2025
Давно не было обзоров и вот опять! Тех. собес был оч длинный - около 1.5-2х часов
Cначала сама галера собесит, дальше уже напрямую заказчик. Как сказала HR, иногда могут сразу напрямую к заказчику направить на собес (минуя внутренний тех. этап).
Из явных плюсов - удобно для второй работы, тк могут оформлять по ИП/ГПХ.
Сам обзор разобью на 2 части - материала много и он показался интересным. В данной части разберем техничку SQL + Python, а в след. блоке обсудим теор/практические вопросы, которые поднимались на собесе.
Технический блок: SQL + Python
Посчитать месячную выручку по таблице orders.
Решение:
SELECT
DATE_TRUNC('month', order_date) AS month_id,
SUM(amount) AS rev
FROM orders
GROUP BY 1;
Найти клиентов, у которых больше одного заказа.
Решение:
SELECT customer_id
FROM orders
GROUP BY 1
HAVING COUNT(*) > 1;
Пронумеровать заказы каждого клиента по дате.
Решение:
SELECT
customer_id,
order_id,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS rn
FROM orders;
Посчитать долю сотрудников с зарплатой выше 50 000.
employee_salaries (employee_id, salary)
Решение:
SELECT
COUNT(*) FILTER (WHERE salary > 50000) * 1.0 / COUNT(*) AS share
FROM employee_salaries;
ps проверяют знание FILTER и понимание целочисленного деления (в SQL int / int дает 0 без приведения к float, те если не умножим числитель/знаменатель на 1.0/ не переведем его в float - в выводе будет 0)
Оценить корреляцию между зарплатой и performance score.
employee_salaries (employee_id, salary, performance_score)
Решение:
SELECT
CORR(salary, performance_score) AS corr
FROM employee_salaries;
ps база по статистике + допом был вопрос почему корреляция не равна причинности
(показывает наличие связи, но не объясняет (не)влияния друг на друга)
Посчитать среднюю зарплату и стандартное отклонение по департаментам.
employee_salaries (employee_id, department_id, salary)
Решение:
SELECT
department_id,
AVG(salary) AS avg_sal,
STDDEV(salary) AS std_sal
FROM employee_salaries
GROUP BY 1;
ps базовая статистика в SQL
Python
Посчитать суммарные net sales по категориям.
df (category, net_sales)
Решение:
result = df.groupby("category", as_index=False).agg(
total_net=("net_sales", "sum"))
ps база по работе с пандас
Создать бинарный флаг: продажи выше среднего. df (sales)
Решение:
avg_sales = df["sales"].mean()
df["flag"] = (df["sales"] > avg_sales).astype(int)
Нормализовать продажи через MinMaxScaler
df (sales) (Написать самому, без import'a)
Решение:
df["sales_norm"] = (
(df["sales"] - df["sales"].min()) /
(df["sales"].max() - df["sales"].min()) )
ps это один из подходов к нормализации данных - приведение признаков к единому масштабу [0;1], чтобы признаки были сопоставимы между собой (часто требуется для обучения моделей). Альтернатива - стандартизация, данные приводятся к среднему 0 (от значения отнимается среднее) и стандартному отклонению 1 (делится на стандартное отклонение)
В целом, задачки не сложные, по теор. блоку спрос был посерьезнее, но это уже во 2 части
А ты бы решил все задачки?👇
@data_driven_bogdan
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥6