Типовая ошибка джунов: LEFT JOIN+WHERE
Привет! На связи Вячеслав Потапов, ментор курса «Аналитик данных» 👋🏻
Предыдущий пост набрал много реакций, а значит, тема вам интересна) Расскажу про ещё одну типовую ошибку, из-за которой начинающие аналитики дают неправильные результаты.
Предположим, у нас есть две таблицы:
Задача: посчитать всех пользователей и количество их заказов. Даже если заказов нет, то пользователь всё равно должен попасть в результат.
Новички часто пишут так:
И пользователь
Почему так происходит?
Ключевой момент, который часто не понимают —
Для пользователя без заказов:
🟠
🟠 Условие
🟠
В итоге
Как правильно?
Есть несколько безопасных способов.
#️⃣ Способ 1. Перенести условие в JOIN. Самый частый и правильный вариант:
Теперь пользователи без заказов остаются, и
#️⃣ Способ 2. Явно учесть NULL:
Работает, но читаемость хуже, и легко допустить ошибку.
#️⃣ Способ 3. Агрегация до JOIN. Самый надёжный подход, особенно для больших объёмов данных:
50 реакций — и сделаем ещё один такой разбор ошибки 🧡
📊 Simulative
Привет! На связи Вячеслав Потапов, ментор курса «Аналитик данных» 👋🏻
Предыдущий пост набрал много реакций, а значит, тема вам интересна) Расскажу про ещё одну типовую ошибку, из-за которой начинающие аналитики дают неправильные результаты.
Предположим, у нас есть две таблицы:
users
user_id registration_date
1 2024-01-01
2 2024-01-03
3 2024-01-05
orders
order_id user_id order_date
101 1 2024-01-10
102 1 2024-01-15
103 2 2024-01-20
Задача: посчитать всех пользователей и количество их заказов. Даже если заказов нет, то пользователь всё равно должен попасть в результат.
Новички часто пишут так:
select
u.user_id,
count(o.order_id) as orders_cnt
from users u
left join orders o
on u.user_id = o.user_id
where o.order_date >= '2024-01-01'
group by u.user_id;
И пользователь
user_id = 3 пропадает из результатов.Почему так происходит?
Ключевой момент, который часто не понимают —
WHERE применяется после JOIN.Для пользователя без заказов:
o.order_date = NULL;o.order_date >= '2024-01-01' возвращает NULL;WHERE оставляет только TRUE.В итоге
LEFT JOIN превращается в INNER JOIN, и все пользователи без заказов вылетают из результата. SQL отработал корректно, а ошибка в логике запроса.Как правильно?
Есть несколько безопасных способов.
select
u.user_id,
count(o.order_id) as orders_cnt
from users u
left join orders o
on u.user_id = o.user_id
and o.order_date >= '2024-01-01'
group by u.user_id;
Теперь пользователи без заказов остаются, и
count() корректно вернёт 0.where o.order_date >= '2024-01-01'
or o.order_date is null
Работает, но читаемость хуже, и легко допустить ошибку.
with orders_cnt as (
select user_id, count(*) as cnt
from orders
where order_date >= '2024-01-01'
group by user_id
)
select
u.user_id,
coalesce(o.cnt, 0) as orders_cnt
from users u
left join orders_cnt o using(user_id);
50 реакций — и сделаем ещё один такой разбор ошибки 🧡
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥67❤23👍12 8
Решаем задачи по Pandas
Освоили базу, пора перейти к практике! В новой карточке адвент-календаря пробуем порешать задачи с собеседований по Pandas.
В материале разберём простым языком, как превратить сложные задачи в пошаговые действия и как объяснять интервьюеру, что вы не просто группируете данные, а видите в них закономерности.
➡️ Перейти в адвент-календарь
📊 Simulative
Освоили базу, пора перейти к практике! В новой карточке адвент-календаря пробуем порешать задачи с собеседований по Pandas.
В материале разберём простым языком, как превратить сложные задачи в пошаговые действия и как объяснять интервьюеру, что вы не просто группируете данные, а видите в них закономерности.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤4 2👍1
Что такое DAX и зачем он нужен аналитику
В новой статье блога мы разберём один из ключевых инструментов в арсенале современного аналитика — язык DAX. Если вы работаете с Excel, Power BI, Tableau или любыми инструментами бизнес-аналитики, понимание DAX изменит ваше представление о возможностях анализа данных.
➡️ Читать статью: https://simulative.ru/blog/dax
📊 Simulative
В новой статье блога мы разберём один из ключевых инструментов в арсенале современного аналитика — язык DAX. Если вы работаете с Excel, Power BI, Tableau или любыми инструментами бизнес-аналитики, понимание DAX изменит ваше представление о возможностях анализа данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤4 3
Гайд: практическое применение алгоритмов ML
Вы знаете, как компьютеры могут учиться на данных и делать точные прогнозы? Благодаря алгоритмам машинного обучения — набору методов, которые позволяют компьютерам учиться на данных и делать прогнозы без явного программирования.
Подготовили для вас материал с обзором и примерами применения таких алгоритмов.
Что вы получите от нашего материала?
➖ 16 алгоритмов с реальными примерами кода, такими как прогнозирование стоимости недвижимости, классификация электронных писем как спам или не-спам и многое другое;
➖ Разберётесь в принципах работы алгоритмов и их практическом применении. Вы узнаете, как использовать их для автоматизации рутинных задач и улучшения процессов принятия решений;
➖ Узнаете, как использовать эти алгоритмы для решения реальных задач в бизнесе, науке и других областях. Это может существенно повысить эффективность ваших проектов и дать вам конкурентное преимущество.
✅ Получить материал
📊 Simulative
Вы знаете, как компьютеры могут учиться на данных и делать точные прогнозы? Благодаря алгоритмам машинного обучения — набору методов, которые позволяют компьютерам учиться на данных и делать прогнозы без явного программирования.
Подготовили для вас материал с обзором и примерами применения таких алгоритмов.
Что вы получите от нашего материала?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7 4❤3
Изучаем A/B-тесты
В новой карточке нашего адвент-календаря — полезное видео от ведущего продуктового аналитика Дениса Иванова. Он рассказал про дизайн A/B-теста — какие могут возникнуть подводные камни, а также делится своим опытом и лайфхаками.
➡️ Перейти в адвент-календарь
📊 Simulative
В новой карточке нашего адвент-календаря — полезное видео от ведущего продуктового аналитика Дениса Иванова. Он рассказал про дизайн A/B-теста — какие могут возникнуть подводные камни, а также делится своим опытом и лайфхаками.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2 2
Последние вебинары Simulative в этом году ☃️
Присоединяйтесь к нашим мероприятиям — обсудим с экспертами, чего ожидать аналитикам в 2026 году, и попробуем собрать финплан с помощью инструментов аналитики.
Регистрируйтесь и добавляйте события к себе в календарь, чтобы не забыть!
📊 Simulative
Присоединяйтесь к нашим мероприятиям — обсудим с экспертами, чего ожидать аналитикам в 2026 году, и попробуем собрать финплан с помощью инструментов аналитики.
🧡 24 декабря, 19:00 МСК — «Кого возьмут в аналитику в 2026 году? Взгляд экспертов из Альфа-Банка, Авито и eLama»
Вместе с аналитиками из Альфа-Банка, Авито и eLama подведём итоги 2025‑го и посмотрим на рынок их глазами. Спикеры расскажут, как менялись задачи и требования к аналитикам в разных компаниях, какие направления росли быстрее всего и какие навыки стали базой «по умолчанию» для джунов.➡️ Зарегистрироваться на вебинар
🧡 25 декабря, 19:00 МСК — «Анализ личных финансов: как на примере банковской выгрузки проанализировать траты и расходы за год»
Вугар Дамиров, Data Analyst Team Lead с 7‑летним опытом, разберёт реальную банковскую выписку: разложим траты по категориям, увидим, куда уходит лишнее, и соберём простой план расходов и накоплений на следующий год. Вы поймёте, как проделать то же самое со своей выгрузкой, даже если никогда не занимались финансами или аналитикой.➡️ Зарегистрироваться на вебинар
Регистрируйтесь и добавляйте события к себе в календарь, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2 2☃1
Программа тренинга «Осмысленные дашборды»
Тренинг Анастасии Кузнецовой — это 9 модулей, которые прокачают вас от сбора требований до презентации готового дашборда. Показали в карточках, из чего будет состоять тренинг.
Добавьте к этому разбор кейсов, домашние задания, чеклисты, шаблоны и готовые инструменты для работы — и получите отличный курс для прокачки своих навыков в BI!
Присоединяйтесь к тренингу по ссылке ниже 👇🏻
➡️ Записаться на тренинг
📊 Simulative
Тренинг Анастасии Кузнецовой — это 9 модулей, которые прокачают вас от сбора требований до презентации готового дашборда. Показали в карточках, из чего будет состоять тренинг.
Добавьте к этому разбор кейсов, домашние задания, чеклисты, шаблоны и готовые инструменты для работы — и получите отличный курс для прокачки своих навыков в BI!
Присоединяйтесь к тренингу по ссылке ниже 👇🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥5 3
Справляемся со страхами
В предпоследний день нашего адвента дарим вам напутствие — вы со всем справитесь!
Часто мы сталкиваемся с внутренними страхами и сомнениями, которые мешают сделать первый шаг к новым знаниям. Из новой статьи адвента вы узнаете, как преодолеть их и не сдаваться, даже если изучение аналитики кажется сложным.
➡️ Перейти в адвент-календарь
📊 Simulative
В предпоследний день нашего адвента дарим вам напутствие — вы со всем справитесь!
Часто мы сталкиваемся с внутренними страхами и сомнениями, которые мешают сделать первый шаг к новым знаниям. Из новой статьи адвента вы узнаете, как преодолеть их и не сдаваться, даже если изучение аналитики кажется сложным.
Please open Telegram to view this post
VIEW IN TELEGRAM
☃3🎄3 2
Карьера в аналитике в 2026 году: на что надеяться?
Говорят, рынок аналитики переполнен джунами, нейросети скоро заменят начинающих и вход в аналитику будет закрыт. А что говорят те, кто нанимает и строит команды в 2026 году?
Мы собрали трёх экспертов из Альфа-Банка, Авито и Яндекс eLama, чтобы они дали честный и трезвый прогноз:
❓ Кого на самом деле будут искать в 2026-м?
❓ Какие навыки из «хотелок» стали обязательным минимумом?
❓ Есть ли пространство для роста у новичков, и где оно?
На вебинаре 24 декабря вы получите советы от аналитиков-практиков:
❄️ Алёна Артемьева, руководитель направления аналитики продаж в Альфа-Банке, развеет мифы и даст «вредные советы» по поиску работы, которые на самом деле работают;
❄️ Анна Першина, аналитик-разработчик в Авито, объяснит, почему джуны всё ещё нужны бигтеху, и что сильная база по Python/SQL — это уже не преимущество;
❄️ Павел Беляев, тимлид аналитиков в Яндекс eLama, покажет 5 ключевых навыков и типичные ошибки джунов, которые решают, возьмут вас или нет.
Встречаемся 24 декабря в 19:00 МСК. Успейте зарегистрироваться и задать свой вопрос спикерам!
👉 Зарегистрироваться на вебинар
📊 Simulative
Говорят, рынок аналитики переполнен джунами, нейросети скоро заменят начинающих и вход в аналитику будет закрыт. А что говорят те, кто нанимает и строит команды в 2026 году?
Мы собрали трёх экспертов из Альфа-Банка, Авито и Яндекс eLama, чтобы они дали честный и трезвый прогноз:
На вебинаре 24 декабря вы получите советы от аналитиков-практиков:
Встречаемся 24 декабря в 19:00 МСК. Успейте зарегистрироваться и задать свой вопрос спикерам!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤4 3
Как ускорить apply(). Часть 1
Привет! На связи Кристина Желтова, ментор курса «ML-инженер» 👋🏻
Представьте себе ситуацию: вы обрабатываете датасет с 1 млн строк. Пишете простой код:
Запускаете. Проходит минута, вторая, пятая... Наконец после 15 минут вычисления завершились.
Потом приходит коллега, делает:
Запускает и получает результат за 0.15 секунды.
Что произошло? 🤯
Именно так выглядит разница между apply() и векторизацией, и это одно из самых узких мест в обработке данных.
Почему apply() такой медленный?
apply() работает примерно так:
Для каждой строки датасета (1 млн штук!):
➖ Взять одну строку;
➖ Передать в функцию lambda;
➖ Вызвать функцию (потратив время и «силы» на вызов — overhead);
➖ Получить результат;
➖ Вернуть в датасет.
Результат: 1 млн * overhead = ОЧЕНЬ медленно.
Векторизация же работает так:
➖ Взять весь столбец col1;
➖ Взять весь столбец col2;
➖ Сложить их поэлементно (в оптимизированном коде на C);
➖ Результат: одна операция, очень быстро.
Итого, в apply() 1 млн функций вызовов, а в векторизации 1 операция!
Проведём небольшой реальный тест:
Как результат — ускорение в сотни раз и даже больше!
📊 Simulative
Привет! На связи Кристина Желтова, ментор курса «ML-инженер» 👋🏻
Представьте себе ситуацию: вы обрабатываете датасет с 1 млн строк. Пишете простой код:
df['new_col'] = df.apply(lambda x: x['col1'] + x['col2'], axis=1)
Запускаете. Проходит минута, вторая, пятая... Наконец после 15 минут вычисления завершились.
Потом приходит коллега, делает:
df['new_col'] = df['col1'].values + df['col2'].values
Запускает и получает результат за 0.15 секунды.
Что произошло? 🤯
Именно так выглядит разница между apply() и векторизацией, и это одно из самых узких мест в обработке данных.
Почему apply() такой медленный?
apply() работает примерно так:
Для каждой строки датасета (1 млн штук!):
Результат: 1 млн * overhead = ОЧЕНЬ медленно.
Векторизация же работает так:
Итого, в apply() 1 млн функций вызовов, а в векторизации 1 операция!
Проведём небольшой реальный тест:
import pandas as pd
import numpy as np
import time
# Создаём датасет
df = pd.DataFrame({
'col1': np.random.rand(1_000_000),
'col2': np.random.rand(1_000_000)
})
# Медленный apply()
start = time.time()
df['result_slow'] = df.apply(lambda x: x['col1'] + x['col2'], axis=1)
slow_time = time.time() - start
print(f"apply(): {slow_time:.2f} секунд")
# Быстрая векторизация
start = time.time()
df['result_fast'] = df['col1'].values + df['col2'].values
fast_time = time.time() - start
print(f"Векторизация: {fast_time:.4f} секунд")
# Разница
print(f"Ускорение: {slow_time / fast_time:.0f}x")
Как результат — ускорение в сотни раз и даже больше!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥5 2🎉1
Как ускорить apply(). Часть 2
В примере выше использовалась простая арифметическая функция, но можно ли ускорить apply с произвольной сложной функцией? Ответ — да, можно! Но с помощью чуть более сложной техники — numba.
Numba — это JIT (Just-In-Time) компилятор для Python, который работает по следующей схеме: в первый раз видит функцию, анализирует типы и компилирует в машинный код. А потом просто запускает скомпилированный машинный код, и скорость выполнения близка близка к C/C++.
Итого, numba = Python + компиляция в машинный код = скорость C с синтаксисом Python.
Ставьте❤️ , если было полезно!
📊 Simulative
В примере выше использовалась простая арифметическая функция, но можно ли ускорить apply с произвольной сложной функцией? Ответ — да, можно! Но с помощью чуть более сложной техники — numba.
Numba — это JIT (Just-In-Time) компилятор для Python, который работает по следующей схеме: в первый раз видит функцию, анализирует типы и компилирует в машинный код. А потом просто запускает скомпилированный машинный код, и скорость выполнения близка близка к C/C++.
import pandas as pd
import numpy as np
import time
from numba import jit
# Создаём датасет
np.random.seed(42)
df = pd.DataFrame({
'col1': np.random.rand(1_000_000),
'col2': np.random.rand(1_000_000),
'col3': np.random.rand(1_000_000),
})
def complex_logic(row):
result = 0
# Имитируем "сложную логику" с несколькими условиями
if row['col1'] > 0.5:
result += row['col2'] * row['col3'] * 2
else:
result += row['col2'] * row['col3'] * 0.5
if row['col2'] > row['col3']:
result += row['col1'] * 10
else:
result += row['col1'] * 5
return result
# Медленный apply()
start = time.time()
df['result_slow'] = df.apply(complex_logic, axis=1)
slow_time = time.time() - start
print(f"Время выполнения: {slow_time:.2f} секунд")
# Быстрый способ через numba
@jit(nopython=True) # numba пытается скомпилировать в машинный код
def complex_logic_fast(col1, col2, col3): # Переписываем функцию из pandas на numpy
result = np.empty(len(col1))
for i in range(len(col1)):
res = 0
if col1[i] > 0.5:
res += col2[i] * col3[i] * 2
else:
res += col2[i] * col3[i] * 0.5
if col2[i] > col3[i]:
res += col1[i] * 10
else:
res += col1[i] * 5
result[i] = res
return result
# Первый вызов: компиляция
df['result_fast'] = complex_logic_fast(df['col1'].values, df['col2'].values, df['col3'].values)
# Второй вызов: уже скомпилировано (очень быстро)
start = time.time()
result_fast_2 = complex_logic_fast(df['col1'].values, df['col2'].values, df['col3'].values)
fast_time = time.time() - start
print(f"Время выполнения (уже скомпилировано): {fast_time:.4f} секунд")
Итого, numba = Python + компиляция в машинный код = скорость C с синтаксисом Python.
Ставьте
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥8 4