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

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

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

لا اله الا الله محمد رسول الله

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

Last updated 3 weeks, 2 days ago

Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.

Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support

Last updated 2 weeks, 3 days ago

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

Last updated 1 month ago

1 month, 2 weeks ago

📊 Как проверить, существует ли датафрейм в Python, прежде чем с ним работать?

Недавно столкнулась на работе с задачей, когда нужно было объединить два датафрейма — 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() нравится. Кратко и по сути, и не надо дублировать код.

2 months, 2 weeks ago

*💡 Почему в мире быстрых изменений важно учиться терпению?*

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

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

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

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

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

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

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

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

2 months, 3 weeks ago

Когда ко мне обращаются за помощью, я с удовольствием поддерживаю, если вижу, что блог действительно полезный и может помочь другим 💪👌👍

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

5 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)]

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

We recommend to visit
HAYZON
HAYZON
6,053,581 @hayzonn

لا اله الا الله محمد رسول الله

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

Last updated 3 weeks, 2 days ago

Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.

Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support

Last updated 2 weeks, 3 days ago

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

Last updated 1 month ago