Simulative – Telegram
7.39K subscribers
1.7K photos
70 videos
1 file
1.26K links
Привет! Мы — образовательная платформа в сфере аналитики Simulative: simulative.ru

Создаём курсы-симуляторы, где обучаем не на «апельсинках», а на кейсах из реального бизнеса.

Наш уютный чат: @itresume_chat
Поддержка: @simulative_support
Download Telegram
Типовая ошибка джунов: LEFT JOIN+WHERE

Привет! На связи Вячеслав Потапов, ментор курса «Аналитик данных» 👋🏻

Предыдущий пост набрал много реакций, а значит, тема вам интересна) Расскажу про ещё одну типовую ошибку, из-за которой начинающие аналитики дают неправильные результаты.

Предположим, у нас есть две таблицы:

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 отработал корректно, а ошибка в логике запроса.

Как правильно?

Есть несколько безопасных способов.

#️⃣ Способ 1. Перенести условие в JOIN. Самый частый и правильный вариант:

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.

#️⃣ Способ 2. Явно учесть NULL:

where o.order_date >= '2024-01-01'
or o.order_date is null


Работает, но читаемость хуже, и легко допустить ошибку.

#️⃣ Способ 3. Агрегация до JOIN. Самый надёжный подход, особенно для больших объёмов данных:

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 реакций — и сделаем ещё один такой разбор ошибки 🧡

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6723👍128
Решаем задачи по Pandas

Освоили базу, пора перейти к практике! В новой карточке адвент-календаря пробуем порешать задачи с собеседований по Pandas.

В материале разберём простым языком, как превратить сложные задачи в пошаговые действия и как объяснять интервьюеру, что вы не просто группируете данные, а видите в них закономерности.

➡️ Перейти в адвент-календарь

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥642👍1
Что такое DAX и зачем он нужен аналитику

В новой статье блога мы разберём один из ключевых инструментов в арсенале современного аналитика — язык DAX. Если вы работаете с Excel, Power BI, Tableau или любыми инструментами бизнес-аналитики, понимание DAX изменит ваше представление о возможностях анализа данных.

➡️ Читать статью: https://simulative.ru/blog/dax

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥943
Гайд: практическое применение алгоритмов ML

Вы знаете, как компьютеры могут учиться на данных и делать точные прогнозы? Благодаря алгоритмам машинного обучения — набору методов, которые позволяют компьютерам учиться на данных и делать прогнозы без явного программирования.

Подготовили для вас материал с обзором и примерами применения таких алгоритмов.

Что вы получите от нашего материала?

16 алгоритмов с реальными примерами кода, такими как прогнозирование стоимости недвижимости, классификация электронных писем как спам или не-спам и многое другое;

Разберётесь в принципах работы алгоритмов и их практическом применении. Вы узнаете, как использовать их для автоматизации рутинных задач и улучшения процессов принятия решений;

Узнаете, как использовать эти алгоритмы для решения реальных задач в бизнесе, науке и других областях. Это может существенно повысить эффективность ваших проектов и дать вам конкурентное преимущество.

Получить материал

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥743
Изучаем A/B-тесты

В новой карточке нашего адвент-календаря — полезное видео от ведущего продуктового аналитика Дениса Иванова. Он рассказал про дизайн A/B-теста — какие могут возникнуть подводные камни, а также делится своим опытом и лайфхаками.

➡️ Перейти в адвент-календарь

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥22
Последние вебинары Simulative в этом году ☃️

Присоединяйтесь к нашим мероприятиям — обсудим с экспертами, чего ожидать аналитикам в 2026 году, и попробуем собрать финплан с помощью инструментов аналитики.

🧡 24 декабря, 19:00 МСК«Кого возьмут в аналитику в 2026 году? Взгляд экспертов из Альфа-Банка, Авито и eLama»

Вместе с аналитиками из Альфа-Банка, Авито и eLama подведём итоги 2025‑го и посмотрим на рынок их глазами. Спикеры расскажут, как менялись задачи и требования к аналитикам в разных компаниях, какие направления росли быстрее всего и какие навыки стали базой «по умолчанию» для джунов.​

➡️ Зарегистрироваться на вебинар


🧡 25 декабря, 19:00 МСК«Анализ личных финансов: как на примере банковской выгрузки проанализировать траты и расходы за год»

Вугар Дамиров, Data Analyst Team Lead с 7‑летним опытом, разберёт реальную банковскую выписку: разложим траты по категориям, увидим, куда уходит лишнее, и соберём простой план расходов и накоплений на следующий год. Вы поймёте, как проделать то же самое со своей выгрузкой, даже если никогда не занимались финансами или аналитикой.​

➡️ Зарегистрироваться на вебинар


Регистрируйтесь и добавляйте события к себе в календарь, чтобы не забыть!

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥221
Simulative pinned a photo
Программа тренинга «Осмысленные дашборды»

Тренинг Анастасии Кузнецовой — это 9 модулей, которые прокачают вас от сбора требований до презентации готового дашборда. Показали в карточках, из чего будет состоять тренинг.

Добавьте к этому разбор кейсов, домашние задания, чеклисты, шаблоны и готовые инструменты для работы — и получите отличный курс для прокачки своих навыков в BI!

Присоединяйтесь к тренингу по ссылке ниже 👇🏻

➡️ Записаться на тренинг

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥53
Справляемся со страхами

В предпоследний день нашего адвента дарим вам напутствие — вы со всем справитесь!

Часто мы сталкиваемся с внутренними страхами и сомнениями, которые мешают сделать первый шаг к новым знаниям. Из новой статьи адвента вы узнаете, как преодолеть их и не сдаваться, даже если изучение аналитики кажется сложным.

➡️ Перейти в адвент-календарь

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
3🎄32
Карьера в аналитике в 2026 году: на что надеяться?

Говорят, рынок аналитики переполнен джунами, нейросети скоро заменят начинающих и вход в аналитику будет закрыт. А что говорят те, кто нанимает и строит команды в 2026 году?

Мы собрали трёх экспертов из Альфа-Банка, Авито и Яндекс eLama, чтобы они дали честный и трезвый прогноз:

Кого на самом деле будут искать в 2026-м?
Какие навыки из «хотелок» стали обязательным минимумом?
Есть ли пространство для роста у новичков, и где оно?

На вебинаре 24 декабря вы получите советы от аналитиков-практиков:

❄️ Алёна Артемьева, руководитель направления аналитики продаж в Альфа-Банке, развеет мифы и даст «вредные советы» по поиску работы, которые на самом деле работают;
❄️ Анна Першина, аналитик-разработчик в Авито, объяснит, почему джуны всё ещё нужны бигтеху, и что сильная база по Python/SQL — это уже не преимущество;
❄️ Павел Беляев, тимлид аналитиков в Яндекс eLama, покажет 5 ключевых навыков и типичные ошибки джунов, которые решают, возьмут вас или нет.

Встречаемся 24 декабря в 19:00 МСК. Успейте зарегистрироваться и задать свой вопрос спикерам!

👉 Зарегистрироваться на вебинар

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥743
Как ускорить apply(). Часть 1

Привет! На связи Кристина Желтова, ментор курса «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 млн штук!):
Взять одну строку;
Передать в функцию lambda;
Вызвать функцию (потратив время и «силы» на вызов — overhead);
Получить результат;
Вернуть в датасет.

Результат: 1 млн * overhead = ОЧЕНЬ медленно.

Векторизация же работает так:

Взять весь столбец col1;
Взять весь столбец col2;
Сложить их поэлементно (в оптимизированном коде на C);
Результат: одна операция, очень быстро.

Итого, в 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")


Как результат — ускорение в сотни раз и даже больше!

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥52🎉1
Как ускорить apply(). Часть 2

В примере выше использовалась простая арифметическая функция, но можно ли ускорить 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.

Ставьте ❤️, если было полезно!

📊 Simulative
Please open Telegram to view this post
VIEW IN TELEGRAM
16🔥84