搞得一个电气经济指数的一个计算,也是AHP的一个应用吧,能够使用,数据的话可能要自己搞了,做个备注吧
import pandas as pd
import numpy as np
import math
import warnings
# 成对比矩阵
criteria = np.array([[1,3,5],
[1/3,1,3],
[1/5, 1/3., 1]])
# AHP框架,获得权重
RI = (0, 0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49)
def cal_weights(input_matrix):
input_matrix = np.array(input_matrix)
n, n1 = input_matrix.shape
assert n == n1, '不是一个方阵'
for i in range(n):
for j in range(n):
if np.abs(input_matrix[i, j] * input_matrix[j, i] - 1) > 1e-7:
raise ValueError('不是反互对称矩阵')
eigenvalues, eigenvectors = np.linalg.eig(input_matrix)
max_idx = np.argmax(eigenvalues)
max_eigen = eigenvalues[max_idx].real
eigen = eigenvectors[:, max_idx].real
eigen = eigen / eigen.sum()
if n > 9:
CR = None
warnings.warn('无法判断一致性')
else:
CI = (max_eigen - n) / (n - 1)
CR = CI / RI[n]
return max_eigen, CR, eigen
max_eigen, CR, criteria_eigen = cal_weights(criteria)
# sigmoid函数,调整极值
def trans_index(x):
index = 1/(1+math.exp(-x*5))
return index
# 指数计算框架
def get_heat_index(data):
data = data.sort_values('data_dt').reset_index(drop = True)
data['elecqt_ratio'] = (data['elecqt_t']-data['elecqt_t'].shift(12))/data['elecqt_t'].shift(12)
data['elecqt_index'] = data['elecqt_ratio'].apply(lambda x:trans_index(x))
data['cons_d'] = data['cons_t']-data['cons_t'].shift(1)
data['cons_ratio'] = (data['cons_d']/data['cons_t'].shift(1)+(data['cons_t']-data['cons_t'].shift(12))/data['cons_t'].shift(12))/2
data['cons_index'] = data['cons_ratio'].apply(lambda x:trans_index(x))
data['cap_n_ratio'] =data['cap_n']/data['cap_t']
data['cap_n_index'] =data['cap_n_ratio'].apply(lambda x:trans_index(x))
data['cap_c_ratio'] =data['cap_c']/data['cap_t']
data['cap_c_index'] =data['cap_c_ratio'].apply(lambda x:trans_index(x))
data['cap_index'] = data['cap_n_index'] - data['cap_c_index']
data['heat_index'] = data['elecqt_index']*criteria_eigen[0] + data['cons_index']*criteria_eigen[1] + data['cap_index']*criteria_eigen[2]
# data['heat_index'] = data['heat_index']*elecqt_lv(data['elecqt_t'].mean())
data['heat_index'] = data['heat_index'].fillna(0)
result = data.copy()
return result
data = pd.read_excel('basic_data.xlsx')
result = get_heat_index(data)
result_final = result[['indust_nm','indust_no','data_dt','heat_index']][12:]
result_final.to_excel('电力景气指数.xlsx')