Български
Тема
Български
Тема
Примерите на тези страници и задачите в Homework repository използват един и същ малък, измислен кредитен портфейл. Нищо в него не идва от истинска банка: клиентите, кредитите и всички стойности са измислени. Типична е само формата: таблица с клиенти, таблица с кредити, която сочи към клиентите, и номенклатура (рейтинговата скала).
| Файл | Редове | Какво е |
|---|---|---|
| 150 | по един ред за всеки клиент | |
| 400 | по един ред за всеки кредит; client_id сочи към clients.csv | |
| 10 | рейтинговата скала: по един ред за всеки рейтингов клас, с неговия PD интервал |
От занятие 7 нататък - още файлове от същия измислен портфейл, нарочно с проблемите на истинските данни: разхвърлян текст, няколко формата, лоши редове, история във времето.
| Файл | Редове | Какво е | Занятия |
|---|---|---|---|
| 150 | клиентите с текстовите им полета, както са ги въвели хората | 7, 8 | |
| 231 | свободни коментари на кредитни служители за кредитите | 8 | |
| 280 | плащанията през септември 2026, с няколко лоши реда | 9 | |
| - | настройките на месечен отчет | 9 | |
| 3 листа | дневни валутни курсове, по един лист на месец | 9, 14, 16 | |
| 7 | регионите на български и английски - записани в cp1251 | 7, 9 | |
| 1800 | рейтингът на всеки клиент към края на 12 месеца | 12, 13, 16 | |
| 3992 | непогасената сума на всеки кредит към края на 12 месеца | 16 | |
| 406 | loans.csv като локален експорт: ;, десетична запетая, dd.mm.yyyy, липсващи стойности, повторения | 14, 15 | |
| 4 таблици | база данни SQLite: clients, loans, rating_scale, ratings_history | 13, 16 |
Същите файлове са в папката data/ на Homework repository. На тези страници те са в data/ на всеки пример, който може да се пусне.
Разгледайте файловете
Щракнете върху името на файл в таблиците, за да видите какво има в него. Файл CSV, лист от файла на Excel или таблица от базата данни се показва като таблица, която може да филтрирате; редовете с грешен брой полета и празните редове са отбелязани. Текст показва файл CSV или JSON такъв, какъвто е - с разделителя, кавичките и интервалите му, а SQL - таблиците на базата данни. Изтегли записва файла. Прегледът сам открива кодировката на regions_bg.csv (cp1251); Python не я открива - вижте описанието на файла по-долу.
| Колона | Пример | Значение |
|---|---|---|
client_id | C0002 | идентификаторът на клиента |
segment | sme | retail, sme или corporate |
region | Ruse | регионът на клиента |
industry | M | код на икономическата дейност (буква, като секциите на NACE / КИД); празен за клиентите на дребно |
rating | 5 | вътрешният рейтинг, от 1 (най-добър) до 10 (неизпълнение) - вижте rating_scale.csv |
client_since | 2014-06-08 | началото на отношенията с клиента (дата във формат ISO) |
import pandas as pd
clients = pd.read_csv("data/clients.csv")
clients.head()import pandas as pd
clients = pd.read_csv("data/clients.csv")
clients.head()| Колона | Пример | Значение |
|---|---|---|
loan_id | L000001 | идентификаторът на кредита |
client_id | C0080 | клиентът (вижте clients.csv) |
product | investment | mortgage, consumer, credit_card, overdraft, working_capital, investment, project_finance |
currency | EUR | EUR или USD |
start_date, maturity_date | 2026-01-22 | дати във формат ISO |
amount | 1156900.00 | първоначалната сума |
outstanding | 1044231.30 | сумата, която остава за плащане към отчетната дата (30.09.2026) |
interest_rate | 8.83 | в проценти годишно |
days_past_due | 0 | дни, с които плащанията закъсняват |
stage | 1 | 1, 2 или 3 - stage 3 означава повече от 90 дни просрочие или рейтинг 10 |
import pandas as pd
loans = pd.read_csv("data/loans.csv")
loans.groupby("product")["outstanding"].sum().round(2)import pandas as pd
loans = pd.read_csv("data/loans.csv")
loans.groupby("product")["outstanding"].sum().round(2)Номенклатура: по един ред за всеки рейтинг, с неговия клас и интервала на вероятността от неизпълнение (PD).
| Колона | Пример | Значение |
|---|---|---|
rating | 4 | от 1 до 10 |
grade | BBB | буквеният клас |
pd_min, pd_max | 0.0025, 0.006 | PD интервалът на класа (0.0025 = 0.25%) |
description | moderate risk |
import csv
with open("data/rating_scale.csv", encoding="utf-8") as f:
for row in csv.DictReader(f):
print(row["rating"], row["grade"], row["description"])import csv
with open("data/rating_scale.csv", encoding="utf-8") as f:
for row in csv.DictReader(f):
print(row["rating"], row["grade"], row["description"])Същите 150 клиента като в clients.csv, но текстовите полета са такива, каквито са въведени в стара система: client_id в много форми (c0014, C 0009, C-0026, C17), имена с произволни главни и малки букви, с излишни интервали и кавички, правни форми, написани като E.A.D., ЕИК с интервали или с BG отпред, IBAN на групи по четири или с малки букви, e-mail адреси с главни букви или с " at ", градове на латиница или кирилица, с gr. отпред, дати на регистрация в пет формата и оборотът на фирмите в български и английски формат на числата. Колони: client_id, name, eik, iban, email, city, registered, turnover. IBAN-ите използват измислени банкови кодове (DEMO, TEST, XMPL, FAKE), а e-mail адресите - запазените домейни example.*.
loan_id, comment_date (ISO), comment: кратки бележки като "Payment of 1 250,00 EUR received on 15.09.2026." или "Disbursement to IBAN BG71 DEMO ... confirmed" - суми, дати, IBAN, ЕИК, e-mail адреси и номера на кредити в свободен текст.
payment_id, loan_id, pay_date, amount, currency. Повечето редове са наред; някои не са: липсваща сума, 12O.50 (буква O), n/a, дата, която не съществува, непознат кредит, отрицателна сума, едно поле по-малко или повече, празен ред.
report_config.json: датата на отчета, LGD, групите по DPD, сегментите и настройките за изхода на месечен отчет.fx_rates.xlsx: по един лист на месец (2026-07, 2026-08, 2026-09); колони date, USD, GBP, CHF - колко единици от валутата се купуват с едно евро.regions_bg.csv: code, name_bg, name_en - записан в кодировката за кирилица на Windows cp1251, като много стари експорти. Отваряйте го с encoding="cp1251".Историята към края на 12 месеца, от 31.10.2025 до 30.09.2026; последният месец съвпада с clients.csv и loans.csv. Клиент или кредит се появява едва от месеца, в който е започнал.
ratings_history.csv: client_id, month_end, rating.balances_monthly.csv: loan_id, month_end, outstanding, days_past_due.400-те кредита като експорт от локална система: разделителят е ;, десетичните числа са със запетая (651927,30), датите са dd.mm.yyyy, имената на колоните имат интервали (Loan ID), файлът започва с BOM ("CSV UTF-8" на Excel). Някои стойности липсват - празни или . като липсваща стойност в SAS - а 6 реда са повторени.
База данни SQLite с четири таблици: clients, loans, rating_scale и ratings_history - същите данни като във файловете CSV, с първични и външни ключове.
import sqlite3
con = sqlite3.connect("data/portfolio.db")
for name, sql in con.execute("SELECT name, sql FROM sqlite_master WHERE type = 'table'"):
print(name)
print(con.execute("SELECT COUNT(*), ROUND(SUM(outstanding), 2) FROM loans").fetchone())
con.close()import sqlite3
con = sqlite3.connect("data/portfolio.db")
for name, sql in con.execute("SELECT name, sql FROM sqlite_master WHERE type = 'table'"):
print(name)
print(con.execute("SELECT COUNT(*), ROUND(SUM(outstanding), 2) FROM loans").fetchone())
con.close()Без pandas
Първите лекции четат файловете със стандартната библиотека (open, csv), а pandas идва в занятие 14. И двата начина четат едни и същи файлове.