如何将单pandas列的IV计算函数扩展为多列批量处理函数
IV计算函数批量改造方案
本次改造完全保留原有单特征IV的计算逻辑,仅在函数入口增加入参类型识别能力,同时兼容单特征、多特征列表两种调用形式,无需重复手动逐次调用。
改造核心逻辑
- 入口处判断第二个入参的类型:如果是字符串格式,直接走原有单特征计算逻辑,返回单个IV数值,完全不改变原有使用习惯
- 如果检测到入参是存储列名的列表/可迭代序列,自动循环遍历每个特征调用单特征计算分支,最终汇总为带
Column、IV两列的DataFrame返回,匹配预期输出格式
改造后完整代码
import pandas as pd import numpy as np def get_IV(df, feature, target): # 多特征入参分支:批量计算并返回DataFrame结果 if not isinstance(feature, str): result = [] for col in feature: col_iv = get_IV(df, col, target) result.append([col, col_iv]) return pd.DataFrame(result, columns=['Column', 'IV']) # 以下为完全保留的原有单特征计算逻辑 lst = [] unique_values = df[feature].unique() for val in unique_values: lst.append([ feature, val, df[(df[feature] == val) & (df[target] == 0)].count()[feature], df[(df[feature] == val) & (df[target] == 1)].count()[feature] ]) data = pd.DataFrame(lst, columns=['Variable', 'Value', 'Good', 'Bad']) total_bad = df[df[target] == 1].count()[feature] total_good = df.shape[0] - total_bad data['Distribution Good'] = data['Good']/ total_good data['Distribution Bad'] = data['Bad'] / total_bad data['WoE'] = np.log(data['Distribution Good'] / data['Distribution Bad']) data = data.replace({'WoE': {np.inf: 0, -np.inf: 0}}) data['IV'] = data['WoE'] * (data['Distribution Good'] - data['Distribution Bad']) data = data.sort_values(by=['Variable', 'Value'], ascending=[True, True]) data.index = range(len(data.index)) iv = data['IV'].sum() return iv
调用示例
多特征批量计算场景
直接传入存储列名的列表即可,无需循环手动调用:cols = ['Column1', 'Column2', 'Column100'] iv_result = get_IV(data, cols, 'Label')输出结果严格匹配预期格式:
Column IV Column1 0.00035 Column2 0.01085 Column100 0.01281 原有单特征调用兼容
改造后的函数完全支持原有的单特征传参方式,返回值和改造前完全一致,不会破坏已有代码的运行逻辑:single_iv = get_IV(data, 'Column1', 'Label')
改造说明
- 对原有代码的改动量极小,仅在函数开头增加了多特征判断的分支,没有修改任何单特征IV的计算逻辑,保证计算结果和原函数完全一致
- 不需要额外编写单独的批量计算函数,所有逻辑统一封装在
get_IV内部,降低后续代码维护成本 - 自动适配入参类型,不需要为不同计算场景切换不同函数
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

