Python案例如何用Pandas做数据Eval评估

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据Eval评估

  1. 目录导读
  2. 为什么数据分析中需要Eval评估?
  3. Pandas做Eval评估的核心逻辑与工具
  4. 案例场景与数据集构造
  5. 逐步实现:数据加载、清洗、评估与报告生成
  6. 自动生成Eval评估报告的代码实战
  7. 问答环节:你可能会遇到的5个高频问题
  8. 总结与最佳实践建议

Python实战案例:如何用Pandas高效完成数据质量Eval评估(附完整代码)

目录导读

  1. 为什么数据分析中需要Eval评估?
  2. Pandas做Eval评估的核心逻辑与工具
  3. 案例场景与数据集构造
  4. 逐步实现:数据加载、清洗、评估与报告生成
  5. 常见评估指标详解(缺失、异常、重复、分布、相关性)
  6. 自动生成Eval评估报告的代码实战
  7. 问答环节:你可能会遇到的5个高频问题
  8. 总结与最佳实践建议

为什么数据分析中需要Eval评估?

在真实的数据分析项目中,我们经常面临“垃圾进,垃圾出”的困境。数据Eval评估是指在建模或分析之前,对原始数据的质量、完整性、一致性和潜在问题进行的系统化检测,这包括:

  • 检查缺失值比例
  • 识别异常值与离群点
  • 检测重复行与重复键
  • 分析数值列分布是否符合预期
  • 评估类别列的平衡性
  • 验证数据类型是否正确

在一份用户行为日志中,若某字段缺失超过70%,或者出现明显超出合理范围的异常值,模型效果将大打折扣。用好Pandas做Eval,可以让你在10分钟内识别出90%的数据质量问题。


Pandas做Eval评估的核心逻辑与工具

Pandas作为Python最成熟的数据处理库,其内建函数足以完成90%的数据质量评估任务,核心工具包括:

  • .info() / .describe():快速了解数据结构与统计摘要
  • .isnull().sum():缺失值统计
  • .duplicated():重复行检测
  • .quantile() / IQR法:异常值识别
  • .value_counts(normalize=True):类别分布
  • .corr():相关性矩阵

但如果你要自动化、批量地实现Eval评估,就需要编写一个eval_data()函数,一次性返回所有关键质量指标,并生成一份可读的报告。


案例场景与数据集构造

假设我们有某电商平台的订单数据(order_data.csv),包含以下字段:

  • order_id:订单唯一标识
  • user_id:用户ID
  • amount:订单金额
  • order_date:下单日期
  • status:订单状态(pending、shipped、cancelled)
  • product_category:商品品类(electronics、clothing、home、books)

我们将用Pandas模拟一份包含缺失、异常值、重复行的脏数据,并对其做完整的Eval评估。

import pandas as pd
import numpy as np
# 构造模拟数据
np.random.seed(42)
n = 1000
data = {
    'order_id': range(1, n+1),
    'user_id': np.random.choice(range(1000, 5000), n),
    'amount': np.round(np.random.exponential(scale=200, size=n) + 50, 2),
    'order_date': pd.date_range('2024-01-01', periods=n, freq='H'),
    'status': np.random.choice(['pending', 'shipped', 'cancelled'], n, p=[0.3, 0.5, 0.2]),
    'product_category': np.random.choice(['electronics', 'clothing', 'home', 'books'], n, p=[0.4, 0.3, 0.2, 0.1])
}
df = pd.DataFrame(data)
# 故意加入脏数据
# 插入缺失值
df.loc[10:20, 'amount'] = np.nan
df.loc[50:55, 'status'] = None
# 插入异常值(金额>5000)
df.loc[100, 'amount'] = 99999
df.loc[200, 'amount'] = -50
# 插入重复行
df = pd.concat([df, df.iloc[0:5]], ignore_index=True)
print(f"原始数据集形状: {df.shape}")

逐步实现:数据加载、清洗、评估与报告生成

1 基础信息检测

def basic_info(df):
    print("=== 数据集基本信息 ===")
    print(f"行数: {df.shape[0]}, 列数: {df.shape[1]}")
    print(f"内存占用: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB")
    print("-" * 50)
    print(df.info(verbose=False))
    print("-" * 50)
    print(df.describe(include='all').T)

2 缺失值评估

def missing_eval(df):
    missing = df.isnull().sum()
    missing_pct = (missing / len(df)) * 100
    missing_df = pd.DataFrame({
        '缺失数量': missing,
        '缺失百分比(%)': np.round(missing_pct, 2)
    })
    missing_df = missing_df[missing_df['缺失数量'] > 0].sort_values(by='缺失百分比(%)', ascending=False)
    print("=== 缺失值评估 ===")
    if missing_df.empty:
        print("✅ 数据集中没有缺失值")
    else:
        print(missing_df)
    return missing_df

3 重复值检测

def duplicate_eval(df):
    total_dup = df.duplicated().sum()
    subset_dup = df.duplicated(subset=['order_id']).sum()
    print("=== 重复值评估 ===")
    print(f"完全重复行: {total_dup}")
    print(f"order_id列重复: {subset_dup}")
    if total_dup > 0:
        print("⚠️ 建议处理重复行")
    else:
        print("✅ 无重复行")

4 异常值检测(IQR法 + 业务规则)

def outlier_eval(df, numeric_cols):
    print("=== 异常值评估 (IQR法) ===")
    for col in numeric_cols:
        if df[col].dtype in ['int64', 'float64'] and df[col].notna().sum() > 0:
            Q1 = df[col].quantile(0.25)
            Q3 = df[col].quantile(0.75)
            IQR = Q3 - Q1
            lower = Q1 - 1.5 * IQR
            upper = Q3 + 1.5 * IQR
            outliers = df[(df[col] < lower) | (df[col] > upper)][col]
            print(f"{col}: 下界={lower:.2f}, 上界={upper:.2f}, 异常值数量={len(outliers)}")
            # 业务规则:金额不能为负
            neg_count = (df[col] < 0).sum()
            if neg_count > 0:
                print(f"   ⚠️ {col}存在{neg_count}个负值,可能为异常")

5 类别平衡性评估

def category_eval(df, cat_cols):
    print("=== 类别字段分布评估 ===")
    for col in cat_cols:
        if df[col].dtype == 'object' or df[col].dtype.name == 'category':
            print(f"\n字段: {col}")
            val_counts = df[col].value_counts(normalize=True) * 100
            print(val_counts.round(2).to_string())
            # 检测是否严重不平衡(某一类占比>90%)
            if val_counts.max() > 90:
                print("   ⚠️ 该字段存在严重不平衡情况")

6 综合Eval报告生成

def full_eval_report(df, cat_cols=None, numeric_cols=None):
    print("="*60)
    print("📊 数据质量Eval评估报告")
    print("="*60)
    basic_info(df)
    print("\n")
    missing_eval(df)
    print("\n")
    duplicate_eval(df)
    print("\n")
    if numeric_cols is None:
        numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist()
    outlier_eval(df, numeric_cols)
    print("\n")
    if cat_cols is None:
        cat_cols = df.select_dtypes(include=['object', 'category']).columns.tolist()
    category_eval(df, cat_cols)
    print("\n" + "="*60)
    print("✅ Eval评估完成")

自动生成Eval评估报告的代码实战

现在我们直接在模拟数据集上运行全流程评估:

# 运行完整Eval评估
full_eval_report(df)
# 输出示例(部分截取):
# 📊 数据质量Eval评估报告
# ============================================================
# === 数据集基本信息 ===
# 行数: 1005, 列数: 6
# === 缺失值评估 ===
# status  缺失数量: 6, 缺失百分比(%): 0.60
# amount  缺失数量: 11, 缺失百分比(%): 1.09
# === 重复值评估 ===
# 完全重复行: 5
# order_id列重复: 5
# === 异常值评估 (IQR法) ===
# amount: 下界=-214.94, 上界=515.02, 异常值数量=43
#    ⚠️ amount存在1个负值
# === 类别字段分布评估 ===
# 字段: status: shipped 50.15%, pending 29.85%
# product_category: electronics 39.70%, clothing 30.65%

问答环节:你可能会遇到的5个高频问题

Q1:Eval评估和EDA(探索性数据分析)有什么区别?

A:Eval评估是EDA的子集,主要聚焦于数据质量检测(缺失、异常、重复、类型错误),EDA更广泛,还包含统计分布、可视化发现、特征关系等。简单说:Eval检查“数据是否干净”,EDA探索“数据有什么故事”。

Q2:如果数据量很大(几十万行),用Pandas做Eval会慢吗?

A:Pandas的.info().describe()处理百万行数据也很快(毫秒级),但duplicated()value_counts()在大数据集上会稍慢,建议:先用.sample()抽样快速评估,再对全量数据执行关键检测,另外可以启用pandas.set_option('display.max_rows', None)避免显示截断。

Q3:异常值检测为什么推荐IQR法?

A:IQR法不假设数据为正态分布,对于大多数业务数据(如金额、时长)更稳健,相比之下,标准差法(Z-score)对极端值敏感,且要求数据近似正态。但需注意:IQR法在数据极度偏态或存在大量相同值时效果会打折扣。

Q4:Eval评估后如何自动生成可视化报告?

A:可以结合matplotlibseaborn绘制缺失值热图、异常值箱线图、类别分布柱状图,更高级的做法是使用pandas-profiling(现在叫ydata-profiling)一键生成HTML报告,涵盖所有Eval指标。

# pip install ydata-profiling
from ydata_profiling import ProfileReport
profile = ProfileReport(df, title="数据质量评估报告")
profile.to_file("eval_report.html")

Q5:如果我在Eval中发现大量缺失值,应该怎么处理?

A:建议分级处理:

  • 缺失<5%:直接删除或填充中位数/众数
  • 缺失5%-30%:尝试用SimpleImputer或模型预测填充
  • 缺失>30%:考虑删除该特征,或将其转为“是否缺失”的新特征(isnull列) 重要:先分析缺失机制(随机缺失/非随机缺失)再决定处理方法。

总结与最佳实践建议

通过真实案例可以看到,用Pandas做数据质量Eval评估只需要不到20行核心代码,就能完成以下关键检测:

评估维度 使用工具 关键输出
基础信息 .info() 类型、内存、非空计数
缺失值 .isnull().sum() 缺失数量与百分比
重复值 .duplicated() 完全/部分重复行数
异常值 IQR法 + 业务规则 异常数量与边界
类别平衡 .value_counts() 各分类占比
分布形态 .describe() 均值、标准差、分位数

最佳实践建议:

  1. 将Eval评估函数化,封装成eval_pipeline(),在不同数据集上复用
  2. 设置质量阈值:例如缺失>20%自动报警,异常值>5%标记为高风险
  3. 保留Eval日志:每次评估后记录时间、数据集版本、发现问题个数
  4. 结合可视化:缺失热图 + 箱线图 + 分布直方图是标配三件套
  5. 持续监控:对于定期更新的数据管道,将Eval评估嵌入到ETL流程中

掌握了Pandas的Eval评估能力,你就能在数据分析的第一步就牢牢把控数据质量,为后续建模和洞察打下坚实基础,现在就打开你的Python环境,动手试试这个实战案例吧!


文章首发于数据分析学习社区,欢迎转载分享(保留出处:Python数据清洗实战系列)

抱歉,评论功能暂时关闭!