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
📊 Как проверить, существует ли датафрейм в 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() нравится. Кратко и по сути, и не надо дублировать код.
*💡 Почему в мире быстрых изменений важно учиться терпению?*
Хочу с вами поделиться одной мыслью. Она наверняка не нова, но я как-то по другому на нее смотрю теперь.
Сейчас скорость достижения целей кажется ключевым навыком. Все вокруг будто бы идут на сверхзвуковой скорости: новые технологии, тренды, навыки. Постоянно учишься, пытаешься освоить новые инструменты и подходы, но при этом результат не всегда виден сразу. Ощущение, что идешь слишком медленно, иногда давит.
Но вот что важно понять: быстрота не всегда равно качество.
Работая в аналитике, да и вообще в любой сфере, если честно, мы часто забываем, что это марафон, а не спринт. Ты не можешь мгновенно стать ~~синьором~~ крутым экспертом или сделать невероятные открытия в данных с первого раза.
Когда я создавала канал несколько лет назад, я и не думала, что он будет приносить мне небольшой, но приятный доход от рекламы. Я просто создавала его так как мне захотелось.
*🎯 Не гонитесь за мгновенными результатами!
То, что вы изучаете сейчас (питон, sql, статистика или еще что-то) может не пригодиться ВОТ ПРЯМ СЕЙЧАС, но очень вероятно, что пригодится через год или два при должном стремлении к вашей цели. Именно терпение и постоянство помогут тебе построить крепкий фундамент. Карьерный рост — это постепенный процесс. Очень важно научиться принимать и ценить каждый маленький шаг*.
*🌱 Учись терпению. Медленный прогресс — это тоже прогресс.*
Важно помнить, что каждый новый проект, каждая ошибка — это кирпичик в твоем профессиональном пути. Твой путь уникален, и гонка с другими только мешает сосредоточиться на своих достижениях.
Терпение — это не вовсе не слабость, а сила. Развивай свои навыки, не гонись за мгновенными результатами, и в итоге ты увидишь, как далеко продвинулся.
Когда ко мне обращаются за помощью, я с удовольствием поддерживаю, если вижу, что блог действительно полезный и может помочь другим 💪👌👍
? ⚡️Хитрая задачка с работы. Возвращение. ?
??Наконец удалось выкроить время, чтобы поэкспериментировать с этой хитрой задачей, и теперь у меня есть решение, которое не использует циклы! Всё сделано исключительно с помощью 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. В нём вы найдёте ещё дополнительные варианты решения, которые прислал Дмитрий в комментариях. Спасибо ему за это! ?
⚡️Хитрая задачка с работы.
Попросили меня выгрузить всех клиентов, у которых ставка кредита меньше или равно указанных. Должны быть меньше вот этих (как пример, цифры придуманные):
? Срок рассрочки 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_" в строке.
(\d+): Находит одну или более цифр и сохраняет их как первую группу захвата (срок кредитования).
Ищет символ подчеркивания _.
4.([\d,.]+): Находит одну или более цифр, запятых или точек и сохраняет их как вторую группу захвата (ставка кредита).
У нас получился датафрейм с колонками 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)]
?Так как код большой, то я оставлю ссылку на юпитер ноутбук. Тестируйте, модифицируйте.
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