建立信用评分模型

article/2025/8/3 11:35:00

读取数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression as LR
from sklearn.ensemble import RandomForestRegressor as rfr
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
%matplotlib inline
data=pd.read_csv('./ch17_cs_training.csv')
data.head()

观察数据

data.info()

在这里插入图片描述

试探性去除重复值,看看数据量是否减少,减少则有重复值,并已去除

data.drop_duplicates(inplace=True) 
data.info()

在这里插入图片描述

恢复索引,并探索缺失值比例

data.reset_index(inplace=True,drop=True)   
data.isnull().mean() 

在这里插入图片描述

由上可知,家属人数缺失值较少,可直接用均值替换缺失值

data['NumberOfDependents'].fillna(data['NumberOfDependents'].mean(),inplace=True) 

由上上可知,月收入缺失值较大,可使用随机森林补充缺失值

def fill_missing_rf(X,y,to_fill):"""使用随机森林填补一个特征的缺失值的函数参数:X:要填补的特征矩阵y:没有缺失值的那部分数据所对应的标签to_fill:要填补的特征"""#构建新特征矩阵和新标签df = X.copy()fill = df.loc[:,to_fill]df = pd.concat([df.loc[:,df.columns != to_fill],pd.DataFrame(y)],axis=1)# 找出我们的训练集和测试集Ytrain = fill[fill.notnull()]Ytest = fill[fill.isnull()]Xtrain = df.iloc[Ytrain.index,:]Xtest = df.iloc[Ytest.index,:]#用随机森林回归来填补缺失值from sklearn.ensemble import RandomForestRegressor as rfrrfr = rfr(n_estimators=100)rfr = rfr.fit(Xtrain, Ytrain)Y_predict = rfr.predict(Xtest)return  Y_predict  X = data.iloc[:,1:] 
y = data.iloc[:,0] 
# 把 X,y 和 含有缺失值的特征 to_fill带入定义好的函数里面
y_pred = fill_missing_rf(X,y,'MonthlyIncome') 
# 将预测的缺失值进行填补
data.loc[data.loc[:,'MonthlyIncome'].isnull(),'MonthlyIncome'] = y_pred 

缺失值补充完后,接下来是异常值处理

data.describe([0.01,0.1,0.25,0.5,0.75,0.9,0.99]).T 

在这里插入图片描述
在这里插入图片描述

观察到年龄的最小值为0,这不符合银行的业务需求,直接删掉

data = data[data["age"] != 0] 

继续观察有三个指标看起来很奇怪:

“NumberOfTime30-59DaysPastDueNotWorse”
“NumberOfTime60-89DaysPastDueNotWorse”
“NumberOfTimes90DaysLate”
这三个指标分别是“过去两年内出现35-59天逾期但是没有发展的更坏的次数”,“过去两年内出现60-89天逾期但是没
有发展的更坏的次数”,“过去两年内出现90天逾期的次数”。这三个指标,在99%的分布的时候依然是2,最大值却是
98,看起来很不正常。

data[data.loc[:,"NumberOfTimes90DaysLate"] > 90].count() 

不对劲,接着判断

有225个样本存在这样的情况,并且这些样本,我们观察一下,标签并不都是1,他们并不都是坏客户这显然是不正常的。
因此,我们基本可以判断,这些样本是某种异常,应该把它们删除。

data = data[data.loc[:,'NumberOfTimes90DaysLate']<90]  

检测

data.describe([0.01,0.1,0.25,0.5,0.75,0.9,0.99]).T 

在这里插入图片描述

恢复索引,并探索标签的分布

data.reset_index(inplace=True,drop=True) 
X = data.iloc[:,1:] 
y = data.iloc[:,0]
# y.value_counts() 
sns.countplot(x="SeriousDlqin2yrs", data=data) 
n_1_sample = y.value_counts()[1]
n_0_sample = y.value_counts()[0] 
print('样本个数:{};1占{:.2%};0占{:.2%}'.format(len(y),n_1_sample/len(y),n_0_sample/len(y)))  

在这里插入图片描述

数据不平衡,让它平衡

#在逻辑回归中,使用最多的是上采样法SMOTE进行 样本均衡import imblearn
#imblearn是专门用来处理不平衡数据集的库,在处理样本不均衡问题中性能高过sklearn很多
#imblearn里面也是一个个的类,也需要进行实例化,fit拟合,和sklearn用法相似
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42) #实例化
X,y = sm.fit_resample(X,y) #返回已经上采样完毕后的特征矩阵和标签
n_sample_ = X.shape[0]
n_1_sample = pd.Series(y).value_counts()[1]
n_0_sample = pd.Series(y).value_counts()[0]
print('样本个数:{}; 1占{:.2%}; 0占{:.2%}'.format(n_sample_,n_1_sample/n_sample_,n_0_sample/n_sample_)) 

训练数据构建模型

from sklearn.model_selection import train_test_split
X = pd.DataFrame(X)
y = pd.DataFrame(y)X_train, X_vali, Y_train, Y_vali = train_test_split(X,y,test_size=0.3,random_state=420) 
model_data = pd.concat([Y_train, X_train], axis=1)
model_data.reset_index(drop=True,inplace=True)
model_data.columns = data.columns

在这里插入图片描述

划分训练集和验证集

vali_data = pd.concat([Y_vali, X_vali], axis=1)
vali_data.reset_index(drop=True,inplace=True) 
vali_data.columns = data.columns
model_data.to_csv(r'.\model_data.csv')
vali_data.to_csv(r'.\vali_data.csv')

分析训练集

import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
df=pd.read_csv(r'.\model_data.csv', index_col = 0)
df.index.name = 'ID'
states={'SeriousDlqin2yrs':'好坏客户','RevolvingUtilizationOfUnsecuredLines':'可用额度比值','age':'年龄','NumberOfTime30-59DaysPastDueNotWorse':'逾期30-59天笔数','DebtRatio':'负债率','MonthlyIncome':'月收入','NumberOfOpenCreditLinesAndLoans':'信贷数量','NumberOfTimes90DaysLate':'逾期90天笔数','NumberRealEstateLoansOrLines':'固定资产贷款量','NumberOfTime60-89DaysPastDueNotWorse':'逾期60-89天笔数','NumberOfDependents':'家属数量'}
df.rename(columns=states,inplace=True)
df.head()

在这里插入图片描述

单变量分析

age_cut=pd.cut(df['年龄'],5)
age_cut_group=df['好坏客户'].groupby(age_cut).count()
age_cut_grouped1=df["好坏客户"].groupby(age_cut).sum()
df2=pd.merge(pd.DataFrame(age_cut_group),pd.DataFrame(age_cut_grouped1),left_index=True,right_index=True)
df2.rename(columns={'好坏客户_x':'总客户数','好坏客户_y':'坏客户数'},inplace=True)
df2.insert(2,"好客户数",df2["总客户数"]-df2["坏客户数"])
df2.insert(2,"坏客户占比",df2["坏客户数"]/df2["总客户数"])
df2

在这里插入图片描述

坏客户率随年龄的变化趋势图

ax11=df2["坏客户占比"].plot(figsize=(10,5))
ax11.set_xticklabels([0,20,29,38,47,55,64,72,81,89,98,107])
ax11.set_ylabel("坏客户率")
ax11.set_title("坏客户率随年龄的变化趋势图")

在这里插入图片描述

多变量分析

import seaborn as sns
corr = df.corr()#计算各变量的相关性系数
xticks = list(corr.index)#x轴标签
yticks = list(corr.index)#y轴标签
fig = plt.figure(figsize=(15,10))
ax1 = fig.add_subplot(1, 1, 1)
sns.heatmap(corr, annot=True, cmap="rainbow",ax=ax1,linewidths=.5, annot_kws={'size': 9, 'weight': 'bold', 'color': 'blue'})
ax1.set_xticklabels(xticks, rotation=35, fontsize=15)
ax1.set_yticklabels(yticks, rotation=0, fontsize=15)
plt.show()

在这里插入图片描述

WOE分箱和WOE值计算

cut1=pd.qcut(df["可用额度比值"],4,labels=False)
cut2=pd.qcut(df["年龄"],8,labels=False)
bins3=[-1,0,1,3,5,13]
cut3=pd.cut(df["逾期30-59天笔数"],bins3,labels=False)
cut4=pd.qcut(df["负债率"],3,labels=False)
cut5=pd.qcut(df["月收入"],4,labels=False)
cut6=pd.qcut(df["信贷数量"],4,labels=False)
bins7=[-1, 0, 1, 3,5, 20]
cut7=pd.cut(df["逾期90天笔数"],bins7,labels=False)
bins8=[-1, 0,1,2, 3, 33]
cut8=pd.cut(df["固定资产贷款量"],bins8,labels=False)
bins9=[-1, 0, 1, 3, 12]
cut9=pd.cut(df["逾期60-89天笔数"],bins9,labels=False)
bins10=[-1, 0, 1, 2, 3, 5, 21]
cut10=pd.cut(df["家属数量"],bins10,labels=False)rate=df["好坏客户"].sum()/(df["好坏客户"].count()-df["好坏客户"].sum())
def get_woe_data(cut):grouped=df["好坏客户"].groupby(cut,as_index = True).value_counts()woe=np.log(grouped.unstack().iloc[:,1]/grouped.unstack().iloc[:,0]/rate)return woe
cut1_woe=get_woe_data(cut1)
cut2_woe=get_woe_data(cut2)
cut3_woe=get_woe_data(cut3)
cut4_woe=get_woe_data(cut4)
cut5_woe=get_woe_data(cut5)
cut6_woe=get_woe_data(cut6)
cut7_woe=get_woe_data(cut7)
cut8_woe=get_woe_data(cut8)
cut9_woe=get_woe_data(cut9)
cut10_woe=get_woe_data(cut10)

随便挑几个变量看下woe

可更改变量名来查看

# cut1_woe.plot.bar(color='b',alpha=0.3,rot=0)
# cut2_woe.plot.bar(color='b',alpha=0.3,rot=0)
cut3_woe.plot.bar(color='b',alpha=0.3,rot=0)

在这里插入图片描述

IV值计算

def get_IV_data(cut,cut_woe):grouped=df["好坏客户"].groupby(cut,as_index = True).value_counts()cut_IV=((grouped.unstack().iloc[:,1]/df["好坏客户"].sum()-grouped.unstack().iloc[:,0]/(df["好坏客户"].count()-df["好坏客户"].sum()))*cut_woe).sum()    return cut_IV
#计算各分组的IV值
cut1_IV=get_IV_data(cut1,cut1_woe)
cut2_IV=get_IV_data(cut2,cut2_woe)
cut3_IV=get_IV_data(cut3,cut3_woe)
cut4_IV=get_IV_data(cut4,cut4_woe)
cut5_IV=get_IV_data(cut5,cut5_woe)
cut6_IV=get_IV_data(cut6,cut6_woe)
cut7_IV=get_IV_data(cut7,cut7_woe)
cut8_IV=get_IV_data(cut8,cut8_woe)
cut9_IV=get_IV_data(cut9,cut9_woe)
cut10_IV=get_IV_data(cut10,cut10_woe)
IV=pd.DataFrame([cut1_IV,cut2_IV,cut3_IV,cut4_IV,cut5_IV,cut6_IV,cut7_IV,cut8_IV,cut9_IV,cut10_IV],index=['可用额度比值','年龄','逾期30-59天笔数','负债率','月收入','信贷数量','逾期90天笔数','固定资产贷款量','逾期60-89天笔数','家属数量'],columns=['IV'])
iv=IV.plot.bar(color='b',alpha=0.3,rot=30,figsize=(10,5),fontsize=(10))
iv.set_title('特征变量与IV值分布图',fontsize=(15))
iv.set_xlabel('特征变量',fontsize=(15))
iv.set_ylabel('IV',fontsize=(15))

在这里插入图片描述

WOE值替换

df_new=pd.DataFrame()   #新建df_new存放woe转换后的数据
def replace_data(cut,cut_woe):a=[]for i in cut.unique():a.append(i)a.sort()for m in range(len(a)):cut.replace(a[m],cut_woe.values[m],inplace=True)return cut
df_new["好坏客户"]=df["好坏客户"]
df_new["可用额度比值"]=replace_data(cut1,cut1_woe)
df_new["年龄"]=replace_data(cut2,cut2_woe)
df_new["逾期30-59天笔数"]=replace_data(cut3,cut3_woe)
df_new["负债率"]=replace_data(cut4,cut4_woe)
df_new["月收入"]=replace_data(cut5,cut5_woe)
df_new["信贷数量"]=replace_data(cut6,cut6_woe)
df_new["逾期90天笔数"]=replace_data(cut7,cut7_woe)
df_new["固定资产贷款量"]=replace_data(cut8,cut8_woe)
df_new["逾期60-89天笔数"]=replace_data(cut9,cut9_woe)
df_new["家属数量"]=replace_data(cut10,cut10_woe)
df_new.head()

在这里插入图片描述

训练模型

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
x=df_new.iloc[:,1:]
y=df_new.iloc[:,:1]
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.6,random_state=0)
model=LogisticRegression()
clf=model.fit(x_train,y_train)
print('测试成绩:{}'.format(clf.score(x_test,y_test)))

测试成绩:0.7791803769069698

模型评估roc曲线

coe=clf.coef_  
y_pred=clf.predict(x_test)
from sklearn.metrics import roc_curve, auc
fpr, tpr, threshold = roc_curve(y_test, y_pred)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, color='darkorange',label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy',  linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC_curve')
plt.legend(loc="lower right")
plt.show()
print(roc_auc)

在这里插入图片描述

绘画KS曲线

fig, ax = plt.subplots()
ax.plot(1 - threshold, tpr, label='tpr') # ks曲线要按照预测概率降序排列,所以需要1-threshold镜像
ax.plot(1 - threshold, fpr, label='fpr')
ax.plot(1 - threshold, tpr-fpr,label='KS')
plt.xlabel('score')
plt.title('KS Curve')
plt.ylim([0.0, 1.0])
plt.figure(figsize=(20,20))
legend = ax.legend(loc='upper left')
plt.show()
print(max(tpr-fpr))

在这里插入图片描述
0.5584308938611491

模型结果转评分

factor = 20 / np.log(2)
offset = 600 - 20 * np.log(20) / np.log(2)
def get_score(coe,woe,factor):scores=[]for w in woe:score=round(coe*w*factor,0)scores.append(score)return scores
x1 = get_score(coe[0][0], cut1_woe, factor)
x2 = get_score(coe[0][1], cut2_woe, factor)
x3 = get_score(coe[0][2], cut3_woe, factor)
x4 = get_score(coe[0][3], cut4_woe, factor)
x5 = get_score(coe[0][4], cut5_woe, factor)
x6 = get_score(coe[0][5], cut6_woe, factor)
x7 = get_score(coe[0][6], cut7_woe, factor)
x8 = get_score(coe[0][7], cut8_woe, factor)
x9 = get_score(coe[0][8], cut9_woe, factor)
x10 = get_score(coe[0][9], cut10_woe, factor)
print("可用额度比值对应的分数:{}".format(x1))
print("年龄对应的分数:{}".format(x2))
print("逾期30-59天笔数对应的分数:{}".format(x3))
print("负债率对应的分数:{}".format(x4))
print("月收入对应的分数:{}".format(x5))
print("信贷数量对应的分数:{}".format(x6))
print("逾期90天笔数对应的分数:{}".format(x7))
print("固定资产贷款量对应的分数:{}".format(x8))
print("逾期60-89天笔数对应的分数:{}".format(x9))
print("家属数量对应的分数:{}".format(x10))

计算用户总分

cu1=pd.qcut(df["可用额度比值"],4,labels=False,retbins=True)
bins1=cu1[1]
cu2=pd.qcut(df["年龄"],8,labels=False,retbins=True)
bins2=cu2[1]bins3=[-1,0,1,3,5,13]
cut3=pd.cut(df["逾期30-59天笔数"],bins3,labels=False)
cu4=pd.qcut(df["负债率"],3,labels=False,retbins=True)
bins4=cu4[1]
cu5=pd.qcut(df["月收入"],4,labels=False,retbins=True)
bins5=cu5[1]
cu6=pd.qcut(df["信贷数量"],4,labels=False,retbins=True)
bins6=cu6[1]

对应各评分进行求和

def compute_score(series,bins,score):list = []i = 0while i < len(series):value = series[i]j = len(bins) - 2m = len(bins) - 2while j >= 0:if value >= bins[j]:j = -1else:j -= 1m -= 1list.append(score[m])i += 1return list

代入测试集进行预估

test1 = pd.read_csv(r'.\vali_data.csv')
test1['x1'] = pd.Series(compute_score(test1['RevolvingUtilizationOfUnsecuredLines'], bins1, x1))
test1['x2'] = pd.Series(compute_score(test1['age'], bins2, x2))
test1['x3'] = pd.Series(compute_score(test1['NumberOfTime30-59DaysPastDueNotWorse'], bins3, x3))
test1['x4'] = pd.Series(compute_score(test1['DebtRatio'], bins4, x4))
test1['x5'] = pd.Series(compute_score(test1['MonthlyIncome'], bins5, x5))
test1['x6'] = pd.Series(compute_score(test1['NumberOfOpenCreditLinesAndLoans'], bins6, x6))
test1['x7'] = pd.Series(compute_score(test1['NumberOfTimes90DaysLate'], bins7, x7))
test1['x8'] = pd.Series(compute_score(test1['NumberRealEstateLoansOrLines'], bins8, x8))
test1['x9'] = pd.Series(compute_score(test1['NumberOfTime60-89DaysPastDueNotWorse'], bins9, x9))
test1['x10'] = pd.Series(compute_score(test1['NumberOfDependents'], bins10, x10))
test1['Score'] = test1['x1']+test1['x2']+test1['x3']+test1['x4']+test1['x5']+test1['x6']+test1['x7']+test1['x8']+test1['x9']+test1['x10']+600
test1.to_csv(r'./ScoreData.csv', index=False)

查看测试集结果

Score = pd.read_csv(r'.\ScoreData.csv',index_col=0)
Score.index.name = 'ID'
Score.iloc[:,11:23]

在这里插入图片描述


http://chatgpt.dhexx.cn/article/5JOkMNKj.shtml

相关文章

信用评分模型开发(FICO评分)

以支付宝的芝麻信用为例&#xff0c;其分值范围在350-950分。一般认为分值越高&#xff0c;信用越好&#xff0c;个人业务的违约率越低。这里用的也是与FICO评分类似的个人信用评分工具。 FICO评分的只要思路是&#xff1a;多大量拥有多个属性的用户数据进行收集/分析/转换&am…

【评分卡开发】信用评分模型构建流程

本课程&#xff0c;将从信用评分模型的发展、应用、类型及开发流程等多个方面展开介绍&#xff0c;旨在让初学者全面了解其在信贷金融领域里的可靠性及重要性&#xff0c;并且掌握一定的开发能力。 文章目录 1.评分卡简介1.1 简介1.2 种类1.2.1 依预测目的分1.2.2 依发展主体分…

基于Python的信用评分卡模型建立和分析,万字阐述,收藏

和所有金融信贷业务一样,信用风险credit risk也是企业贷款面临的最主要风险&#xff0c;特别是中小微企业。随着微小企业信贷业务的迅速发展,客户群体的不断扩大,诸多大型企业&#xff08;恒大&#xff0c;融创&#xff0c;st上市公司&#xff09;暴雷&#xff0c;银行在大数据…

基于Python的信用评分卡模型分析

我们每天都在用支付宝&#xff0c;蚂蚁金服风险识别速度可达到100毫秒&#xff0c;比眨眼一次的时间还要快四倍。在全球数字经济时代&#xff0c;有一种金融优势&#xff0c;那就是基于消费者大数据的纯信用&#xff01; 我们不妨称之为数据信用&#xff0c;它比抵押更靠谱&…

基于python的信用卡评分模型

基于python的信用卡评分模型 1. 项目背景介绍 1.1 信用风险和评分卡模型的基本概念 信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险&#xff0c;即受信人不能履行还本付息的责任而使授信人的预期收益与实际收益发生偏离的可能性&#xff0c;它是金融风险…

信用标准评分卡模型开发及实现

一、信用风险评级模型的类型 信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成&#xff0c;其中主体评级模型可用“四张卡”来表示&#xff0c;分别是A卡、B卡、C卡和F卡&#xff1b;债项评级模型通常按照主体的融资用途&#xf…

我眼中的信用评分模型

关于信用风险 之前工作中涉及到信用风险&#xff0c;接下来几天就分享些我在信用风险建模领域的一些经验吧~ 推荐一本比较好的资料书-《信用风险评分卡研究-基于SAS的开发与实施》&#xff0c;书的核心内容为以逻辑回归为基础构建信用评分模型&#xff0c;如果将这本书的内容理…

信用卡评分模型(数据获取+数据预处理+探索分析+变量选择+模型开发+模型评估+信用评分+建立评分系统)

最近两次遇到关于信用卡评分的题目&#xff0c;遂了解一波。 Reference: 基于python的信用卡评分模型(超详细&#xff01;&#xff01;&#xff01;) https://www.jianshu.com/p/f931a4df202c https://blog.csdn.net/zs15321583801/article/details/81234446 https://blo…

信用评分模型详解(下)之 信用评分系统搭建

信用评分问题中一般使用逻辑回归作为主要的模型。过程主要包括变量分箱、变量的WOE&#xff08;证据权重&#xff09;变换和变量选择&#xff08;IV值&#xff09;、逻辑回归估算。 一个完整的评分卡流程主要包括以下几个步骤&#xff1a; 数据准备数据探索性分析数据预处理&…

【信用评分预测模型(一)】信用评分预测模型简介

文章目录 前言一、数据准备1.文章所使用的数据都是基于下面这两个网站&#xff1a;2.观察期和表现期 二、数据处理1.缺失值和异常值2.筛选数据 三、相关性检验四、特征工程1.特征变量 五、模型构建1.随机森林模型2.决策树模型3.AHP分析 总结 前言 在传统的信用风险预测的模型中…

大数据分析案例-基于多元线性回归算法构建用户信用评分模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…

【综合案例】信用评分模型开发

目录 一、案例背景二、前置知识2.1 数据分箱2.2 属性选择2.3 回归方程 三、数据处理3.1 数据清洗3.2 因素分析 四、模型训练五、模型预测六、结语后记 一、案例背景 在上一篇文章网络贷款违约预测案例中&#xff0c;我们在分析属性关系时发现&#xff1a;FICO信用评分与分类标…

信用评分模型(R语言)

信用评分 2016年1月10日 本文详细的介绍了信用评分卡的开发流程,开发语言为R语言,python版本请见:一行代码搞定信用评分模型(python) python版实例和数据请见我的github:https://github.com/chengsong990020186/CreditScoreModel,如觉得实用就点下star,欢迎大家一起…

信用评分卡模型分析(基于Python)--理论部分

信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成&#xff0c;其中主体评级模型可用“四张卡”来表示&#xff0c;分别是A卡、B卡、C卡和F卡&#xff1b;债项评级模型通常按照主体的融资用途&#xff0c;分为企业融资模型、现金流…

企业信用评分卡模型实战(python,附代码)

企业信用评级在全球金融领域有广泛应用。它涉及到公司管理&#xff0c;企业债发行&#xff0c;企业融资&#xff0c;企业上市&#xff0c;企业并购&#xff0c;个人炒股和购买公司债券等多个场景。企业债发行 企业主体信用评级越高&#xff0c;意味着该企业抗风险能力、盈利能力…

银行信用卡评分模型(一)| python

文章目录 背景介绍题目分析一、申请者评级模型二、欺诈评级模型三、行为评级模型四、催收评级模型总结 背景介绍 信用风险和评分卡模型的基本概念&#xff1a;信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险&#xff0c;即受信人不能履行还本付息的责任而使…

【单片机毕业设计】【mcuclub-cl-010】基于单片机的灭火小车的设计

最近设计了一个项目基于单片机的灭火小车系统&#xff0c;与大家分享一下&#xff1a; 一、基本介绍 项目名&#xff1a;灭火小车 项目编号&#xff1a;mcuclub-cl-010 单片机类型&#xff1a;STC89C52、STM32F103C8T6 具体功能&#xff1a; 1、通过一对红外寻迹管进行寻迹&a…

详细介绍如何从零开始制作51单片机控制的智能小车(四)———通过蓝牙模块实现数据传输以及通过手机蓝牙实现对小车运动状态的控制

我会通过本系列文章&#xff0c;详细介绍如何从零开始用51单片机去实现智能小车的控制&#xff0c;在本系列的上一篇文章中介绍了如何让小车实现自动避障&#xff0c;本文作为本系列的第四篇文章&#xff0c;主要介绍蓝牙模块的使用&#xff0c;如何通过蓝牙进行数据传输&#…

课设-基于51单片机的智能小车(循迹+避障+APP控制)

51单片机课设—智能小车 一、课设任务二、硬件设计及相关传感器模块1、车模2、51单片机3、红外循迹模块4、电机及驱动5、蓝牙模块6、硬件搭建 三、程序代码1、main.c文件2、motor.c文件 四、我的大学--“造车”史 注&#xff1a;本设计资源可在微信公众号&#xff1a;“Kevin的…

基于51单片机智能小车循迹功能的实现

基于51单片机智能小车循迹功能的实现 目录 基于51单片机智能小车循迹功能的实现一、思路&#xff08;仅供参考&#xff09;二、部分硬件模块介绍1、L298n电机驱动模块2、两路红外循迹模块 三、实现1、代码2、运行视频(...注意&#xff1a;该视频有声音&#xff01;&#xff01;…