, S) c9 _2 D8 s; J销项发票作废率,销项负数发票率,销项每月平均交易额,销项每月交易次数,销售收入增长率: k) e+ @; H1 s: d
1 |& E+ W2 X- P
( u1 z0 k o- h9 E7 h# w4 O5 L
提取出相关指标到附件 # {4 c& E. U. v1 r, W . w; L z* O5 v; e+ l; r3 ~3 q* C( p }/ c P/ I$ r5 F6 g
for xsn in sn.sheet_names[1:]:0 U Z {9 V: b0 M
# 读取文件 6 _1 s' Z( e. N- d4 [! q7 t datas = pd.read_excel(file_pos, sheet_name=xsn)6 D4 G; L; y4 D# X+ _4 d( S7 m
code_list = list(set(list((datas['code']))))8 j4 k% u- W- W6 O
for name in code_list: & f( y2 V$ {) q tmp_datas = datas[datas['code'] == name]% Q1 Q& s0 p, G/ n( _$ |! x
tmp_datas.index = range(len(tmp_datas)) m, L% Z8 c7 H4 j insert_datas.append(name) / W( w; r" X, h( u" ~" K; A: N; J # 作废数 4 z* ~% d3 c4 t/ w6 N4 P cacel_count = len(tmp_datas[tmp_datas['tax_status'] == 'b']) . q, V7 S2 @6 O3 S% T" W0 V8 a/ ? # 有效数( _) S0 t; @5 T i7 Z% p4 G
valid_count = len(tmp_datas[tmp_datas['tax_status'] == 'a'])" H4 s* t: x6 y
# 发票作废率 0 |; R7 U4 }# s! q" g count1 = (cacel_count / (cacel_count + valid_count))*100" N( D9 c& C; c% v3 O* z7 ?
# 负数发票数 - _" z$ t. \* U7 _. Z/ v( T) A neg_count = len(tmp_datas[tmp_datas['cost'] < 0]), F+ B7 D* L0 o( K( r3 A( B2 F6 d
# 负数发票率; J0 h8 H' I4 w9 q3 f
count2 = (neg_count / valid_count) * 1000 W) p; ~" Q/ P" j7 B& B C
# 转换时间 6 K6 g6 q& _" s3 d2 Z; [& a tmp_datas['date'] = [x.strftime('%Y/%m/%d') for x in tmp_datas['date']]3 g2 R3 `0 k2 A- f" q% ~
# 时间最大值! M% O7 K! @8 k/ ]. ], P
max_time = tmp_datas.iloc[0:,1].max()) p% M0 ?6 C* n0 U& E
# 时间最小值 ) d6 W9 C) c/ R- j P min_time = tmp_datas.iloc[0:,1].min() 6 N! U& ?3 x* o/ m4 P # 时间差4 g" {) X. `, u
diff_time = months(max_time, min_time) + 1$ {0 q/ M5 ]; g
# 有效票, G K. n3 ` c, Q8 } E
valid_tax = tmp_datas[tmp_datas['tax_status'] == 'a'] 1 K5 C1 d+ S; t3 l) [! u# Q7 r; u1 } # 平均月交易额 $ a) G8 E4 X9 i7 \; w X avg_money = valid_tax['totle_cost'].sum() / diff_time ( X3 w8 Z% U% ^* G) U # 平均每月交易次数 & N, y" b% a c2 W* i8 Q! g1 a trans_count = len(tmp_datas) / diff_time1 g3 Z( _7 \$ E
insert_datas += [count1, count2, avg_money, trans_count,] # x; q5 b* A$ D; F p; E [* e- F' s) S4 O if flag: " B$ p6 b5 P1 e6 H: m, m df1.loc[len(df1)] = insert_datas j3 I/ Z3 s+ Q7 `& ]. n df1.to_excel(writer1,sheet_name='进项信息',index=False) $ |& k8 X. P: p4 B* U( Z2 ^3 Q else: 4 `& \* n; \" }0 A; F0 O' a% j merge_time = tmp_datas.groupby(tmp_datas['date']).sum() 3 U1 R r6 ^9 `% J1 f # 销售收入增长率 - T* S0 E/ e0 C% d income_info= list((merge_time['cost'] - merge_time['cost'].shift(1)).fillna(1))# {' E, M- i: v3 A0 c
diff_time_day = days(max_time,min_time) / r! _+ \8 m* E: \) r; g income_tax = (sum(income_info) / diff_time_day)*100: N3 a Z: a/ @+ a2 g, K, @
insert_datas.append(income_tax)* e! I( ]5 K5 z
df2.loc[len(df2)] = insert_datas+ j9 s y9 W4 @0 ]# A2 R
df2.to_excel(writer1,sheet_name='销项信息',index=False)7 i- z$ y& C$ {- ^
insert_datas = [] & T6 B: O. O2 M, F1 R! S. | flag = False 7 ?6 ]: U8 h0 }8 S: M3 ~# x3 i/ A3 C0 @. H, l
( e) a8 r: ]8 m9 ^0 B5 R5 h ( K+ Y" |! W' [3 f1 y4 D2 }7 G. v: T4 C! X/ ^6 z( T6 h
并将是否违约插入到最后一列+ k5 F! R4 v1 W
7 R+ W+ q8 f* A! h+ L( z+ V$ M. ~. c" w
# 提取是否违约的列表, ]& `8 t2 |0 O7 _0 Z
m = [] . v* c7 D3 z' e, f2 U# Mfor name in code_list: 5 j4 L) ~6 K! b, H4 {+ `8 H4 e: J- @ m.append(datas[datas['code']==name]['break_contract'].tolist()[0]) ! P8 D6 g6 m! Y# T* ~: h df1.loc[:,len(df1)] = m1 I6 i! K, a0 c! `1 }# P
df1.to_excel(writer3,sheet_name='sheet1',index=False)' H* W) i* e$ J" o* x* d5 c
建立模型 E7 L8 }% x; `: H& V8 R3 K: b6 iLogistics违约率预测模型" u# f# C9 X/ ^# y0 v4 }8 k
使用Logistics违约预测模型,代入所有的指标数据为自变量,是否违约为因变量,预测出违约率。9 j' K# U% \: N! H
0 }, o) X# @2 k5 } 0 P8 N7 m% h T6 m' a- n! yX=datas[['进项发票作废率','进项负数发票率','进项每月平均交易额','进项每月交易次数','销项发票作废率','销项负数发票率','销项每月平均交易额','销项每月交易次数','销售收入增长率']] & Z" u/ x8 l& b3 o' {y=datas['是否违约']$ F4 \! b0 A# }" n
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2,random_state=2020) ! U& c9 _# `. Z% C* rX_validation, X_test, y_validation, y_test = train_test_split(X_test,y_test, test_size=0.1,random_state=2020)0 y$ Z6 v2 c( {$ a: d
model = LogisticRegression() * \, I6 X7 i1 G/ @model.fit(X_train,y_train) % Z8 K+ F* Y. F2 j% `: Va=model.predict_proba(X_validation)+ F# \, ^: V* j: ~1 h) J
result=[] 0 t! f& J |/ c2 Z. g, Jfor i in range(len(a)):( O: g6 e |# C6 S3 w5 R1 L |7 r
if a[1]>0.5: ?- N( T- t4 L; ?8 K/ b% D4 q
result.append(1)( ?! k9 X; K& N) w7 F/ W5 A3 u
else:! a W% L6 o* s, Y) c# f
result.append(0) / M/ F! U2 j# d) vfrom sklearn import metrics . @! T6 {6 K7 ] Jprint('误差: %.4f' % (1-metrics.recall_score(y_validation,result,average='weighted'))) 8 Z; j+ H* K* H, p U4 I2 R最终得到一张我们的分析表格 6 q2 M* a2 R8 ~4 p( w: M. Z2 V2 d4 Z/ |' N5 R$ T
3 ?9 L/ G4 C4 w a# m- X( j- @/ ?" A ~
! k8 M7 \! k" K5 ~" u% O
; ?# T4 x$ S4 I. \ , E$ H! m3 J# r- r. ~) r( N通过预测是否违约,我们就能解决贷不贷款的问题。8 Q# `; A6 Q' U G% {7 R
/ {+ `6 H% F h/ ?, w: a, H- k$ \
贷款金额6 m9 |6 a* X) o+ _4 N! Q
贷款金额的确认,根据该公司不违约率在所有公司中的权重,乘以总贷款金额确认:& o6 b/ }/ U! C s1 h0 f
$ ]7 a, v; t1 y, w; q$ Y( D& W
+ a7 }/ X% P6 R& L& {; h' J
1 B4 G1 c- F2 _( E
, v5 q9 c& V2 Y ( m1 Z0 h3 {. n. q! C$ \ri=1−Zi∑123j=1(1−Zi)×M: j0 s+ J' B2 \- d; _
ri=1−Zi∑j=1123(1−Zi)×M( V w1 N( L1 p/ C: P
因此,我们得到的贷款金额是违约率和贷款总金额组成的关系式,这在第二问中能起到重要作用。& j3 T* Y7 ]( t' I
9 d# P: T* {3 @+ E# N# P) q, L: U& v' K
贷款年利率 6 l' I r# k+ @8 u, `4 }绘制出年利率与客户流失率图,可以分析出两者应该是有关系的。利用SPSS拟合出不同信誉等级,年利率与客户流失率的关系式。. S& ?- @( u, d2 z* d2 g
7 N' P3 Z: U2 ]% E% X# q' c! e9 m
信誉等级 R平方 关系式 2 I& {" ]7 V1 n/ sA 0.9977 y = 37.97x^3-258.57x^2+640.944*x -1.121 2 Y& V; t; f/ F7 N9 l8 f4 |B 0.9982 y = 33.995x^3-225.051x^2+552.829*x-1.017 / ^, A# E2 g' O& H$ C* P+ U0 }C 0.9982 y = 32.157x^3-207.386x^2+504.717*x-0.9733 r! f9 A! {, W# q4 [- A
银行获利=贷款金额x贷款年利率x(1-利率对于信誉评级客户流失率) & R9 \' W7 w6 n5 E- o3 _ 9 S7 M' h6 ]. T" {8 p3 x, ?) O( V : Y* O" N2 A8 I: p在贷款金额确认,贷款年利率范围在0.4~1.5的情况下,利用上面拟合的关系式,我们能够暴力跑出最优年利率。 ( `7 F: E- y. B5 N1 M% [7 {1 B e! P5 O
5 K4 o, h3 }4 m& |! K/ ]0 Qdouble turnover_rate(double x, char ch) {4 E0 I6 j% @2 n; W: o/ ^- H
double y = 0, result = 0;9 e( e2 }8 B2 \: q+ j
switch (ch) { 6 ? i% h: I D j" W case 'A': - U, N0 e7 u( _9 c: I y = 37.969520 * pow(x, 3) - 258.570452 * pow(x, 2) + 640.944427 * x - 1.121484;0 d1 e U# @0 z; a/ L6 L
result = x * (1 - y / 100.0); [ V3 H" r3 u7 M! D
break; ' X4 h* Y' ^8 A, Y case 'B':, }7 P4 U$ }: Q8 _. {" N% _+ c( `
y = 33.994698 * pow(x, 3) - 225.050538 * pow(x, 2) + 552.829151 * x - 1.016503;6 N- W. H3 w7 T2 @9 y# Y6 ]. x" Z
result = x * (1 - y / 100.0);8 x$ v( H) N8 @1 U0 }
break;6 `) N- T" A8 [/ `
case 'C': % d- ]+ r* X/ b+ K7 K y = 32.156864 * pow(x, 3) - 207.385880 * pow(x, 2) + 504.716993 * x - 0.973497;8 Y# s* x, t. O/ F5 W
result = x * (1 - y / 100.0);1 R7 b7 s ?2 w V; X& J
break; 0 ?. O) N s1 T9 ^+ g4 ^' D default:. u: { b- @, Z2 e v" S
cout << "输出有误!" << ch << endl;0 }5 q5 Z% G/ \* n5 p% Z/ h
}# {7 h6 N: i9 C) ^8 S5 M
( ]1 T: i, x# l2 H( B3 L
return result; 4 m: |' L9 b! I}' `, I2 p g6 E( L) M1 i% t
0 a8 \1 M" [. [4 c+ l" v0 b' k* ?* T5 C3 T
5 }- [$ |' Z" J" G* u0 ?
0 K: ^; d7 o. Y* Y% O4 O+ Y
问题二2 @+ Z% ~3 `& V) g
利用代码,重新计算出各指标数据& ]# S) c- m% Z1 ?
代入Logistics违约率预测模型,预测出各公司的违约率 4 i7 W6 l/ D/ f; l( y; W' L$ h0 |根据标准普尔评级建立,主标尺,对不同违约率进行A~D等级划分,信誉等级D不予贷款 8 P, y- ]# {( O6 e" e将违约率代入,之前得到的公式,得到具体贷款金额; x4 A' N E( t9 y0 e$ X
最优年利率沿用上一问5 w5 D6 N8 q! w# _, X! t
# 信用等级" J( ^0 m- K3 y& D
cs = []9 S6 j- F$ W. S- Z
# 最优年利率,客户流失率,利率值 4 o2 ? Q/ _. Q& w8 Qtax = [] 3 ], O2 H1 o/ T+ S$ Dfor i in m: 0 H& i9 ]/ t/ `/ z5 ~ if i <= 0.0069264: 6 s3 L" `: I! H" \5 Y! ]: H I5 Y cs.append('A') 0 y6 l p( q$ o' L tax.append([0.083,0.503173,0.0412366])- y+ V8 [: w% }3 g
elif i > 0.0069264 and i <= 0.22619:4 D8 F Q) m2 v: O, k0 F4 P/ L u
cs.append('B')" g" `6 x2 b2 j3 K; x
tax.append([0.097,0.505215,0.0479942])! u" c* _2 _% d: C8 v
elif i > 0.22619 and i <= 0.509915:$ O* h# F: x+ n1 G
cs.append('C') 2 z! k+ Z" c* H5 N* W0 h( v tax.append([0.1069,0.506501,0.052755]) 2 K; t1 M5 j; ? elif i > 0.509915:2 r7 K% S: @9 D& E5 S- U
cs.append('D')3 Z* t( E5 C5 C5 G: U$ |6 k
tax.append([0.15,0,0]) 2 e! s# e2 v: \8 M, q else: 1 L; J( X, y4 ~. v% r print('违规') N9 f" E0 p0 W1 r/ ] , O1 K7 D& O$ ]5 ~( A, Q
parr = []6 `2 L# [. c4 w% J
for arr in list(a): * Y7 @. h _- I/ h+ r0 d parr.append(list(arr)[0])2 m) _. L5 E8 n1 x
sum_val = sum(parr) : s& ^7 m4 N1 V N+ I3 Wamount = []& U) F. v+ m+ k; k3 p/ x
for ival in parr:% X) S# d% }$ H
tmp = ival / sum_val * 100000000 * X9 D" ?! N2 v7 x8 B if ival < 1 - 0.509915:5 j+ `2 T1 R9 y9 m6 @% N$ p; U
amount.append(0)5 ~) F. T) y6 |1 R: n1 ~( R) _
else: ' V8 Q3 S/ ]9 q: [3 |$ r9 {8 F amount.append(tmp)/ v. x6 o# w A! e1 x/ `$ U
0 R, Z0 v7 i" m; n* { - J( @+ i V, A* C# J9 X, |* L ! C. s! @( \- p4 ? m/ B$ { f( H1 \- f% A. H
可以看到,贷款金额也都在10w~100w之内。 ! P) A, p- H% L8 r- I $ B! U q$ Y7 ]2 W" g$ b8 ^8 P4 k [8 T
问题三, g' y7 P9 H: p
这一问,我们做得有些匆忙了,有其他想法的可以按照自己的想法做做,这里只拿我们的做参照。 ; y2 t/ s4 `4 g& s& A4 L k5 K8 L& A; f* H" D$ _* C, H) B; ?8 x0 }