灰色关联度分析

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")
    


原始文件:

灰色关联度分析_第1张图片

执行结果:

待补充


 


你可能感兴趣的:(Python案例)