python秩和比综合评价代码记录
生活随笔
收集整理的這篇文章主要介紹了
python秩和比综合评价代码记录
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
import pandas as pd
import numpy as np
from collections import Counter
import statsmodels.api as sm
import scipy.statsdef rsr(data, weight=None, threshold=None, full_rank=False):Result = pd.DataFrame()n, m = data.shape# 對數(shù)據(jù)編秩if full_rank:for i, X in enumerate(data.columns):Result[f'X{str(i + 1)}:{X}'] = data.iloc[:, i]Result[f'R{str(i + 1)}:{X}'] = data.iloc[:, i].rank(method="average") # 整次編制else:for i, X in enumerate(data.columns):Result[f'X{str(i + 1)}:{X}'] = data.iloc[:, i]Result[f'R{str(i + 1)}:{X}'] = 1 + (n - 1) * (data.iloc[:, i] - data.iloc[:, i].min()) / (data.iloc[:, i].max() - data.iloc[:, i].min()) # 非整次編制,正向指標# 計算秩和比weight = 1 / m if weight is None else np.array(weight) / sum(weight)Result['RSR'] = (Result.iloc[:, 1::2] * weight).sum(axis=1) / n # axis=1,將每一行的元素相加# 加權(quán)的RSRResult['RSR_Rank'] = Result['RSR'].rank(ascending=False) # RSR值的排序# 繪制 RSR 分布表RSR = Result['RSR']RSR_RANK_DICT = dict(zip(RSR.values, RSR.rank().values))Distribution = pd.DataFrame(index=sorted(RSR.unique())) # 編號Distribution['f'] = RSR.value_counts().sort_index() # 頻數(shù)Distribution['Σ f'] = Distribution['f'].cumsum() # 累計頻數(shù)Distribution['Rf'] = [RSR_RANK_DICT[i] for i in Distribution.index] #Distribution['R/n*100%'] = Distribution['Rf'] / n # 根據(jù)累計頻數(shù)算累計頻率Distribution.iat[-1, -1] = 1 - 1 / (4 * n) # 修正最后一項累計頻率Distribution['Probit'] = 5 - scipy.stats.norm.isf(Distribution.iloc[:, -1]) # inverse survival function 將累計頻率換算為概率單位print(Distribution)# 計算回歸方差并進行回歸分析r0 = np.polyfit(Distribution['Probit'], Distribution.index, deg=1) # x,ymodel = sm.OLS(Distribution.index, sm.add_constant(Distribution['Probit'])) # y,xresult = model.fit()print(result.summary())# 殘差檢驗z_error, p_error = scipy.stats.normaltest(result.resid.values) # tests the null hypothesis that a sample comes from a normal distributionprint("殘差分析: ", p_error)if r0[1] > 0:print(f"\n回歸直線方程為:y = {r0[0]} Probit + {r0[1]}")else:print(f"\n回歸直線方程為:y = {r0[0]} Probit - {abs(r0[1])}")# 代入回歸方程并分檔排序Result['Probit'] = Result['RSR'].apply(lambda item: Distribution.at[item, 'Probit'])Result['RSR Regression'] = np.polyval(r0, Result['Probit'])C_level=scipy.stats.norm.ppf(0.3) + 5B_level=scipy.stats.norm.ppf(0.8)+5A_level=10threshold = np.polyval(r0, [0, C_level, B_level, A_level]) if threshold is None else np.polyval(r0, threshold)Result['Level'] = pd.cut(Result['RSR Regression'], threshold,labels=range(len(threshold) - 1, 0, -1)) # Probit分組[(2, 4] < (4, 6] < (6, 8]]# 方差齊性檢驗x1=Result.loc[Result["Level"]==1,"RSR Regression"]x2 = Result.loc[Result["Level"] == 2, "RSR Regression"]x3 = Result.loc[Result["Level"] == 3, "RSR Regression"]stat, p = scipy.stats.bartlett(x1, x2, x3)print(stat, p)print(Counter(Result["Level"]))print(Result)return Result, Distribution
def rsrAnalysis(data, file_name=None, **kwargs):Result, Distribution = rsr(data, **kwargs)file_name = 'RSR 分析結(jié)果報告.xlsx' if file_name is None else file_name + '.xlsx'Excel_Writer = pd.ExcelWriter(file_name)Result.to_excel(Excel_Writer, '綜合評價結(jié)果')Result.sort_values(by='Level', ascending=False).to_excel(Excel_Writer, '分檔排序結(jié)果')Distribution.to_excel(Excel_Writer, 'RSR分布表')Excel_Writer.save()data=pd.read_csv("已清理數(shù)據(jù)問一.csv") # 默認將第一行認定為列名
# print(data.columns)
data_new=data[["總里程","運輸時長","業(yè)務(wù)類型","運輸?shù)燃?#34;,"計劃發(fā)車時間","車輛噸位","需求緊急程度","需求類型2"]]
# 將data成本類指標轉(zhuǎn)化為效益類
data_new.loc[:,"業(yè)務(wù)類型"]=1/data_new.loc[:,"業(yè)務(wù)類型"]
data_new.loc[:,"運輸?shù)燃?#34;]=1/data_new.loc[:,"運輸?shù)燃?#34;]rsr(data_new,weight=[0.359, 0.168, 0.075, 0.035, 0.065, 0.194, 0.087, 0.017])
rsrAnalysis(data_new,weight=[0.359, 0.168, 0.075, 0.035, 0.065, 0.194, 0.087, 0.017])
總結(jié)
以上是生活随笔為你收集整理的python秩和比综合评价代码记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux各种常用源码网站
- 下一篇: 电子政务网站设计