4. 数据准备:Python环境搭建与回测数据集加载

本章是PSI哨兵漂移预警案例的数据基石。我们将完成Python科学计算环境的搭建,加载真实的回测数据集,并对原始数据进行清洗与预处理,确保后续PSI计算与坏账率回测的准确性和可靠性。

4.1 Python环境搭建与依赖库

推荐使用Python 3.8+版本,通过pip或conda安装以下核心库。建议在虚拟环境中进行,避免依赖冲突。

库名称 版本建议 用途
pandas ≥1.4.0 数据加载、清洗、聚合与透视
numpy ≥1.21.0 数值计算、数组操作、分箱逻辑
matplotlib ≥3.5.0 基础图表绘制、PSI趋势可视化
seaborn ≥0.11.0 统计图形增强、分布对比与热力图
环境验证提示: 安装完成后,在Python交互环境中执行 import pandas as pd; print(pd.__version__),确认版本号正常输出,无ImportError。

4.2 加载回测数据集

本案例使用模拟的信贷申请与表现数据集,包含时间戳、评分卡分数、最终坏账标签三个核心字段。数据集以CSV格式存储,通过pandas的read_csv方法加载。

import pandas as pd
import numpy as np

# 加载回测数据集
df = pd.read_csv('psi_backtest_data.csv', parse_dates=['apply_date'])

# 查看数据基本信息
print('数据集形状:', df.shape)
print('字段列表:', df.columns.tolist())
print('前5行预览:')
print(df.head())

数据集字段说明:

字段名 数据类型 说明
apply_date datetime64 申请日期,用于划分时间窗口
score float64 模型输出的评分卡分数,范围[300, 900]
is_bad int64 坏账标签,1=坏账,0=正常
数据量级参考: 本案例回测数据集包含约12万条记录,时间跨度24个月,覆盖完整的经济周期波动,适合验证PSI漂移哨兵的有效性。

4.3 数据清洗与预处理

原始数据通常存在缺失值、异常值和格式不一致问题。以下步骤确保数据质量满足PSI计算要求。

4.3.1 缺失值处理

# 检查缺失值
print('缺失值统计:')
print(df.isnull().sum())

# 删除评分或坏账标签为空的记录
df = df.dropna(subset=['score', 'is_bad'])

# 对日期字段的缺失值,使用前向填充
df['apply_date'] = df['apply_date'].fillna(method='ffill')

4.3.2 异常值过滤

# 评分范围合理性检查:仅保留[300, 900]区间内的分数
df = df[(df['score'] >= 300) & (df['score'] <= 900)]

# 坏账标签只能为0或1
df = df[df['is_bad'].isin([0, 1])]

4.3.3 时间窗口划分

为计算PSI,需要将数据按时间划分为“基准期”和“监测期”。本案例以月为粒度划分窗口。

# 提取年月作为时间窗口标识
df['year_month'] = df['apply_date'].dt.to_period('M')

# 查看各月份数据量分布
monthly_counts = df['year_month'].value_counts().sort_index()
print('各月份样本量:')
print(monthly_counts)
注意: 如果某个月份样本量过少(如<100条),该月份的PSI估计方差会很大,建议合并相邻月份或剔除该窗口,避免漂移误报。

4.4 数据预处理流程总览

下图展示了从原始数据到可用于PSI计算的标准化数据集的完整流程。

数据预处理流程架构 原始CSV数据 缺失值处理 异常值过滤 时间窗口划分 标准化回测数据集 输出字段:apply_date | year_month | score | is_bad 数据量约12万条,覆盖24个月,无缺失无异常

4.5 预处理后数据质量检查

完成清洗后,执行最终质量检查,确保数据符合PSI计算要求。

# 最终数据质量检查
print('最终数据集形状:', df.shape)
print('评分范围: [{:.1f}, {:.1f}]'.format(df['score'].min(), df['score'].max()))
print('坏账率: {:.4f}'.format(df['is_bad'].mean()))
print('时间窗口数:', df['year_month'].nunique())
print('各窗口样本量统计:')
print(df.groupby('year_month').size().describe())
数据就绪标志: 当评分范围完整、坏账标签无异常、各月份样本量充足且无缺失值时,数据集已准备好进入PSI计算与回测环节。下一阶段将基于此标准化数据集,构建基准分布与监测分布,计算PSI指标并触发漂移预警。