全系列过程谢谢杨总引入门,自己兴趣所在,分享了出来。文章中所涉及代码无隐私问题,量比较多(700多行,分6个模块),且逐步在调整结构,优化逻辑处理,代码逐步放出来。
有思维、有动作、有结果
Lending club之所以一度成为全球p2p行业老大的地位得益于其风控系统,不过中美信用体系,金融行业发展程度相差很大,lending club在交易中只充当交易平台,风险由投资者自己承担,lending club 利用其风控系统一度将坏账控制在很小的比例,其实由于模式之差,有参考的意义,并不能完全依赖。该信贷数据曾作为kaggle比赛参考数据,题目为建立信贷违约预测模型。以下为LC的审批流程。
关于Lending club数据的分析,我将从准备工作、获取数据及数据筛选、数据画像PPT、特征探索、特征字段业务分析、数据清洗及预处理、特征衍生、建模八个步骤对数据进行处理,主要的语言为python。
一、准备工作
下载:登录https://www.kaggle.com/wendykan/lending-club-loan-data,下载最新的数据,网页有下载包的介绍。如下图,图示中标红为该数据配套信息。大小2.33GB,三个文件(sqlite数据库文件、csv数据文件、字典文件),外网网速太慢,我传到自己百度网盘,如下:
翻译数据字典:数据字典字段名,均有对应的英文介绍,通过部分中文网站也能获取到翻译名,由于一个字段的字面理解从字典看永远不够,建议大家先翻译,不准确或者生硬的字段,去查阅美国信贷的名词介绍即可。LC的数据库表,是合并处理过的数据,类似共同借款人、困难计划等设计从原始是分表的,还有贷前申请也是分表的。投资人信息、二级申请人等都是独立表分离的。这里是整合后的数据。翻译初稿见wps云:
[金山文档] LCDataDictionary.xlsx
python环境:熟悉python语法,至少能读懂。类、装饰器等使用不多。
若需要运行代码,安装下pycharm,网上找个永久破解,学习用,若有正规开发,还是建议官方购买下。注意部分网络有防火墙,影响破解。版本如下:
新建工程:工程环境无所限制,引入requirements.txt,执行以下命令,安装所需库,部分库需要国外连接。requirements.txt在百度网盘有:
pip install -r requirements.txt
复制
二、获取数据及数据筛选
以下为第一部分的代码,主要头部结构如下:相关库引入、公共参数设置、阶段设置、字典表挂载。支持阶段顺序进行,同时支持各阶段直接跳入进行。
# coding:utf-8
import sys
import pandas as pd
import numpy as np
import os,time
from pathlib import Path
from datetime import datetime
import matplotlib.pyplot as plt
import seaborn as sns
import ofun.o_utils as o_utils
import math
import reportgen as rpt
from wordcloud import WordCloud
import sklearn
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score,roc_curve
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from statsmodels.stats.outliers_influence import variance_inflation_factor as vif
import statsmodels.api as sm
from scipy.stats import mode
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号,#有中文出现的情况,需要u'内容'
# plt.rcParams.update({'figure.max_open_warning': 0})
# 显示设置
np.set_printoptions(threshold=sys.maxsize) # 这个参数填的是你想要多少行显示
np.set_printoptions(linewidth=50000) # 这个参数填的是横向多宽
pd.set_option('display.max_columns', 50000)
pd.set_option('display.max_rows', 50000)
pd.set_option('display.width', 50000) # 影响显示
pd.set_option('display.max_colwidth', 50000)
start_time = time.process_time()
# stage = ['loadFile','dataanyla','dataFilter','dataClrAndPre','genFeatures'] # dataPPT (可选)
stage = ['loadFile','dataanyla','dataFilter','dataClrAndPre']
print("一:课题分析:构造一个简单明了的传统信贷申请评分卡(A卡),和一个解释性较差的黑箱预测模型,用于辅助决策")
disk_file='F:/jcbank青干班/D11/34_1110834_bundle_archive/LCDataDictionary.xlsx'
disk = pd.read_excel(disk_file,sheet_name='LoanStats')
data_disc = dict(zip(disk['LoanStatNew'],disk['LoanStatNew_trans']))
data = None
file = "lc_2016-2018.pkl"
file_test = "lc_test_2016-2018.pkl"
file_vail = "lc_vail_2016-2018.pkl"
file_train = "lc_train_2016-2018.pkl"
df_list = []
if(Path(file).exists()):
df = pd.read_pickle(file)
df_list.append(df)
if (Path(file_test).exists()):
df_test = pd.read_pickle(file_test)
df_list.append(df_test)
if (Path(file_vail).exists()):
df_vail = pd.read_pickle(file_vail)
df_list.append(df_vail)
if (Path(file_train).exists()):
df_train = pd.read_pickle(file_train)
df_list.append(df_train)
# df_list = [df, df_test, df_vail, df_train]
print("loadFile" + str(df_train.shape))
复制
第二部分代码:该部分主要以数据装载、根据时间进行分段筛选,代码中为2016-2018三年的数据为主,同时进行特征扩展,将贷款状态进行分类转换及数值化,同时to_pickle以文件形式固化该部分数据。
'''
二:数据获取
'''
# 根据贷款状态 ‘loan_status’ 定义好坏贷款
bad_loan = ["Charged Off",
"Default",
"Does not meet the credit policy. Status:Charged Off",
"In Grace Period",
"Late (16-30 days)",
"Late (31-120 days)"]
def loan_condition(status):
if status in bad_loan:
return 'Bad Loan'
else:
return 'Good Loan'
if 'loadFile' in stage:
print("二:数据获取:")
afile='D:/workspace/python3/OupFlask/apps/lc/data/loan.csv'
data = pd.read_csv(afile,low_memory=False)
print(data.info())
print(o_utils.get_bp(2) + "1)、数据分拆: issue_d(2016-2018年)")
# print(df['issue_d'].value_counts) #过滤字段 值初评估
dt_series = pd.to_datetime(data['issue_d']) # 将 ‘issue_d’ str形式的时间日期转换
data['year'] = dt_series.dt.year
data['month'] = dt_series.dt.month
df = data[(data[u'year'] >= 2016) & (data[u'year'] <= 2018)] # 过滤
df.loc[:, 'loan_condition'] = np.nan # 初始化字段
df.loc[:, 'loan_condition'] = df['loan_status'].apply(loan_condition)
df.loc[:, 'loan_condition_int'] = np.nan # 初始化字段
lst = [df]
for col in lst:
col.loc[df['loan_condition'] == 'Good Loan', 'loan_condition_int'] = 0 # Negative (Bad Loan)
col.loc[df['loan_condition'] == 'Bad Loan', 'loan_condition_int'] = 1 # Positive (Good Loan)
df.loc[:, 'loan_condition_int'] = df['loan_condition_int'].astype(int)
print(df.info())
df.to_pickle(file)
# badloanDf = df[df['loan_condition'] == 'Bad Loan'] # 整理出坏账数据
复制
这是python应用的一个场景,同时提升我们了解业务、分析建模、
python应用、数据分析四个方面的能力,有思维、有动作、
有结果,不断循环找个过程,能看到能做到的事会越来越多。
复制