前言
本來因為ACM競賽培訓的原因沒有參加數學建模的培訓和系列賽事,開學被同學拉過來湊數,就這樣陰差陽錯的參加了一次數學建模國賽,由于沒有系統的學習數學建模,還是第一次接觸數學建模正式賽事,所以論文寫的比較水,主要用到的方法都是爛大街的沒有新意的方法,都是我在平時做資料練習時的一些偏機器學習的模型,前期想著隊長能有什么模型想出來,結果隊長啥也沒想出來只好自己上,導致正式開始動筆建模時已經比較晚,其實論文還有很多可以改進的地方,比如沒有查閱足夠的文獻資料,綜合前人的結果,其實前人已經做出一些信用風險評估模型,其次集成學習比較倉促,沒有分配分類器權重系數,時間夠的話還應該可以做一下信用遷移矩陣,將題目中的時間用到,但最侄訓是寫出了一個可行但并非最優解,也算完成論文,
題目

摘要

說明
詳細論文、程式原始碼和資料
請見代碼倉庫,過一陣子放
資料預處理
據說這個部分讓很多隊伍頭痛,其實也不是很難,不用很多時間,主要是根據發票資訊對每個公司進行統計,我們算出了一些指標,以便以后使用,由于時間原因,沒有處理發票中的時間資訊,如果時間足夠的話,其實還可以算一下信用遷移矩陣,詳細程式見下,
綜合評價系統
我們用的是Topsis+熵權法,其實綜合評價系統有很多種,應該針對不同的資料區別使用,但筆者沒系統學過建模,也是現學現用,讀者可以嘗試使用其他評價系統,或者嘗試一些現有信用風險模型,谷歌學術搜一搜就可,
分類系統
使用kmeans分類,我也只知道這個,太菜了╯﹏╰,論文里分了九類,是根據聚類效果評價演算法得出來的最佳聚類簇個數,其實3個也就夠了的,
程式
1.問題1
資料讀取
#匯入相關庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import zscore
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
#讀取資料
data = pd.read_excel('a0.xlsx')
data2 =pd.read_excel('a0.xlsx',sheet_name=1)
data3 =pd.read_excel('a0.xlsx',sheet_name=2)
#將企業代號前的E去掉,使其成為數值型變數,便于排序
data['企業代號']=data['企業代號'].apply(lambda x:int(x[1:]))
data2['企業代號']=data2['企業代號'].apply(lambda x:int(x[1:]))
data3['企業代號']=data3['企業代號'].apply(lambda x:int(x[1:]))
資料概覽
data
| 企業代號 | 企業名稱 | 信譽評級 | 是否違約 | |
|---|---|---|---|---|
| 0 | 1 | ***電器銷售有限公司 | A | 否 |
| 1 | 2 | ***技術有限責任公司 | A | 否 |
| 2 | 3 | ***電子(中國)有限公司***分公司 | C | 否 |
| 3 | 4 | ***發展有限責任公司 | C | 否 |
| 4 | 5 | ***供應鏈管理有限公司 | B | 否 |
| ... | ... | ... | ... | ... |
| 118 | 119 | ***藥房 | D | 是 |
| 119 | 120 | ***陳列廣告有限公司 | D | 是 |
| 120 | 121 | ***藥業連鎖有限公司***藥店 | D | 是 |
| 121 | 122 | ***商貿有限責任公司 | D | 是 |
| 122 | 123 | ***創科技有限責任公司 | D | 是 |
123 rows × 4 columns
data2
| 企業代號 | 發票號碼 | 開票日期 | 銷方單位代號 | 金額 | 稅額 | 價稅合計 | 發票狀態 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 3390939 | 2017-07-18 | A00297 | -943.40 | -56.60 | -1000.00 | 有效發票 |
| 1 | 1 | 3390940 | 2017-07-18 | A00297 | -4780.24 | -286.81 | -5067.05 | 有效發票 |
| 2 | 1 | 3390941 | 2017-07-18 | A00297 | 943.40 | 56.60 | 1000.00 | 有效發票 |
| 3 | 1 | 3390942 | 2017-07-18 | A00297 | 4780.24 | 286.81 | 5067.05 | 有效發票 |
| 4 | 1 | 9902669 | 2017-08-07 | A05061 | 326.21 | 9.79 | 336.00 | 有效發票 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 210942 | 122 | 54706234 | 2019-04-17 | A08967 | 223.30 | 6.70 | 230.00 | 有效發票 |
| 210943 | 122 | 55721344 | 2020-01-10 | A09184 | 264.15 | 15.85 | 280.00 | 有效發票 |
| 210944 | 123 | 38493295 | 2017-12-15 | A03624 | 264.15 | 15.85 | 280.00 | 有效發票 |
| 210945 | 123 | 95472001 | 2018-12-29 | A03626 | 264.15 | 15.85 | 280.00 | 有效發票 |
| 210946 | 123 | 54469883 | 2019-12-18 | A03626 | 264.15 | 15.85 | 280.00 | 有效發票 |
210947 rows × 8 columns
data3
| 企業代號 | 發票號碼 | 開票日期 | 購方單位代號 | 金額 | 稅額 | 價稅合計 | 發票狀態 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 11459356 | 2017-08-04 | B03711 | 9401.71 | 1598.29 | 11000.0 | 有效發票 |
| 1 | 1 | 5076239 | 2017-08-09 | B00844 | 8170.94 | 1389.06 | 9560.0 | 有效發票 |
| 2 | 1 | 5076240 | 2017-08-09 | B00844 | 8170.94 | 1389.06 | 9560.0 | 有效發票 |
| 3 | 1 | 5076241 | 2017-08-09 | B00844 | 4085.47 | 694.53 | 4780.0 | 有效發票 |
| 4 | 1 | 5076242 | 2017-08-09 | B00844 | 4085.47 | 694.53 | 4780.0 | 有效發票 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 162479 | 123 | 8887701 | 2019-12-17 | B10944 | 4827.67 | 144.83 | 4972.5 | 有效發票 |
| 162480 | 123 | 8887702 | 2019-12-17 | B10944 | 7412.62 | 222.38 | 7635.0 | 有效發票 |
| 162481 | 123 | 34173085 | 2019-12-17 | B13093 | 1917.47 | 57.53 | 1975.0 | 有效發票 |
| 162482 | 123 | 8887703 | 2019-12-25 | B13093 | 7252.42 | 217.58 | 7470.0 | 有效發票 |
| 162483 | 123 | 8887704 | 2019-12-25 | B13093 | 6660.19 | 199.81 | 6860.0 | 有效發票 |
162484 rows × 8 columns
資料預處理
#計算有效發票、負數發票和作廢發票數量
def cnt(a,b,df):
tot=0
for i in range(a,b):
if df.iloc[i,6]<0 and df.iloc[i,7] == '有效發票':
tot+=1
if(len(df.iloc[a:b,:]['發票狀態'].value_counts())==1):
return df.iloc[a:b,:]['發票狀態'].value_counts()['有效發票'],0,tot
return df.iloc[a:b,:]['發票狀態'].value_counts()['有效發票'],df.iloc[a:b,:]['發票狀態'].value_counts()['作廢發票'],tot
#計算有效金額,有效稅額,作廢額
def cnt2(a,b,df):
zf=0
yxj=0
yxs=0
for i in range(a,b):
if df.iloc[i,7] == '作廢發票':
zf+=df.iloc[i,6]
else:
yxj+=df.iloc[i,4]
yxs+=df.iloc[i,5]
return yxj,yxs,zf
#對進項發票進行統計
checkin=pd.DataFrame(data2['企業代號'].value_counts())
checkin.columns=['進項發票數量']
checkin.sort_index(inplace=True)
last=0
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
temp6=[]
temp7=[]
for i in range(len(checkin)):
a,b,c=cnt(last,last+int(checkin.iloc[i,0]),data2)
d,e,f=cnt2(last,last+int(checkin.iloc[i,0]),data2)
last=last+int(checkin.iloc[i,0])
temp1.append(a)
temp2.append(b)
temp3.append(c)
temp4.append(d)
temp5.append(e)
temp6.append(f)
temp7.append(d+e)
checkin['進項有效發票']=temp1
checkin['進項作廢發票']=temp2
checkin['進項負數發票']=temp3
checkin['進項有效金額']=temp4
checkin['進項有效稅額']=temp5
checkin['進項無效額']=temp6
checkin['進項有效價稅']=temp7
#對銷項發票進行統計
checkout=pd.DataFrame(data3['企業代號'].value_counts())
checkout.columns=['銷項發票數量']
checkout.sort_index(inplace=True)
last=0
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
temp6=[]
temp7=[]
for i in range(len(checkout)):
a,b,c=cnt(last,last+int(checkout.iloc[i,0]),data3)
d,e,f=cnt2(last,last+int(checkout.iloc[i,0]),data3)
last=last+int(checkout.iloc[i,0])
temp1.append(a)
temp2.append(b)
temp3.append(c)
temp4.append(d)
temp5.append(e)
temp6.append(f)
temp7.append(d+e)
checkout['銷項有效發票']=temp1
checkout['銷項作廢發票']=temp2
checkout['銷項負數發票']=temp3
checkout['銷項有效金額']=temp4
checkout['銷項有效稅額']=temp5
checkout['銷項無效額']=temp6
checkout['銷項有效價稅']=temp7
#保存中間結果
checkin.to_excel('value_counts_in.xls')
checkout.to_excel('value_counts_out.xls')
#合并進項和銷項發票收據資料,為進行下一步計算做準備
checks=pd.concat([checkin,checkout],axis=1)
#對發票進行匯總統計
temp1=data['信譽評級']
temp2=data['是否違約']
temp1.index=range(1,124)
temp2.index=range(1,124)
checks=pd.concat([temp1,temp2,checks],axis=1)
checks['收入']=checks['銷項有效價稅']-checks['進項有效價稅']
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
last1=last2=0
a=b=0
for i in range(len(checks)):
next1=last1+checks.iloc[i,2]
next2=last2+checks.iloc[i,10]
temp3=data2.iloc[last1:next1,3].value_counts()
temp4=data3.iloc[last2:next2,3].value_counts()
if(len(temp3)<=3):
temp1.append(1)
temp2.append(1)
temp5.append(1)
else:
a=sum(temp3[:3])/sum(temp3)
b=sum(temp4[:3])/sum(temp4)
temp1.append(a)
temp2.append(b)
temp5.append(np.sqrt((a*a+b*b)/2))
last1=next1
last2=next2
checks['進穩定度指標']=temp1
checks['銷穩定度指標']=temp2
checks['供求穩定度指標']=temp5
temp1=[]
temp2=[]
for i in range(len(checks)):
sum1=sum2=sum3=0
sum1=checks.iloc[i,2]+checks.iloc[i,10]
sum2=checks.iloc[i,4]+checks.iloc[i,12]
sum3=checks.iloc[i,5]+checks.iloc[i,13]
temp1.append(sum2/sum1)
temp2.append(sum3/sum1)
checks['作廢發票率']=temp1
checks['負數發票率']=temp2
#保存中間結果
checks.to_excel('checks_1.xls')
第一問子問題一求解
pa0=checks[checks['信譽評級']!='D']
pa0
| 信譽評級 | 是否違約 | 進項發票數量 | 進項有效發票 | 進項作廢發票 | 進項負數發票 | 進項有效金額 | 進項有效稅額 | 進項無效額 | 進項有效價稅 | ... | 銷項有效金額 | 銷項有效稅額 | 銷項無效額 | 銷項有效價稅 | 收入 | 進穩定度指標 | 銷穩定度指標 | 供求穩定度指標 | 作廢發票率 | 負數發票率 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | A | 否 | 3441 | 3249 | 192 | 71 | 5.744706e+09 | 8.932358e+08 | 2.547518e+08 | 6.637942e+09 | ... | 4.065843e+09 | 6.327901e+08 | 1.001785e+08 | 4.698633e+09 | -1.939309e+09 | 0.515838 | 0.236252 | 0.401188 | 0.036014 | 0.025885 |
| 2 | A | 否 | 32156 | 31435 | 721 | 156 | 1.557623e+08 | 6.725653e+06 | 9.248509e+06 | 1.624880e+08 | ... | 5.908417e+08 | 3.545392e+07 | 6.841255e+07 | 6.262956e+08 | 4.638077e+08 | 0.268597 | 0.084520 | 0.199108 | 0.039297 | 0.011457 |
| 3 | C | 否 | 4561 | 4367 | 194 | 26 | 5.202698e+07 | 2.152374e+06 | 3.341486e+06 | 5.417935e+07 | ... | 5.701780e+08 | 9.089228e+07 | 2.166951e+07 | 6.610703e+08 | 6.068909e+08 | 0.168823 | 0.568936 | 0.419636 | 0.020221 | 0.154781 |
| 4 | C | 否 | 558 | 521 | 37 | 4 | 2.198771e+08 | 3.470711e+07 | 1.258232e+08 | 2.545842e+08 | ... | 1.839970e+09 | 3.065709e+08 | 1.990901e+08 | 2.146541e+09 | 1.891956e+09 | 0.261649 | 0.710892 | 0.535643 | 0.081391 | 0.004661 |
| 5 | B | 否 | 2169 | 2084 | 85 | 16 | 1.977850e+08 | 2.954699e+07 | 4.718235e+06 | 2.273320e+08 | ... | 2.026323e+08 | 3.065841e+07 | 9.497473e+06 | 2.332907e+08 | 5.958721e+06 | 0.393269 | 0.591509 | 0.502267 | 0.043357 | 0.008052 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 98 | B | 否 | 51 | 50 | 1 | 1 | 1.993190e+05 | 9.963970e+03 | 2.060000e+02 | 2.092830e+05 | ... | 1.403242e+06 | 4.186923e+04 | 3.697712e+05 | 1.445111e+06 | 1.235828e+06 | 0.392157 | 0.732026 | 0.587218 | 0.102941 | 0.034314 |
| 104 | C | 否 | 1 | 1 | 0 | 0 | 2.641500e+02 | 1.585000e+01 | 0.000000e+00 | 2.800000e+02 | ... | 2.626505e+05 | 7.879490e+03 | 2.000000e+04 | 2.705300e+05 | 2.702500e+05 | 1.000000 | 1.000000 | 1.000000 | 0.090909 | 0.045455 |
| 105 | C | 否 | 6 | 6 | 0 | 0 | 7.436920e+03 | 1.043080e+03 | 0.000000e+00 | 8.480000e+03 | ... | 9.248194e+05 | 2.774452e+04 | 1.039500e+04 | 9.525639e+05 | 9.440839e+05 | 0.833333 | 0.196721 | 0.605452 | 0.007812 | 0.031250 |
| 106 | B | 否 | 36 | 35 | 1 | 0 | 5.033527e+04 | 2.125830e+03 | 9.000000e+03 | 5.246110e+04 | ... | 5.860489e+05 | 1.762900e+04 | 5.552000e+04 | 6.036779e+05 | 5.512168e+05 | 0.361111 | 0.156863 | 0.278395 | 0.084656 | 0.021164 |
| 110 | C | 否 | 3 | 3 | 0 | 0 | 9.633900e+02 | 7.661000e+01 | 0.000000e+00 | 1.040000e+03 | ... | 1.969199e+05 | 5.907650e+03 | 7.257769e+04 | 2.028275e+05 | 2.017875e+05 | 1.000000 | 1.000000 | 1.000000 | 0.244186 | 0.000000 |
99 rows × 24 columns
pa0.iloc[:,0].value_counts()
B 38
C 34
A 27
Name: 信譽評級, dtype: int64
#替換指標值、洗掉多余項
pa1=pa0
pa1=pa1.replace('是',0)
pa1=pa1.replace('否',1)
pa1=pa1.replace('A',100)
pa1=pa1.replace('B',80)
pa1=pa1.replace('C',52.45)
pa1.drop(pa1.columns[range(2,18)],axis=1,inplace=True)
pa1.drop(pa1.columns[range(3,5)],axis=1,inplace=True)
pa1
| 信譽評級 | 是否違約 | 收入 | 供求穩定度指標 | 作廢發票率 | 負數發票率 | |
|---|---|---|---|---|---|---|
| 1 | 100.00 | 1 | -1.939309e+09 | 0.401188 | 0.036014 | 0.025885 |
| 2 | 100.00 | 1 | 4.638077e+08 | 0.199108 | 0.039297 | 0.011457 |
| 3 | 52.45 | 1 | 6.068909e+08 | 0.419636 | 0.020221 | 0.154781 |
| 4 | 52.45 | 1 | 1.891956e+09 | 0.535643 | 0.081391 | 0.004661 |
| 5 | 80.00 | 1 | 5.958721e+06 | 0.502267 | 0.043357 | 0.008052 |
| ... | ... | ... | ... | ... | ... | ... |
| 98 | 80.00 | 1 | 1.235828e+06 | 0.587218 | 0.102941 | 0.034314 |
| 104 | 52.45 | 1 | 2.702500e+05 | 1.000000 | 0.090909 | 0.045455 |
| 105 | 52.45 | 1 | 9.440839e+05 | 0.605452 | 0.007812 | 0.031250 |
| 106 | 80.00 | 1 | 5.512168e+05 | 0.278395 | 0.084656 | 0.021164 |
| 110 | 52.45 | 1 | 2.017875e+05 | 1.000000 | 0.244186 | 0.000000 |
99 rows × 6 columns
#成本型指標轉換,資料歸一化
pa1['作廢發票率']=(max(pa1['作廢發票率'])-pa1['作廢發票率'])/(max(pa1['作廢發票率'])-min(pa1['作廢發票率']))
pa1['負數發票率']=(max(pa1['負數發票率'])-pa1['負數發票率'])/(max(pa1['負數發票率'])-min(pa1['負數發票率']))
pa1=(pa1-pa1.min())/(pa1.max()-pa1.min())
pa2=np.asarray(pa1)
#熵權法計算權重
ta=pa1
tb=pa2
n,m=np.shape(tb)
s=np.sum(ta,axis=0)
s=np.asarray(s)
s=np.reshape(s,(1,len(s)))
s=np.repeat(s,len(tb),axis=0)
s=s.reshape((n,m))
tb=tb/s
a=tb*1.0
a[np.where(tb==0)]=0.001
e=(-1.0/np.log(n))*np.sum(tb*np.log(a),axis=0)
w=(1-e)/np.sum(1-e)
w
array([0.62060705, 0.04171411, 0.02020687, 0.25088922, 0.04182548,
0.02475726])
#Topsis綜合評價
df=pa2/np.sqrt((pa2**2).sum())
df=pd.DataFrame(df)
X=pd.DataFrame([df.min(),df.max()],index=['負理想解','正理想解'])
R=df.copy()
R.columns=['信譽評級','是否違約','收入','供求穩定度指標','作廢發票率','負數發票率']
R['正理想解']=np.sqrt(((df - X.loc['正理想解']) ** 2 * w).sum(axis=1))
R['負理想解']=np.sqrt(((df - X.loc['負理想解']) ** 2 * w).sum(axis=1))
R['綜合得分']=R['負理想解'] / (R['負理想解'] + R['正理想解'])
R['排序']=R.rank(ascending=False)['綜合得分']
R['公司識別碼']=pa1.index
R['利率']=15-(R['綜合得分']-R['綜合得分'].min())/(R['綜合得分'].max()-R['綜合得分'].min())*11
#保存第一問子問題一結果
R.to_excel('result_1.xls')
第一問子問題二求解
pb0=pa0
pb1=pb0.iloc[:,[2,6,7,10,14,15,18,19,20,21,22,23]]#刪去多余的指標
pb2=np.asarray(pb1)#轉化為numpy陣列,便于進行下一步計算
pb2=zscore(pb2)#資料標準化
#PCA主成分分析
pca=PCA()
pca.fit(pb2)
#計算差異保留比例
pcavr=[]
for i in range(1,13):
pcavr.append(sum(pca.explained_variance_ratio_[:i]))
pcavr
[0.35983267152542864,
0.5976689949959799,
0.7300543810440263,
0.8069829584129986,
0.8737054990987985,
0.9362732312043334,
0.9788073230784305,
0.9989350168474531,
0.9995699794090525,
0.9999523012802018,
0.9999999999999999,
0.9999999999999999]
#PCA差異保留畫圖分析
X = range(1,13)
#plt.figure(figsize=(12,8))
plt.xlabel('n_components')
plt.title('Principal Component Analysis')
plt.ylabel('Explained Variance Ratio')
plt.plot(X,pcavr,'o-')
plt.locator_params('x',nbins=12)
plt.savefig('Principal_Component_Analysis.jpg')
plt.show()

#選取最佳維度6,保留93%差異性
pca_=PCA(n_components=6)
pb3=pca_.fit_transform(pb2)
#肘部法則計算最佳聚類數
SSE=[]
for k in range(2,21):
km=KMeans(n_clusters=k,random_state=10)
km.fit(pb3)
SSE.append(km.inertia_)
X = range(2,21)
#肘部法則畫圖分析
#plt.figure(figsize=(12,8))
plt.xlabel('k')
plt.title('Elbow Method')
plt.ylabel('SSE')
plt.plot(X,SSE,'o-')
plt.locator_params('x',nbins=20)
plt.savefig('Elbow_Method.jpg')
plt.show()

#輪廓系數計算最佳聚類數
SC=[]
for k in range(2,21):
km=KMeans(n_clusters=k,random_state=10)
km.fit(pb3)
a=silhouette_score(pb3,km.labels_, metric='euclidean')
SC.append(a)
#輪廓系數畫圖分析
X = range(2,21)
#plt.figure(figsize=(12,8))
plt.xlabel('k')
plt.title('Silhouette Coefficient')
plt.ylabel('SC')
plt.plot(X,SC,'o-')
plt.locator_params('x',nbins=20)
plt.savefig('Silhouette_Coefficient.jpg')
plt.show()

#選取最佳聚類數9進行聚類分析
km=KMeans(n_clusters=9,random_state=12)
km.fit(pb3)
#標簽統計
pd.DataFrame(km.labels_)[0].value_counts()
7 34
6 29
2 16
5 8
8 5
4 3
3 2
1 1
0 1
Name: 0, dtype: int64
#加入標簽
pb1['分類']=km.labels_
pb1
/home/yang/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
?
| 進項發票數量 | 進項有效金額 | 進項有效稅額 | 銷項發票數量 | 銷項有效金額 | 銷項有效稅額 | 收入 | 進穩定度指標 | 銷穩定度指標 | 供求穩定度指標 | 作廢發票率 | 負數發票率 | 分類 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 3441 | 5.744706e+09 | 8.932358e+08 | 8110 | 4.065843e+09 | 6.327901e+08 | -1.939309e+09 | 0.515838 | 0.236252 | 0.401188 | 0.036014 | 0.025885 | 1 |
| 2 | 32156 | 1.557623e+08 | 6.725653e+06 | 12707 | 5.908417e+08 | 3.545392e+07 | 4.638077e+08 | 0.268597 | 0.084520 | 0.199108 | 0.039297 | 0.011457 | 4 |
| 3 | 4561 | 5.202698e+07 | 2.152374e+06 | 24073 | 5.701780e+08 | 9.089228e+07 | 6.068909e+08 | 0.168823 | 0.568936 | 0.419636 | 0.020221 | 0.154781 | 3 |
| 4 | 558 | 2.198771e+08 | 3.470711e+07 | 2231 | 1.839970e+09 | 3.065709e+08 | 1.891956e+09 | 0.261649 | 0.710892 | 0.535643 | 0.081391 | 0.004661 | 0 |
| 5 | 2169 | 1.977850e+08 | 2.954699e+07 | 1060 | 2.026323e+08 | 3.065841e+07 | 5.958721e+06 | 0.393269 | 0.591509 | 0.502267 | 0.043357 | 0.008052 | 7 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 98 | 51 | 1.993190e+05 | 9.963970e+03 | 153 | 1.403242e+06 | 4.186923e+04 | 1.235828e+06 | 0.392157 | 0.732026 | 0.587218 | 0.102941 | 0.034314 | 6 |
| 104 | 1 | 2.641500e+02 | 1.585000e+01 | 21 | 2.626505e+05 | 7.879490e+03 | 2.702500e+05 | 1.000000 | 1.000000 | 1.000000 | 0.090909 | 0.045455 | 5 |
| 105 | 6 | 7.436920e+03 | 1.043080e+03 | 122 | 9.248194e+05 | 2.774452e+04 | 9.440839e+05 | 0.833333 | 0.196721 | 0.605452 | 0.007812 | 0.031250 | 6 |
| 106 | 36 | 5.033527e+04 | 2.125830e+03 | 153 | 5.860489e+05 | 1.762900e+04 | 5.512168e+05 | 0.361111 | 0.156863 | 0.278395 | 0.084656 | 0.021164 | 7 |
| 110 | 3 | 9.633900e+02 | 7.661000e+01 | 83 | 1.969199e+05 | 5.907650e+03 | 2.017875e+05 | 1.000000 | 1.000000 | 1.000000 | 0.244186 | 0.000000 | 5 |
99 rows × 13 columns
#保存問題一子問題二結果
pb1.to_excel('result_2.xls')
2.附件一Topsis綜合評價
說明
這些程式從問題一改寫而來,問題要去掉信譽等級為D的再算topsis綜合得分,為了神經網路的學習,這里不需要去D
資料讀取
#匯入相關庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import zscore
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
#讀取資料
data = pd.read_excel('a0.xlsx')
data2 =pd.read_excel('a0.xlsx',sheet_name=1)
data3 =pd.read_excel('a0.xlsx',sheet_name=2)
#將企業代號前的E去掉,使其成為數值型變數,便于排序
data['企業代號']=data['企業代號'].apply(lambda x:int(x[1:]))
data2['企業代號']=data2['企業代號'].apply(lambda x:int(x[1:]))
data3['企業代號']=data3['企業代號'].apply(lambda x:int(x[1:]))
資料概覽
data
| 企業代號 | 企業名稱 | 信譽評級 | 是否違約 | |
|---|---|---|---|---|
| 0 | 1 | ***電器銷售有限公司 | A | 否 |
| 1 | 2 | ***技術有限責任公司 | A | 否 |
| 2 | 3 | ***電子(中國)有限公司***分公司 | C | 否 |
| 3 | 4 | ***發展有限責任公司 | C | 否 |
| 4 | 5 | ***供應鏈管理有限公司 | B | 否 |
| ... | ... | ... | ... | ... |
| 118 | 119 | ***藥房 | D | 是 |
| 119 | 120 | ***陳列廣告有限公司 | D | 是 |
| 120 | 121 | ***藥業連鎖有限公司***藥店 | D | 是 |
| 121 | 122 | ***商貿有限責任公司 | D | 是 |
| 122 | 123 | ***創科技有限責任公司 | D | 是 |
123 rows × 4 columns
data2
| 企業代號 | 發票號碼 | 開票日期 | 銷方單位代號 | 金額 | 稅額 | 價稅合計 | 發票狀態 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 3390939 | 2017-07-18 | A00297 | -943.40 | -56.60 | -1000.00 | 有效發票 |
| 1 | 1 | 3390940 | 2017-07-18 | A00297 | -4780.24 | -286.81 | -5067.05 | 有效發票 |
| 2 | 1 | 3390941 | 2017-07-18 | A00297 | 943.40 | 56.60 | 1000.00 | 有效發票 |
| 3 | 1 | 3390942 | 2017-07-18 | A00297 | 4780.24 | 286.81 | 5067.05 | 有效發票 |
| 4 | 1 | 9902669 | 2017-08-07 | A05061 | 326.21 | 9.79 | 336.00 | 有效發票 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 210942 | 122 | 54706234 | 2019-04-17 | A08967 | 223.30 | 6.70 | 230.00 | 有效發票 |
| 210943 | 122 | 55721344 | 2020-01-10 | A09184 | 264.15 | 15.85 | 280.00 | 有效發票 |
| 210944 | 123 | 38493295 | 2017-12-15 | A03624 | 264.15 | 15.85 | 280.00 | 有效發票 |
| 210945 | 123 | 95472001 | 2018-12-29 | A03626 | 264.15 | 15.85 | 280.00 | 有效發票 |
| 210946 | 123 | 54469883 | 2019-12-18 | A03626 | 264.15 | 15.85 | 280.00 | 有效發票 |
210947 rows × 8 columns
data3
| 企業代號 | 發票號碼 | 開票日期 | 購方單位代號 | 金額 | 稅額 | 價稅合計 | 發票狀態 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 11459356 | 2017-08-04 | B03711 | 9401.71 | 1598.29 | 11000.0 | 有效發票 |
| 1 | 1 | 5076239 | 2017-08-09 | B00844 | 8170.94 | 1389.06 | 9560.0 | 有效發票 |
| 2 | 1 | 5076240 | 2017-08-09 | B00844 | 8170.94 | 1389.06 | 9560.0 | 有效發票 |
| 3 | 1 | 5076241 | 2017-08-09 | B00844 | 4085.47 | 694.53 | 4780.0 | 有效發票 |
| 4 | 1 | 5076242 | 2017-08-09 | B00844 | 4085.47 | 694.53 | 4780.0 | 有效發票 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 162479 | 123 | 8887701 | 2019-12-17 | B10944 | 4827.67 | 144.83 | 4972.5 | 有效發票 |
| 162480 | 123 | 8887702 | 2019-12-17 | B10944 | 7412.62 | 222.38 | 7635.0 | 有效發票 |
| 162481 | 123 | 34173085 | 2019-12-17 | B13093 | 1917.47 | 57.53 | 1975.0 | 有效發票 |
| 162482 | 123 | 8887703 | 2019-12-25 | B13093 | 7252.42 | 217.58 | 7470.0 | 有效發票 |
| 162483 | 123 | 8887704 | 2019-12-25 | B13093 | 6660.19 | 199.81 | 6860.0 | 有效發票 |
162484 rows × 8 columns
資料預處理
#計算有效發票、負數發票和作廢發票數量
def cnt(a,b,df):
tot=0
for i in range(a,b):
if df.iloc[i,6]<0 and df.iloc[i,7] == '有效發票':
tot+=1
if(len(df.iloc[a:b,:]['發票狀態'].value_counts())==1):
return df.iloc[a:b,:]['發票狀態'].value_counts()['有效發票'],0,tot
return df.iloc[a:b,:]['發票狀態'].value_counts()['有效發票'],df.iloc[a:b,:]['發票狀態'].value_counts()['作廢發票'],tot
#計算有效金額,有效稅額,作廢額
def cnt2(a,b,df):
zf=0
yxj=0
yxs=0
for i in range(a,b):
if df.iloc[i,7] == '作廢發票':
zf+=df.iloc[i,6]
else:
yxj+=df.iloc[i,4]
yxs+=df.iloc[i,5]
return yxj,yxs,zf
#對進項發票進行統計
checkin=pd.DataFrame(data2['企業代號'].value_counts())
checkin.columns=['進項發票數量']
checkin.sort_index(inplace=True)
last=0
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
temp6=[]
temp7=[]
for i in range(len(checkin)):
a,b,c=cnt(last,last+int(checkin.iloc[i,0]),data2)
d,e,f=cnt2(last,last+int(checkin.iloc[i,0]),data2)
last=last+int(checkin.iloc[i,0])
temp1.append(a)
temp2.append(b)
temp3.append(c)
temp4.append(d)
temp5.append(e)
temp6.append(f)
temp7.append(d+e)
checkin['進項有效發票']=temp1
checkin['進項作廢發票']=temp2
checkin['進項負數發票']=temp3
checkin['進項有效金額']=temp4
checkin['進項有效稅額']=temp5
checkin['進項無效額']=temp6
checkin['進項有效價稅']=temp7
#對銷項發票進行統計
checkout=pd.DataFrame(data3['企業代號'].value_counts())
checkout.columns=['銷項發票數量']
checkout.sort_index(inplace=True)
last=0
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
temp6=[]
temp7=[]
for i in range(len(checkout)):
a,b,c=cnt(last,last+int(checkout.iloc[i,0]),data3)
d,e,f=cnt2(last,last+int(checkout.iloc[i,0]),data3)
last=last+int(checkout.iloc[i,0])
temp1.append(a)
temp2.append(b)
temp3.append(c)
temp4.append(d)
temp5.append(e)
temp6.append(f)
temp7.append(d+e)
checkout['銷項有效發票']=temp1
checkout['銷項作廢發票']=temp2
checkout['銷項負數發票']=temp3
checkout['銷項有效金額']=temp4
checkout['銷項有效稅額']=temp5
checkout['銷項無效額']=temp6
checkout['銷項有效價稅']=temp7
#合并進項和銷項發票收據資料,為進行下一步計算做準備
checks=pd.concat([checkin,checkout],axis=1)
#對發票進行匯總統計
temp1=data['信譽評級']
temp2=data['是否違約']
temp1.index=range(1,124)
temp2.index=range(1,124)
checks=pd.concat([temp1,temp2,checks],axis=1)
checks['收入']=checks['銷項有效價稅']-checks['進項有效價稅']
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
last1=last2=0
a=b=0
for i in range(len(checks)):
next1=last1+checks.iloc[i,2]
next2=last2+checks.iloc[i,10]
temp3=data2.iloc[last1:next1,3].value_counts()
temp4=data3.iloc[last2:next2,3].value_counts()
if(len(temp3)<=3):
temp1.append(1)
temp2.append(1)
temp5.append(1)
else:
a=sum(temp3[:3])/sum(temp3)
b=sum(temp4[:3])/sum(temp4)
temp1.append(a)
temp2.append(b)
temp5.append(np.sqrt((a*a+b*b)/2))
last1=next1
last2=next2
checks['進穩定度指標']=temp1
checks['銷穩定度指標']=temp2
checks['供求穩定度指標']=temp5
temp1=[]
temp2=[]
for i in range(len(checks)):
sum1=sum2=sum3=0
sum1=checks.iloc[i,2]+checks.iloc[i,10]
sum2=checks.iloc[i,4]+checks.iloc[i,12]
sum3=checks.iloc[i,5]+checks.iloc[i,13]
temp1.append(sum2/sum1)
temp2.append(sum3/sum1)
checks['作廢發票率']=temp1
checks['負數發票率']=temp2
對不去D的資料進行topsis綜合評價
#pa0=checks[checks['信譽評級']!='D']
pa0=checks
pa0
| 信譽評級 | 是否違約 | 進項發票數量 | 進項有效發票 | 進項作廢發票 | 進項負數發票 | 進項有效金額 | 進項有效稅額 | 進項無效額 | 進項有效價稅 | ... | 銷項有效金額 | 銷項有效稅額 | 銷項無效額 | 銷項有效價稅 | 收入 | 進穩定度指標 | 銷穩定度指標 | 供求穩定度指標 | 作廢發票率 | 負數發票率 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | A | 否 | 3441 | 3249 | 192 | 71 | 5.744706e+09 | 8.932358e+08 | 2.547518e+08 | 6.637942e+09 | ... | 4.065843e+09 | 6.327901e+08 | 1.001785e+08 | 4.698633e+09 | -1.939309e+09 | 0.515838 | 0.236252 | 0.401188 | 0.036014 | 0.025885 |
| 2 | A | 否 | 32156 | 31435 | 721 | 156 | 1.557623e+08 | 6.725653e+06 | 9.248509e+06 | 1.624880e+08 | ... | 5.908417e+08 | 3.545392e+07 | 6.841255e+07 | 6.262956e+08 | 4.638077e+08 | 0.268597 | 0.084520 | 0.199108 | 0.039297 | 0.011457 |
| 3 | C | 否 | 4561 | 4367 | 194 | 26 | 5.202698e+07 | 2.152374e+06 | 3.341486e+06 | 5.417935e+07 | ... | 5.701780e+08 | 9.089228e+07 | 2.166951e+07 | 6.610703e+08 | 6.068909e+08 | 0.168823 | 0.568936 | 0.419636 | 0.020221 | 0.154781 |
| 4 | C | 否 | 558 | 521 | 37 | 4 | 2.198771e+08 | 3.470711e+07 | 1.258232e+08 | 2.545842e+08 | ... | 1.839970e+09 | 3.065709e+08 | 1.990901e+08 | 2.146541e+09 | 1.891956e+09 | 0.261649 | 0.710892 | 0.535643 | 0.081391 | 0.004661 |
| 5 | B | 否 | 2169 | 2084 | 85 | 16 | 1.977850e+08 | 2.954699e+07 | 4.718235e+06 | 2.273320e+08 | ... | 2.026323e+08 | 3.065841e+07 | 9.497473e+06 | 2.332907e+08 | 5.958721e+06 | 0.393269 | 0.591509 | 0.502267 | 0.043357 | 0.008052 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 119 | D | 是 | 315 | 314 | 1 | 1 | 2.197387e+05 | 2.999611e+04 | 6.250000e+01 | 2.497348e+05 | ... | 3.567186e+04 | 1.070140e+03 | 5.000000e+02 | 3.674200e+04 | -2.129928e+05 | 0.761905 | 0.333333 | 0.588052 | 0.011905 | 0.002976 |
| 120 | D | 是 | 36 | 35 | 1 | 0 | 1.811556e+04 | 1.330780e+03 | 1.075000e+04 | 1.944634e+04 | ... | 1.906732e+05 | 5.720210e+03 | 0.000000e+00 | 1.963934e+05 | 1.769471e+05 | 0.583333 | 0.206897 | 0.437655 | 0.323077 | 0.000000 |
| 121 | D | 是 | 50 | 50 | 0 | 1 | 1.073486e+06 | 1.776337e+05 | 0.000000e+00 | 1.251120e+06 | ... | 1.014620e+05 | 1.282553e+04 | 3.505210e+03 | 1.142875e+05 | -1.136832e+06 | 0.740000 | 0.215054 | 0.544907 | 0.097458 | 0.004237 |
| 122 | D | 是 | 48 | 47 | 1 | 1 | 5.067211e+04 | 3.074150e+03 | 9.620000e+02 | 5.374626e+04 | ... | 5.892182e+04 | 1.818780e+03 | 2.674846e+04 | 6.074060e+04 | 6.994340e+03 | 0.437500 | 0.169492 | 0.331763 | 0.102410 | 0.054217 |
| 123 | D | 是 | 3 | 3 | 0 | 0 | 7.924500e+02 | 4.755000e+01 | 0.000000e+00 | 8.400000e+02 | ... | 2.002358e+05 | 2.732385e+04 | 3.960850e+04 | 2.275597e+05 | 2.267197e+05 | 1.000000 | 1.000000 | 1.000000 | 0.470588 | 0.000000 |
123 rows × 24 columns
pa0.iloc[:,0].value_counts()
B 38
C 34
A 27
D 24
Name: 信譽評級, dtype: int64
#替換指標值、洗掉多余項
pa1=pa0
pa1=pa1.replace('是',0)
pa1=pa1.replace('否',1)
pa1=pa1.replace('A',100)
pa1=pa1.replace('B',80)
pa1=pa1.replace('C',52.45)
pa1=pa1.replace('D',1)
pa1.drop(pa1.columns[range(2,18)],axis=1,inplace=True)
pa1.drop(pa1.columns[range(3,5)],axis=1,inplace=True)
pa1
| 信譽評級 | 是否違約 | 收入 | 供求穩定度指標 | 作廢發票率 | 負數發票率 | |
|---|---|---|---|---|---|---|
| 1 | 100.00 | 1 | -1.939309e+09 | 0.401188 | 0.036014 | 0.025885 |
| 2 | 100.00 | 1 | 4.638077e+08 | 0.199108 | 0.039297 | 0.011457 |
| 3 | 52.45 | 1 | 6.068909e+08 | 0.419636 | 0.020221 | 0.154781 |
| 4 | 52.45 | 1 | 1.891956e+09 | 0.535643 | 0.081391 | 0.004661 |
| 5 | 80.00 | 1 | 5.958721e+06 | 0.502267 | 0.043357 | 0.008052 |
| ... | ... | ... | ... | ... | ... | ... |
| 119 | 1.00 | 0 | -2.129928e+05 | 0.588052 | 0.011905 | 0.002976 |
| 120 | 1.00 | 0 | 1.769471e+05 | 0.437655 | 0.323077 | 0.000000 |
| 121 | 1.00 | 0 | -1.136832e+06 | 0.544907 | 0.097458 | 0.004237 |
| 122 | 1.00 | 0 | 6.994340e+03 | 0.331763 | 0.102410 | 0.054217 |
| 123 | 1.00 | 0 | 2.267197e+05 | 1.000000 | 0.470588 | 0.000000 |
123 rows × 6 columns
#成本型指標轉換,資料歸一化
pa1['作廢發票率']=(max(pa1['作廢發票率'])-pa1['作廢發票率'])/(max(pa1['作廢發票率'])-min(pa1['作廢發票率']))
pa1['負數發票率']=(max(pa1['負數發票率'])-pa1['負數發票率'])/(max(pa1['負數發票率'])-min(pa1['負數發票率']))
pa1=(pa1-pa1.min())/(pa1.max()-pa1.min())
pa2=np.asarray(pa1)
#熵權法計算權重
ta=pa1
tb=pa2
n,m=np.shape(tb)
s=np.sum(ta,axis=0)
s=np.asarray(s)
s=np.reshape(s,(1,len(s)))
s=np.repeat(s,len(tb),axis=0)
s=s.reshape((n,m))
tb=tb/s
a=tb*1.0
a[np.where(tb==0)]=0.001
e=(-1.0/np.log(n))*np.sum(tb*np.log(a),axis=0)
w=(1-e)/np.sum(1-e)
w
array([0.34111674, 0.33907811, 0.01653923, 0.24240319, 0.03652877,
0.02433396])
#Topsis綜合評價
df=pa2/np.sqrt((pa2**2).sum())
df=pd.DataFrame(df)
X=pd.DataFrame([df.min(),df.max()],index=['負理想解','正理想解'])
R=df.copy()
R.columns=['信譽評級','是否違約','收入','供求穩定度指標','作廢發票率','負數發票率']
R['正理想解']=np.sqrt(((df - X.loc['正理想解']) ** 2 * w).sum(axis=1))
R['負理想解']=np.sqrt(((df - X.loc['負理想解']) ** 2 * w).sum(axis=1))
R['綜合得分']=R['負理想解'] / (R['負理想解'] + R['正理想解'])
R['排序']=R.rank(ascending=False)['綜合得分']
R['公司識別碼']=pa1.index
R['利率']=15-(R['綜合得分']-R['綜合得分'].min())/(R['綜合得分'].max()-R['綜合得分'].min())*11
#保存topsisi分析結果
R.to_excel('result_a1.xls')
3.問題2
資料讀取
#匯入相關庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import zscore
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
from sklearn import svm
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
#讀取資料
data = pd.read_excel('b0.xlsx')
data2 =pd.read_excel('b0.xlsx',sheet_name=1)
data3 =pd.read_excel('b0.xlsx',sheet_name=2)
#將企業代號前的E去掉,使其成為數值型變數,便于排序
data['企業代號']=data['企業代號'].apply(lambda x:int(x[1:]))
data2['企業代號']=data2['企業代號'].apply(lambda x:int(x[1:]))
data3['企業代號']=data3['企業代號'].apply(lambda x:int(x[1:]))
#比較坑,附件一附件二進銷項位置不一樣,互換位置即可
temp=data2
data2=data3
data3=temp
資料概覽
data
| 企業代號 | 企業名稱 | |
|---|---|---|
| 0 | 124 | 個體經營E124 |
| 1 | 125 | 個體經營E125 |
| 2 | 126 | 個體經營E126 |
| 3 | 127 | 個體經營E127 |
| 4 | 128 | 個體經營E128 |
| ... | ... | ... |
| 297 | 421 | ***保溫材料有限公司 |
| 298 | 422 | ***童裝店 |
| 299 | 423 | ***通風設備有限公司 |
| 300 | 424 | ***貿易有限公司 |
| 301 | 425 | ***商貿有限公司 |
302 rows × 2 columns
data2
| 企業代號 | 發票號碼 | 開票日期 | 銷方單位代號 | 金額 | 稅額 | 價稅合計 | 發票狀態 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 124 | 18891676 | 2017-09-01 00:00:00 | C00014 | 338.46 | 57.54 | 396.0 | 有效發票 |
| 1 | 124 | 18691267 | 2017-09-01 00:00:00 | C00480 | 230.10 | 6.90 | 237.0 | 有效發票 |
| 2 | 124 | 12995412 | 2017-09-01 00:00:00 | C23675 | 223.30 | 6.70 | 230.0 | 有效發票 |
| 3 | 124 | 6378193 | 2017-09-01 11:11:03 | C00333 | 90090.09 | 9909.91 | 100000.0 | 有效發票 |
| 4 | 124 | 6378194 | 2017-09-01 11:12:01 | C00333 | 90090.09 | 9909.91 | 100000.0 | 有效發票 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 395170 | 425 | 72101375 | 2019-12-30 00:00:00 | C23112 | 663.11 | 19.89 | 683.0 | 有效發票 |
| 395171 | 425 | 20253285 | 2020-01-05 00:00:00 | C01937 | 45.41 | 4.09 | 49.5 | 有效發票 |
| 395172 | 425 | 20253315 | 2020-01-05 00:00:00 | C01937 | 110.14 | 1.16 | 111.3 | 有效發票 |
| 395173 | 425 | 52449404 | 2020-01-06 00:00:00 | C15032 | 73.22 | 6.58 | 79.8 | 有效發票 |
| 395174 | 425 | 5666299 | 2020-01-10 00:00:00 | C23112 | 132.04 | 3.96 | 136.0 | 有效發票 |
395175 rows × 8 columns
data3
| 企業代號 | 發票號碼 | 開票日期 | 購方單位代號 | 金額 | 稅額 | 價稅合計 | 發票狀態 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 124 | 15212483 | 2017-09-01 11:58:43 | D00585 | 839350.55 | 92328.56 | 931679.11 | 有效發票 |
| 1 | 124 | 15212484 | 2017-09-01 11:59:20 | D00585 | 900900.90 | 99099.10 | 1000000.00 | 有效發票 |
| 2 | 124 | 15212485 | 2017-09-01 11:59:51 | D00585 | 900900.90 | 99099.10 | 1000000.00 | 有效發票 |
| 3 | 124 | 15212486 | 2017-09-01 12:00:45 | D00585 | 697365.74 | 76710.23 | 774075.97 | 有效發票 |
| 4 | 124 | 6089615 | 2017-09-05 10:58:38 | D00108 | 726216.22 | 79883.78 | 806100.00 | 有效發票 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 330830 | 425 | 21803468 | 2018-04-03 00:00:00 | D21446 | 9000.00 | 270.00 | 9270.00 | 有效發票 |
| 330831 | 425 | 21803469 | 2018-04-03 00:00:00 | D21446 | 5155.34 | 154.66 | 5310.00 | 有效發票 |
| 330832 | 425 | 21803470 | 2019-06-11 00:00:00 | D02126 | 4854.37 | 145.63 | 5000.00 | 作廢發票 |
| 330833 | 425 | 21803471 | 2019-06-11 00:00:00 | D02126 | 4854.37 | 145.63 | 5000.00 | 作廢發票 |
| 330834 | 425 | 21803472 | 2019-06-11 00:00:00 | D02126 | 4854.37 | 145.63 | 5000.00 | 有效發票 |
330835 rows × 8 columns
資料預處理
#計算有效發票、負數發票和作廢發票數量
def cnt(a,b,df):
tot=0
for i in range(a,b):
if df.iloc[i,6]<0 and df.iloc[i,7] == '有效發票':
tot+=1
if(len(df.iloc[a:b,:]['發票狀態'].value_counts())==1):
return df.iloc[a:b,:]['發票狀態'].value_counts()['有效發票'],0,tot
return df.iloc[a:b,:]['發票狀態'].value_counts()['有效發票'],df.iloc[a:b,:]['發票狀態'].value_counts()['作廢發票'],tot
#計算有效金額,有效稅額,作廢額
def cnt2(a,b,df):
zf=0
yxj=0
yxs=0
for i in range(a,b):
if df.iloc[i,7] == '作廢發票':
zf+=df.iloc[i,6]
else:
yxj+=df.iloc[i,4]
yxs+=df.iloc[i,5]
return yxj,yxs,zf
#對進項發票進行統計
checkin=pd.DataFrame(data2['企業代號'].value_counts())
checkin.columns=['進項發票數量']
checkin.sort_index(inplace=True)
last=0
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
temp6=[]
temp7=[]
for i in range(len(checkin)):
a,b,c=cnt(last,last+int(checkin.iloc[i,0]),data2)
d,e,f=cnt2(last,last+int(checkin.iloc[i,0]),data2)
last=last+int(checkin.iloc[i,0])
temp1.append(a)
temp2.append(b)
temp3.append(c)
temp4.append(d)
temp5.append(e)
temp6.append(f)
temp7.append(d+e)
checkin['進項有效發票']=temp1
checkin['進項作廢發票']=temp2
checkin['進項負數發票']=temp3
checkin['進項有效金額']=temp4
checkin['進項有效稅額']=temp5
checkin['進項無效額']=temp6
checkin['進項有效價稅']=temp7
#對銷項發票進行統計
checkout=pd.DataFrame(data3['企業代號'].value_counts())
checkout.columns=['銷項發票數量']
checkout.sort_index(inplace=True)
last=0
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
temp6=[]
temp7=[]
for i in range(len(checkout)):
a,b,c=cnt(last,last+int(checkout.iloc[i,0]),data3)
d,e,f=cnt2(last,last+int(checkout.iloc[i,0]),data3)
last=last+int(checkout.iloc[i,0])
temp1.append(a)
temp2.append(b)
temp3.append(c)
temp4.append(d)
temp5.append(e)
temp6.append(f)
temp7.append(d+e)
checkout['銷項有效發票']=temp1
checkout['銷項作廢發票']=temp2
checkout['銷項負數發票']=temp3
checkout['銷項有效金額']=temp4
checkout['銷項有效稅額']=temp5
checkout['銷項無效額']=temp6
checkout['銷項有效價稅']=temp7
#保存中間結果
checkin.to_excel('value_counts_in.xls')
checkout.to_excel('value_counts_out.xls')
#合并進項和銷項發票收據資料,為進行下一步計算做準備
checks=pd.concat([checkin,checkout],axis=1)
#對發票進行匯總統計
checks['收入']=checks['銷項有效價稅']-checks['進項有效價稅']
temp1=[]
temp2=[]
temp3=[]
temp4=[]
temp5=[]
last1=last2=0
a=b=0
for i in range(len(checks)):
next1=last1+checks.iloc[i,0]
next2=last2+checks.iloc[i,8]
temp3=data2.iloc[last1:next1,3].value_counts()
temp4=data3.iloc[last2:next2,3].value_counts()
if(len(temp3)<=3):
temp1.append(1)
temp2.append(1)
temp5.append(1)
else:
if(sum(temp3)==0):
a=0
else:
a=sum(temp3[:3])/sum(temp3)
if(sum(temp4)==0):
b=0
else:
b=sum(temp4[:3])/sum(temp4)
temp1.append(a)
temp2.append(b)
temp5.append(np.sqrt((a*a+b*b)/2))
last1=next1
last2=next2
checks['進穩定度指標']=temp1
checks['銷穩定度指標']=temp2
checks['供求穩定度指標']=temp5
temp1=[]
temp2=[]
for i in range(len(checks)):
sum1=sum2=sum3=0
sum1=checks.iloc[i,0]+checks.iloc[i,8]
sum2=checks.iloc[i,2]+checks.iloc[i,10]
sum3=checks.iloc[i,3]+checks.iloc[i,11]
temp1.append(sum2/sum1)
temp2.append(sum3/sum1)
checks['作廢發票率']=temp1
checks['負數發票率']=temp2
#保存中間結果
checks.to_excel('checks_2.xls')
#讀取問題一的信譽評級資料
checks_2=pd.read_excel('checks_a1.xls',index_col=0)
#做標注,為下面的支持向量機做準備
labels=checks_2['信譽評級']
labels=labels.replace('A',1)
labels=labels.replace('B',2)
labels=labels.replace('C',3)
labels=labels.replace('D',4)
labels=np.asarray(labels)
#合并附件一和附件二的企業
checks_2.drop(['信譽評級','是否違約'],axis=1,inplace=True)
checks_3=pd.concat([checks_2,checks],axis=0)
checks_3
| 進項發票數量 | 進項有效發票 | 進項作廢發票 | 進項負數發票 | 進項有效金額 | 進項有效稅額 | 進項無效額 | 進項有效價稅 | 銷項發票數量 | 銷項有效發票 | ... | 銷項有效金額 | 銷項有效稅額 | 銷項無效額 | 銷項有效價稅 | 收入 | 進穩定度指標 | 銷穩定度指標 | 供求穩定度指標 | 作廢發票率 | 負數發票率 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 3441 | 3249 | 192 | 71 | 5.744706e+09 | 8.932358e+08 | 2.547518e+08 | 6.637942e+09 | 8110 | 7886 | ... | 4.065843e+09 | 6.327901e+08 | 1.001785e+08 | 4.698633e+09 | -1.939309e+09 | 0.515838 | 0.236252 | 0.401188 | 0.036014 | 0.025885 |
| 2 | 32156 | 31435 | 721 | 156 | 1.557623e+08 | 6.725653e+06 | 9.248509e+06 | 1.624880e+08 | 12707 | 11665 | ... | 5.908417e+08 | 3.545392e+07 | 6.841255e+07 | 6.262956e+08 | 4.638077e+08 | 0.268597 | 0.084520 | 0.199108 | 0.039297 | 0.011457 |
| 3 | 4561 | 4367 | 194 | 26 | 5.202698e+07 | 2.152374e+06 | 3.341486e+06 | 5.417935e+07 | 24073 | 23688 | ... | 5.701780e+08 | 9.089228e+07 | 2.166951e+07 | 6.610703e+08 | 6.068909e+08 | 0.168823 | 0.568936 | 0.419636 | 0.020221 | 0.154781 |
| 4 | 558 | 521 | 37 | 4 | 2.198771e+08 | 3.470711e+07 | 1.258232e+08 | 2.545842e+08 | 2231 | 2041 | ... | 1.839970e+09 | 3.065709e+08 | 1.990901e+08 | 2.146541e+09 | 1.891956e+09 | 0.261649 | 0.710892 | 0.535643 | 0.081391 | 0.004661 |
| 5 | 2169 | 2084 | 85 | 16 | 1.977850e+08 | 2.954699e+07 | 4.718235e+06 | 2.273320e+08 | 1060 | 1005 | ... | 2.026323e+08 | 3.065841e+07 | 9.497473e+06 | 2.332907e+08 | 5.958721e+06 | 0.393269 | 0.591509 | 0.502267 | 0.043357 | 0.008052 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 421 | 19 | 19 | 0 | 0 | 3.039381e+04 | 1.776190e+03 | 0.000000e+00 | 3.217000e+04 | 29 | 28 | ... | 2.457008e+05 | 7.371070e+03 | 0.000000e+00 | 2.530718e+05 | 2.209018e+05 | 0.894737 | 0.862069 | 0.878555 | 0.020833 | 0.000000 |
| 422 | 3 | 3 | 0 | 0 | 8.893900e+02 | 7.061000e+01 | 0.000000e+00 | 9.600000e+02 | 30 | 27 | ... | 2.701831e+04 | 8.383000e+02 | 1.351000e+03 | 2.785661e+04 | 2.689661e+04 | 1.000000 | 1.000000 | 1.000000 | 0.090909 | 0.000000 |
| 423 | 21 | 21 | 0 | 1 | 6.104614e+04 | 8.005560e+03 | 0.000000e+00 | 6.905170e+04 | 7 | 6 | ... | 7.278640e+04 | 2.183600e+03 | 5.770000e+03 | 7.497000e+04 | 5.918300e+03 | 0.714286 | 1.000000 | 0.868966 | 0.035714 | 0.035714 |
| 424 | 25 | 25 | 0 | 0 | 2.543299e+05 | 1.766949e+04 | 0.000000e+00 | 2.719994e+05 | 43 | 37 | ... | 7.689642e+04 | 2.306880e+03 | 1.148231e+04 | 7.920330e+04 | -1.927961e+05 | 0.560000 | 0.534884 | 0.547586 | 0.088235 | 0.029412 |
| 425 | 118 | 116 | 2 | 3 | 5.719625e+04 | 4.885150e+03 | 2.678840e+03 | 6.208140e+04 | 18 | 10 | ... | 8.512621e+04 | 2.553790e+03 | 6.947200e+04 | 8.768000e+04 | 2.559860e+04 | 0.576271 | 1.000000 | 0.816115 | 0.073529 | 0.022059 |
425 rows × 22 columns
checks_3.to_excel('checks_3.xls')
問題二子問題一利率分配
#一些資料的初始化
pa0=checks_3
#pa1=pa0.iloc[:,[0,8,16,19,20,21]]
#pa1=pa0.drop(pa0.columns[[0,7,8,15,16,19,20,21]],axis=1)
pa1=pa0
pa1=np.asarray(pa1)
pa1=zscore(pa1)
ck=np.asarray(checks)
ck2=np.asarray(checks_2)
#主成分分析
pca=PCA()
pca.fit(pa1)
pcavr=[]
for i in range(1,23):
pcavr.append(sum(pca.explained_variance_ratio_[:i]))
pcavr
[0.3667363880450508,
0.5647177553788358,
0.6694778602067868,
0.7551550627474768,
0.8131132267472697,
0.865619957576671,
0.9107898364534954,
0.9387893796264828,
0.9599599037916896,
0.9788060451769551,
0.988728920202568,
0.9942716313124501,
0.9978255167866447,
0.999138389215358,
0.9995923091351523,
0.999967761573444,
0.9999999766710131,
1.0,
1.0,
1.0,
1.0,
1.0]
#PCA差異保留畫圖分析
X = range(1,23)
#plt.figure(figsize=(12,8))
plt.xlabel('n_components')
plt.title('Principal Component Analysis')
plt.ylabel('Explained Variance Ratio')
plt.plot(X,pcavr,'o-')
plt.locator_params('x',nbins=12)
plt.savefig('Principal_Component_Analysis.jpg')
plt.show()

#得到降維后的向量
pca_=PCA(n_components=8)
pa2=pca_.fit_transform(pa1)
#用于打亂訓練集和測驗集用
import random
rd=np.arange(123)
random.shuffle(rd)
#用支持向量機對前100個訓練,后23個測驗驗證所得到的精度
clf = make_pipeline(StandardScaler(), svm.SVC(gamma='auto'))
clf.fit(pa2[rd[:100]],labels[rd[:100]])
clf.score(pa2[rd[100:123]],labels[rd[100:]])
0.2608695652173913
#對附件一所有企業進行訓練,得到的訓練精度
clf2 = make_pipeline(StandardScaler(), svm.SVC(gamma='auto'))
clf2.fit(pa2[:123],labels)
clf2.score(pa2[:123],labels)
0.5365853658536586
#得到信譽預測A指標
m1p=clf2.predict(pa2[123:])
labels=pd.DataFrame(labels)
m1p=pd.DataFrame(m1p)
c1=pd.concat([labels,m1p],axis=0)
c1.index=np.arange(1,426)
pa0['信譽預測A']=c1
#改寫問題一topsis程式,不去除D,計算綜合得分并歸一化
ra1=pd.read_excel('result_a1.xls',index_col=0)
lb=(ra1['綜合得分']-ra1['綜合得分'].min())/(ra1['綜合得分'].max()-ra1['綜合得分'].min())
lb=np.asarray(lb)
#建立DNN密集鏈接神經網路模型
from keras import models
from keras import layers
def rmodel():
model=models.Sequential()
model.add(layers.Dense(64, activation='relu',
input_shape=(pa2.shape[1],)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
return model
model1=rmodel()
model1.fit(pa2[rd[:100]], lb[rd[:100]],epochs=100, batch_size=1,verbose=0)
val_mse, val_mae = model1.evaluate(pa2[rd[100:123]], lb[rd[100:123]], verbose=0)
Using TensorFlow backend.
#用DNN對前100個訓練,后23個測驗驗證所得到的誤差
val_mse,val_mae
(0.19183750450611115, 0.3098321855068207)
#訓練模型
model2=rmodel()
model2.fit(pa2[:123], lb,epochs=100, batch_size=1,verbose=0)
val2_mse, val2_mae = model2.evaluate(pa2[:123], lb, verbose=0)
val2_mse, val2_mae
(0.055356581490941165, 0.11002491414546967)
#得到信譽預測B指標
m2p=model2.predict(pa2[123:])
m2p=pd.DataFrame(m2p)
lb=pd.DataFrame(lb)
c2=pd.concat([lb,m2p])
c2.index=range(1,426)
pa0['信譽預測B']=c2
#統計計算
pa3=pa0.iloc[123:,:]
pa3['信譽預測A'].replace(1,100,inplace=True)
pa3['信譽預測A'].replace(2,80,inplace=True)
pa3['信譽預測A'].replace(3,52.45,inplace=True)
pa3['信譽預測A'].replace(4,1,inplace=True)
pa3['作廢發票率']=(max(pa3['作廢發票率'])-pa3['作廢發票率'])/(max(pa3['作廢發票率'])-min(pa3['作廢發票率']))
pa3['負數發票率']=(max(pa3['負數發票率'])-pa3['負數發票率'])/(max(pa3['負數發票率'])-min(pa3['負數發票率']))
pa3=(pa3-pa3.min())/(pa3.max()-pa3.min())
pa3=pa3[['信譽預測A','信譽預測B','收入','供求穩定度指標','作廢發票率','負數發票率']]
pa4=np.asarray(pa3)
#熵權法計算權重
ta=pa3
tb=pa4
n,m=np.shape(tb)
s=np.sum(ta,axis=0)
s=np.asarray(s)
s=np.reshape(s,(1,len(s)))
s=np.repeat(s,len(tb),axis=0)
s=s.reshape((n,m))
tb=tb/s
a=tb*1.0
a[np.where(tb==0)]=0.001
e=(-1.0/np.log(n))*np.sum(tb*np.log(a),axis=0)
w=(1-e)/np.sum(1-e)
w
array([0.11221771, 0.11019597, 0.25695496, 0.47673639, 0.01765203,
0.02624293])
#Topsis綜合評價
df=pa4/np.sqrt((pa4**2).sum())
df=pd.DataFrame(df)
X=pd.DataFrame([df.min(),df.max()],index=['負理想解','正理想解'])
R=df.copy()
R.columns=['信譽評級','是否違約','收入','供求穩定度指標','作廢發票率','負數發票率']
R['正理想解']=np.sqrt(((df - X.loc['正理想解']) ** 2 * w).sum(axis=1))
R['負理想解']=np.sqrt(((df - X.loc['負理想解']) ** 2 * w).sum(axis=1))
R['綜合得分']=R['負理想解'] / (R['負理想解'] + R['正理想解'])
R['排序']=R.rank(ascending=False)['綜合得分']
R['利率']=15-(R['綜合得分']-R['綜合得分'].min())/(R['綜合得分'].max()-R['綜合得分'].min())*11
#保存利率計算結果
R.to_excel('result_3.xls')
問題二子問題二額度分析
pb0=pa0
pb1=pb0.iloc[123:,[0,4,5,8,12,13,16,17,18,19,20,21]]#刪去多余的指標
pb2=np.asarray(pb1)#轉化為numpy陣列,便于進行下一步計算
pb2=zscore(pb2)#資料標準化
#PCA主成分分析
pca=PCA()
pca.fit(pb2)
#計算差異保留比例
pcavr=[]
for i in range(1,13):
pcavr.append(sum(pca.explained_variance_ratio_[:i]))
pcavr
[0.40237293073369423,
0.5723379535072953,
0.6867370550736526,
0.7714374725780188,
0.8524884204316454,
0.9169752220290351,
0.9662287460931756,
0.9882960568245,
0.9959509809020667,
0.9993026536897576,
0.9999999999999999,
0.9999999999999999]
#PCA差異保留畫圖分析
X = range(1,13)
#plt.figure(figsize=(12,8))
plt.xlabel('n_components')
plt.title('Principal Component Analysis')
plt.ylabel('Explained Variance Ratio')
plt.plot(X,pcavr,'o-')
plt.locator_params('x',nbins=12)
plt.savefig('Principal_Component_Analysis_B.jpg')
plt.show()

#選取最佳維度6,保留91%差異性
pca_=PCA(n_components=6)
pb3=pca_.fit_transform(pb2)
#肘部法則計算最佳聚類數
SSE=[]
for k in range(2,21):
km=KMeans(n_clusters=k,random_state=10)
km.fit(pb3)
SSE.append(km.inertia_)
X = range(2,21)
#肘部法則畫圖分析
#plt.figure(figsize=(12,8))
plt.xlabel('k')
plt.title('Elbow Method')
plt.ylabel('SSE')
plt.plot(X,SSE,'o-')
plt.locator_params('x',nbins=20)
plt.savefig('Elbow_Method.jpg')
plt.show()

#輪廓系數計算最佳聚類數
SC=[]
for k in range(2,21):
km=KMeans(n_clusters=k,random_state=10)
km.fit(pb3)
a=silhouette_score(pb3,km.labels_, metric='euclidean')
SC.append(a)
#輪廓系數畫圖分析
X = range(2,21)
#plt.figure(figsize=(12,8))
plt.xlabel('k')
plt.title('Silhouette Coefficient')
plt.ylabel('SC')
plt.plot(X,SC,'o-')
plt.locator_params('x',nbins=20)
plt.savefig('Silhouette_Coefficient.jpg')
plt.show()

#選取最佳聚類數10進行聚類分析
km=KMeans(n_clusters=10,random_state=20)
km.fit(pb3)
#標簽統計
pd.DataFrame(km.labels_)[0].value_counts()
6 87
1 87
2 36
0 35
7 31
9 9
5 8
8 4
4 3
3 2
Name: 0, dtype: int64
#加入標簽
pb1['分類']=km.labels_
pb1
| 進項發票數量 | 進項有效金額 | 進項有效稅額 | 銷項發票數量 | 銷項有效金額 | 銷項有效稅額 | 收入 | 進穩定度指標 | 銷穩定度指標 | 供求穩定度指標 | 作廢發票率 | 負數發票率 | 分類 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 124 | 17411 | 7.855255e+08 | 5.867726e+07 | 1293 | 7.417804e+08 | 6.665738e+07 | -3.576505e+07 | 0.127793 | 0.323279 | 0.245805 | 0.125160 | 0.020477 | 3 |
| 125 | 20288 | 9.323832e+08 | 6.881856e+07 | 1595 | 9.412114e+08 | 8.362975e+07 | 2.363930e+07 | 0.121057 | 0.303448 | 0.231015 | 0.124617 | 0.020016 | 3 |
| 126 | 533 | 1.127735e+08 | 1.604526e+07 | 1516 | 5.206911e+08 | 1.731628e+07 | 4.091887e+08 | 0.465291 | 0.250000 | 0.373494 | 0.131772 | 0.017082 | 4 |
| 127 | 1450 | 1.646702e+06 | 1.188565e+05 | 4026 | 6.519380e+08 | 1.957022e+07 | 6.697426e+08 | 0.388966 | 0.467958 | 0.430278 | 0.027027 | 0.001096 | 4 |
| 128 | 3222 | 8.928033e+06 | 4.324670e+05 | 1255 | 2.423902e+08 | 8.299067e+06 | 2.413287e+08 | 0.307573 | 0.980876 | 0.726884 | 0.040652 | 0.003350 | 7 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 421 | 19 | 3.039381e+04 | 1.776190e+03 | 29 | 2.457008e+05 | 7.371070e+03 | 2.209018e+05 | 0.894737 | 0.862069 | 0.878555 | 0.020833 | 0.000000 | 0 |
| 422 | 3 | 8.893900e+02 | 7.061000e+01 | 30 | 2.701831e+04 | 8.383000e+02 | 2.689661e+04 | 1.000000 | 1.000000 | 1.000000 | 0.090909 | 0.000000 | 0 |
| 423 | 21 | 6.104614e+04 | 8.005560e+03 | 7 | 7.278640e+04 | 2.183600e+03 | 5.918300e+03 | 0.714286 | 1.000000 | 0.868966 | 0.035714 | 0.035714 | 0 |
| 424 | 25 | 2.543299e+05 | 1.766949e+04 | 43 | 7.689642e+04 | 2.306880e+03 | -1.927961e+05 | 0.560000 | 0.534884 | 0.547586 | 0.088235 | 0.029412 | 6 |
| 425 | 118 | 5.719625e+04 | 4.885150e+03 | 18 | 8.512621e+04 | 2.553790e+03 | 2.559860e+04 | 0.576271 | 1.000000 | 0.816115 | 0.073529 | 0.022059 | 0 |
302 rows × 13 columns
#保存問題二子問題二額度分析結果
pb1.to_excel('result_4.xls')
4.問題3
根據調查結果修正利率
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
gsb=pd.read_excel('gsb.xlsx')
gsb['企業代號']=gsb['企業代號'].apply(lambda x:int(x[1:]))
gsb.columns=['企業代號','企業名稱','企業評分']
gsb['企業評分'].replace([9,19,18,1,2,8,15,12,5,6,3,14,11,16,4,10,13,17,7],[int(i) for i in np.linspace(5,95,19)],inplace=True)
r3=pd.read_excel('result_3.xls',index_col=0)
r3['評分']=gsb['企業評分']
r3['修正利率']=(r3['評分']-50)*0.06
r3.to_excel('result_6.xls')
5.其他程式
主要是畫圖
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
問題一-隸屬函式
x=np.linspace(1,4,300)
y=(0.6952*np.log(x)+0.0362)*(x<3)+((1+1.1086*(x-0.8942)**(-2))**(-1))*(x>=3)
#plt.figure(figsize=(12,8))
plt.plot(x,y)
plt.title('Membership function')
plt.xlabel('x')
plt.ylabel('y')
plt.savefig('Membership_function.jpg')
plt.show()

問題一-不同公司的利率散點圖和風險系數散點圖
result1=pd.read_excel('result_1.xls',index_col=0)
x=result1['公司識別碼']
y1=result1['利率']
y2=result1['綜合得分']
y2=1-y2
plt.figure(figsize=(12,8))
plt.title('The interest rate of different companys')
plt.xlabel('Company ID')
plt.ylabel('The interest rate')
plt.plot(x,y1,'ro-')
plt.savefig('The_interest_rate_of_different_companys.jpg')

plt.figure(figsize=(12,8))
plt.title('The overall ratings of different companys')
plt.xlabel('Company ID')
plt.ylabel('The interest rate')
plt.plot(x,y2,'ro-')
plt.savefig('The_overall_ratings_of_different_companys.jpg')

問題二-不同公司的利率散點圖和風險系數散點圖
result3=pd.read_excel('result_3.xls',index_col=0)
x=range(1,303)
y1=result3['利率']
y2=result3['綜合得分']
y2=1-y2
#plt.figure(figsize=(12,8))
plt.title('The interest rate of different companys')
plt.xlabel('Company ID')
plt.ylabel('The interest rate')
plt.plot(x,y1,'go-')
plt.savefig('The_interest_rate_of_different_companys.jpg')

#plt.figure(figsize=(12,8))
plt.title('The overall ratings of different companys')
plt.xlabel('Company ID')
plt.ylabel('The interest rate')
plt.plot(x,y2,'go-')
plt.savefig('The_overall_ratings_of_different_companys.jpg')

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/66702.html
標籤:其他
下一篇:對于2020應屆生的要求
