主頁 >  其他 > 【練習筆記(第一次)】2020年數學建模國賽C題:資料處理、源代碼

【練習筆記(第一次)】2020年數學建模國賽C題:資料處理、源代碼

2020-09-17 16:00:38 其他

前言

本來因為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
企業代號企業名稱信譽評級是否違約
01***電器銷售有限公司A
12***技術有限責任公司A
23***電子(中國)有限公司***分公司C
34***發展有限責任公司C
45***供應鏈管理有限公司B
...............
118119***藥房D
119120***陳列廣告有限公司D
120121***藥業連鎖有限公司***藥店D
121122***商貿有限責任公司D
122123***創科技有限責任公司D

123 rows × 4 columns

data2
企業代號發票號碼開票日期銷方單位代號金額稅額價稅合計發票狀態
0133909392017-07-18A00297-943.40-56.60-1000.00有效發票
1133909402017-07-18A00297-4780.24-286.81-5067.05有效發票
2133909412017-07-18A00297943.4056.601000.00有效發票
3133909422017-07-18A002974780.24286.815067.05有效發票
4199026692017-08-07A05061326.219.79336.00有效發票
...........................
210942122547062342019-04-17A08967223.306.70230.00有效發票
210943122557213442020-01-10A09184264.1515.85280.00有效發票
210944123384932952017-12-15A03624264.1515.85280.00有效發票
210945123954720012018-12-29A03626264.1515.85280.00有效發票
210946123544698832019-12-18A03626264.1515.85280.00有效發票

210947 rows × 8 columns

data3
企業代號發票號碼開票日期購方單位代號金額稅額價稅合計發票狀態
01114593562017-08-04B037119401.711598.2911000.0有效發票
1150762392017-08-09B008448170.941389.069560.0有效發票
2150762402017-08-09B008448170.941389.069560.0有效發票
3150762412017-08-09B008444085.47694.534780.0有效發票
4150762422017-08-09B008444085.47694.534780.0有效發票
...........................
16247912388877012019-12-17B109444827.67144.834972.5有效發票
16248012388877022019-12-17B109447412.62222.387635.0有效發票
162481123341730852019-12-17B130931917.4757.531975.0有效發票
16248212388877032019-12-25B130937252.42217.587470.0有效發票
16248312388877042019-12-25B130936660.19199.816860.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
信譽評級是否違約進項發票數量進項有效發票進項作廢發票進項負數發票進項有效金額進項有效稅額進項無效額進項有效價稅...銷項有效金額銷項有效稅額銷項無效額銷項有效價稅收入進穩定度指標銷穩定度指標供求穩定度指標作廢發票率負數發票率
1A34413249192715.744706e+098.932358e+082.547518e+086.637942e+09...4.065843e+096.327901e+081.001785e+084.698633e+09-1.939309e+090.5158380.2362520.4011880.0360140.025885
2A32156314357211561.557623e+086.725653e+069.248509e+061.624880e+08...5.908417e+083.545392e+076.841255e+076.262956e+084.638077e+080.2685970.0845200.1991080.0392970.011457
3C45614367194265.202698e+072.152374e+063.341486e+065.417935e+07...5.701780e+089.089228e+072.166951e+076.610703e+086.068909e+080.1688230.5689360.4196360.0202210.154781
4C5585213742.198771e+083.470711e+071.258232e+082.545842e+08...1.839970e+093.065709e+081.990901e+082.146541e+091.891956e+090.2616490.7108920.5356430.0813910.004661
5B2169208485161.977850e+082.954699e+074.718235e+062.273320e+08...2.026323e+083.065841e+079.497473e+062.332907e+085.958721e+060.3932690.5915090.5022670.0433570.008052
..................................................................
98B5150111.993190e+059.963970e+032.060000e+022.092830e+05...1.403242e+064.186923e+043.697712e+051.445111e+061.235828e+060.3921570.7320260.5872180.1029410.034314
104C11002.641500e+021.585000e+010.000000e+002.800000e+02...2.626505e+057.879490e+032.000000e+042.705300e+052.702500e+051.0000001.0000001.0000000.0909090.045455
105C66007.436920e+031.043080e+030.000000e+008.480000e+03...9.248194e+052.774452e+041.039500e+049.525639e+059.440839e+050.8333330.1967210.6054520.0078120.031250
106B3635105.033527e+042.125830e+039.000000e+035.246110e+04...5.860489e+051.762900e+045.552000e+046.036779e+055.512168e+050.3611110.1568630.2783950.0846560.021164
110C33009.633900e+027.661000e+010.000000e+001.040000e+03...1.969199e+055.907650e+037.257769e+042.028275e+052.017875e+051.0000001.0000001.0000000.2441860.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
信譽評級是否違約收入供求穩定度指標作廢發票率負數發票率
1100.001-1.939309e+090.4011880.0360140.025885
2100.0014.638077e+080.1991080.0392970.011457
352.4516.068909e+080.4196360.0202210.154781
452.4511.891956e+090.5356430.0813910.004661
580.0015.958721e+060.5022670.0433570.008052
.....................
9880.0011.235828e+060.5872180.1029410.034314
10452.4512.702500e+051.0000000.0909090.045455
10552.4519.440839e+050.6054520.0078120.031250
10680.0015.512168e+050.2783950.0846560.021164
11052.4512.017875e+051.0000000.2441860.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

?

進項發票數量進項有效金額進項有效稅額銷項發票數量銷項有效金額銷項有效稅額收入進穩定度指標銷穩定度指標供求穩定度指標作廢發票率負數發票率分類
134415.744706e+098.932358e+0881104.065843e+096.327901e+08-1.939309e+090.5158380.2362520.4011880.0360140.0258851
2321561.557623e+086.725653e+06127075.908417e+083.545392e+074.638077e+080.2685970.0845200.1991080.0392970.0114574
345615.202698e+072.152374e+06240735.701780e+089.089228e+076.068909e+080.1688230.5689360.4196360.0202210.1547813
45582.198771e+083.470711e+0722311.839970e+093.065709e+081.891956e+090.2616490.7108920.5356430.0813910.0046610
521691.977850e+082.954699e+0710602.026323e+083.065841e+075.958721e+060.3932690.5915090.5022670.0433570.0080527
..........................................
98511.993190e+059.963970e+031531.403242e+064.186923e+041.235828e+060.3921570.7320260.5872180.1029410.0343146
10412.641500e+021.585000e+01212.626505e+057.879490e+032.702500e+051.0000001.0000001.0000000.0909090.0454555
10567.436920e+031.043080e+031229.248194e+052.774452e+049.440839e+050.8333330.1967210.6054520.0078120.0312506
106365.033527e+042.125830e+031535.860489e+051.762900e+045.512168e+050.3611110.1568630.2783950.0846560.0211647
11039.633900e+027.661000e+01831.969199e+055.907650e+032.017875e+051.0000001.0000001.0000000.2441860.0000005

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
企業代號企業名稱信譽評級是否違約
01***電器銷售有限公司A
12***技術有限責任公司A
23***電子(中國)有限公司***分公司C
34***發展有限責任公司C
45***供應鏈管理有限公司B
...............
118119***藥房D
119120***陳列廣告有限公司D
120121***藥業連鎖有限公司***藥店D
121122***商貿有限責任公司D
122123***創科技有限責任公司D

123 rows × 4 columns

data2
企業代號發票號碼開票日期銷方單位代號金額稅額價稅合計發票狀態
0133909392017-07-18A00297-943.40-56.60-1000.00有效發票
1133909402017-07-18A00297-4780.24-286.81-5067.05有效發票
2133909412017-07-18A00297943.4056.601000.00有效發票
3133909422017-07-18A002974780.24286.815067.05有效發票
4199026692017-08-07A05061326.219.79336.00有效發票
...........................
210942122547062342019-04-17A08967223.306.70230.00有效發票
210943122557213442020-01-10A09184264.1515.85280.00有效發票
210944123384932952017-12-15A03624264.1515.85280.00有效發票
210945123954720012018-12-29A03626264.1515.85280.00有效發票
210946123544698832019-12-18A03626264.1515.85280.00有效發票

210947 rows × 8 columns

data3
企業代號發票號碼開票日期購方單位代號金額稅額價稅合計發票狀態
01114593562017-08-04B037119401.711598.2911000.0有效發票
1150762392017-08-09B008448170.941389.069560.0有效發票
2150762402017-08-09B008448170.941389.069560.0有效發票
3150762412017-08-09B008444085.47694.534780.0有效發票
4150762422017-08-09B008444085.47694.534780.0有效發票
...........................
16247912388877012019-12-17B109444827.67144.834972.5有效發票
16248012388877022019-12-17B109447412.62222.387635.0有效發票
162481123341730852019-12-17B130931917.4757.531975.0有效發票
16248212388877032019-12-25B130937252.42217.587470.0有效發票
16248312388877042019-12-25B130936660.19199.816860.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
信譽評級是否違約進項發票數量進項有效發票進項作廢發票進項負數發票進項有效金額進項有效稅額進項無效額進項有效價稅...銷項有效金額銷項有效稅額銷項無效額銷項有效價稅收入進穩定度指標銷穩定度指標供求穩定度指標作廢發票率負數發票率
1A34413249192715.744706e+098.932358e+082.547518e+086.637942e+09...4.065843e+096.327901e+081.001785e+084.698633e+09-1.939309e+090.5158380.2362520.4011880.0360140.025885
2A32156314357211561.557623e+086.725653e+069.248509e+061.624880e+08...5.908417e+083.545392e+076.841255e+076.262956e+084.638077e+080.2685970.0845200.1991080.0392970.011457
3C45614367194265.202698e+072.152374e+063.341486e+065.417935e+07...5.701780e+089.089228e+072.166951e+076.610703e+086.068909e+080.1688230.5689360.4196360.0202210.154781
4C5585213742.198771e+083.470711e+071.258232e+082.545842e+08...1.839970e+093.065709e+081.990901e+082.146541e+091.891956e+090.2616490.7108920.5356430.0813910.004661
5B2169208485161.977850e+082.954699e+074.718235e+062.273320e+08...2.026323e+083.065841e+079.497473e+062.332907e+085.958721e+060.3932690.5915090.5022670.0433570.008052
..................................................................
119D315314112.197387e+052.999611e+046.250000e+012.497348e+05...3.567186e+041.070140e+035.000000e+023.674200e+04-2.129928e+050.7619050.3333330.5880520.0119050.002976
120D3635101.811556e+041.330780e+031.075000e+041.944634e+04...1.906732e+055.720210e+030.000000e+001.963934e+051.769471e+050.5833330.2068970.4376550.3230770.000000
121D5050011.073486e+061.776337e+050.000000e+001.251120e+06...1.014620e+051.282553e+043.505210e+031.142875e+05-1.136832e+060.7400000.2150540.5449070.0974580.004237
122D4847115.067211e+043.074150e+039.620000e+025.374626e+04...5.892182e+041.818780e+032.674846e+046.074060e+046.994340e+030.4375000.1694920.3317630.1024100.054217
123D33007.924500e+024.755000e+010.000000e+008.400000e+02...2.002358e+052.732385e+043.960850e+042.275597e+052.267197e+051.0000001.0000001.0000000.4705880.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
信譽評級是否違約收入供求穩定度指標作廢發票率負數發票率
1100.001-1.939309e+090.4011880.0360140.025885
2100.0014.638077e+080.1991080.0392970.011457
352.4516.068909e+080.4196360.0202210.154781
452.4511.891956e+090.5356430.0813910.004661
580.0015.958721e+060.5022670.0433570.008052
.....................
1191.000-2.129928e+050.5880520.0119050.002976
1201.0001.769471e+050.4376550.3230770.000000
1211.000-1.136832e+060.5449070.0974580.004237
1221.0006.994340e+030.3317630.1024100.054217
1231.0002.267197e+051.0000000.4705880.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
企業代號企業名稱
0124個體經營E124
1125個體經營E125
2126個體經營E126
3127個體經營E127
4128個體經營E128
.........
297421***保溫材料有限公司
298422***童裝店
299423***通風設備有限公司
300424***貿易有限公司
301425***商貿有限公司

302 rows × 2 columns

data2
企業代號發票號碼開票日期銷方單位代號金額稅額價稅合計發票狀態
0124188916762017-09-01 00:00:00C00014338.4657.54396.0有效發票
1124186912672017-09-01 00:00:00C00480230.106.90237.0有效發票
2124129954122017-09-01 00:00:00C23675223.306.70230.0有效發票
312463781932017-09-01 11:11:03C0033390090.099909.91100000.0有效發票
412463781942017-09-01 11:12:01C0033390090.099909.91100000.0有效發票
...........................
395170425721013752019-12-30 00:00:00C23112663.1119.89683.0有效發票
395171425202532852020-01-05 00:00:00C0193745.414.0949.5有效發票
395172425202533152020-01-05 00:00:00C01937110.141.16111.3有效發票
395173425524494042020-01-06 00:00:00C1503273.226.5879.8有效發票
39517442556662992020-01-10 00:00:00C23112132.043.96136.0有效發票

395175 rows × 8 columns

data3
企業代號發票號碼開票日期購方單位代號金額稅額價稅合計發票狀態
0124152124832017-09-01 11:58:43D00585839350.5592328.56931679.11有效發票
1124152124842017-09-01 11:59:20D00585900900.9099099.101000000.00有效發票
2124152124852017-09-01 11:59:51D00585900900.9099099.101000000.00有效發票
3124152124862017-09-01 12:00:45D00585697365.7476710.23774075.97有效發票
412460896152017-09-05 10:58:38D00108726216.2279883.78806100.00有效發票
...........................
330830425218034682018-04-03 00:00:00D214469000.00270.009270.00有效發票
330831425218034692018-04-03 00:00:00D214465155.34154.665310.00有效發票
330832425218034702019-06-11 00:00:00D021264854.37145.635000.00作廢發票
330833425218034712019-06-11 00:00:00D021264854.37145.635000.00作廢發票
330834425218034722019-06-11 00:00:00D021264854.37145.635000.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
進項發票數量進項有效發票進項作廢發票進項負數發票進項有效金額進項有效稅額進項無效額進項有效價稅銷項發票數量銷項有效發票...銷項有效金額銷項有效稅額銷項無效額銷項有效價稅收入進穩定度指標銷穩定度指標供求穩定度指標作廢發票率負數發票率
134413249192715.744706e+098.932358e+082.547518e+086.637942e+0981107886...4.065843e+096.327901e+081.001785e+084.698633e+09-1.939309e+090.5158380.2362520.4011880.0360140.025885
232156314357211561.557623e+086.725653e+069.248509e+061.624880e+081270711665...5.908417e+083.545392e+076.841255e+076.262956e+084.638077e+080.2685970.0845200.1991080.0392970.011457
345614367194265.202698e+072.152374e+063.341486e+065.417935e+072407323688...5.701780e+089.089228e+072.166951e+076.610703e+086.068909e+080.1688230.5689360.4196360.0202210.154781
45585213742.198771e+083.470711e+071.258232e+082.545842e+0822312041...1.839970e+093.065709e+081.990901e+082.146541e+091.891956e+090.2616490.7108920.5356430.0813910.004661
52169208485161.977850e+082.954699e+074.718235e+062.273320e+0810601005...2.026323e+083.065841e+079.497473e+062.332907e+085.958721e+060.3932690.5915090.5022670.0433570.008052
..................................................................
4211919003.039381e+041.776190e+030.000000e+003.217000e+042928...2.457008e+057.371070e+030.000000e+002.530718e+052.209018e+050.8947370.8620690.8785550.0208330.000000
42233008.893900e+027.061000e+010.000000e+009.600000e+023027...2.701831e+048.383000e+021.351000e+032.785661e+042.689661e+041.0000001.0000001.0000000.0909090.000000
4232121016.104614e+048.005560e+030.000000e+006.905170e+0476...7.278640e+042.183600e+035.770000e+037.497000e+045.918300e+030.7142861.0000000.8689660.0357140.035714
4242525002.543299e+051.766949e+040.000000e+002.719994e+054337...7.689642e+042.306880e+031.148231e+047.920330e+04-1.927961e+050.5600000.5348840.5475860.0882350.029412
425118116235.719625e+044.885150e+032.678840e+036.208140e+041810...8.512621e+042.553790e+036.947200e+048.768000e+042.559860e+040.5762711.0000000.8161150.0735290.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
進項發票數量進項有效金額進項有效稅額銷項發票數量銷項有效金額銷項有效稅額收入進穩定度指標銷穩定度指標供求穩定度指標作廢發票率負數發票率分類
124174117.855255e+085.867726e+0712937.417804e+086.665738e+07-3.576505e+070.1277930.3232790.2458050.1251600.0204773
125202889.323832e+086.881856e+0715959.412114e+088.362975e+072.363930e+070.1210570.3034480.2310150.1246170.0200163
1265331.127735e+081.604526e+0715165.206911e+081.731628e+074.091887e+080.4652910.2500000.3734940.1317720.0170824
12714501.646702e+061.188565e+0540266.519380e+081.957022e+076.697426e+080.3889660.4679580.4302780.0270270.0010964
12832228.928033e+064.324670e+0512552.423902e+088.299067e+062.413287e+080.3075730.9808760.7268840.0406520.0033507
..........................................
421193.039381e+041.776190e+03292.457008e+057.371070e+032.209018e+050.8947370.8620690.8785550.0208330.0000000
42238.893900e+027.061000e+01302.701831e+048.383000e+022.689661e+041.0000001.0000001.0000000.0909090.0000000
423216.104614e+048.005560e+0377.278640e+042.183600e+035.918300e+030.7142861.0000000.8689660.0357140.0357140
424252.543299e+051.766949e+04437.689642e+042.306880e+03-1.927961e+050.5600000.5348840.5475860.0882350.0294126
4251185.719625e+044.885150e+03188.512621e+042.553790e+032.559860e+040.5762711.0000000.8161150.0735290.0220590

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應屆生的要求

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more