贷款预测--12种pandas数据分析技巧

本文介绍了一个贷款预测项目的全过程,从数据加载到预处理,包括缺失值处理、数据类型转换、特征工程等步骤,展示了Pandas在数据分析中的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一次偶然的机会在知乎上发现了Analytics vidhya这个网站,对将要实习的我来说简直是如获至宝。网站中关于数据分析的方法和案例都有很详细的说明。通过浏览网页,我决定第一个项目从贷款预测入手,巩固一下pandas的基础。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv("C:\\Users\\lixiao\\Downloads\\train.csv",index_col="Loan_ID")
print(data)

在这里插入图片描述
1.根据所需条件过滤列中的值
pandas布尔索引的区别:
iloc,即index locate 用index索引进行定位,所以参数是整型,如:df.iloc[10:20, 3:5]
loc,通过label 名称来过滤,可使用column名和index名进行定位,如:df.loc[‘image1’:‘image10’, ‘age’:‘score’]

条件:获得没有毕业并获得贷款的所有女性的名单

df = data.loc[(data["Gender"]=="Female")&(data["Education"]=="Not Graduate")&(data["Loan_Status"]=="Y"),["Gender","Education","Loan_Status"]]
print(df)

在这里插入图片描述
2.apply应用功能
**apply是播放数据和创建新变量的常用函数之一。在使用某个函数传递数据框的每一行/列后,Apply返回一些值。**该功能可以是默认功能,也可以是用户定义的功能。
例如,这里可以用它来查找每行和每列中的#missing值。

def num_missing(x):
  return sum(x.isnull())

print("Missing values per column:")
print(data.apply(num_missing, axis=0))

print("\nMissing values per row:")
print(data.apply(num_missing, axis=1).head())#head()函数用于第二个输出,因为它包含许多行

在这里插入图片描述在这里插入图片描述
3.更新缺失值
’fillna()用于使用列的总体平均值/模式/中值更新缺失值。

#填写LoanAmount缺失值
data['Gender'].fillna(data['Gender'].mode()[0], inplace=True)
data['Married'].fillna(data['Married'].mode()[0], inplace=True)
data['Self_Employed'].fillna(data['Self_Employed'].mode()[0], inplace=True)
#检查确认缺失值:
print(data.apply(num_missing, axis=0))

在这里插入图片描述
由运行结果即可确认了缺失值被估算
4.数据透视表
Pandas可用于创建Excel样式数据透视表。
例如,在这种情况下,键列是“LoanAmount”,它具有缺失值。我们可以使用每个“性别”,“已婚”和“自我雇佣”组的平均数量来估算它。每组的平均’LoanAmount’可以确定。

impute_grps = data.pivot_table(values=["LoanAmount"], index=["Gender","Married","Self_Employed"], aggfunc=np.mean)
print(impute_grps)

在这里插入图片描述

5.多索引
每个索引由3个值组合而成。这称为多索引。它有助于快速执行操作。
再次检查得到了每个组的缺失值,但它们没有被估算。
注意:
1)多索引需要元组来定义loc语句中的索引组。这是一个功能中使用的元组。
2) .values[0]后缀是必需的,因为默认情况下返回的系列元素的索引与数据帧的索引不匹配。

for i,row in data.loc[data['LoanAmount'].isnull(),:].iterrows():
  ind = tuple([row['Gender'],row['Married'],row['Self_Employed']])
  data.loc[i,'LoanAmount'] = impute_grps.loc[ind].values[0]
print(data.apply(num_missing, axis=0))

在这里插入图片描述
6.交叉表
此函数用于获取数据的初始视图。在这里,我们可以验证一些基本假设。
例如,在这种情况下,“Credit_History”预计会显着影响贷款状态。
这可以使用交叉制表进行测试。

print(pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True))
# 这些是绝对数字。但是,百分比可以更直观地提供一些快速见解。
# 我们可以使用apply函数执行此操作:
def percConvert(ser):
  return ser/float(ser[-1])
print(pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True).apply(percConvert, axis=1))

在这里插入图片描述在这里插入图片描述
7.合并DataFrames
当我们收集来自不同来源的信息进行整理时,合并数据框架变得至关重要

prop_rates = pd.DataFrame([1000, 5000, 12000], index=['Rural', 'Semiurban', 'Urban'], columns=['rates'])
print(prop_rates)

在这里插入图片描述
数据透视表验证成功的合并操作。
注意:'values’参数在这里是无关紧要的,因为我们只是计算值。

data_merged = data.merge(right=prop_rates, how='inner',left_on='Property_Area',right_index=True, sort=False)
print(data_merged.pivot_table(values='Credit_History',index=['Property_Area','rates'], aggfunc=len))

在这里插入图片描述
8.对DataFrame进行排序–Pandas允许基于多个列轻松排序
注意:Pandas“sort”函数现已弃用。我们应该使用“sort_values”代替。

data_sorted = data.sort_values(['ApplicantIncome','CoapplicantIncome'], ascending=False)
print(data_sorted[['ApplicantIncome','CoapplicantIncome']].head(10))

在这里插入图片描述
9.绘图–箱形图和直方图
许多人可能不知道箱形图和直方图可以直接在Pandas中绘制,并且不需要单独调用matplotlib。这只是一个命令。例如,如果我们想要比较Loan_Status的ApplicantIncome分布:

s1=data.boxplot(column="ApplicantIncome",by="Loan_Status")
plt.show()
s2=data.hist(column="ApplicantIncome",by="Loan_Status",bins=30)
plt.show()

在这里插入图片描述
在这里插入图片描述
10.用于分箱的剪切功能
**定义了一个简单的函数Binning,**可以很容易地重用它来对任何变量进行分箱

def binning(col, cut_points, labels=None):
  #定义最大最小值:
  minval = col.min()
  maxval = col.max()

  #create list by adding min and max to cut_points
  break_points = [minval] + cut_points + [maxval]

  #if no labels provided, use default labels 0 ... (n-1)
  if not labels:
    labels = range(len(cut_points)+1)

  #Binning using cut function of pandas
  colBin = pd.cut(col,bins=break_points,labels=labels,include_lowest=True)
  return colBin

#Binning age:
cut_points = [90,140,190]
labels = ["low","medium","high","very high"]
data["LoanAmount_Bin"] = binning(data["LoanAmount"], cut_points, labels)
print(pd.value_counts(data["LoanAmount_Bin"], sort=False))

在这里插入图片描述
11.编码名义数据
通常,我们会发现一个案例,我们要修改名义变量的类别。这可能是由于各种原因:
某些算法(如Logistic回归)要求所有输入都是数字。所以名义变量大多编码为0,1 …(n-1)有时,类别可能以两种方式表示。例如,温度可记录为“高”,“中”,“低”,“H”,“低”。这里,“高”和“H”都指相同的类别。类似地,在“低”和“低”中仅存在差异。但是,python会将它们视为不同的级别。某些类别可能具有非常低的频率,并且通常将它们组合起来。
在此定义了一个泛型函数,它将输入作为字典并使用Pandas中的’replace’函数对值进行编码。

def coding(col, codeDict):
  colCoded = pd.Series(col, copy=True)
  for key, value in codeDict.items():
    colCoded.replace(key, value, inplace=True)
  return colCoded

12.迭代数据帧的行
有时可能需要使用for循环遍历所有行。例如,我们面临的一个常见问题是Python中对变量的错误处理。这通常发生在: 具有数字类别的标称变量被视为数字。
在其中一行中输入字符的数字变量(由于数据错误)被视为分类。
因此,手动定义列类型通常是个好主意。如果我们检查所有列的数据类型

print('Before Coding:')
print(pd.value_counts(data["Loan_Status"]))
data["Loan_Status_Coded"] = coding(data["Loan_Status"], {'N': 0, 'Y': 1})
print('\nAfter Coding:')
print(pd.value_counts(data["Loan_Status_Coded"]))
print(data.dtypes)

在这里插入图片描述
在这里,我们看到Credit_History是名义变量,但看起来像浮点数。
解决此类问题的一种好方法是创建一个包含列名和类型的csv文件。这样,我们可以创建一个通用函数来读取文件并分配列数据类型。例如,这里我创建了一个csv文件:

colTypes = pd.read_csv('C:\\Users\\lixiao\\Desktop\\datatypes.csv')
print(colTypes)

在这里插入图片描述
加载此文件后,我们可以遍历每一行,并使用“type”列将数据类型分配给“feature”列中定义的变量名称。

for i, row in colTypes.iterrows():  #i: dataframe index; row: each row in series format
    if row['type']=="categorical":
        data[row['feature']]=data[row['feature']].astype(np.object)
    elif row['type']=="continuous":
        data[row['feature']]=data[row['feature']].astype(np.float)
 print(data.dtypes)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值