【贷款违约预测】task1and2 理解和数据探索

import numpy as np              # 导入numpy库
import pandas as pd             # 导入pandas库
import matplotlib as mpl        # 导入matplotlib库
import matplotlib.pyplot as plt 
import seaborn as sns           # 导入seaborn库
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
import warnings
warnings.filterwarnings("ignore")

数据导入

data = pd.read_csv('train.csv',index_col = 'id')
pd.read_csv?
data.head()
loanAmntterminterestRateinstallmentgradesubGradeemploymentTitleemploymentLengthhomeOwnershipannualIncome...n5n6n7n8n9n10n11n12n13n14
id
035000.0519.52917.97EE2320.02 years2110000.0...9.08.04.012.02.07.00.00.00.02.0
118000.0518.49461.90DD2219843.05 years046000.0...NaNNaNNaNNaNNaN13.0NaNNaNNaNNaN
212000.0516.99298.17DD331698.08 years074000.0...0.021.04.05.03.011.00.00.00.04.0
311000.037.26340.96AA446854.010+ years1118000.0...16.04.07.021.06.09.00.00.00.01.0
43000.0312.99101.07CC254.0NaN129000.0...4.09.010.015.07.012.00.00.00.04.0

5 rows × 46 columns

data.describe()
loanAmntterminterestRateinstallmentemploymentTitlehomeOwnershipannualIncomeverificationStatusisDefaultpurpose...n5n6n7n8n9n10n11n12n13n14
count800000.000000800000.000000800000.000000800000.000000799999.000000800000.0000008.000000e+05800000.000000800000.000000800000.000000...759730.000000759730.000000759730.000000759729.000000759730.000000766761.000000730248.000000759730.000000759730.000000759730.000000
mean14416.8188753.48274513.238391437.94772372005.3517140.6142137.613391e+041.0096830.1995131.745982...8.1079378.5759948.28295314.6224885.59234511.6438960.0008150.0033840.0893662.178606
std8716.0861780.8558324.765757261.460393106585.6402040.6757496.894751e+040.7827160.3996342.367453...4.7992107.4005364.5616898.1246103.2161845.4841040.0300750.0620410.5090691.844377
min500.0000003.0000005.31000015.6900000.0000000.0000000.000000e+000.0000000.0000000.000000...0.0000000.0000000.0000001.0000000.0000000.0000000.0000000.0000000.0000000.000000
25%8000.0000003.0000009.750000248.450000427.0000000.0000004.560000e+040.0000000.0000000.000000...5.0000004.0000005.0000009.0000003.0000008.0000000.0000000.0000000.0000001.000000
50%12000.0000003.00000012.740000375.1350007755.0000001.0000006.500000e+041.0000000.0000000.000000...7.0000007.0000007.00000013.0000005.00000011.0000000.0000000.0000000.0000002.000000
75%20000.0000003.00000015.990000580.710000117663.5000001.0000009.000000e+042.0000000.0000004.000000...11.00000011.00000010.00000019.0000007.00000014.0000000.0000000.0000000.0000003.000000
max40000.0000005.00000030.9900001715.420000378351.0000005.0000001.099920e+072.0000001.00000013.000000...70.000000132.00000079.000000128.00000045.00000082.0000004.0000004.00000039.00000030.000000

8 rows × 41 columns

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 800000 entries, 0 to 799999
Data columns (total 47 columns):
id                    800000 non-null int64
loanAmnt              800000 non-null float64
term                  800000 non-null int64
interestRate          800000 non-null float64
installment           800000 non-null float64
grade                 800000 non-null object
subGrade              800000 non-null object
employmentTitle       799999 non-null float64
employmentLength      753201 non-null object
homeOwnership         800000 non-null int64
annualIncome          800000 non-null float64
verificationStatus    800000 non-null int64
issueDate             800000 non-null object
isDefault             800000 non-null int64
purpose               800000 non-null int64
postCode              799999 non-null float64
regionCode            800000 non-null int64
dti                   799761 non-null float64
delinquency_2years    800000 non-null float64
ficoRangeLow          800000 non-null float64
ficoRangeHigh         800000 non-null float64
openAcc               800000 non-null float64
pubRec                800000 non-null float64
pubRecBankruptcies    799595 non-null float64
revolBal              800000 non-null float64
revolUtil             799469 non-null float64
totalAcc              800000 non-null float64
initialListStatus     800000 non-null int64
applicationType       800000 non-null int64
earliesCreditLine     800000 non-null object
title                 799999 non-null float64
policyCode            800000 non-null float64
n0                    759730 non-null float64
n1                    759730 non-null float64
n2                    759730 non-null float64
n2.1                  759730 non-null float64
n4                    766761 non-null float64
n5                    759730 non-null float64
n6                    759730 non-null float64
n7                    759730 non-null float64
n8                    759729 non-null float64
n9                    759730 non-null float64
n10                   766761 non-null float64
n11                   730248 non-null float64
n12                   759730 non-null float64
n13                   759730 non-null float64
n14                   759730 non-null float64
dtypes: float64(33), int64(9), object(5)
memory usage: 286.9+ MB
data.columns
Index(['loanAmnt', 'term', 'interestRate', 'installment', 'grade', 'subGrade',
       'employmentTitle', 'employmentLength', 'homeOwnership', 'annualIncome',
       'verificationStatus', 'issueDate', 'isDefault', 'purpose', 'postCode',
       'regionCode', 'dti', 'delinquency_2years', 'ficoRangeLow',
       'ficoRangeHigh', 'openAcc', 'pubRec', 'pubRecBankruptcies', 'revolBal',
       'revolUtil', 'totalAcc', 'initialListStatus', 'applicationType',
       'earliesCreditLine', 'title', 'policyCode', 'n0', 'n1', 'n2', 'n2.1',
       'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n10', 'n11', 'n12', 'n13', 'n14'],
      dtype='object')



Field	Description
id	为贷款清单分配的唯一信用证标识
loanAmnt	贷款金额
term	贷款期限(year)
interestRate	贷款利率
installment	分期付款金额
grade	贷款等级
subGrade	贷款等级之子级
employmentTitle	就业职称
employmentLength	就业年限(年)

isDefault 标签

样本分布不均匀  
总体违约率为0.1995
data[ 'isDefault'].value_counts()  # 
0    640390
1    159610
Name: isDefault, dtype: int64
data['isDefault'].sum()/data.shape[0]
0.1995125

‘interestRate’,‘loanAmnt’,‘installment’ 数值型

违约普遍高于不违约 
sns.boxplot(x='isDefault',y='loanAmnt',data=data)
<matplotlib.axes._subplots.AxesSubplot at 0x2ee44efed68>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uv6VBE13-1600130353320)(output_13_1.png)]

plt.subplot?
plt.figure(figsize=(16,5))
count = 1
for i in [ 'interestRate','loanAmnt','installment']:
    plt.subplot(1,3,count)
    sns.kdeplot(data[i])
    count += 1 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mlt7rRKV-1600130353327)(output_15_0.png)]

data[['isDefault','interestRate','loanAmnt','installment']].groupby('isDefault').agg(['mean','median'])
interestRateloanAmntinstallment
meanmedianmeanmedianmeanmedian
isDefault
012.62168512.1814133.06574912000.0431.222184368.08
115.71274915.0515555.29807014325.0464.932048402.83

term 数值型分类

 期限为5年的违约比例更高?
pd.crosstab(data['isDefault'],data['term'],)  # 期限为5年的违约比例更高?
term35
isDefault
0509776130614
19712662484

‘grade’,‘subGrade’ str_class

 等级从A至D违约率越高 sub1至5越高 
 可以使用sub替代grade
data[['grade','isDefault']].groupby('grade').apply(lambda x:x.sum()/x.count())  
isDefault
grade
A0.060375
B0.132992
C0.225020
D0.303852
E0.384291
F0.453524
G0.497017
data[['subGrade','isDefault']].groupby('subGrade').apply(lambda x:x.sum()/x.count())  
isDefault
subGrade
A10.031919
A20.045697
A30.055882
A40.067221
A50.085399
B10.102921
B20.112262
B30.129239
B40.148639
B50.165649
C10.191360
C20.206892
C30.224576
C40.250113
C50.261549
D10.277982
D20.297572
D30.304015
D40.322863
D50.334735
E10.355233
E20.376903
E30.387460
E40.402243
E50.419161
F10.426498
F20.455991
F30.456807
F40.477440
F50.482993
G10.466174
G20.480910
G30.519427
G40.521971
G50.548837

‘employmentTitle’ int_class

分类较多 (248683,)
len(data['employmentTitle'].value_counts())
248683

employmentLength str_class

年限越久违约率越低
缺失样本违约率较高 (单独分类 )
data['employmentLength'].value_counts()

data['employmentLength'].fillna('-1 years')

data[['employmentLength','isDefault']].groupby('employmentLength').apply(lambda x:x.sum()/x.count())  
# null 的违约率较高,考虑单独分类 

map_employmentLength = {f'{i} years':i+1 for i in range(2,10)}

map_employmentLength.update({-1:0,'< 1 year':1,'1 year':2,'10+ years':11})
10+ years    262753
2 years       72358
< 1 year      64237
3 years       64152
1 year        52489
5 years       50102
4 years       47985
-1            46799
6 years       37254
8 years       36192
7 years       35407
9 years       30272
Name: employmentLength, dtype: int64

homeOwnership 借款人在登记时提供的房屋所有权状况
annualIncome 年收入
verificationStatus 验证状态
issueDate 贷款发放的月份
purpose 借款人在贷款申请时的贷款用途类别
postCode 借款人在贷款申请中提供的邮政编码的前3位数字
regionCode 地区编码
dti 债务收入比
delinquency_2years 借款人过去2年信用档案中逾期30天以上的违约事件数

homeOwnership int_class

1,5 较高  0,4较低 
3,4,5,样本较少
data['homeOwnership'].value_counts()
0    395732
1    317660
2     86309
3       185
5        81
4        33
Name: homeOwnership, dtype: int64
data[['homeOwnership','isDefault']].groupby('homeOwnership').apply(lambda x:x.sum()/x.count())  
homeOwnershipisDefault
homeOwnership
00.00.171535
11.00.232107
22.00.207800
33.00.205405
44.00.151515
55.00.234568

annualIncome 数值型

非正态分布
较低的越容易违约 
sns.kdeplot(data['annualIncome'])
<matplotlib.axes._subplots.AxesSubplot at 0x2ee46e054a8>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S8cz72Ap-1600130353333)(output_31_1.png)]

data[['annualIncome','isDefault']].groupby('isDefault').agg(['mean','median'])
annualIncome
meanmedian
isDefault
077606.51402365000.0
170225.50516460000.0

‘verificationStatus’ int_class

分类 label
data['verificationStatus'].value_counts()
1    309810
2    248968
0    241222
Name: verificationStatus, dtype: int64
data[['verificationStatus','isDefault']].groupby('verificationStatus').apply(lambda x:x.sum()/x.count())  
verificationStatusisDefault
verificationStatus
00.00.147221
11.00.209412
22.00.237858

issueDate 贷款发放月份

年份影响较大 
月份影响较小 
data_date  =  data[['issueDate','isDefault']]
data_date['year'] = pd.to_datetime(data.issueDate).dt.year
data_date['month'] = pd.to_datetime(data.issueDate).dt.month
data_date.groupby('year')['isDefault'].mean()
year
2007    0.178344
2008    0.162073
2009    0.124775
2010    0.131468
2011    0.145621
2012    0.159931
2013    0.155974
2014    0.184278
2015    0.202053
2016    0.233084
2017    0.231040
2018    0.157534
Name: isDefault, dtype: float64
data_date.groupby('month')['isDefault'].mean()
month
1     0.190948
2     0.191409
3     0.202784
4     0.209204
5     0.205296
6     0.206889
7     0.205550
8     0.199575
9     0.202622
10    0.191226
11    0.192314
12    0.198323
Name: isDefault, dtype: float64

purpose 目的 int_class

data.groupby('purpose')['isDefault'].mean()
purpose
0     0.211370
1     0.295190
2     0.175718
3     0.189431
4     0.169278
5     0.209655
6     0.225769
7     0.196166
8     0.146125
9     0.218337
10    0.229653
11    0.238267
12    0.111519
13    0.189474
Name: isDefault, dtype: float64

‘postCode’,‘regionCode’ 多分类

分类较多 
from sklearn.preprocessing import LabelEncoder
for col in data(['employmentTitle', 'postCode', 'title','subGrade']):
    le = LabelEncoder()
    le.fit(list(data_train[col].astype(str).values) +
list(data_test_a[col].astype(str).values))
    data_train[col] = le.transform(list(data_train[col].astype(str).values))
    data_test_a[col] = le.transform(list(data_test_a[col].astype(str).values))
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-207-c6562597df2a> in <module>
      1 from sklearn.preprocessing import LabelEncoder
----> 2 for col in data(['employmentTitle', 'postCode', 'title','subGrade']):
      3     le = LabelEncoder()
      4     le.fit(list(data_train[col].astype(str).values) +
      5 list(data_test_a[col].astype(str).values))


TypeError: 'DataFrame' object is not callable
le = LabelEncoder()
data['employmentTitle']
le.fit(data['employmentTitle'].values.fillna(-1))
le.transform(data['employmentTitle'].values.fillna(-1))
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-212-a0ac796b2725> in <module>
      1 le = LabelEncoder()
      2 data['employmentTitle']
----> 3 le.fit(data['employmentTitle'].values.fillna(-1))
      4 le.transform(data['employmentTitle'].values.fillna(-1))


AttributeError: 'numpy.ndarray' object has no attribute 'fillna'
le.fit(data['employmentTitle'].fillna(0).values)
LabelEncoder()
w = le.fit_transform(data['employmentTitle'].fillna(0).values)
np.array(w).max()
248682
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit([1, 2, 2, 6])
LabelEncoder()
LabelEncoder()
le.classes_
array([1, 2, 6])
data[['postCode','regionCode']].head()
postCoderegionCode
id
0137.032
1156.018
2337.014
3148.011
4301.021

dti 债务收入比 数值型

data['dti'].describe()
count    799761.000000
mean         18.284557
std          11.150155
min          -1.000000
25%          11.790000
50%          17.610000
75%          24.060000
max         999.000000
Name: dti, dtype: float64
sns.kdeplot(data['dti'])
<matplotlib.axes._subplots.AxesSubplot at 0x2ee02cd4b70>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFOAzmaR-1600130353341)(output_54_1.png)]

sns.boxplot(data['dti'][])
<matplotlib.axes._subplots.AxesSubplot at 0x2ee02d0e278>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oH4ZWlTW-1600130353345)(output_55_1.png)]

data[['isDefault','dti','employmentLength']].groupby('employmentLength').agg(['mean','max','median'])
isDefaultdti
meanmaxmedianmeanmaxmedian
employmentLength
-10.2687881020.825034999.0019.310
1 year0.2051861017.743159999.0017.110
10+ years0.1870391018.426270592.1217.910
2 years0.2000331017.760318580.2017.140
3 years0.2014901017.830329999.0017.170
4 years0.1982911017.964413999.0017.420
5 years0.1957411017.913925466.9217.350
6 years0.1928121018.034503308.2517.550
7 years0.1950461018.132814345.4217.500
8 years0.1972261018.25656977.2317.710
9 years0.1984011018.432058489.1617.945
< 1 year0.2048821018.052667999.0017.000

delinquency_2years 数值型

data['delinquency_2years'].value_counts()
0.0     645715
1.0     102586
2.0      29944
3.0      10919
4.0       4808
5.0       2504
6.0       1399
7.0        770
8.0        443
9.0        293
10.0       192
11.0       144
12.0        86
14.0        53
13.0        50
15.0        23
16.0        20
18.0        13
19.0        10
20.0         7
17.0         6
21.0         3
22.0         3
26.0         2
29.0         2
30.0         1
25.0         1
39.0         1
27.0         1
24.0         1
Name: delinquency_2years, dtype: int64
data[['isDefault','delinquency_2years']].groupby('delinquency_2years').mean()
isDefault
delinquency_2years
0.00.195829
1.00.208401
2.00.223484
3.00.229600
4.00.235441
5.00.243211
6.00.235883
7.00.254545
8.00.207675
9.00.252560
10.00.213542
11.00.215278
12.00.267442
13.00.300000
14.00.245283
15.00.304348
16.00.300000
17.00.500000
18.00.076923
19.00.300000
20.00.428571
21.00.333333
22.00.000000
24.00.000000
25.01.000000
26.00.000000
27.01.000000
29.00.000000
30.00.000000
39.00.000000
    ficoRangeLow	借款人在贷款发放时的fico所属的下限范围
    ficoRangeHigh	借款人在贷款发放时的fico所属的上限范围
    openAcc	借款人信用档案中未结信用额度的数量
    pubRec	贬损公共记录的数量
    pubRecBankruptcies	公开记录清除的数量
    revolBal	信贷周转余额合计
    revolUtil	循环额度利用率,或借款人使用的相对于所有可用循环信贷的信贷金额
    totalAcc	借款人信用档案中当前的信用额度总数
    initialListStatus	贷款的初始列表状态
    applicationType	表明贷款是个人申请还是与两个共同借款人的联合申请
    earliesCreditLine	借款人最早报告的信用额度开立的月份
    title	借款人提供的贷款名称
    policyCode	公开可用的策略_代码=1新产品不公开可用的策略_代码=2
    n系列匿名特征	匿名特征n0-n14,为一些贷款人行为计数特征的处理

‘ficoRangeLow’,‘ficoRangeHigh’,‘openAcc’,‘pubRec’,‘pubRecBankruptcies’,‘revolBal’,‘revolUtil’,‘totalAcc’

data[['ficoRangeLow','ficoRangeHigh','openAcc','pubRec','pubRecBankruptcies','revolBal','revolUtil','totalAcc']].head()
ficoRangeLowficoRangeHighopenAccpubRecpubRecBankruptciesrevolBalrevolUtiltotalAcc
id
0730.0734.07.00.00.024178.048.927.0
1700.0704.013.00.00.015096.038.918.0
2675.0679.011.00.00.04606.051.827.0
3685.0689.09.00.00.09948.052.628.0
4690.0694.012.00.00.02942.032.027.0
data[['initialListStatus','applicationType']].head()
initialListStatusapplicationType
id
000
110
200
310
400

earliesCreditLine 时间变量

len(pd.to_datetime(data['earliesCreditLine'],format='%b-%Y'))
800000

title 多分类变量

len(data['title'].value_counts())
39644

policyCode useless

useless
data['policyCode'].value_counts()
1.0    800000
Name: policyCode, dtype: int64

匿名 行为计数

data[data.columns[-15:]].isna().sum()/data.shape[0]
n0      0.050338
n1      0.050338
n2      0.050338
n2.1    0.050338
n4      0.041549
n5      0.050338
n6      0.050338
n7      0.050338
n8      0.050339
n9      0.050338
n10     0.041549
n11     0.087190
n12     0.050338
n13     0.050338
n14     0.050338
dtype: float64
[len(data[i].unique()) for i in data.columns[-15:]]
[40, 34, 51, 51, 47, 66, 108, 71, 103, 45, 77, 6, 6, 29, 32]
data[data.columns[-15:]].describe()
n0n1n2n2.1n4n5n6n7n8n9n10n11n12n13n14
count759730.000000759730.000000759730.000000759730.000000766761.000000759730.000000759730.000000759730.000000759729.000000759730.000000766761.000000730248.000000759730.000000759730.000000759730.000000
mean0.5119323.6423305.6426485.6426484.7356418.1079378.5759948.28295314.6224885.59234511.6438960.0008150.0033840.0893662.178606
std1.3332662.2468253.3028103.3028102.9499694.7992107.4005364.5616898.1246103.2161845.4841040.0300750.0620410.5090691.844377
min0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000000.0000000.0000000.000000
25%0.0000002.0000003.0000003.0000003.0000005.0000004.0000005.0000009.0000003.0000008.0000000.0000000.0000000.0000001.000000
50%0.0000003.0000005.0000005.0000004.0000007.0000007.0000007.00000013.0000005.00000011.0000000.0000000.0000000.0000002.000000
75%0.0000005.0000007.0000007.0000006.00000011.00000011.00000010.00000019.0000007.00000014.0000000.0000000.0000000.0000003.000000
max51.00000033.00000063.00000063.00000049.00000070.000000132.00000079.000000128.00000045.00000082.0000004.0000004.00000039.00000030.000000
sns.heatmap(data[['isDefault']].join(data[data.columns[-15:]]).corr().abs(),vmin=0,vmax=1)
<matplotlib.axes._subplots.AxesSubplot at 0x2ee755187b8>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKv8es1S-1600130353347)(output_74_1.png)]

data[['isDefault']].join(data[data.columns[-15:]]).corr()
isDefaultn0n1n2n2.1n4n5n6n7n8n9n10n11n12n13n14
isDefault1.0000000.0109530.0406590.0703520.0703520.013156-0.0186610.0053500.032007-0.0059510.0689780.025583-0.0002930.0032870.0101010.085715
n00.0109531.000000-0.056378-0.029272-0.029272-0.0698800.0676240.126076-0.0194470.082053-0.0232480.0233950.035126-0.0035200.3131910.080475
n10.040659-0.0563781.0000000.8077890.8077890.8290160.577299-0.0322240.6518520.4434060.8009250.540271-0.004406-0.004329-0.0337120.160022
n20.070352-0.0292720.8077891.0000001.0000000.6631860.473744-0.0014950.7903370.5676080.9820150.655296-0.0025540.002908-0.0180580.256501
n2.10.070352-0.0292720.8077891.0000001.0000000.6631860.473744-0.0014950.7903370.5676080.9820150.655296-0.0025540.002908-0.0180580.256501
n40.013156-0.0698800.8290160.6631860.6631861.0000000.717936-0.0194850.7421570.5731030.6398670.614658-0.000965-0.003339-0.0204900.236147
n5-0.0186610.0676240.5772990.4737440.4737440.7179361.0000000.0326460.6189700.8380660.4724340.5062320.0077120.0101030.0162390.217438
n60.0053500.126076-0.032224-0.001495-0.001495-0.0194850.0326461.0000000.0258920.0726330.0019430.3899240.0007640.0069520.0701770.189194
n70.032007-0.0194470.6518520.7903370.7903370.7421570.6189700.0258921.0000000.7749550.7944650.8297990.0031340.011109-0.0247510.345906
n8-0.0059510.0820530.4434060.5676080.5676080.5731030.8380660.0726330.7749551.0000000.5639100.6407290.0104620.0182470.0298460.294802
n90.068978-0.0232480.8009250.9820150.9820150.6398670.4724340.0019430.7944650.5639101.0000000.660395-0.0025680.002943-0.0253240.243350
n100.0255830.0233950.5402710.6552960.6552960.6146580.5062320.3899240.8297990.6407290.6603951.0000000.0013920.0069190.0100420.364384
n11-0.0002930.035126-0.004406-0.002554-0.002554-0.0009650.0077120.0007640.0031340.010462-0.0025680.0013921.0000000.0036290.072216-0.005094
n120.003287-0.003520-0.0043290.0029080.002908-0.0033390.0101030.0069520.0111090.0182470.0029430.0069190.0036291.0000000.004886-0.006824
n130.0101010.313191-0.033712-0.018058-0.018058-0.0204900.0162390.070177-0.0247510.029846-0.0253240.0100420.0722160.0048861.000000-0.000595
n140.0857150.0804750.1600220.2565010.2565010.2361470.2174380.1891940.3459060.2948020.2433500.364384-0.005094-0.006824-0.0005951.000000
sns.heatmap?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值