7.2.2 灰色关联度分析

需求:按照灰色关联度的分析方法,对数据指标进行分析

解决方法:通过Python的pandas以及内置的函数完成该需求。

import numpy as np
import pandas as pd
import os

def readData(filename):
if(os.path.isfile(filename)):
if(not os.access(filename,os.R_OK)):
raise Exception('文件不可读')
else:
return pd.read_excel(filename)
else:
raise Exception('文件不存在')

def overall(filename):
try:
dframe = readData(filename)
except Exception as err:
print(err)

if(dframe.columns.size>0):
totaltarget = dframe.columns.size -1
rowsize=dframe.iloc[:,0].size


## 1 读取原始数据,该数据通过ETL加工而来
## 2 异常数据检测
## 3 按照指标的情况,计算参考序列:即每个指标的最大/小值,注意这里避开了首列SKUID
dframe1 =dframe.iloc[:,1:dframe.columns.size]
a = dframe1.apply(lambda x: (x-x.min())/(x.max() - x.min())*(1-0)+0)
## 4 参考序列差额绝对值, ABS(V1-RefV).
a= a.apply(lambda x: abs(x - x.max()))
## 5 指定全局最小、最大值、分辨率 这里默认取的是0、1(计算而来)、0.5(经验值)
globalMax=a.values.max()
globalMin=a.values.min()
resolution=0.5
## 6 计算关联系数:(全局最小值+全局最大值*分辨率)/(V1+全局最大值*分辨率)
a= a.apply(lambda x:(globalMin + globalMax *resolution)/(x+globalMax *resolution) )
## 7 计算权重系数和关联度(新增一行一列,其中关联度的每个V是该行的AVG,权重系数是每列的AVG)
a.loc['Row_avg']=a.apply(lambda x: x.mean())
## 8 加权关联度: 通过SUMPRODUCT,每个SKU的指标和权重系数一维数组的对应索引元素相乘在求和,除以总指标数得到关联系数
d= a.iloc[:,0:totaltarget]
reftab=pd.DataFrame((d.dot(np.array(d.loc['Row_avg'].values[0:]))/totaltarget),columns=['refid'])
skuidtab=pd.DataFrame(dframe.iloc[0:rowsize,0:1].values[0:],columns=['skuid'])
fintab=pd.concat([skuidtab.astype('str'),reftab.astype('float')],axis=1)
#fintab.reindex(columns=cols)
## 9 对关联系数进行正排序得到上架数N,逆排序得到
print(fintab.iloc[0:-1, 0:totaltarget].sort_values(by='refid', ascending=False))
else:
print('DataFrame初始化失败')

if __name__ == '__main__':
overall("G:\Works\BIPreJ\ModelData.xlsx")

原始文件:

灰色关联度分析_灰色关联分析

执行结果:

待补充