Центр научной коммуникации Университета ИТМО проводит анализ профессионального сообщества ML- и DS-специалистов в России. Мы хотим узнать больше о том, как устроена профессиональная коммуникация в вашей сфере, кого вы считаете лидерами рынка на данный момент.
Ваше участие поможет нам сформировать полную картину современного состояния индустрии. Мы гарантируем полную анонимность и конфиденциальность ваших ответов.
Опрос займет не более 10 минут вашего времени.
Ссылка на анкету: https://forms.gle/dHRsqQJteuty51Bp7
p.s. Я погуглила университет. Оказалось, что это национальный исследовательский университет, основанный в 1900 в Санкт-Петербурге. Это вам не игры. Тут все серьезно.
Таким помогать - одно удовольствие. 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍6😁1
Хочу поделиться своими рекомендациями так как многие люди тратят деньги и время на неподходящие курсы, которые не приносят желаемых результатов.
Постепенное освоение навыков значительно повысит ваши шансы на успешное трудоустройство! А уже с приобретением опыта вы сможете продвигаться дальше и продолжать развивать свои способности.
Удачи! 🚀📈😊
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥40❤12😍2⚡1💯1
⚡️Хитрая задачка с работы.
Попросили меня выгрузить всех клиентов, у которых ставка кредита меньше или равно указанных. Должны быть меньше вот этих (как пример, цифры придуманные):
📉 Срок рассрочки 3 мес.: 5.93%
📉 Срок рассрочки 4 мес.: 6.64%
📉 Срок рассрочки 6 мес.: 7.05%
В базе данные хранятся у каждого клиента в параметре value просто как текст:
installment_0_0_3_7,59 Срок рассрочки 3 мес. installment_0_0_4_8,42 Срок рассрочки 4 мес. installment_0_0_6_10,84 Срок рассрочки 6 мес.
Сравнить нужно не только ставку, но и соотнести с продолжительностью кредита.
Решение 🚀
✔️ Генерация данных. 📊 Создадим небольшой датафрейм:
Обработка данных 🛠
✔️ Создаем пустой список для хранения обработанных данных.
✔️ Извлечение данных с помощью iterrows() 🔄
Для каждой строки извлекаем client_id, сроки рассрочки и процентные ставки из столбца value. Используем регулярное выражение для поиска всех совпадений в value, которые соответствуют шаблону installment_0_0_<term>_<rate>.
📚Как работает iterrows() 🐍 Метод iterrows() проходит по строкам DataFrame и возвращает пары (index, row) для каждой строки. Здесь index - это индекс строки, а row - это Series, представляющая данные строки.
То есть я извлекаю сроки рассрочки и процентные ставки из колонки value и потом добавляю их в новый DataFrame.
Регулярное выражение для извлечения данных 🔍
Разберем matches = re.findall(r'installment_0_0_(\d+)_([\d,\.]+)', value) подробно:
1. Ищет буквальный текст "installment_0_0_" в строке.
2. (\d+): Находит одну или более цифр и сохраняет их как первую группу захвата (срок кредитования).
3. Ищет символ подчеркивания _.
4.([\d,\.]+): Находит одну или более цифр, запятых или точек и сохраняет их как вторую группу захвата (ставка кредита).
5. Метод re.findall возвращает список кортежей, каждый из которых содержит группы захвата.
У нас получился датафрейм с колонками client_id, rate и term. Вуаля! А теперь можно отфильтровать нужное.
✔️ Фильтрация данных 🎯
Далее я фильтрую данные по заданным условиям. Проценты не должны превышать определенных значений для каждого срока рассрочки
📌Так как код большой, то я оставлю ссылку на юпитер ноутбук. Тестируйте, модифицируйте.
Попросили меня выгрузить всех клиентов, у которых ставка кредита меньше или равно указанных. Должны быть меньше вот этих (как пример, цифры придуманные):
📉 Срок рассрочки 3 мес.: 5.93%
📉 Срок рассрочки 4 мес.: 6.64%
📉 Срок рассрочки 6 мес.: 7.05%
В базе данные хранятся у каждого клиента в параметре value просто как текст:
installment_0_0_3_7,59 Срок рассрочки 3 мес. installment_0_0_4_8,42 Срок рассрочки 4 мес. installment_0_0_6_10,84 Срок рассрочки 6 мес.
Сравнить нужно не только ставку, но и соотнести с продолжительностью кредита.
Решение 🚀
data = [
{
'client_id': 111,
'value': 'installment_0_0_3_7,59 Срок рассрочки 3 мес.'
'installment_0_0_4_8,42 Срок рассрочки 4 мес.'
'installment_0_0_6_10,84 Срок рассрочки 6 мес.'
},
{
'client_id': 222,
'value': 'installment_0_0_3_4,93 Срок рассрочки 3 мес.'
},
{
'client_id': 333,
'value': 'installment_0_0_4_5,64 Срок рассрочки 4 мес.'
'installment_0_0_6_6,05 Срок рассрочки 6 мес.'
},
{
'client_id': 444,
'value': 'installment_0_0_3_7,78 Срок рассрочки 3 мес.'
'installment_0_0_6_9,60 Срок рассрочки 6 мес.'
},
{
'client_id': 555,
'value': 'installment_0_0_4_8,57 Срок рассрочки 4 мес.'
'installment_0_0_6_8 Срок рассрочки 6 мес.'
}
]
# Создание DataFrame
df = pd.DataFrame(data)
Обработка данных 🛠
processed_data = []
Для каждой строки извлекаем client_id, сроки рассрочки и процентные ставки из столбца value. Используем регулярное выражение для поиска всех совпадений в value, которые соответствуют шаблону installment_0_0_<term>_<rate>.
📚Как работает iterrows() 🐍 Метод iterrows() проходит по строкам DataFrame и возвращает пары (index, row) для каждой строки. Здесь index - это индекс строки, а row - это Series, представляющая данные строки.
То есть я извлекаю сроки рассрочки и процентные ставки из колонки value и потом добавляю их в новый DataFrame.
for index, row in df.iterrows():
client_id = row['client_id']
value = row['value']
# Извлечение сроков и ставок с помощью регулярного выражения
matches = re.findall(r'installment_0_0_(\d+)_([\d,\.]+)', value)
for match in matches:
term = f"Срок рассрочки {match[0]} мес."
rate_str = match[1].replace(',', '.')
rate_str = re.sub(r'\.$', '', rate_str)
rate = float(rate_str)
processed_data.append({
'client_id': client_id,
'rate': rate,
'term': term
})
# Создание нового DataFrame из обработанных данных
processed_df = pd.DataFrame(processed_data)
Регулярное выражение для извлечения данных 🔍
Разберем matches = re.findall(r'installment_0_0_(\d+)_([\d,\.]+)', value) подробно:
1. Ищет буквальный текст "installment_0_0_" в строке.
2. (\d+): Находит одну или более цифр и сохраняет их как первую группу захвата (срок кредитования).
3. Ищет символ подчеркивания _.
4.([\d,\.]+): Находит одну или более цифр, запятых или точек и сохраняет их как вторую группу захвата (ставка кредита).
5. Метод re.findall возвращает список кортежей, каждый из которых содержит группы захвата.
У нас получился датафрейм с колонками client_id, rate и term. Вуаля! А теперь можно отфильтровать нужное.
Далее я фильтрую данные по заданным условиям. Проценты не должны превышать определенных значений для каждого срока рассрочки
# Определение условий фильтрации
conditions = {
"Срок рассрочки 3 мес.": 5.93,
"Срок рассрочки 4 мес.": 6.64,
"Срок рассрочки 6 мес.": 7.05
}
filtered_df = processed_df[processed_df.apply(
lambda row: row['term'] in conditions and row['rate'] <= conditions[row['term']], axis=1)]
📌Так как код большой, то я оставлю ссылку на юпитер ноутбук. Тестируйте, модифицируйте.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍9❤4👎3
🎉 Один хороший человек наконец-то достиг первой серьезной отметки - 1000 подписчиков на своем Телеграмм-канале! 🎉
📚 В честь этого он устраивает розыгрыш трех потрясающих книг! По аналитике конечно📚 А я всегда поддерживаю такие начинания. 👌
1. Статистика и Котики – Владимир Савельев
2. Графики, которые убеждают всех – Александр Богачев
3. Погружение в аналитику данных. От Exсel к Python и R – Джордж Маунт
🎁 Я тоже участвую и надеюсь на удачу. 😃 Присоединяйтесь!
Условия участия очень просты - быть его подписчиком.
🍀 Пусть удача будет на вашей стороне! https://xn--r1a.website/analitikza30
📚 В честь этого он устраивает розыгрыш трех потрясающих книг! По аналитике конечно📚 А я всегда поддерживаю такие начинания. 👌
1. Статистика и Котики – Владимир Савельев
2. Графики, которые убеждают всех – Александр Богачев
3. Погружение в аналитику данных. От Exсel к Python и R – Джордж Маунт
Условия участия очень просты - быть его подписчиком.
🍀 Пусть удача будет на вашей стороне! https://xn--r1a.website/analitikza30
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥17🔥6👍2🎉2❤1🤗1💘1
📊 ⚡️Хитрая задачка с работы. Возвращение. 📊
👨💻Наконец удалось выкроить время, чтобы поэкспериментировать с этой хитрой задачей, и теперь у меня есть решение, которое не использует циклы! Всё сделано исключительно с помощью Pandas!
Давайте разберем его пошагово:
1️⃣ Генерация данных как и в прошлый раз💾
Здесь мы создаем список словарей, где каждый словарь содержит client_id и строку value с информацией о рассрочках.
2️⃣ Извлечение данных (сроков рассрочки и ставок из строки value) с использованием регулярного выражения 🔍
3️⃣ Преобразование данных в нужный формат 🔄 Преобразуем строковые значения в числовой формат и добавляем текстовое описание к срокам рассрочки.
4️⃣ Определение условий фильтрации 🕵️♂️
Задаем условия для фильтрации данных по срокам рассрочки и максимальным допустимым ставкам.
5️⃣ Фильтрация данных 📊
📎 Вот ссылка на обновленный Jupyter Notebook. В нём вы найдёте ещё дополнительные варианты решения, которые прислал Дмитрий в комментариях. Спасибо ему за это! 🙂
👨💻Наконец удалось выкроить время, чтобы поэкспериментировать с этой хитрой задачей, и теперь у меня есть решение, которое не использует циклы! Всё сделано исключительно с помощью Pandas!
Давайте разберем его пошагово:
Здесь мы создаем список словарей, где каждый словарь содержит client_id и строку value с информацией о рассрочках.
import pandas as pd
data = [
{ 'client_id': 111,
'value': 'installment_0_0_3_7,59 Срок рассрочки 3 мес.'
'installment_0_0_4_8,42 Срок рассрочки 4 мес.'
'installment_0_0_6_10,84 Срок рассрочки 6 мес.'
},
{
'client_id': 222,
'value': 'installment_0_0_3_4,93 Срок рассрочки 3 мес.'
},
{
'client_id': 333,
'value': 'installment_0_0_4_5,64 Срок рассрочки 4 мес.'
'installment_0_0_6_6,05 Срок рассрочки 6 мес.'
},
{
'client_id': 444,
'value': 'installment_0_0_3_7,78 Срок рассрочки 3 мес.'
'installment_0_0_6_9,60 Срок рассрочки 6 мес.'
},
{
'client_id': 555,
'value': 'installment_0_0_4_8,57 Срок рассрочки 4 мес.'
'installment_0_0_6_8 Срок рассрочки 6 мес.'
}
]
df = pd.DataFrame(data)
extracted = df.set_index('client_id')['value'].str.extractall(r'installment_0_0_(\d+)_([\d,]+)')
extracted = extracted.reset_index(level=1, drop=True).reset_index()
extracted.columns = ['client_id', 'term', 'rate']extracted['rate'] = extracted['rate'].str.replace(',', '.').astype(float)
extracted['term'] = 'Срок рассрочки ' + extracted['term'] + ' мес.'Задаем условия для фильтрации данных по срокам рассрочки и максимальным допустимым ставкам.
conditions = {
"Срок рассрочки 3 мес.": 5.93,
"Срок рассрочки 4 мес.": 6.64,
"Срок рассрочки 6 мес.": 7.05
}filtered_df = extracted[extracted.apply(
lambda row: row['term'] in conditions and row['rate'] <= conditions[row['term']], axis=1
)]
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤2👍2
📊 Анализ данных: Извлечение доменов почт клиентов 📊
Привет, друзья! Меня на днях попросили проанализировать домены почт у клиента если сможем.✉️ Цитата:
Я ответила, что можем иполезла в базу пошла за кофе.
Покажу решение на примере SQL-запроса и Python кода.
📜 SQL-запрос
Для начала я использую SQL-запрос, чтобы извлечь домены почт из базы данных:
Этот запрос выполняет следующие действия:
✔️ SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1)
- SUBSTRING_INDEX(email, '@', -1) извлекает часть строки после символа @ (то есть домен почты).
- SUBSTRING_INDEX(..., '.', 1) затем извлекает часть строки до первой точки в домене, чтобы получить тип почты.
Таким образом, если email выглядит как user@mail.com, результат будет mail. Если email выглядит как user@yandex.ru, результат будет yandex.
✔️ COUNT(*) — считает количество пользователей с каждым доменом.
✔️ WHERE client_id = 1000 AND type = 'user' — фильтрует данные по определённому аккаунту и типу пользователя.
✔️ GROUP BY 1 — группирует результаты по домену.
💻 Python код
После получения данных из SQL-запроса, мы используем Python для дальнейшей обработки. В целом можно и в SQL написать было, но базе и так тяжело, не стала нагружать ее подзапросами.
P.S. Функция SUBSTRING_INDEX используется в MySQL и не поддерживается PostgreSQL. В PostgreSQL для аналогичной задачи нужно использовать
Цифра 2 в функции split_part(email, '@', 2) указывает на то, что мы хотим получить вторую часть строки, разделённую символом '@'. Мы разделяем email на две части: до символа '@' и после него. Нам нужна часть, идущая после символа '@', то есть домен почты.
📝 Результаты
После выполнения этого кода мы получаем таблицу, отсортированную по количеству пользователей для каждого домена, с процентным значением.
Теперь понятно какие почтовые домены наиболее популярны среди пользователей.✉️
Привет, друзья! Меня на днях попросили проанализировать домены почт у клиента если сможем.
Типа такого: яндекс - 1,2 млн / 15% мейл.ру - …. гугл
Я ответила, что можем и
Покажу решение на примере SQL-запроса и Python кода.
📜 SQL-запрос
Для начала я использую SQL-запрос, чтобы извлечь домены почт из базы данных:
query = ""
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1) AS mail_type, COUNT(*)
FROM user.user
WHERE client_id = 1000
AND type = 'user'
GROUP BY 1
"""
users = pd.read_sql(query, connection)
Этот запрос выполняет следующие действия:
- SUBSTRING_INDEX(email, '@', -1) извлекает часть строки после символа @ (то есть домен почты).
- SUBSTRING_INDEX(..., '.', 1) затем извлекает часть строки до первой точки в домене, чтобы получить тип почты.
Таким образом, если email выглядит как user@mail.com, результат будет mail. Если email выглядит как user@yandex.ru, результат будет yandex.
💻 Python код
После получения данных из SQL-запроса, мы используем Python для дальнейшей обработки. В целом можно и в SQL написать было, но базе и так тяжело, не стала нагружать ее подзапросами.
import pandas as pd
#Сортировка данных по количеству пользователей в порядке убывания
users_sorted = users.sort_values('count(*)', ascending=False)
# Подсчёт общего количества пользователей
total_count = users_sorted['count(*)'].sum()
# Расчёт процента для каждого домена
users_sorted['percentage'] = (users_sorted['count(*)'] / total_count) * 100
P.S. Функция SUBSTRING_INDEX используется в MySQL и не поддерживается PostgreSQL. В PostgreSQL для аналогичной задачи нужно использовать
split_part(split_part(email, '@', 2), '.', 1) AS mail_type
Цифра 2 в функции split_part(email, '@', 2) указывает на то, что мы хотим получить вторую часть строки, разделённую символом '@'. Мы разделяем email на две части: до символа '@' и после него. Нам нужна часть, идущая после символа '@', то есть домен почты.
📝 Результаты
После выполнения этого кода мы получаем таблицу, отсортированную по количеству пользователей для каждого домена, с процентным значением.
Теперь понятно какие почтовые домены наиболее популярны среди пользователей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31❤5
✨ Мечты сбываются! ✨
Друзья, рада поделиться отличной новостью! Мой модуль по аналитике уже опубликован в курсе SkillFactory "IT-специалист с нуля"! 🥳 Ранее я делилась с вами, что работаю над этим курсом, вот тут.
Создание курса оказалось нелегким испытанием (особенно совмещение с основной работой), но очень интересным процессом. Я полностью уверена в том, что каждый, кто его пройдет, получит максимум знаний и навыков. Я вложила в него все, что было возможно, и спокойна за ваши результаты! 🚀
Мой модуль является частью большого IT-курса, где каждый раздел помогает изучить различные IT-профессии и выбрать свой путь в мире технологий!👨💻
Друзья, рада поделиться отличной новостью! Мой модуль по аналитике уже опубликован в курсе SkillFactory "IT-специалист с нуля"! 🥳 Ранее я делилась с вами, что работаю над этим курсом, вот тут.
Создание курса оказалось нелегким испытанием (особенно совмещение с основной работой), но очень интересным процессом. Я полностью уверена в том, что каждый, кто его пройдет, получит максимум знаний и навыков. Я вложила в него все, что было возможно, и спокойна за ваши результаты! 🚀
Мой модуль является частью большого IT-курса, где каждый раздел помогает изучить различные IT-профессии и выбрать свой путь в мире технологий!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥43❤🔥6❤5🤡2
Сперва кажется, что за бред про прерываемые индексы? Сейчас расскажу где можно ошибиться 😜
А кто не ошибается, тот не работает! Главное вовремя понять, что тут что-то не то.
💡 Итак, задача: У нас есть список клиентов и их годовые обороты. Мы хотим отфильтровать тех, у кого оборот, допустим, больше 1 миллиона, отсортировать их по убыванию и выбрать топ-3 самых крупных клиентов.
Создадим данные для наглядности:
import pandas as pd
# Создаем исходный DataFrame
data = {
'client_id': [101, 102, 103, 104, 105],
'client_name': ['Client A', 'Client B', 'Client C', 'Client D', 'Client E'],
'turnover': [1200000, 500000, 1500000, 2000000, 3000000]
}
df = pd.DataFrame(data)
📋 Шаг 1: Фильтрация и сортировка клиентов
Сначала отфильтруем клиентов с оборотом более 1 миллиона и отсортируем их по обороту от большего к меньшему:
filtered_df = df[df['turnover'] > 1000000].sort_values('turnover', ascending=False)Теперь у нас есть DataFrame с клиентами, у которых оборот превышает 1 миллион, отсортированный по убыванию
🚫 Ошибка: Что будет, если для выбора топ-3 теперь использовать .loc?
incorrect_top_3 = filtered_df.loc[:3]
Метод .loc[:3] пытается выбрать строки с индексами 0, 1, 2, 3. Однако, после фильтрации и сортировки, индексы строк изменились, и это приведет к выбору не тех строк!
✅ Правильный подход: Используем .iloc, чтобы выбрать первые 3 строки по их позициям:
correct_top_3 = filtered_df.iloc[:3]
С помощью .iloc мы гарантированно получаем топ-3 клиента по их позициям в отсортированном DataFrame, игнорируя индексы.
✨ Вывод: Используйте .iloc для выбора строк по позициям, особенно после фильтрации, группировки или сортировки данных, когда индексы идут не подряд. Тогда результат действительно будет топовым!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31❤🔥6❤1✍1😴1
Лето прошло, и кажется, все уже поплакали по этому поводу. Но кто бы мог подумать, что Notion тоже оставит нас в печали?
С 9 сентября сервис прекратит работу для пользователей из России. Это настоящее разочарование.😭 Вся мои заметки, ссылки и курсы хранятся там, и теперь я в поисках альтернативы.
После долгих поисков наткнулась на Yonote.ru. Это не реклама, а просто находка, которая поможет заменить Notion. Конечно, можно использовать VPN, но иногда хочется работать без лишних танцев с бубном.
Что делать дальше?
✅ Экспорт данных: Первое и самое важное — экспортируйте свои заметки из Notion. Это можно сделать как для отдельных страниц, так и для всего аккаунта. Резервные копии — залог спокойствия.
✅ Ожидание: Посмотрим, что произойдет после 9 сентября. Пока нет полной ясности, как именно будут ограничивать доступ: всех ли пользователей, только платных, или же по IP. Но, почти наверняка, даже в худшем случае, сервис будет доступен через VPN. Но стоит ли это усилий? Каждый решает сам.
✅ Аналоги: Есть несколько российских вариантов:
✔️ Яндекс Заметки — для простых записей, если не нужны сложные структуры: ссылка
✔️ Заметки Mail.ru — с недавним добавлением тегов можно разделять записи по темам: ссылка
Для более сложных задач:
✔️ Yonote.ru — организация, планирование, управление знаниями.
✔️ Teamly.ru — платформа для совместной работы и управления знаниями
✔️ Weeek.net — задачи, база знаний, CRM, аналитика и многое другое
Каждый решает сам, что выбрать. Главное — быть готовым к изменениям и действовать заранее.👩💻
А вы чем пользуетесь, кстати?
С 9 сентября сервис прекратит работу для пользователей из России. Это настоящее разочарование.
После долгих поисков наткнулась на Yonote.ru. Это не реклама, а просто находка, которая поможет заменить Notion. Конечно, можно использовать VPN, но иногда хочется работать без лишних танцев с бубном.
Что делать дальше?
✅ Экспорт данных: Первое и самое важное — экспортируйте свои заметки из Notion. Это можно сделать как для отдельных страниц, так и для всего аккаунта. Резервные копии — залог спокойствия.
✅ Ожидание: Посмотрим, что произойдет после 9 сентября. Пока нет полной ясности, как именно будут ограничивать доступ: всех ли пользователей, только платных, или же по IP. Но, почти наверняка, даже в худшем случае, сервис будет доступен через VPN. Но стоит ли это усилий? Каждый решает сам.
✅ Аналоги: Есть несколько российских вариантов:
Для более сложных задач:
Каждый решает сам, что выбрать. Главное — быть готовым к изменениям и действовать заранее.
А вы чем пользуетесь, кстати?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3🤨2
Про прокрастинацию и баланс в жизни 🧠💪
Когда работаешь аналитиком данных 📊, кажется, что учёба и саморазвитие — это неотъемлемая часть успеха. Постоянно хочется освоить что-то новое, улучшить свои навыки, но... в какой-то момент понимаешь, что усталость берёт своё 😩.
Домашние дела 🧹, семейные заботы 👨👩👧👦, домашка с детьми-школьниками, и несколько человек в менторстве — всё это отнимает много сил. И вот тут появляется прокрастинация 🕰. Не потому что неинтересно, а потому что тело и разум просто требуют передышки 🛌.
И знаете, я пришла к выводу: нельзя постоянно «пахать» 💼. Наш организм подаёт сигнал, что ему нужен отдых, и это важно уважать. Если хочется замедлиться 🧘♀️ — нужно дать себе такую возможность. Отдых — это тоже часть пути к продуктивности ⚡️
Недавно я даже решилась на шаг вперёд: записалась в фитнес-клуб 🏋️♀️. Теперь забочусь не только о своём уме 🧠, но и о теле 💪. Ведь в гармонии важен баланс ⚖️ — между физическим, эмоциональным и интеллектуальным развитием.
Помните, заботиться о себе — это не лень, а необходимость ❤️.
И вот, пишу это всё в пятницу 13-го 🌘 — не знаю, совпадение это или знак, но кажется, что сегодня именно тот день, когда стоит притормозить, оглянуться вокруг и просто насладиться тем, что уже удалось достичь.
Когда работаешь аналитиком данных 📊, кажется, что учёба и саморазвитие — это неотъемлемая часть успеха. Постоянно хочется освоить что-то новое, улучшить свои навыки, но... в какой-то момент понимаешь, что усталость берёт своё 😩.
Домашние дела 🧹, семейные заботы 👨👩👧👦, домашка с детьми-школьниками, и несколько человек в менторстве — всё это отнимает много сил. И вот тут появляется прокрастинация 🕰. Не потому что неинтересно, а потому что тело и разум просто требуют передышки 🛌.
И знаете, я пришла к выводу: нельзя постоянно «пахать» 💼. Наш организм подаёт сигнал, что ему нужен отдых, и это важно уважать. Если хочется замедлиться 🧘♀️ — нужно дать себе такую возможность. Отдых — это тоже часть пути к продуктивности ⚡️
Недавно я даже решилась на шаг вперёд: записалась в фитнес-клуб 🏋️♀️. Теперь забочусь не только о своём уме 🧠, но и о теле 💪. Ведь в гармонии важен баланс ⚖️ — между физическим, эмоциональным и интеллектуальным развитием.
Помните, заботиться о себе — это не лень, а необходимость ❤️.
И вот, пишу это всё в пятницу 13-го 🌘 — не знаю, совпадение это или знак, но кажется, что сегодня именно тот день, когда стоит притормозить, оглянуться вокруг и просто насладиться тем, что уже удалось достичь.
❤40👍15🔥5🥰1
🎯LEFT JOIN, с условием в ON или в WHERE.
Разберем, почему происходит различие между двумя запросами с LEFT JOIN, где условие включено в разные части: ON и WHERE.
Такое встречается на тестовых. Ну и по работе тоже нужно конечно.
Есть две таблицы: Таблица 1: информация о транзакциях и Таблица 2: информация о типе пользователя
Задача: выполнить LEFT JOIN по user_id, чтобы узнать, какой у пользователя тип (type), и разобраться, почему два похожих запроса могут дать разные результаты.
🟢 Запрос1️⃣ : LEFT JOIN с условием в ON:
Для каждой строки из df_1 ищется строка в df_2, где user_id совпадают и type в df_2 равно 'admin'.
Если такое совпадение найдено, строка из df_2 включается в результат. Если совпадений нет, то столбцы из df_2 заполняются NULL.
Все строки из df_1 присутствуют, так как это LEFT JOIN.
🟢 Запрос2️⃣ : LEFT JOIN с условием в WHERE
Аналогично предыдущему случаю, LEFT JOIN возвращает все строки из df_1 и соответствующие строки из df_2.
Условие WHERE отфильтровывает строки после объединения. Это означает, что оно удалит все строки, где df_2.type не равно 'admin' и также строки, где df_2.type равно NULL.
В результате будут включены только строки, где df_2.type = 'admin'.
🤓 В чем разница?
Условие в ON позволяет выполнить фильтрацию во время объединения (JOIN), сохраняя все строки из левой таблицы (df_1) и вставляя NULL для несоответствующих значений из правой таблицы.
Условие в WHERE применяется после объединения. Поэтому строки, которые не соответствуют условию (type = 'admin'), будут удалены включая строки с NULL!
💡 Запомним 🚀
ON — фильтрует при объединении, сохраняя строки из левой таблицы.
WHERE — фильтрует после объединения, убирая строки с NULL и несоответствующими значениями.
p.s. Картинку рисовала в Canva впервые. Накидайте реакций за смелость :) Дизайнерам тапками не кидаться, сделала как смогла 😂
Разберем, почему происходит различие между двумя запросами с LEFT JOIN, где условие включено в разные части: ON и WHERE.
Такое встречается на тестовых. Ну и по работе тоже нужно конечно.
Есть две таблицы: Таблица 1: информация о транзакциях и Таблица 2: информация о типе пользователя
Задача: выполнить LEFT JOIN по user_id, чтобы узнать, какой у пользователя тип (type), и разобраться, почему два похожих запроса могут дать разные результаты.
🟢 Запрос
SELECT df_1.user_id, df_1.amount, df_2.type
FROM df_1
LEFT JOIN df_2 ON df_1.user_id = df_2.user_id AND df_2.type = 'admin'
Для каждой строки из df_1 ищется строка в df_2, где user_id совпадают и type в df_2 равно 'admin'.
Если такое совпадение найдено, строка из df_2 включается в результат. Если совпадений нет, то столбцы из df_2 заполняются NULL.
Все строки из df_1 присутствуют, так как это LEFT JOIN.
🟢 Запрос
SELECT df_1.user_id, df_1.amount, df_2.type
FROM df_1
LEFT JOIN df_2 ON df_1.user_id = df_2.user_id
WHERE df_2.type = 'admin'
Аналогично предыдущему случаю, LEFT JOIN возвращает все строки из df_1 и соответствующие строки из df_2.
Условие WHERE отфильтровывает строки после объединения. Это означает, что оно удалит все строки, где df_2.type не равно 'admin' и также строки, где df_2.type равно NULL.
В результате будут включены только строки, где df_2.type = 'admin'.
🤓 В чем разница?
Условие в ON позволяет выполнить фильтрацию во время объединения (JOIN), сохраняя все строки из левой таблицы (df_1) и вставляя NULL для несоответствующих значений из правой таблицы.
Условие в WHERE применяется после объединения. Поэтому строки, которые не соответствуют условию (type = 'admin'), будут удалены включая строки с NULL!
💡 Запомним 🚀
ON — фильтрует при объединении, сохраняя строки из левой таблицы.
WHERE — фильтрует после объединения, убирая строки с NULL и несоответствующими значениями.
p.s. Картинку рисовала в Canva впервые. Накидайте реакций за смелость :) Дизайнерам тапками не кидаться, сделала как смогла 😂
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥40⚡13❤9👍2✍1🔥1
✋🏻 Привет, меня зовут Дмитрий, я data engineer.
Веду свой блог по инжинирингу данных https://xn--r1a.website/kuzmin_dmitry91.
Пишу про область, рабочие кейсы, немного лайфстайла. Работаю, учусь, делаю и исправляю ошибки)
Будет интересно больше новичкам в области, но также поддержу разговор с middle+ de.
Буду рад, если в моем канале найдете для себя полезности 💪🏻
Веду свой блог по инжинирингу данных https://xn--r1a.website/kuzmin_dmitry91.
Пишу про область, рабочие кейсы, немного лайфстайла. Работаю, учусь, делаю и исправляю ошибки)
Будет интересно больше новичкам в области, но также поддержу разговор с middle+ de.
Буду рад, если в моем канале найдете для себя полезности 💪🏻
Telegram
Дмитрий Кузьмин | Инженерия данных
Путь Data engineer от Junior до Lead.
Делюсь мыслями, рабочими кейсами, обучением. Блог для junior - middle DE.
Мой профиль: @dim4eg91
Сайт: https://kuzmin-dmitry.ru
Практикум Data engineer: https://kuzmin-dmitry.ru/de_practicum
Делюсь мыслями, рабочими кейсами, обучением. Блог для junior - middle DE.
Мой профиль: @dim4eg91
Сайт: https://kuzmin-dmitry.ru
Практикум Data engineer: https://kuzmin-dmitry.ru/de_practicum
❤🔥8
Когда ко мне обращаются за помощью, я с удовольствием поддерживаю, если вижу, что блог действительно полезный и может помочь другим 💪👌👍
❤9👍5❤🔥4😁4⚡1
💡 Почему в мире быстрых изменений важно учиться терпению?
Хочу с вами поделиться одной мыслью. Она наверняка не нова, но я как-то по другому на нее смотрю теперь.
Сейчас скорость достижения целей кажется ключевым навыком. Все вокруг будто бы идут на сверхзвуковой скорости: новые технологии, тренды, навыки. Постоянно учишься, пытаешься освоить новые инструменты и подходы, но при этом результат не всегда виден сразу. Ощущение, что идешь слишком медленно, иногда давит.
Но вот что важно понять: быстрота не всегда равно качество.
Работая в аналитике, да и вообще в любой сфере, если честно, мы часто забываем, что это марафон, а не спринт. Ты не можешь мгновенно статьсиньором крутым экспертом или сделать невероятные открытия в данных с первого раза.
Когда я создавала канал несколько лет назад, я и не думала, что он будет приносить мне небольшой, но приятный доход от рекламы. Я просто создавала его так как мне захотелось.
🎯 Не гонитесь за мгновенными результатами!
То, что вы изучаете сейчас (питон, sql, статистика или еще что-то) может не пригодиться ВОТ ПРЯМ СЕЙЧАС, но очень вероятно, что пригодится через год или два при должном стремлении к вашей цели. Именно терпение и постоянство помогут тебе построить крепкий фундамент. Карьерный рост — это постепенный процесс. Очень важно научиться принимать и ценить каждый маленький шаг.
🌱 Учись терпению. Медленный прогресс — это тоже прогресс.
Важно помнить, что каждый новый проект, каждая ошибка — это кирпичик в твоем профессиональном пути. Твой путь уникален, и гонка с другими только мешает сосредоточиться на своих достижениях.
Терпение — это не вовсе не слабость, а сила. Развивай свои навыки, не гонись за мгновенными результатами, и в итоге ты увидишь, как далеко продвинулся.
Хочу с вами поделиться одной мыслью. Она наверняка не нова, но я как-то по другому на нее смотрю теперь.
Сейчас скорость достижения целей кажется ключевым навыком. Все вокруг будто бы идут на сверхзвуковой скорости: новые технологии, тренды, навыки. Постоянно учишься, пытаешься освоить новые инструменты и подходы, но при этом результат не всегда виден сразу. Ощущение, что идешь слишком медленно, иногда давит.
Но вот что важно понять: быстрота не всегда равно качество.
Работая в аналитике, да и вообще в любой сфере, если честно, мы часто забываем, что это марафон, а не спринт. Ты не можешь мгновенно стать
Когда я создавала канал несколько лет назад, я и не думала, что он будет приносить мне небольшой, но приятный доход от рекламы. Я просто создавала его так как мне захотелось.
🎯 Не гонитесь за мгновенными результатами!
То, что вы изучаете сейчас (питон, sql, статистика или еще что-то) может не пригодиться ВОТ ПРЯМ СЕЙЧАС, но очень вероятно, что пригодится через год или два при должном стремлении к вашей цели. Именно терпение и постоянство помогут тебе построить крепкий фундамент. Карьерный рост — это постепенный процесс. Очень важно научиться принимать и ценить каждый маленький шаг.
🌱 Учись терпению. Медленный прогресс — это тоже прогресс.
Важно помнить, что каждый новый проект, каждая ошибка — это кирпичик в твоем профессиональном пути. Твой путь уникален, и гонка с другими только мешает сосредоточиться на своих достижениях.
Терпение — это не вовсе не слабость, а сила. Развивай свои навыки, не гонись за мгновенными результатами, и в итоге ты увидишь, как далеко продвинулся.
❤🔥38👍10
💡 Как избежать ошибок при SQL-запросах, если в списке только одно значение?
Иногда при выполнении SQL-запросов с оператором IN может возникнуть ошибка, если список содержит только одно значение. Столкнулась с этим на работе, и решила проблему хитрым способом: добавляю фиктивное значение в список.
Это позволяет SQL-запросу работать корректно в любом случае!
📊 В этом примере, даже если список users_lst содержит одно значение, мы добавляем фиктивный user_id, чтобы запрос был корректным. Используем библиотеку pandasql для выполнения SQL-запроса на DataFrame.
Иногда при выполнении SQL-запросов с оператором IN может возникнуть ошибка, если список содержит только одно значение. Столкнулась с этим на работе, и решила проблему хитрым способом: добавляю фиктивное значение в список.
Это позволяет SQL-запросу работать корректно в любом случае!
from pandasql import sqldf
import pandas as pd
# Список user_id
users_lst = [987654321]
# Проверка длины списка
if len(users_lst) == 1:
# Добавляем фиктивное значение
users_lst.append(123456789)
# Преобразование списка в кортеж
users_lst = tuple(users_lst)
# Пример базы данных с двумя колонками: user_id и amount
data = {
'user_id': [987654321, 154589364, 234567890, 345678901, 456789012],
'amount': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)
# SQL-запрос
query = f"""
SELECT user_id, amount
FROM df
WHERE user_id IN {users_lst}
"""
# Вывод результата
sqldf(query)
📊 В этом примере, даже если список users_lst содержит одно значение, мы добавляем фиктивный user_id, чтобы запрос был корректным. Используем библиотеку pandasql для выполнения SQL-запроса на DataFrame.
❤18👍2
🚀 Участвуйте в новом исследовании рынка аналитиков от NewHR!
Если вы работаете в аналитике, это отличная возможность не только внести свой вклад, но и получить доступ к уникальным результатам и инсайтам из исследования!
📊 Почему это важно?
NewHR проводит исследования рынка с 2018 года, чтобы собрать данные о развитии аналитической профессии: зарплаты, задачи, форматы работы и многое другое. Каждый год они следят за изменениями, чтобы лучше понять динамику в этой быстро развивающейся сфере.
Каких аналитиков охватывает исследование?
➤ Дата-аналитики
➤ BI-аналитики
➤ Продуктовые аналитики
➤ Маркетинговые и веб-аналитики
О чём пойдет речь в опросе?
👉 Как меняются зарплаты и вилки
👉 Какие компании предлагают отличные условия для аналитиков
👉 В каком формате работают аналитики: офис или удалёнка
👉 Чем занимаются аналитики сейчас и к чему стремятся в будущем
👉 Как они ищут работу и выбирают работодателей
📌 Как принять участие? Пройдите опрос, это займёт около 20 минут: ссылка на опрос. Сбор данных идёт весь октябрь.
💡 Почему это важно? Чем больше участников, тем точнее и репрезентативнее результаты! Ваше участие поможет сделать исследование максимально полезным для всех нас.
Я очень рекомендую пройти опрос (сама уже прошла) и поделиться им с коллегами! Окончательные результаты будут опубликованы в начале 2025 года, но участники смогут получать промежуточные данные и приглашения на закрытые обсуждения инсайтов.
Посмотрите какие у них были исследования:
Релокация IT-специалистов
Как изменились зарплаты айтишников за 2023 год
Исследование рынка продуктовых и дата-аналитиков
Если вы работаете в аналитике, это отличная возможность не только внести свой вклад, но и получить доступ к уникальным результатам и инсайтам из исследования!
📊 Почему это важно?
NewHR проводит исследования рынка с 2018 года, чтобы собрать данные о развитии аналитической профессии: зарплаты, задачи, форматы работы и многое другое. Каждый год они следят за изменениями, чтобы лучше понять динамику в этой быстро развивающейся сфере.
Каких аналитиков охватывает исследование?
➤ Дата-аналитики
➤ BI-аналитики
➤ Продуктовые аналитики
➤ Маркетинговые и веб-аналитики
О чём пойдет речь в опросе?
👉 Как меняются зарплаты и вилки
👉 Какие компании предлагают отличные условия для аналитиков
👉 В каком формате работают аналитики: офис или удалёнка
👉 Чем занимаются аналитики сейчас и к чему стремятся в будущем
👉 Как они ищут работу и выбирают работодателей
📌 Как принять участие? Пройдите опрос, это займёт около 20 минут: ссылка на опрос. Сбор данных идёт весь октябрь.
💡 Почему это важно? Чем больше участников, тем точнее и репрезентативнее результаты! Ваше участие поможет сделать исследование максимально полезным для всех нас.
Я очень рекомендую пройти опрос (сама уже прошла) и поделиться им с коллегами! Окончательные результаты будут опубликованы в начале 2025 года, но участники смогут получать промежуточные данные и приглашения на закрытые обсуждения инсайтов.
Посмотрите какие у них были исследования:
Релокация IT-специалистов
Как изменились зарплаты айтишников за 2023 год
Исследование рынка продуктовых и дата-аналитиков
❤5👍2
🚀 Друзья, хочу поделиться с вами важной новостью – я создала новый канал, посвященный искусственному интеллекту, нейросетям и технологиям! Это будет канал с последними новостями, собранными из ведущих зарубежных и отечественных источников: www.cnews.ru, www.bbc.com, newatlas.com, www.ibm.com и прочих.
Мне не терпится рассказать вам, как я пришла к этому!
Я просто обожаю всё, что связано с технологиями и нейросетями! 🧠 Я часто читаю новости, отслеживаю самые свежие разработки и подписана на множество тематических каналов. В какой-то момент я подумала: "Почему бы не сделать что-то своё?" 💡 И вот, теперь у меня есть собственный информационный вестник, где я делюсь с вами самым интересным и важным из мира ИИ! Назвала его ИИ Журнал, а симпотяшку робота нарисовала в нейронке.
Этот проект меня невероятно вдохновляет, потому что я не просто читаю и изучаю – я делюсь своими открытиями с вами. Так что присоединяйтесь, будет много захватывающих новостей и инсайтов!
🌐 P.S. Давайте признаем, что мысли о том, что нас всех могут заменить нейросети, уже давно стали актуальной темой. С одной стороны, меня беспокоит, до каких масштабов это может дойти, а с другой — перед нами открывается множество новых возможностей.
ИИ Журнал ждет Вас! Ну и как можно отказать такому милому роботу?🤪
Мне не терпится рассказать вам, как я пришла к этому!
Я просто обожаю всё, что связано с технологиями и нейросетями! 🧠 Я часто читаю новости, отслеживаю самые свежие разработки и подписана на множество тематических каналов. В какой-то момент я подумала: "Почему бы не сделать что-то своё?" 💡 И вот, теперь у меня есть собственный информационный вестник, где я делюсь с вами самым интересным и важным из мира ИИ! Назвала его ИИ Журнал, а симпотяшку робота нарисовала в нейронке.
Этот проект меня невероятно вдохновляет, потому что я не просто читаю и изучаю – я делюсь своими открытиями с вами. Так что присоединяйтесь, будет много захватывающих новостей и инсайтов!
ИИ Журнал ждет Вас! Ну и как можно отказать такому милому роботу?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👏1🤡1
📊 Как проверить, существует ли датафрейм в Python, прежде чем с ним работать?
Недавно столкнулась на работе с задачей, когда нужно было объединить два датафрейма — df1 и df2. Но тут был нюанс: иногда df1 просто не загружался из-за отсутствия данных. А мне нужно было учесть его, если данные вдруг появятся. Если бы пыталась объединить df1 и df2, когда df1 не существует, то это выдавало бы ошибку. Код и выдавал ошибку, чего уж там. 🤦♂️
Вот тут и пригодилась небольшая хитрость с проверкой на существование переменной.
В Python можно использовать функцию locals(), чтобы проверить, была ли создана переменная, прежде чем что-то с ней делать. Например, если я хочу проверить, существует ли df1, то пишу условие:
Итак, накидаем примерчики.
🔹 Вариант 1: locals()
🔹 Вариант 2: try-except
Другой способ — использовать try-except, чтобы поймать ошибку NameError, если переменная df1 еще не была создана. Это помогает избежать лишних проверок на пустоту и существование:
📝 Мне больше с locals() нравится. Кратко и по сути, и не надо дублировать код.
Недавно столкнулась на работе с задачей, когда нужно было объединить два датафрейма — df1 и df2. Но тут был нюанс: иногда df1 просто не загружался из-за отсутствия данных. А мне нужно было учесть его, если данные вдруг появятся. Если бы пыталась объединить df1 и df2, когда df1 не существует, то это выдавало бы ошибку. Код и выдавал ошибку, чего уж там. 🤦♂️
Вот тут и пригодилась небольшая хитрость с проверкой на существование переменной.
В Python можно использовать функцию locals(), чтобы проверить, была ли создана переменная, прежде чем что-то с ней делать. Например, если я хочу проверить, существует ли df1, то пишу условие:
if 'df1' not in locals():
df1 = pd.DataFrame() # Создаем df1, если он не существует
Итак, накидаем примерчики.
🔹 Вариант 1: locals()
import pandas as pd
df2 = pd.DataFrame({
'status': [1, 2, 3],
'manager_name': ['Иванов', 'Петров', 'Сидоров'] })
# Проверка наличия df1
if 'df1' not in locals() or df1.empty:
df1 = df2.copy() # Если df1 пустой или не существует, присваиваем ему df2
else:
df1 = pd.concat([df1, df2], ignore_index=True) # Объединение строк
🔹 Вариант 2: try-except
Другой способ — использовать try-except, чтобы поймать ошибку NameError, если переменная df1 еще не была создана. Это помогает избежать лишних проверок на пустоту и существование:
try:
if df1.empty:
# Если df1 пустой, присваиваем ему значения df2
df1 = df2.copy()
else:
# Если df1 не пустой, объединяем его с df2
df1 = pd.concat([df1, df2], ignore_index=True)
except NameError:
# Если df1 не был создан, создаем его как копию df2
df1 = df2.copy()
df1
📝 Мне больше с locals() нравится. Кратко и по сути, и не надо дублировать код.
❤🔥18👍4❤2🤔1
«Яндекс» опроверг наличие в компании «красных маркеров» при отборе кандидатов (возраст 40+, работа в госструктурах)
💼 На рынке труда часто ценят не только профессиональные навыки, но и соответствие негласным "маркерам" и стереотипам.
12 ноября 2024 года «Яндекс» опроверг в пояснении ситуации для Хабра наличие в компании «красных маркеров» при отборе кандидатов (возраст 40+, с опытом работы в госструктурах, частая смена работодателя и так далее), так как подобные правила противоречат внутренним политикам компании.
😏 Поверили ли мы сразу? Скажем так — рынку проще отсеивать, чем разбираться. И в этом грусть: многих достойных специалистов отсекают по признакам, которые не имеют отношения к их компетентности. Шансы попасть на собеседование часто сводятся к нулю по причинам, которые от кандидата никак не зависят.
⚖️ Конечно, приходится адаптироваться к этой реальности, но у соискателей тоже есть свои "красные маркеры". Один раз, к примеру, я была на собеседовании, где руководитель финансового отдела выглядел до предела уставшим человеком. Тогда я подумала: ну, всякое бывает, может, у компании непростой период. Как выяснилось позже, этот "период" длился уже давно, и в тот год до моего прихода сменился весь финансовый отдел, включая руководителя. Я тоже ушла спустя четыре месяца, так как возвращаться домой за полночь не слишком устраивало мою семью.
Расскажите, а вам попадались "красные флаги" у работодателей или в откликах на резюме?
💼 На рынке труда часто ценят не только профессиональные навыки, но и соответствие негласным "маркерам" и стереотипам.
12 ноября 2024 года «Яндекс» опроверг в пояснении ситуации для Хабра наличие в компании «красных маркеров» при отборе кандидатов (возраст 40+, с опытом работы в госструктурах, частая смена работодателя и так далее), так как подобные правила противоречат внутренним политикам компании.
😏 Поверили ли мы сразу? Скажем так — рынку проще отсеивать, чем разбираться. И в этом грусть: многих достойных специалистов отсекают по признакам, которые не имеют отношения к их компетентности. Шансы попасть на собеседование часто сводятся к нулю по причинам, которые от кандидата никак не зависят.
⚖️ Конечно, приходится адаптироваться к этой реальности, но у соискателей тоже есть свои "красные маркеры". Один раз, к примеру, я была на собеседовании, где руководитель финансового отдела выглядел до предела уставшим человеком. Тогда я подумала: ну, всякое бывает, может, у компании непростой период. Как выяснилось позже, этот "период" длился уже давно, и в тот год до моего прихода сменился весь финансовый отдел, включая руководителя. Я тоже ушла спустя четыре месяца, так как возвращаться домой за полночь не слишком устраивало мою семью.
Расскажите, а вам попадались "красные флаги" у работодателей или в откликах на резюме?
❤14🙏2❤🔥1🕊1
🔍 Как посчитать суммы покупок клиентов без оконных функций в SQL? Простое решение на Python! 🐍
Поступила мне тут задачка посчитать сумму покупок для каждого пользователя на определенном этапе его покупок: например, для 1-й, 2-й или 3-й покупки. В идеале это можно решить с помощью оконных функций в SQL. Но что делать, если они не доступны? 🤔
Я сделала, как обычно, с помощью Python и библиотеки pandas! Давайте разберемся, как это сделать шаг за шагом.
Итак, у нас есть таблица df с такими данными:
Мы добавляем столбец month, который извлекает месяц из даты покупки (created_at), так как мне нужна была именно по месяцам разбивка.
Оказывается есть метод cumcount(), чтобы рассчитать порядок покупок для каждого пользователя. 📊
Теперь у нас есть столбец rank, который говорит нам, какая по счету покупка была сделана пользователем.
И уже можно легко фильтровать их по порядку (первая, вторая, третья) и посчитать суммы для каждого из этих этапов.
📈 Вот так любимый python-чик может все! ❤️🔥 🎯
Поступила мне тут задачка посчитать сумму покупок для каждого пользователя на определенном этапе его покупок: например, для 1-й, 2-й или 3-й покупки. В идеале это можно решить с помощью оконных функций в SQL. Но что делать, если они не доступны? 🤔
Я сделала, как обычно, с помощью Python и библиотеки pandas! Давайте разберемся, как это сделать шаг за шагом.
Итак, у нас есть таблица df с такими данными:
data = {
#дата покупки
'created_at': ['2024-10-25', '2024-10-30', '2024-10-30', '2024-11-03', '2024-11-04', '2024-11-05'],
#идентификатор пользователя
'user_id': [1, 1, 2, 2, 2, 1],
#номер сделки
'deal_id': [101, 102, 103, 104, 105, 106],
#сумма покупки
'amount': [200, 300, 150, 250, 100, 200]
}
df = pd.DataFrame(data)
df['created_at'] = pd.to_datetime(df['created_at'])Мы добавляем столбец month, который извлекает месяц из даты покупки (created_at), так как мне нужна была именно по месяцам разбивка.
df['month'] = df['created_at'].dt.to_period('M')Оказывается есть метод cumcount(), чтобы рассчитать порядок покупок для каждого пользователя. 📊
df['rank'] = df.groupby('user_id').cumcount() + 1Теперь у нас есть столбец rank, который говорит нам, какая по счету покупка была сделана пользователем.
И уже можно легко фильтровать их по порядку (первая, вторая, третья) и посчитать суммы для каждого из этих этапов.
# Сумма первых покупок
first_deals = df[df['rank'] == 1].groupby('month', as_index=False)['amount'].sum()
# Сумма вторых покупок
second_deals = df[df['rank'] == 2].groupby('month', as_index=False)['amount'].sum()
# Сумма третьих покупок
third_deals = df[df['rank'] == 3].groupby('month', as_index=False)['amount'].sum()
📈 Вот так любимый python-чик может все! ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
❤25👍13❤🔥4
Наверно многие знают Пашу Бухтика Head of Product Analytics. Так вот у него завтра начинается курс по AБ и я выбила для вас 5% скидку. Нужно только сказать «я от Валерии / мира аналитики данных».
🎉 Курс по АБ – старт уже 2 декабря!
Ты хочешь прокачать навык АБ-тестирования, но устал от кусочных знаний из статей и книг?
Ты пробовал курсы, но на работе вопросов стало только больше? Или, может быть, тебя разворачивали на собеседованиях, потому что не хватало глубины?
👉 Тогда этот курс для тебя!
Паша Бухтик собрал все это:
✔️ Систему подходов, методов и инструментов для АБ,
✔️ Глубокое понимание и практику ключевых навыков,
✔️ Лучшие примеры из своей реальной практики за 7 лет.
Это не просто обучение. Это:
🔸 12 онлайн-занятий в Zoom – максимум структуры и ответов на все вопросы;
🔸 12 практических занятий в малых группах – кейсы, задачи, прикладной опыт;
🔸 12 комплектов доп. материалов – чеклисты, статьи, книги;
🔸 Индивидуальные домашки и обратная связь;
🔸 Активное комьюнити единомышленников!
🚀 Зачем тебе это? Чтобы выйти на новый уровень:
- Наконец увидеть большую картину.
- Разобраться, как всё работает в реальных рабочих задачах.
- Получить ответы на свои вопросы и перестать «спотыкаться».
🤝 Успей присоединиться! На второй поток.
🔗 Заявку оставляй на сайте: nodatanogrowth.com/product-analyst-ab-testing
Войди в 2024 с навыком, который сделает тебя экспертом. 💪
🎉 Курс по АБ – старт уже 2 декабря!
Ты хочешь прокачать навык АБ-тестирования, но устал от кусочных знаний из статей и книг?
Ты пробовал курсы, но на работе вопросов стало только больше? Или, может быть, тебя разворачивали на собеседованиях, потому что не хватало глубины?
👉 Тогда этот курс для тебя!
Паша Бухтик собрал все это:
✔️ Систему подходов, методов и инструментов для АБ,
✔️ Глубокое понимание и практику ключевых навыков,
✔️ Лучшие примеры из своей реальной практики за 7 лет.
Это не просто обучение. Это:
🔸 12 онлайн-занятий в Zoom – максимум структуры и ответов на все вопросы;
🔸 12 практических занятий в малых группах – кейсы, задачи, прикладной опыт;
🔸 12 комплектов доп. материалов – чеклисты, статьи, книги;
🔸 Индивидуальные домашки и обратная связь;
🔸 Активное комьюнити единомышленников!
🚀 Зачем тебе это? Чтобы выйти на новый уровень:
- Наконец увидеть большую картину.
- Разобраться, как всё работает в реальных рабочих задачах.
- Получить ответы на свои вопросы и перестать «спотыкаться».
🤝 Успей присоединиться! На второй поток.
🔗 Заявку оставляй на сайте: nodatanogrowth.com/product-analyst-ab-testing
Войди в 2024 с навыком, который сделает тебя экспертом. 💪
Nodatanogrowth
Онлайн-курс по АБ-тестам и проверке гипотез для продуктовых аналитиков
Систематизируй знания по АБ в четкую методологию, преврати знания в навыки и карьерные достижения!
❤🔥6❤2