暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

LendingClub数据的分析建模(一)

loulou分享 2020-06-22
1574

    全系列过程谢谢杨总引入门,自己兴趣所在,分享了出来。文章中所涉及代码无隐私问题,量比较多(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数据文件、字典文件),外网网速太慢,我传到自己百度网盘,如下:

    

链接:https://pan.baidu.com/s/1jbeDH8uIPGFIIQkrTyNf8g
提取码:akk4

      翻译数据字典:数据字典字段名,均有对应的英文介绍,通过部分中文网站也能获取到翻译名,由于一个字段的字面理解从字典看永远不够,建议大家先翻译,不准确或者生硬的字段,去查阅美国信贷的名词介绍即可。LC的数据库表,是合并处理过的数据,类似共同借款人、困难计划等设计从原始是分表的,还有贷前申请也是分表的。投资人信息、二级申请人等都是独立表分离的。这里是整合后的数据。翻译初稿见wps云:

https://kdocs.cn/l/swpsV6tPK

[金山文档] LCDataDictionary.xlsx


     python环境:熟悉python语法,至少能读懂。类、装饰器等使用不多。

若需要运行代码,安装下pycharm,网上找个永久破解,学习用,若有正规开发,还是建议官方购买下。注意部分网络有防火墙,影响破解。版本如下:


     新建工程:工程环境无所限制,引入requirements.txt,执行以下命令,安装所需库,部分库需要国外连接。requirements.txt在百度网盘有:

    

链接:https://pan.baidu.com/s/1Fs6qKsv3TcVgYLq5i15kdw
提取码:3s3k
    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应用、数据分析四个方面的能力,有思维、有动作、

        有结果,不断循环找个过程,能看到能做到的事会越来越多。


        复制
        文章转载自loulou分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论