Мир аналитика данных
4.58K subscribers
134 photos
3 videos
110 links
Пишу о рабочих буднях и о том как я сменила профессию.

Автор канала: @Valeria_Shuvaeva
Download Telegram
Всем привет!

Я участвую в классной инициативе с другими аналитическими каналами! 📊 Андрон из Simulative обратился ко мне с предложением добавить этот канал в специальную папку. Всего участвуют 15 каналов, где эксперты делятся своим опытом и знаниями. На большинство из них я уже была подписана, поэтому сразу согласилась.

Здесь представлены каналы про Data Science, «хардовые» советы для аналитиков 🖥, каналы о развитии софт-скиллов 🌟, а также каналы про визуализацию. 📈 То, что в подборке есть каналы Бабушкина и Михайлова, уже говорит о многом. Эти ребята действительно крутые! 💪
Ссылка на папку: https://xn--r1a.website/addlist/dMeiok8FCdA3ZTMy

Мне для обзора выпал канал Юрия Борзило https://xn--r1a.website/y_borzilo, который я давно знаю и очень рекомендую всем, кто интересуется аналитикой! Юра – действующий продуктовый аналитик, и у него много информации про А/Б тесты.

Вот подборка его постов про А/Б тесты за год: https://xn--r1a.website/y_borzilo/477

Признавайтесь, у кого есть опыт A/Б тестов? В одном из постов Юра писал о двух крайностях:
1️⃣ Давайте ничего не будем АБ тестировать.
2️⃣Давайте АБ тестировать вообще все.

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

Сейчас так много информации, что учиться и совершенствовать свои навыки стало проще, чем когда-либо. Правда, со временем всё так же сложно 😂
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥52😁1🆒1
📊 Новая Задачка с Работы

Недавно столкнулась с интересной задачей. У каждого клиента client_id есть параметр - подсчет чего-либо. Назовем эту колонку count.
Быстренько создадим датафремчик с примером:
import pandas as pd

data = {
"client_id": [111, 222, 111, 333, 333, 444, 444],
"info": ['AAA', 'AAA', 'BBB', 'CCC', 'DDD', 'DDD', 'EEE'],
"count": [10, 1, 9, 8, 6, 0, 1]
}

df = pd.DataFrame(data)


🎯Нужно для каждого клиента найти максимальное значение в колонке count с помощью метода idxmax.
Казалось бы, можно использовать просто max(), но есть нюансы.

Группировка и нахождение индексов с максимальным значением.
Группируем по client_id и находим строки с максимальным значением count для каждой группы (client_id).
idx = df.groupby('client_id')['count'].idxmax()


Фильтрация: Используем эти индексы для фильтрации исходного DataFrame, оставляя только строки с максимальными значениями count для каждого client_id.

df_filtered = df.loc[idx] #выбирает строки по индексам из idx.


Результат - df_filtered видим на картинке.

А теперь поясню про вариант с max():
Да, задачу можно решить с помощью функции max() при группировке. Этот подход подходит для нахождения максимального значения count для каждого клиента, но не возвращает строку полностью! А мне нужно было видеть всю инфу по строке, так как там много колонок было.

df.groupby('client_id',as_index=False)['count'].max()


Эта строчка кода вернет только две колонки: client_id и count

Смоделируем бизнес ситуацию, где такое можно было бы использовать:

🛍 Вы работаете в розничной сети, которая имеет программу лояльности для своих клиентов 🛍. Клиенты могут иметь несколько аккаунтов (например, основной аккаунт и семейные аккаунты). В каждом аккаунте фиксируется активность клиента (покупки, участие в акциях и т.д.). Вам необходимо анализировать наиболее активные аккаунты для предоставления специальных предложений и акций.

Вот такой интересный случай из практики 🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
34👍17
🎉 Сохраняем порядок строк при объединении датафреймов в Pandas! 🎉

Привет, друзья! Сегодня я расскажу вам, как правильно объединить два датафрейма и при этом сохранить порядок строк первого! 🧩⬇️

👉 Для этого мы используем df.index, чтобы порядок строк из первого датафрейма оставался неизменным, а из второго добавляем нужные данные. 💼📈
📄 Пример кода:

Набросаю пару таблиц, на которых будем экспериментировать.

import pandas as pd

# Первый df
df1 = pd.DataFrame({
'account_id': [1, 2, 1, 3, 4],
'value_df1': [10, 20, 30, 40, 50]
})

# Второй df
df2 = pd.DataFrame({
'account_id': [1, 2, 3, 5],
'value_df2': ['1 from df2',
'2 from df2',
'3 from df2',
'5 from df2']
})


Добавим индексный столбец к исходному датафрейму.

df1['original_index'] = df1.index


Объединяем датафреймы:
df_merged = pd.merge(df1, df2, on='account_id', how='outer')

Видим, что строки левой таблицы идут сначала не в нужном нам порядке.

Сортируем по исходному индексу:
df_merged = df_merged.sort_values(by='original_index').reset_index(drop=True)


Удаляем вспомогательный индексный столбец, если он больше не нужен
df_final = df_merged.drop(columns=['original_index'])


🔍 И получаем результат: df_final. Смотрим картинку с поэтапным процессом. Специально разбито все по частям, чтобы отследить результат.

С помощью этих шагов мы сохраняем порядок строк из первого датафрейма и добавляем нужные данные из второго. 🚀
🔥326🍓2
🔈Мне написали из Центра научной коммуникации Университета ИТМО и попросили выложить пост с опросом. Дело полезное и нужное, так что выкладываю.

Центр научной коммуникации Университета ИТМО проводит анализ профессионального сообщества ML- и DS-специалистов в России. Мы хотим узнать больше о том, как устроена профессиональная коммуникация в вашей сфере, кого вы считаете лидерами рынка на данный момент.

Ваше участие поможет нам сформировать полную картину современного состояния индустрии. Мы гарантируем полную анонимность и конфиденциальность ваших ответов.

Опрос займет не более 10 минут вашего времени.

Ссылка на анкету: https://forms.gle/dHRsqQJteuty51Bp7

p.s. Я погуглила университет. Оказалось, что это национальный исследовательский университет, основанный в 1900 в Санкт-Петербурге. Это вам не игры. Тут все серьезно.
Таким помогать - одно удовольствие. 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍6😁1
💬 Консультируя людей, я часто слышу вопрос: "Какой курс выбрать для перехода в IT?"

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

1️⃣ Избегайте длинных годовых курсов без соответствующего бэкграунда:

Если у вас нет опыта в IT, выбирайте краткосрочные и целенаправленные курсы. Годовые программы могут быть пустой тратой времени и денег.

Работодатели не всегда обращают внимание на ваши курсы, особенно если они не соответствуют вашему предыдущему опыту.

2️⃣Рассмотрите ваш текущий опыт и его применимость:

Если вы находитесь в декрете, долго не работали или работаете в областях, не связанных с IT (медицина, юриспруденция, наука, морская индустрия, консалтинг и т.д.), начните с основ.

Например, если вы не работали хотя бы с Excel, ваш путь в IT должен начинаться с базовых знаний.

➡️ Как проверить свою гипотезу? Создайте тестовое резюме.

Включите в него тот курс, который вы планируете пройти, и посмотрите на отклики работодателей.

Если интереса нет, то, вероятно, пройдя курс, вы не получите ожидаемого эффекта и ваше резюме останется незамеченным.

3️⃣С чего начать:

Изучите Excel и SQL:

Много бесплатных курсов доступно онлайн. Начните с основ и поймите, нравится ли вам это направление.

Попробуйте откликаться на вакансии, требующие знания Excel. Если будет упоминание SQL — это плюс.

Поиск вакансий начального уровня:

Ищите вакансии, где требуется аналитическая работа: сбор данных, работа с таблицами и т.д.

Это может быть аналитик в отделе продаж, помощник для маркетплейса, координатор онлайн-школы — любые должности, требующие знаний Excel.

Доступ к базам данных:

Работая в этих должностях, стремитесь получить доступ к базам данных и попрактиковаться с SQL-запросами.

Постепенное освоение навыков значительно повысит ваши шансы на успешное трудоустройство! А уже с приобретением опыта вы сможете продвигаться дальше и продолжать развивать свои способности.

Удачи! 🚀📈😊
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4012😍21💯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 мес.
Сравнить нужно не только ставку, но и соотнести с продолжительностью кредита.

Решение 🚀
✔️Генерация данных. 📊 Создадим небольшой датафрейм:
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 = []

✔️Извлечение данных с помощью iterrows() 🔄

Для каждой строки извлекаем 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👍94👎3
🎉 Один хороший человек наконец-то достиг первой серьезной отметки - 1000 подписчиков на своем Телеграмм-канале! 🎉

📚 В честь этого он устраивает розыгрыш трех потрясающих книг! По аналитике конечно📚 А я всегда поддерживаю такие начинания. 👌

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🎉21🤗1💘1
📊 ⚡️Хитрая задачка с работы. Возвращение. 📊

👨‍💻Наконец удалось выкроить время, чтобы поэкспериментировать с этой хитрой задачей, и теперь у меня есть решение, которое не использует циклы! Всё сделано исключительно с помощью Pandas!
Давайте разберем его пошагово:

1️⃣Генерация данных как и в прошлый раз💾
Здесь мы создаем список словарей, где каждый словарь содержит 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)

2️⃣Извлечение данных (сроков рассрочки и ставок из строки value) с использованием регулярного выражения 🔍
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']

3️⃣ Преобразование данных в нужный формат 🔄 Преобразуем строковые значения в числовой формат и добавляем текстовое описание к срокам рассрочки.
extracted['rate'] = extracted['rate'].str.replace(',', '.').astype(float)
extracted['term'] = 'Срок рассрочки ' + extracted['term'] + ' мес.'

4️⃣Определение условий фильтрации 🕵️‍♂️
Задаем условия для фильтрации данных по срокам рассрочки и максимальным допустимым ставкам.
conditions = {
"Срок рассрочки 3 мес.": 5.93,
"Срок рассрочки 4 мес.": 6.64,
"Срок рассрочки 6 мес.": 7.05
}

5️⃣Фильтрация данных 📊
filtered_df = extracted[extracted.apply(
lambda row: row['term'] in conditions and row['rate'] <= conditions[row['term']], axis=1
)]


📎 Вот ссылка на обновленный Jupyter Notebook. В нём вы найдёте ещё дополнительные варианты решения, которые прислал Дмитрий в комментариях. Спасибо ему за это! 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥172👍2
📊 Анализ данных: Извлечение доменов почт клиентов 📊

Привет, друзья! Меня на днях попросили проанализировать домены почт у клиента если сможем.✉️ Цитата:
Типа такого: яндекс - 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(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 написать было, но базе и так тяжело, не стала нагружать ее подзапросами.
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
👍315
Мечты сбываются!

Друзья, рада поделиться отличной новостью! Мой модуль по аналитике уже опубликован в курсе SkillFactory "IT-специалист с нуля"! 🥳 Ранее я делилась с вами, что работаю над этим курсом, вот тут.

Создание курса оказалось нелегким испытанием (особенно совмещение с основной работой), но очень интересным процессом. Я полностью уверена в том, что каждый, кто его пройдет, получит максимум знаний и навыков. Я вложила в него все, что было возможно, и спокойна за ваши результаты! 🚀

Мой модуль является частью большого IT-курса, где каждый раздел помогает изучить различные IT-профессии и выбрать свой путь в мире технологий! 👨‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥43❤‍🔥65🤡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❤‍🔥611😴1
Лето прошло, и кажется, все уже поплакали по этому поводу. Но кто бы мог подумать, что Notion тоже оставит нас в печали?

С 9 сентября сервис прекратит работу для пользователей из России. Это настоящее разочарование. 😭 Вся мои заметки, ссылки и курсы хранятся там, и теперь я в поисках альтернативы.

После долгих поисков наткнулась на Yonote.ru. Это не реклама, а просто находка, которая поможет заменить Notion. Конечно, можно использовать VPN, но иногда хочется работать без лишних танцев с бубном.

Что делать дальше?

Экспорт данных: Первое и самое важное — экспортируйте свои заметки из Notion. Это можно сделать как для отдельных страниц, так и для всего аккаунта. Резервные копии — залог спокойствия.

Ожидание: Посмотрим, что произойдет после 9 сентября. Пока нет полной ясности, как именно будут ограничивать доступ: всех ли пользователей, только платных, или же по IP. Но, почти наверняка, даже в худшем случае, сервис будет доступен через VPN. Но стоит ли это усилий? Каждый решает сам.

Аналоги: Есть несколько российских вариантов:

✔️ Яндекс Заметки — для простых записей, если не нужны сложные структуры: ссылка
✔️ Заметки Mail.ru — с недавним добавлением тегов можно разделять записи по темам: ссылка

Для более сложных задач:

✔️ Yonote.ru — организация, планирование, управление знаниями.
✔️ Teamly.ru — платформа для совместной работы и управления знаниями
✔️ Weeek.net — задачи, база знаний, CRM, аналитика и многое другое

Каждый решает сам, что выбрать. Главное — быть готовым к изменениям и действовать заранее. 👩‍💻

А вы чем пользуетесь, кстати?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3🤨2
Про прокрастинацию и баланс в жизни 🧠💪

Когда работаешь аналитиком данных 📊, кажется, что учёба и саморазвитие — это неотъемлемая часть успеха. Постоянно хочется освоить что-то новое, улучшить свои навыки, но... в какой-то момент понимаешь, что усталость берёт своё 😩.

Домашние дела 🧹, семейные заботы 👨‍👩‍👧‍👦, домашка с детьми-школьниками, и несколько человек в менторстве — всё это отнимает много сил. И вот тут появляется прокрастинация 🕰. Не потому что неинтересно, а потому что тело и разум просто требуют передышки 🛌.

И знаете, я пришла к выводу: нельзя постоянно «пахать» 💼. Наш организм подаёт сигнал, что ему нужен отдых, и это важно уважать. Если хочется замедлиться 🧘‍♀️ — нужно дать себе такую возможность. Отдых — это тоже часть пути к продуктивности ⚡️

Недавно я даже решилась на шаг вперёд: записалась в фитнес-клуб 🏋️‍♀️. Теперь забочусь не только о своём уме 🧠, но и о теле 💪. Ведь в гармонии важен баланс ⚖️ — между физическим, эмоциональным и интеллектуальным развитием.

Помните, заботиться о себе — это не лень, а необходимость ❤️.

И вот, пишу это всё в пятницу 13-го 🌘 — не знаю, совпадение это или знак, но кажется, что сегодня именно тот день, когда стоит притормозить, оглянуться вокруг и просто насладиться тем, что уже удалось достичь.
40👍15🔥5🥰1
🎯LEFT JOIN, с условием в ON или в WHERE.

Разберем, почему происходит различие между двумя запросами с LEFT JOIN, где условие включено в разные части: ON и WHERE.
Такое встречается на тестовых. Ну и по работе тоже нужно конечно.

Есть две таблицы: Таблица 1: информация о транзакциях и Таблица 2: информация о типе пользователя

Задача
: выполнить LEFT JOIN по user_id, чтобы узнать, какой у пользователя тип (type), и разобраться, почему два похожих запроса могут дать разные результаты.

🟢 Запрос 1️⃣: LEFT JOIN с условием в ON:
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.

🟢 Запрос 2️⃣: LEFT JOIN с условием в WHERE
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
❤‍🔥40139👍21🔥1
✋🏻 Привет, меня зовут Дмитрий, я data engineer.

Веду свой блог по инжинирингу данных https://xn--r1a.website/kuzmin_dmitry91.

Пишу про область, рабочие кейсы, немного лайфстайла. Работаю, учусь, делаю и исправляю ошибки)
Будет интересно больше новичкам в области, но также поддержу разговор с middle+ de.

Буду рад, если в моем канале найдете для себя полезности 💪🏻
❤‍🔥8
Когда ко мне обращаются за помощью, я с удовольствием поддерживаю, если вижу, что блог действительно полезный и может помочь другим 💪👌👍
9👍5❤‍🔥4😁41
💡 Почему в мире быстрых изменений важно учиться терпению?

Хочу с вами поделиться одной мыслью. Она наверняка не нова, но я как-то по другому на нее смотрю теперь.
Сейчас скорость достижения целей кажется ключевым навыком. Все вокруг будто бы идут на сверхзвуковой скорости: новые технологии, тренды, навыки. Постоянно учишься, пытаешься освоить новые инструменты и подходы, но при этом результат не всегда виден сразу. Ощущение, что идешь слишком медленно, иногда давит.

Но вот что важно понять: быстрота не всегда равно качество.

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

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

🎯 Не гонитесь за мгновенными результатами!
То, что вы изучаете сейчас (питон, sql, статистика или еще что-то) может не пригодиться ВОТ ПРЯМ СЕЙЧАС, но очень вероятно, что пригодится через год или два при должном стремлении к вашей цели. Именно терпение и постоянство помогут тебе построить крепкий фундамент. Карьерный рост — это постепенный процесс. Очень важно научиться принимать и ценить каждый маленький шаг.

🌱 Учись терпению. Медленный прогресс — это тоже прогресс.

Важно помнить, что каждый новый проект, каждая ошибка — это кирпичик в твоем профессиональном пути. Твой путь уникален, и гонка с другими только мешает сосредоточиться на своих достижениях.

Терпение — это не вовсе не слабость, а сила. Развивай свои навыки, не гонись за мгновенными результатами, и в итоге ты увидишь, как далеко продвинулся.
❤‍🔥38👍10
💡 Как избежать ошибок при SQL-запросах, если в списке только одно значение?

Иногда при выполнении 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 год
Исследование рынка продуктовых и дата-аналитиков
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