Найти в Дзене

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


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