python熵权法求权重
生活随笔
收集整理的這篇文章主要介紹了
python熵权法求权重
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.庫的引用
import warnings warnings.filterwarnings("ignore") import pandas as pd import numpy as np import os os.chdir(r"E:\BaiduNetdiskDownload\數據") #指定工作路徑2.定義計算權重函數
#計算權重,并將標準化后數據保存下來 def get_entropy_weight(data):""":param data: 評價指標數據框:return: 各指標權重列表"""# 數據標準化data = (data - data.min())/(data.max() - data.min())# 保存標準化后的數據data.to_excel("標準化后數據.xlsx", sheet_name="sheet1", index= False,encoding="utf-8")print(data) #直接在運行時打印出標準化后的數據#計算km,n=data.shape #m是行,n是列#將dataframe格式轉化為matrix格式data=data.as_matrix(columns=None)k=1/np.log(m)yij=data.sum(axis=0)#計算pijpij=data/yijtest=pij*np.log(pij)test=np.nan_to_num(test)#計算每種指標的信息熵ej=-k*(test.sum(axis=0))#計算每種指標的權重wi=(1-ej)/np.sum(1-ej)wi_list=list(wi)return wi_list3.定義計算得分函數
def get_score(wi_list,data):""":param wi_list: 權重系數列表:param data:評價指標數據框:return:返回得分""" # 將權重轉換為矩陣cof_var = np.mat(wi_list)# 將數據框轉換為矩陣context_train_data = np.mat(data)# 權重跟自變量相乘last_hot_matrix = context_train_data * cof_var.Tlast_hot_matrix = pd.DataFrame(last_hot_matrix)# 累加求和得到總分,這是直接用原數據計算的last_hot_score = list(last_hot_matrix.apply(sum))return last_hot_score4.導入數據運行
if __name__ == '__main__': data = pd.read_excel("指標.xlsx", encoding='utf8')data= data.iloc[:, 1:] #數據選擇第二列開始是所有行mm = datawi_list=get_entropy_weight(data)score_list=get_score(mm,wi_list)print(wi_list) # 權重print(score_list) #得分,這個得分是原數據*權重 計算的,可以改成標準化的數據計算,也可以將得分映射成百分制。5. 可能出現的問題
5.1 打印顯示不全問題,數據太多時顯示不全的解決辦法
#打印時顯示所有列pd.set_option('display.max_columns', None)#打印顯示所有行pd.set_option('display.max_rows', None)5.2 pandas.read_csv() 報錯 OSError: Initializing from file failed
一般由兩種情況引起:一種是路徑有問題,另一種是函數參數帶有中文。
對于第一種情況很簡單,有的是因為沒有把文件名稱放到路徑的后面,把文件名稱添加到路徑后面就可以了;還有的是文件名稱有誤,比如多個空格少個空格,大小寫,最好是直接復制文件的名稱粘貼。
第二種情況,路徑、文件名都正確,還是報錯的原因是這個參數中有中文,調用pandas的read_csv()方法時,默認使用C engine作為parser engine,而當文件名中含有中文的時候,用C engine在部分情況下就會出錯。所以在read里面加上engine="python"即可解決。
總結
以上是生活随笔為你收集整理的python熵权法求权重的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性代数——基变换
- 下一篇: python3.8使用aiml总结