TGViewer
Мир аналитика данных Мир аналитика данных @analysts_world · 4.56K subscribers
Post #151 4.8K
⚡️Хитрая задачка с работы.

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

📌Так как код большой, то я оставлю ссылку на юпитер ноутбук. Тестируйте, модифицируйте.
  • 🔥 29
  • 👍 9
  • ❤ 4
  • 👎 3
More from @analysts_world
  1. Sep 21, 2026📊 Задачка с собеседования Ну что, по итогам голосования большинство хотят задачки и sql.…
  2. Sep 14, 2026Post #345
  3. Sep 14, 2026Что-то я тут прям зачастила с A/B тестами 😅 Смотрю на последние посты и такое чувство, чт…
  4. Sep 1, 2026🎒 С 1 сентября, друзья! Сегодня как раз отправила своих детей в школу – и вот это чувство…
  5. Aug 24, 2026Вне выборки Обычно здесь про SQL, Python и AB-тесты. Но не всё, что важно, попадает в выбо…
  6. Aug 20, 2026Fuckup Night от создателей Trisigma, Ares и karpov.courses Согласитесь, ивенты, где все де…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →