##1,读取文件,并进行初步筛选去重
import pandas as pd
from IPython.display import display
corp_eva7 = pd.read_excel('/home/dev/桌面/官方数据表/zhubiao.xlsx')
# corp_eva7['flag'] = corp_eva7['财报年份标签']
# 财报年份标签
fenxiang = corp_eva7[[
xxxx___
]]
#print(fenxiang)
##2,检查字段空值,排除掉空值率高于80%的字段,# 排除area,金额,投资方字段
# 使用isnull()方法检查空值
null_distribution = fenxiang.isnull().sum()
# 打印每个字段的空值分布情况
print(null_distribution)
# 查看数值字段的分布情况
numeric_columns = fenxiang.select_dtypes(include=['number'])
for column in numeric_columns.columns:
print(f"字段:{column}")
print(fenxiang[column].value_counts())
fenxiang[column].plot(kind='hist', bins=20)
##3,先处理连续型变量,对数据进行分箱,先处理离群值,然后计算均值与标准差,按照极差除于10进行分箱,分为10个箱体
import pandas as pd
# 获取分箱
# 读取文件到DataFrame
binned_data = fenxiang
# 选择数值型字段
numeric_columns = binned_data.select_dtypes(include=['number'])
# 遍历每个数值型字段进行分箱处理
for column in numeric_columns.columns:
# 计算每个字段的最大值和最小值
min_value = binned_data[column].min()
max_value = binned_data[column].max()
# 计算均值和标准差
mean = binned_data[column].mean()
std_dev = binned_data[column].std()
# 定义异常值阈值(例如,超过平均值2个标准差的被定义为异常值)
outlier_threshold = 2 * std_dev
# 删除异常值
data = binned_data[(binned_data[column] >= mean - outlier_threshold) &
(binned_data[column] <= mean + outlier_threshold)]
# 计算每个分箱的宽度
bin_width = (max_value - min_value) / 10
# 使用Cut函数进行分箱处理
bins = [min_value + i * bin_width for i in range(11)]
binned_data[f'{column}_bins'] = pd.cut(binned_data[column], bins, labels=False,
include_lowest=True, right=True)
# 打印已经分箱处理的DataFrame
print(binned_data)
##4,拼接负样本标签字段到处理后的表中
df2 = corp_eva7['负样本标签']
filtered_columns.index = df2.index
# 拼接数据框
df1_cm = pd.concat([filtered_columns, df2], axis=1)
#print(df1_cm['负样本标签'])
##5,计算连续型字段的数据的WOE值和IV值
import pandas as pd
import numpy as np
# 创建一个DataFrame来存储每个变量的WOE值,好客户数目和坏客户数目以及IV值
woe_df = pd.DataFrame(columns=['Field', 'Bin', 'WOE', 'Good', 'Bad', 'IV'])
# 计算整体好坏比
total_good = df1_cm['负样本标签'].sum()
total_bad = len(df1_cm) - total_good
# 遍历每个字段,计算每个字段的WOE值,好客户数目和坏客户数目以及IV值
for col in df1_cm.columns[:-1]: # 排除最后一个字段
if col.endswith('_bins'): # 如果字段名以_bins结尾
woe_col = col + '_woe'
iv = 0 # 初始化IV值
for bin_value in sorted(df1_cm[col].uniq