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

Description
Пишу о рабочих буднях и о том как я сменила профессию

Автор канала: @Valeria_Shuvaeva
Advertising
We recommend to visit
HAYZON
HAYZON
6,442,108 @hayzonn

💼 How to create capital and increase it using cryptocurrency

👤 𝐅𝐨𝐮𝐧𝐝𝐞𝐫: @Tg_Syprion
🗓 ᴀᴅᴠᴇʀᴛɪsɪɴɢ: @SEO_Fam
Мои каналы: @mazzafam

Last updated 1 day, 22 hours ago

Канал для поиска исполнителей для разных задач и организации мини конкурсов

Last updated 3 months ago

Новые и перспективные Web3 игры с добычей токенов.

Чат: https://t.me/Crypto_Wolf_Chat

Правила чата смотрите в описании чата.

Все свои вопросы направляйте в чат или главному модератору чата: @Exudna_118

По теме сотрудничества: @Zombini

Last updated 2 months, 2 weeks ago

3 months, 2 weeks ago
3 months, 3 weeks ago

? ⚡️Хитрая задачка с работы. Возвращение. ?

?‍?Наконец удалось выкроить время, чтобы поэкспериментировать с этой хитрой задачей, и теперь у меня есть решение, которое не использует циклы! Всё сделано исключительно с помощью 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. В нём вы найдёте ещё дополнительные варианты решения, которые прислал Дмитрий в комментариях. Спасибо ему за это! ?

4 months ago

⚡️Хитрая задачка с работы.

Попросили меня выгрузить всех клиентов, у которых ставка кредита меньше или равно указанных. Должны быть меньше вот этих (как пример, цифры придуманные):
? Срок рассрочки 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__.

*?Как работает 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_" в строке.

  1. (\d+): Находит одну или более цифр и сохраняет их как первую группу захвата (срок кредитования).

  2. Ищет символ подчеркивания _.

4.([\d,.]+): Находит одну или более цифр, запятых или точек и сохраняет их как вторую группу захвата (ставка кредита).

  1. Метод 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)]

?Так как код большой, то я оставлю ссылку на юпитер ноутбук. Тестируйте, модифицируйте.

5 months, 1 week ago
*****?*** Новая Задачка с Работы**

*? Новая Задачка с Работы*

Недавно столкнулась с интересной задачей. У каждого клиента 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

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

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

Вот такой интересный случай из практики ?

5 months, 1 week ago

Всем привет!

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

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

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

Вот подборка его постов про А/Б тесты за год: https://t.me/y_borzilo/477

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

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

Сейчас так много информации, что учиться и совершенствовать свои навыки стало проще, чем когда-либо. Правда, со временем всё так же сложно ?

Telegram

Борзило

Пишу про аналитику, продукты, маркетинг @borzilo\_y - по всем вопросам

***✅*** Всем привет!
5 months, 2 weeks ago
***?*** У нас теперь есть бот …

? У нас теперь есть бот для анонимных сообщений!

Если у вас есть вопросы или что-то, чем вы хотите поделиться, но не хотите раскрывать свою личность, просто напишите боту. Я постараюсь честно ответить (если это не будет под NDA) или как-то прокомментирую.

? Пишите сюда: t.me/anonaskbot?start=UwPGvL1G1RVzcgu

У меня много кода в блоге, но иногда хочется и порассуждать. ?

7 months, 1 week ago
***?*** Анализ Поисковых Запросов в Яндекс.Метрике

? Анализ Поисковых Запросов в Яндекс.Метрике

Продолжаю изучение Яндекс.Метрики и делюсь выводами:

? Кто посещает сайт?

География: Основная аудитория из России, но были случаи и из Аргентины!
(Отчеты - Аудитория - География.)
Пол: Преобладают женщины.
(Отчеты - Аудитория - Пол. )
Возраст: Большая часть — это люди в возрасте 25-34 года.
(Отчеты - Аудитория - Возраст. )

? Откуда приходят посетители? Отчеты - Источники - Поисковые запросы

Этот отчет предоставляет информацию о том, какие конкретные запросы пользователи вводили в поисковые системы (например, Яндекс или Google), которые впоследствии привели их на ваш сайт. Изучение этих данных помогает адаптировать контент под популярные запросы и улучшить SEO. Например, слова "собеседование", "питон", "пандас" и "аналитика" часто приводили пользователей на мой сайт в Дзене.

? Зачем это нужно?

Инсайты и SEO: Понимание популярных запросов и оптимизация сайта под них помогает улучшить видимость в поисковиках и сделать контент релевантным для аудитории.
Улучшение сайта: Анализ запросов позволяет совершенствовать навигацию и структуру сайта, делая его более удобным для пользователей.

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

**Открытый доступ к статистике:
Хочу предоставить Вам возможность самостоятельно ознакомиться с отчетами и статистикой. Я сделала доступ к моему счетчику открытым!

Используйте эту ссылку: https://metrika.yandex.ru/dashboard?id=96707090 ?
Пользуйтесь на здоровье!

7 months, 2 weeks ago

☝️? Важное объявление для тех кто хочет попасть на .. последний поток по SQL и Python! Заявка на мой курс тут.

? Подошел к концу текущий поток моего обучающего курса по SQL и Python(Pandas). Я сама не верю, что провела уже два потока. Когда я писала этот курс, то потратила огромное количество сил и энергии и когда вела его, то тоже старалась много отдать, быть на связи, помогать даже с резюме и отвечать на разные вопросы иногда даже просто "за жизнь".

Это крутое время, проведенное вместе! Тем не менее, как говорится, "все хорошее - когда-то заканчивается". И вот, я хочу объявить, что сейчас будет последний поток в обозримом будущем, так как летом я буду занята собственным обучением и проектами.
*? Так что стартует набор на крайний поток обучения!
?* Дата потока открытая. Начнем, как только наберется достаточное количество участников.

?‍??‍? Если вы хотите присоединиться к потоку и расширить свои знания SQL и Python, не упустите эту возможность! Присоединяйтесь к нашей группе и начнем это захватывающее образовательное путешествие вместе!

? Спасибо за ваш интерес и участие! Многие просили программу обучения. ? Подробная программа, вот она. Там в конце еще отзывы есть.
Оставляйте заявку в гугл-форме на курс, ну или пишите напрямую @Valeria_Shuvaeva

7 months, 2 weeks ago
Вы тоже сможете вырасти до хардового …

Вы тоже сможете вырасти до хардового аналитика уровня Middle+. Как?
Добавьте к своим скилам навыки в проектировании архитектуры и интеграций веб-сервисов!

Пять месяцев назад я уже писала про этот курс. Сейчас пишу еще раз, потому что у курса вышло полезное обновление, уже доступное ученикам, независимо от того, когда они его купили.
—————
? Первое: в портфолио включили примеры интеграций от крупных BigTech-компаний. Это позволит вам понять, как технологии применяются в реальных бизнес-контекстах.
? Второе: обновили портфолио. Теперь в нём есть задания повышенного уровня сложности для каждой темы. Это небольшие реальные проекты, с помощью которых можно не только проверить, но и улучшить свои навыки!
✔️Третье: вышел новый модуль про проектирование баз данных - нормализация, транзакции, основы DWH, индексы.
—————
• Результат после прохождения курса: 15 рабочих проектов в портфолио-резюме
• Доступ к урокам и всем обновлениям останется навсегда
• Фундаментальная база
• Всю программу и отзывы смотрите в боте курса

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

https://t.me/studyit_help_bot?start=worr

Скидка на курс от канала
— 1 000₽ на Stepik по промокоду
WORR до 30 апреля.

7 months, 4 weeks ago
***✅*** **Тестовое. Задачка по SQL.** Просматривала …

Тестовое. Задачка по SQL. Просматривала я аналитические каналы и вижу интересное тестовое. У меня мозг на автомате начал накидывать варианты и уже прям не терпелось написать скрипт.
Думаю это будет полезным для всех.

Итак, есть две таблички: с отделами и данными по зарплате у сотрудников и их начальников.
Создадим быстренько датафреймы, на котором потренируемся прям в юпитер ноутбуке с помощью библиотеки pandasql. Про эту библиотеку пост тут.

data = {'id': [1,2,3,4,5,6], 'name': ['Финансы','Риски','Розница','Безопасность','ДКК','Аналитика']} Departament = pd.DataFrame(data)

data = { 'id': [1,2,3,4,5,6], 'id\_head': [1, 1,2,4,5,3], 'id\_dep':[2,2,3,3,8,4], 'sal': [45000,80000,100000,65000,35000,50000] } Personal = pd.DataFrame(data)

?Задание 1. Вывести отдел с наибольшим числом сотрудников.
Самый простой способ:

select d.name as Department, count(p.id) as count\_personal from Personal p join Departament d on d.id = p.id\_dep group by 1 order by 1 desc limit 1

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

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

Это можно реализовать соединив таблицу с этой же модифицированной таблицей. Сделаем табличку с помощью группировки, чтобы был уникальный сотрудник и его з/пл. И присоединим ее с помощью left join к основной по ключу p1.id_head = p2.id.
Тогда в одной строке будет и з/пл сотрудника и з/пл его руководителя. И потом оставляем тех, у кого sal>sal_head

select p1.id from Personal p1 join (select id,sal as sal\_head from Personal group by 1) p2 on p1.id\_head = p2.id where sal>sal\_head

? Тут ноутбук с решением.

We recommend to visit
HAYZON
HAYZON
6,442,108 @hayzonn

💼 How to create capital and increase it using cryptocurrency

👤 𝐅𝐨𝐮𝐧𝐝𝐞𝐫: @Tg_Syprion
🗓 ᴀᴅᴠᴇʀᴛɪsɪɴɢ: @SEO_Fam
Мои каналы: @mazzafam

Last updated 1 day, 22 hours ago

Канал для поиска исполнителей для разных задач и организации мини конкурсов

Last updated 3 months ago

Новые и перспективные Web3 игры с добычей токенов.

Чат: https://t.me/Crypto_Wolf_Chat

Правила чата смотрите в описании чата.

Все свои вопросы направляйте в чат или главному модератору чата: @Exudna_118

По теме сотрудничества: @Zombini

Last updated 2 months, 2 weeks ago