3. 数据加载与探索:使用 Pandas 读取贷后数据集
在构建贷后风控模型之前,第一步是正确加载数据并完成初步探索。本节将演示如何使用 Pandas 读取贷后数据集,并快速掌握数据的基本形态、字段类型及缺失情况,为后续的特征筛选奠定基础。
3.1 数据加载:从 CSV 到 DataFrame
贷后数据集通常以 CSV 格式存储,包含客户还款行为、逾期记录、催收动作等字段。使用 Pandas 的 read_csv() 函数加载数据,并指定常见参数以提升加载效率与解析准确性。
import pandas as pd
# 加载贷后数据集
df = pd.read_csv(
'post_loan_data.csv',
encoding='utf-8',
parse_dates=['report_date', 'due_date', 'payment_date'],
dtype={
'customer_id': 'str',
'loan_id': 'str',
'overdue_days': 'int32',
'principal_balance': 'float32'
},
low_memory=False
)
print('数据加载完成')
加载要点:
- parse_dates:将日期字段解析为 datetime 类型,便于后续时间序列分析。
- dtype:显式指定字段类型,减少内存占用并避免类型推断错误。
- low_memory=False:确保混合类型字段被正确读取,避免数据截断。
3.2 数据形状:行数与列数
使用 df.shape 查看数据集的维度,快速了解样本量与特征数量。
rows, cols = df.shape
print(f'数据集包含 {rows} 条记录,{cols} 个字段')
贷后风控数据集通常具有以下特征:
| 指标 | 典型范围 | 说明 |
|---|---|---|
| 样本量 | 10万 ~ 500万 | 取决于业务规模与观察窗口 |
| 特征数 | 50 ~ 300 | 包含基础信息、行为特征、衍生特征 |
| 正样本占比 | 1% ~ 10% | 逾期/坏账标签通常稀疏 |
3.3 数据类型概览
使用 df.dtypes 或 df.info() 查看每个字段的数据类型,识别数值型、类别型、时间型字段。
# 查看数据类型概览
print(df.dtypes.value_counts())
# 详细字段类型信息
df.info(verbose=True, null_counts=True)
贷后数据集中常见的字段类型分布:
| 数据类型 | 常见字段示例 | 处理建议 |
|---|---|---|
| float64 | 本金余额、利息、已还金额 | 检查异常值,考虑对数变换 |
| int64 | 逾期天数、催收次数、分期期数 | 确认是否为离散型,是否需要编码 |
| object | 客户ID、产品类型、渠道来源 | 转为 category 类型以节省内存 |
| datetime64 | 报告日期、到期日、还款日 | 提取年、月、周、距今天数等特征 |
3.4 缺失值概览
缺失值处理是贷后风控特征筛选的关键前置步骤。使用 df.isnull().sum() 统计每个字段的缺失数量与比例。
# 计算缺失值数量与比例
missing = df.isnull().sum()
missing_pct = (missing / len(df)) * 100
# 合并为 DataFrame 并排序
missing_df = pd.DataFrame({
'缺失数量': missing,
'缺失比例(%)': missing_pct.round(2)
}).sort_values('缺失比例(%)', ascending=False)
# 筛选缺失比例大于 0 的字段
missing_df = missing_df[missing_df['缺失数量'] > 0]
print(missing_df.head(20))
缺失值处理原则:
- 缺失率 > 50%:通常直接删除该特征,信息量过低。
- 缺失率 5% ~ 50%:根据业务含义选择填充或构造缺失指示变量。
- 缺失率 < 5%:可使用均值、中位数或众数填充。
- 时间序列字段:缺失可能代表未发生事件,需谨慎处理。
3.5 数据探索流程总览
以下 SVG 图展示了贷后数据集加载与探索的完整流程,从原始文件到可建模的干净数据集。
3.6 快速探索代码模板
以下代码模板整合了上述所有探索步骤,可直接用于贷后数据集的初步分析:
def explore_post_loan_data(df):
"""贷后数据集快速探索函数"""
print("=" * 50)
print("1. 数据形状")
print(f" 行数: {df.shape[0]:,}, 列数: {df.shape[1]}")
print()
print("2. 字段类型分布")
print(df.dtypes.value_counts())
print()
print("3. 前5行数据预览")
print(df.head())
print()
print("4. 缺失值概览(缺失率 > 0%)")
missing = df.isnull().sum()
missing_pct = (missing / len(df)) * 100
missing_df = pd.DataFrame({
'缺失数量': missing,
'缺失比例(%)': missing_pct.round(2)
})
missing_df = missing_df[missing_df['缺失数量'] > 0]
missing_df = missing_df.sort_values('缺失比例(%)', ascending=False)
print(missing_df)
print()
print("5. 数值型字段基本统计")
print(df.describe())
print("=" * 50)
# 调用探索函数
explore_post_loan_data(df)
实践建议: 在加载数据后立即执行上述探索函数,将输出结果保存为日志文件,作为特征筛选的基线参考。重点关注缺失率超过 30% 的字段,以及数据类型与业务预期不一致的字段。