4. 数据加载与初步探索:使用Pandas读取CSV/Excel/数据库数据、info()/describe()/head()/shape方法、数据类型检查

在风控数据质量治理中,数据加载是异常值检测的第一步。只有正确、高效地将原始数据读入内存,才能进行后续的探索与清洗。本节将系统讲解如何使用Pandas加载常见数据源,并利用核心方法快速掌握数据全貌。

4.1 数据加载:从文件到DataFrame

Pandas支持多种数据源读取,风控场景中最常用的是CSV、Excel和关系型数据库。下表对比了三种方式的适用场景与核心参数:

数据源 核心函数 常用参数 风控典型场景
CSV pd.read_csv() filepath, sep, encoding, dtype, parse_dates 离线交易流水、用户行为日志
Excel pd.read_excel() sheet_name, header, usecols 风控规则配置、人工审核标注
数据库 pd.read_sql() sql, con, params 实时特征库、黑名单查询
关键实践:加载风控数据时,务必使用 dtype 参数显式指定字段类型(如 {'user_id': str, 'amount': float}),避免Pandas自动推断导致类型错误,这是数据质量治理的第一道防线。
import pandas as pd
from sqlalchemy import create_engine

# 1. 读取CSV(指定分隔符、编码、日期列)
df_csv = pd.read_csv('transaction_2024.csv', sep=',', encoding='utf-8',
                     parse_dates=['trans_time'], dtype={'user_id': str})

# 2. 读取Excel(指定sheet和列范围)
df_excel = pd.read_excel('rule_config.xlsx', sheet_name='anti_fraud',
                         usecols='A:F')

# 3. 读取数据库(使用SQLAlchemy连接)
engine = create_engine('mysql+pymysql://user:pass@host:3306/risk_db')
df_sql = pd.read_sql('SELECT * FROM feature_store WHERE dt = "2024-01-01"',
                     con=engine)

4.2 初步探索:四步掌握数据全貌

数据加载完成后,必须通过系统化的探索方法快速建立对数据集的认知。以下四个方法构成了风控数据初步探索的标准流程:

  1. df.shape — 获取行数和列数,判断数据规模是否在预期范围内。
  2. df.info() — 查看每列的非空计数、数据类型和内存占用,快速定位缺失字段和类型异常。
  3. df.head() — 预览前5行数据,直观检查字段内容是否符合业务预期。
  4. df.describe() — 生成数值型字段的统计摘要(均值、标准差、分位数),初步识别离群值。
风控经验:在调用 describe() 后,重点关注 min 和 max 列。例如,如果交易金额的 min 为负数或 max 超过业务上限(如单笔100万),这些极值就是异常值检测的优先目标。
# 加载示例风控数据集
df = pd.read_csv('risk_sample.csv')

# 1. 数据规模
print(f"数据集维度: {df.shape}")  # 输出: (100000, 25)

# 2. 数据类型与缺失概览
df.info()

# 3. 预览前5行
print(df.head())

# 4. 数值字段统计摘要
print(df.describe())
数据初步探索四步流程 df.shape 行数 × 列数 df.info() 类型·缺失·内存 df.head() 前5行预览 df.describe() 统计摘要 四步联动:从宏观到微观 ① shape 判断数据规模是否完整 ② info 定位缺失列与类型错误 ③ head 验证字段内容合理性 → ④ describe 发现极值与异常分布

4.3 数据类型检查:风控字段的“身份验证”

数据类型错误是风控数据质量中最隐蔽的问题之一。例如,用户ID被读成浮点数、交易时间被读成字符串、金额字段出现非数字字符等。Pandas提供了两种核心检查方式:

检查方法 返回结果 风控典型问题
df.dtypes 每列的数据类型Series user_id 显示为 float64(应转为 object/str)
df.select_dtypes() 按类型筛选子集DataFrame 筛选数值列做异常检测,排除非数值列
# 数据类型检查实战
print("各字段类型:")
print(df.dtypes)

# 检查是否存在异常类型
numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns.tolist()
object_cols = df.select_dtypes(include=['object']).columns.tolist()

print(f"\n数值列(共{len(numeric_cols)}个):{numeric_cols}")
print(f"文本列(共{len(object_cols)}个):{object_cols}")

# 强制类型转换(风控常用)
df['user_id'] = df['user_id'].astype(str)
df['trans_time'] = pd.to_datetime(df['trans_time'], errors='coerce')
⚠️ 常见陷阱:使用 pd.to_datetime() 时务必设置 errors='coerce',将无法解析的日期转为 NaT,避免整个转换过程报错中断。转换后应检查 df['trans_time'].isna().sum() 确认异常日期数量。
数据类型检查与转换流程 原始DataFrame df.dtypes 检查 select_dtypes 筛选 类型转换 astype / to_datetime 清洗后 类型检查是异常值检测的前置条件 错误的类型会导致统计指标失真、异常检测算法失效,必须在探索阶段完成类型校正。

4.4 综合实践:风控数据集加载与探索模板

以下代码整合了本节所有核心方法,形成风控数据加载与初步探索的标准模板,可直接用于实际项目:

def load_and_explore_risk_data(file_path, date_col='trans_time'):
    """
    风控数据集加载与初步探索模板
    参数:
        file_path: 数据文件路径(CSV格式)
        date_col: 日期列名,用于自动解析
    返回:
        df: 加载后的DataFrame
        report: 数据质量初步报告(字典)
    """
    # 1. 加载数据(显式指定类型)
    df = pd.read_csv(
        file_path,
        encoding='utf-8',
        parse_dates=[date_col] if date_col else False,
        dtype={'user_id': str, 'order_id': str},
        low_memory=False
    )

    # 2. 初步探索
    report = {
        'shape': df.shape,
        'columns': list(df.columns),
        'dtypes': df.dtypes.to_dict(),
        'missing_count': df.isnull().sum().to_dict(),
        'missing_pct': (df.isnull().sum() / len(df) * 100).round(2).to_dict(),
        'numeric_summary': df.describe().to_dict()
    }

    # 3. 类型检查与修正
    for col in df.select_dtypes(include=['object']).columns:
        if 'time' in col.lower() or 'date' in col.lower():
            df[col] = pd.to_datetime(df[col], errors='coerce')

    # 4. 输出关键信息
    print(f"✅ 数据加载完成:{report['shape'][0]}行 × {report['shape'][1]}列")
    print(f"⚠️  缺失字段数:{sum(1 for v in report['missing_count'].values() if v > 0)}")

    return df, report

# 使用示例
df_risk, report = load_and_explore_risk_data('risk_transactions.csv')
print(report['numeric_summary'])
数据治理要点:在风控生产环境中,建议将上述探索结果写入数据质量监控日志,记录每次加载的数据量、缺失率、类型异常数,形成可追溯的数据质量基线。当某日数据量突降或缺失率飙升时,自动触发告警,这是异常值检测在数据质量层面的前置防御。