Spaces:
Paused
Paused
| import os | |
| import pandas as pd | |
| from pathlib import Path | |
| CSV_PATH = Path(__file__).resolve().parent.parent / "scrape" / "data" / "LoanData_Bondora.csv" | |
| OUTPUT_TXT = Path(__file__).resolve().parent.parent / "scrape" / "data" / "policies" / "bondora_loan_dataset_summary.txt" | |
| def generate_summary(): | |
| print(f"Reading dataset from {CSV_PATH}...") | |
| df = pd.read_csv(CSV_PATH, low_memory=False) | |
| total_rows = len(df) | |
| total_amount = df["Amount"].sum() | |
| avg_amount = df["Amount"].mean() | |
| avg_interest = df["Interest"].mean() | |
| avg_duration = df["LoanDuration"].mean() | |
| country_counts = df["Country"].value_counts().to_dict() | |
| rating_counts = df["Rating"].value_counts().to_dict() | |
| status_counts = df["Status"].value_counts().to_dict() | |
| # Breakdown by country | |
| country_summary = [] | |
| for country, count in country_counts.items(): | |
| sub = df[df["Country"] == country] | |
| c_amt = sub["Amount"].sum() | |
| c_avg_int = sub["Interest"].mean() | |
| country_summary.append( | |
| f" - {country}: {count:,} loans | Total Amount: €{c_amt:,.2f} | Avg Interest: {c_avg_int:.2f}%" | |
| ) | |
| # Breakdown by rating | |
| rating_summary = [] | |
| for rating, count in rating_counts.items(): | |
| sub = df[df["Rating"] == rating] | |
| r_avg_amt = sub["Amount"].mean() | |
| r_avg_int = sub["Interest"].mean() | |
| rating_summary.append( | |
| f" - Rating {rating}: {count:,} loans | Avg Amount: €{r_avg_amt:,.2f} | Avg Interest: {r_avg_int:.2f}%" | |
| ) | |
| summary_text = f"""BONDORA LOAN DATASET SUMMARY & METRICS DATA | |
| Dataset Overview: | |
| - Source File: LoanData_Bondora.csv | |
| - Total Loan Records: {total_rows:,} loans | |
| - Total Funded Amount: €{total_amount:,.2f} | |
| - Average Loan Amount: €{avg_amount:,.2f} | |
| - Average Interest Rate: {avg_interest:.2f}% | |
| - Average Loan Duration: {avg_duration:.1f} months | |
| Geographic Distribution (Loans by Country): | |
| {chr(10).join(country_summary)} | |
| Credit Rating Distribution: | |
| {chr(10).join(rating_summary)} | |
| Loan Status Categories: | |
| {chr(10).join([f' - Status {k}: {v:,} loans' for k, v in status_counts.items()])} | |
| Dataset Schema & Key Fields Description: | |
| - LoanId / LoanNumber: Unique identification key for each loan agreement. | |
| - Country: Borrower residency country code (EE = Estonia, FI = Finland, ES = Spain, SK = Slovakia). | |
| - AppliedAmount / Amount: Requested loan amount vs actual issued loan principal in EUR. | |
| - Interest: Annual interest rate applied to the loan (percentage). | |
| - LoanDuration: Contract duration in months (typically 3 to 120 months). | |
| - MonthlyPayment: Agreed monthly repayment installment amount. | |
| - UseOfLoan: Purpose category of the loan (e.g. debt consolidation, home improvement, vehicle, business). | |
| - IncomeTotal / DebtToIncome: Borrower financial metrics at application time. | |
| - ProbabilityOfDefault (PD) / ExpectedLoss (EL): Risk management metrics calculated at origination. | |
| - LossGivenDefault (LGD): Estimated proportion of loan loss if default occurs. | |
| - Rating: Internal credit risk rating grade assigned to the borrower (from AA down to HR - High Risk). | |
| - Status: Current status of the loan contract (Repaid, Current, Late / Defaulted). | |
| - Restructured: Boolean flag indicating if payment schedule terms were altered or rescheduled. | |
| """ | |
| OUTPUT_TXT.parent.mkdir(parents=True, exist_ok=True) | |
| with open(OUTPUT_TXT, "w", encoding="utf-8") as f: | |
| f.write(summary_text) | |
| print(f"Dataset summary successfully generated at {OUTPUT_TXT}!") | |
| if __name__ == "__main__": | |
| generate_summary() | |