来自 Мир аналитика данных (@analysts_world) 的最新 Telegram 贴文

Мир аналитика данных Telegram 帖子

Мир аналитика данных
Пишу о рабочих буднях и о том как я сменила профессию.
Можно отблагодарить данатами за контент boosty.to/analysts_world

Автор канала: @Valeria_Shuvaeva
4,383 订阅者
83 张照片
2 个视频
最后更新于 12.03.2025 01:32

Мир аналитика данных 在 Telegram 上分享的最新内容

Мир аналитика данных

14 Feb, 13:06

1,852

Друзья, иногда трудно бывает найти какие-то интересные новые каналы со всякими полезностями. В этой папке 🔝 вы найдете каналы по: ИТ, ТЕХНОЛОГИЯМ И ИГРАМ.
🎯 https://t.me/addlist/74yhTlKg8_00YWYy

Здесь вас ждут ответы на многие вопросы и множество интересного контента. 💪🤪
Мир аналитика данных

14 Feb, 12:36

1,915

👍 Задачка с LeetCode. Расчет коэффициента подтверждения

🔍 Пришло время для следующей задачки с LeetCode.

У нас есть две таблицы:
Signups — информация о регистрации пользователей:
- user_id — уникальный идентификатор пользователя.
- time_stamp — время регистрации.

и Confirmations — информация о подтверждении действий пользователей:
- user_id — идентификатор пользователя.
- time_stamp — время подтверждения.
- action — результат действия (confirmed или timeout).

🌟Нужно: Посчитать коэффициент подтверждения для каждого пользователя — это доля успешных подтверждений (confirmed) от общего числа запросов. Если у пользователя не было запросов, коэффициент равен 0. Результат округляем до двух знаков после запятой.

Задачка уровня Middle. Вроде не сложная, но самое смешное, что я больше намучалась с округлением ROUND. В Юпитере же мы используем pandasql, а тут на сайте нужно Postgresql. Но обо всем поподробнее.

Сначала создадим тестовые данные:
import pandas as pd

signups_data = {
'user_id': [3, 7, 2, 6],
'time_stamp': [
'2020-03-21 10:16:13',
'2020-01-04 13:57:59',
'2020-07-29 23:09:44',
'2020-12-09 10:39:37'
]
}
signups = pd.DataFrame(signups_data)

confirmations_data = {
'user_id': [3, 3, 7, 7, 7, 2, 2],
'time_stamp': [
'2021-01-06 03:30:46',
'2021-07-14 14:00:00',
'2021-06-12 11:57:29',
'2021-06-13 12:58:28',
'2021-06-14 13:59:27',
'2021-01-22 00:00:00',
'2021-02-28 23:59:59'
],
'action': [
'timeout',
'timeout',
'confirmed',
'confirmed',
'confirmed',
'confirmed',
'timeout'
]
}
confirmations = pd.DataFrame(confirmations_data)

#Финальный запрос для LeetCode выглядит так:
SELECT
tt.user_id,
ROUND(count_confirmed::NUMERIC / count_all, 2) AS confirmation_rate
FROM (
SELECT
sd.user_id,
COUNT(*) FILTER (WHERE action = 'confirmed') AS count_confirmed,
COUNT(*) AS count_all
FROM signups sd
LEFT JOIN confirmations cd
ON cd.user_id = sd.user_id
GROUP BY 1
) tt;

А вот в Юпитере вместо ROUND(count_confirmed::NUMERIC / count_all, 2) AS confirmation_rate нужно сделать по другому: round(cast(count_confirmed AS FLOAT)/count_all,2) AS confirmation_rate.

Объяснение скрипта
1️⃣. Вложенный запрос:
Считаем общее количество запросов (count_all) и подтвержденных действий (count_confirmed) для каждого пользователя.
Применяем FILTER для выделения только действий confirmed. Можно было и простым where обойтись, но это скучнее, вот и повыпендриваться захотелось. 🤪

2️⃣ Основной запрос:
Делим count_confirmed на count_all для каждого пользователя.
Используем многострадальный ROUND для округления результата до двух знаков после запятой. В случае юпитера через cast для приведения count_confirmed к типу FLOAT перед делением. В случае Leetcode - к типу FLOAT приводим через ::NUMERIC
Теперь деление будет выполняться в дробных числах, а не в целых.

А еще отвлекающий маневр - колонка time_stamp в таблице Signups. Она тут не нужна, но зачем-то есть. Не люблю лишние данные в задачках 😜

Итог
Этот запрос поможет отработать ключевые SQL-концепции, такие как FILTER, LEFT JOIN и группировка, а также построить наглядный расчет метрик.

Попробуйте сами — это отличная практика!
Мир аналитика данных

11 Feb, 08:08

1,577

Как начинающему аналитику выдержать конкуренцию на рынке и успешно получить первый оффер?

Если раньше, чтобы пройти на стажерскую или junior позицию достаточно было базово знать Python и SQL, то сейчас даже зная все инструменты, но не имея опыта работы шансы получить работу значительно уменьшились.

Сейчас компании часто предпочитают брать многоруких-многоногов, которые уже нарешали большое количество пет-проектов и потрогали смежные сферы: дата-инженерии, BI и тд.

В Simulative учат аналитиков быть сразу такими — максимально полезными бизнесу. В итоге обучения у вас будет портфолио из 25+ уникальных реальных рабочих проектов и необходимые навыки в смежных направлениях.

Кроме того, там не просто помогут с трудоустройством, у вас будет персональный ментор и HR, которые вместе с вами пройдут путь до оффера: будут гонять вас по собеседованиям, искать точки роста на всех этапах вашего поиска работы, пока не получите заветный оффер.

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

Уже совсем скоро стартует новый поток
Оставляйте заявку, чтобы узнать все подробности

Кстати, как приятный бонус — часть оплаты за обучение берут только после получения оффера!
А по промокоду Analysts_world дарят еще скидку 10%

Реклама. ООО АЙТИ РЕЗЮМЕ. ИНН 4025460134
Мир аналитика данных

03 Feb, 09:14

2,355

👍 Задачка с LeetCode. Найти имя менеджера, у которого 5 или больше подчиненных.
Все знают, что решать задачи на LeetCode полезно как для прокачки мозга, так и для подготовки к собеседованиям. Но времени на это хватает не всегда, а вот разобраться, что там вообще решается, хочется. Поэтому я решила делиться с вами готовыми решениями! Сегодня у нас задача уровня Medium — разберем вместе (вот она).

Чтобы можно было потестить решение, напишу его с помощью библиотеки pandasql в Jupyter Notebook. Библиотека позволяет выполнять SQL-запросы прямо в Юпитере, а вместо базы можно просто создавать DataFrame.

Итак, в этом задании требуется написать SQL-запрос, чтобы найти всех менеджеров, у которых как минимум 5 прямых подчиненных.
Таблица Employee:
id : первичный ключ (уникальный идентификатор сотрудника).
name : имя сотрудника.
department
: департамент сотрудника.
managerId : id менеджера этого сотрудника.


Если managerId равен NULL, значит у сотрудника нет менеджера, то есть он и есть шеф.
Никакой сотрудник не будет являться своим собственным менеджером.

Мы видим, что у менеджера с id = 101 (John) есть 5 подчиненных: Dan, James, Amy, Anne и Ron.
Его (John) нам и нужно получить в ответе.

1️⃣Создаем данные для дальнейшего тестирования кода. В data записаны сотрудники, их id, департамент и id их менеджеров. Преобразуем это в DataFrame.
import pandas as pd
from pandasql import sqldf

data = {
"id": [101, 102, 103, 104, 105, 106],
"name": ["John", "Dan", "James", "Amy", "Anne", "Ron"],
"department": ["A", "A", "A", "A", "A", "B"],
"managerId": [None, 101, 101, 101, 101, 101]
}
employee = pd.DataFrame(data)

2️⃣SQL-решение:

🔹Вложенный SQL-запрос:
- Сначала группируем сотрудников по managerId, чтобы можно было посчитать их кол-во.
- Оставляем только тех менеджеров, у которых 5 или больше подчиненных.

🔹Внешний запрос:
- Находим имена этих менеджеров по их id.

3️⃣Получаем имя менеджера, у которого 5 или больше подчиненных.
query = """
SELECT name
FROM employee
WHERE id in (
SELECT managerId
FROM employee
GROUP BY managerId
HAVING COUNT(*) >= 5
)
"""
sqldf(query)


Это задание помогает разобраться, как использовать группировку (GROUP BY) и фильтрацию с HAVING. Эти навыки часто нужны в реальной работе.

Если вам такой разбор понравился, накидайте реакции! Буду разбирать задачки с LeetCode дальше. 🚀
Мир аналитика данных

28 Jan, 10:10

2,298

Как прокачать самый главный навык аналитика

Написание кода, построение дашбордов и подсчет метрик — эти навыки давно уже стали необходимым минимумом для любого аналитика. Этого работодатель ждет от вас «по умолчанию».

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

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

И как раз про это будет рассказывать Андрон Алексанян на своем вебинаре «Как прокачать самый главный навык аналитика» 🔥

Вебинар пройдет завтра, 29 января, в 19:00 Мск. Регистрация — по ссылке.

Андрон прошел большой путь в аналитике и ему точно есть, чем поделиться. Он более 5 раз отстраивал аналитику в компаниях с нуля, а сейчас развивает быстрорастущую школу аналитики данных Simulative и консультирует крупные компании.

В общем, если «прокачать продуктовое мышление» для вас актуально — обязательно приходите на вебинар, будет полезно 👉🏻 ссылка.

Реклама. ООО АЙТИ РЕЗЮМЕ. ИНН 4025460134.
Мир аналитика данных

24 Jan, 09:33

2,678

👨‍💻Принесла вам интересную задачку: нужно выяснить, кто из клиентов продлевает тариф (подписку для приложений например) без перерывов (в нашем условном примере перерыв — это больше 30 дней между окончанием одного тарифа и началом следующего). Покажу пошагово, как это сделать с помощью shift() в pandas. Рассмотрим небольшой DataFrame для наглядности.

1️⃣ Создаём демонстрационный DataFrame 👨‍💻
import pandas as pd

data = [
# Клиент 1: у него нет перерывов (три подписки друг за другом)
{
'client_id': 1,
'start': '2023-01-01 09:15:00',
'finish': '2023-02-01 10:55:00',
'title': 'тариф1',
'amount': 1000
},
{
'client_id': 1,
'start': '2023-02-01 10:55:00',
'finish': '2023-03-01 12:30:00',
'title': 'тариф2',
'amount': 1500
},
{
'client_id': 1,
'start': '2023-03-01 12:30:00',
'finish': '2023-04-01 09:00:00',
'title': 'тариф3',
'amount': 2000
},

# Клиент 2: между вторым и третьим тарифом появляется перерыв больше 30 дней
{
'client_id': 2,
'start': '2023-01-07 11:00:00',
'finish': '2023-02-07 10:45:00',
'title': 'тариф1',
'amount': 1200
},
{
'client_id': 2,
'start': '2023-02-07 10:45:00',
'finish': '2023-03-07 11:15:00',
'title': 'тариф2',
'amount': 1400
},
{
'client_id': 2,
'start': '2023-04-15 09:20:00',
'finish': '2023-05-15 10:00:00',
'title': 'тариф3',
'amount': 2100
},

# Клиент 3: тоже без перерывов (три тарифа подряд)
{
'client_id': 3,
'start': '2023-01-12 08:50:00',
'finish': '2023-02-12 10:05:00',
'title': 'тариф1',
'amount': 1000
},
{
'client_id': 3,
'start': '2023-02-12 10:05:00',
'finish': '2023-03-12 09:55:00',
'title': 'тариф2',
'amount': 1200
},
{
'client_id': 3,
'start': '2023-03-12 09:55:00',
'finish': '2023-04-12 10:10:00',
'title': 'тариф3',
'amount': 1400
},
]

df = pd.DataFrame(data)
df['start'] = pd.to_datetime(df['start'])
df['finish'] = pd.to_datetime(df['finish'])


2️⃣Ищем дату окончания предыдущего тарифа 🧑‍💻
Сгруппируем по client_id и применим shift(1), чтобы «сдвинуть» finish на одну позицию вниз:

df['prev_finish'] = df.groupby('client_id')['finish'].shift(1)

Теперь в каждой строке появляется столбец prev_finish — конец предыдущего тарифа этого же клиента (или NaN, если предыдущей записи нет).

3️⃣Считаем «gap» в днях 👨‍💻
df['gap'] = (df['start'] - df['prev_finish']).dt.days

В gap получаем, сколько дней прошло между началом текущего тарифа и концом предыдущего.

Если gap > 30, считаем это перерывом и помечаем такой случай в поле check:
df.loc[df['gap'] > 30, 'check'] = 1

4️⃣Ищем тех, кто никогда не уходил в перерыв
1.Собираем «провинившихся» клиентов (у кого есть перерывы):
accounts_with_gap = tuple(set(df.loc[df['check'] == 1, 'client_id']))

2. Фильтруем все строки, в которых check не равен 1, — то есть записи без перерыва. Здесь мы берём только те покупки (строки), где не обнаружено gap > 30, то есть не поставлен check = 1.
df_winner = df[df['check'] != 1]

3.Исключаем из этого списка клиентов, попавших в accounts_with_gap:
df_winner_only = df_winner[~df_winner['client_id'].isin(accounts_with_gap)]

Теперь в df_winner_only останутся исключительно «идеальные» клиенты, у которых не было ни одного перерыва (в нашем примере это клиенты №1 и №3).

5️⃣Готово!
Таким образом, мы выявили, что:
У клиента 2 есть перерыв между тарифом №2 и тарифом №3 (пропуск более 30 дней).
Клиенты 1 и 3 идут без разрыва.
👆 Вот такой простой и мощный приём с shift() если нет оконок в sql часто выручает, когда нужно сравнивать строки внутри «своей» группы. Надеюсь, было полезно!
Мир аналитика данных

22 Jan, 11:29

2,489

🔥 Сегодня прочитала, что Сбербанк начал масштабные сокращения в IT-подразделении Ecom.tech (это «Купер», «Мегамаркет», «Сберлогистика» и «Самокат») — некоторые команды «урежут» до 50%! 😱

Особенно грустно, что под «оптимизацию» попадают стажёры и джуны, то есть те, кто только делает первые шаги в профессии. При этом многие топ-менеджеры предпочитают сами покидать компанию, не желая увольнять подчинённых. 👥 Личный респект им!

Но что это значит для нас с вами — IT-специалистов или тех, кто только планирует стать айтишником? Рынок становится жёстче, конкуренция растёт, и учиться приходится всё активнее, ведь без постоянного развития навыков просто не удержаться на плаву. 📚💡

Чтобы быть «на гребне волны» в мире IT, не забывайте:

☝️Следим за трендами — технологии меняются быстро, и сейчас на первый план выходят etl, искусственный интеллект и машинное обучение (AI/ML).
☝️Осваивайте смежные области — DevOps, Data Science, тестирование, проектный менеджмент,кибербезопасность и информационная защита. Это расширяет кругозор и делает вас ценным специалистом. 🔧⚙️
☝️Иногда отдыхать, а то можно выгореть. Потом еще на психолога тратиться придется. 🤪
☝️Относиться ко всему проще и легче. Или в переводе "А когда было легко?"

Короче нам надо учится, учиться и еще раз учиться.
Думаете сейчас будет реклама курсов? А вот и нет. 😜
https://rb.ru/news/sber-ecom-personnel/
Мир аналитика данных

18 Jan, 16:53

2,580

Друзья, вы просто космос! Посмотрите, сколько новых задач и участников появилось в наших таблицах: тут и курсы по аналитике, и чтение книг, и даже ежедневные тренировки и йога. Кажется, мы все дружно рванули вперёд! 🚀

Кстати, для самых первых участников я уже добавила вдохновляющие картинки, а на неделе планирую порадовать такими же и тех, кто присоединился совсем недавно. 📸

Очень радует, что у многих не только “В планах” новые цели, но уже “Выполняется” сразу несколько дел: от прокачки SQL до занятий спортом. С каким кайфом я сама ставлю галочку, когда занимаюсь!

Именно так рождается настоящий драйв: каждый маленький шаг даёт огромный заряд мотивации всем остальным. Ведь когда видишь, как другие двигаются, тоже хочется включаться на полную. 🏋️‍♀️

Спасибо, что заполняете таблички и делитесь своими успехами. С таким настроем у нас точно всё получится! Продолжаем в том же духе: изучаем новое, тренируемся, растём. 💪

Тут спрашивали про лучшие курсы. Но их так много, что трудно выбрать - их действительно огромное количество. Главное начать заниматься, а где - уже не так важно. Одним курсом вы все равно не отделаетесь 😂 Знаний в нашей сфере много не бывает - постоянно нужно что-то учить и доучивать. Но, зато мозг будет прокачен. Ну и про тело не забывать тоже. А то это уже дисбаланс. А нам такое не надо. Гармония во всем! 😌 Поучился - иди и поприседай. Покодил - постой в планке, да не на графике, а на своем полу 😜

Я продолжу следить за прогрессом — и, конечно, всегда вэлкам для новых идей! 💡💡💡
📎 Табличка тут - тык
Мир аналитика данных

10 Jan, 12:05

3,108

🎯 Вот и пролетели каникулы. Не жалею, что не сидела за компом. Мы семьей ездили на дачу, парились в баньке, жгли камин, встречались с друзьями, ездили к бабушкам, побывали на Красной площади.

Жизнь дуальна или двойственна или, если по другому, у всего есть две стороны. Можно сосредоточиться на том, что отдых закончился и опять нужно работать . А можно сконцентрировать свои мысли на перспективе того интересного и захватывающего, что мы сами себе можем создать в этом году! И все действительно в наших руках! Но для этого нужно учиться, ставить цели и кайфовать от того, что потихоньку идем по своем пути. Пусть извилистому, но именно нашему особенному пути.

💡 У меня появилась идея, которая поможет каждому из нас оставаться мотивированным и идти к своим целям!
Предлагаю вам простой, но эффективный инструмент — таблица для мотивации. Абсолютно бесплатно для всех.

Я буду за Вами следить и Вас мотивировать, а также любой из нас кто зайдет на Ваш лист и захочет что-то написать или вставить наклейку для мотивации. Короче, полная свобода!

😀 Как это работает? 😀

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

Когда знаешь, что за тобой наблюдают, появляется дополнительный стимул двигаться вперед. Это проверенный прием, который помогает не сойти с дистанции! 🚀

Что нужно сделать?
1️⃣ Переходите по ссылке, копируйте лист "Для копирования" и дайте ему имя - свое или любое другое, которое Вам нравится.
2️⃣ Заполняйте своими целями и курсами.
3️⃣ Начинайте действовать!

Чтобы вам было проще начать, я добавила в таблицу несколько курсов, которые могут стать отличным ориентиром.

Не ждите идеального момента — начните сегодня! 💪 Ссылка на таблицу

Давайте делиться успехами и поддерживать друг друга! 🔥 Можно писать друг другу прям на листах. Типа "Ого, круто! Молодец!" Можно вставлять картинки и эмодзи. Короче, никак себя не ограничивать.

Напишите в комментариях, что планируете изучать или какую цель хотите достичь. 🙌

Скажу честно - после того как я это придумала, мне показалось, что возможно я зря это затеваю. Заходить, смотреть, самой отмечать свои занятия. Но это был искренний порыв помочь. Надеюсь эта инициатива реально окажется полезной!
Мир аналитика данных

31 Dec, 11:31

2,907

🎄С наступающим Новым годом, друзья!🎄

Пусть в каждом доме царят гармония, мир и тепло, а наступающий год подарит вам вдохновение, яркие события и множество счастливых мгновений. 🌟🌟🌟

В эти праздничные дни отложите гаджеты в сторону и уделите время своему телу: ощутите мир, двигайтесь, встречайтесь с друзьями и готовьте вкусные угощения! Позвольте себе отдохнуть от виртуальной суеты!
У меня в планах конечно салаты, дача и общение с близкими.

Мечтайте, загадывайте желания и смело идите к своим целям! 🔼🎆🎆🎆🎁✔️😀

До встречи в новом году! 🎄