面板数据数据熵值法公式-基于Python
更新时间:2022年11月9日
更新内容:已解决运行代码时出现下述问题:
; 一、理论基础
本文通过王晓红等(2021)中所使用到的面板数据熵值法公式,来讲解如何对面板数据使用熵值法及Python代码的实现,具体过程如下:
; 二、代码实现
import pandas as pd
import numpy as np
import os
def Entory(path0,forwrd_indicator,inverse_indicator):
df=pd.DataFrame()
df1=pd.DataFrame()
data=pd.read_excel(path0,sheet_name=None,index_col=0)
Sheet_name=list(data.keys())
for i in Sheet_name:
df2=pd.read_excel(path0,sheet_name=i,index_col=0)
df3=pd.DataFrame(df2.to_numpy().reshape(-1, 1, order='F'))
df=pd.concat([df,df3],axis=1)
x1=df2.shape[1]
x2=df2.shape[0]
y=df2.index
z=list(df2.columns)
df.columns=[i for i in Sheet_name]
df.insert(0,"城市",list(y)*x1)
df.insert(1,"年份",sorted(z*x2))
df=df.set_index(["城市","年份"])
df4=df.copy()
forwrd_indicator=[i for i in forwrd_indicator]
inverse_indicator=[i for i in inverse_indicator]
if forwrd_indicator:
inverse_indicator=list(set(forwrd_indicator) ^ set(Sheet_name))
else:
forwrd_indicator=list(set(inverse_indicator) ^ set(Sheet_name))
print("正向指标forwrd_indicator:\n",forwrd_indicator)
print("\n")
print("逆向指标inverse_indicator:\n",inverse_indicator)
print("\n")
if forwrd_indicator or inverse_indicator:
df4[forwrd_indicator]=(df4[forwrd_indicator]-df4[forwrd_indicator].min())/(df4[forwrd_indicator].max()-df4[forwrd_indicator].min())
df4[inverse_indicator]=(df4[inverse_indicator].max()-df4[inverse_indicator])/(df4[inverse_indicator].max()-df4[inverse_indicator].min())
df4=df4.apply(lambda x:x+0.01)
df5=df4/df4.apply(lambda x:x.sum())
k=np.power(np.log(df5.shape[0]),-1)
p=df5/df5.apply(lambda x:x.sum())
P=(p*p.apply(np.log)).sum()
entory=-k*P
D=1-entory
W=D/D.sum()
print("权重:\n",W)
print("\n")
excel_to_path=os.path.join(os.path.split(path0)[0],"熵值法.xlsx")
with pd.ExcelWriter(path=excel_to_path) as writer:
df.to_excel(writer, sheet_name='面板数据')
W.to_excel(writer, sheet_name='权重')
print("结果已保存到路径{}下".format(excel_to_path))
path0=r"C:\Users\HP\Desktop\python.xlsx"
forwrd_indicator=["用水量","人均GDP增长率"]
inverse_indicator=[]
Entory(path0,forwrd_indicator,inverse_indicator)
三、实例
在本例中,求用水量与GDP增长率这两个指标所占的比重。
数据格式如下图所示:
注:每个指标单独放在一个sheet表里
- 数据来源:中国统计年鉴
- 代码实现过程
此步骤见第二步 - 结果
其中,最后一行W为各指标的权重,其余各行说明详见代码实现部分
; 四、结果验证
为验证结果的正确性,此处使用spssau进行验证,结果如下图所示:
比较二者的结果,可认为本文所提供的代码具有一定的合理性。
; 五、说明
在计算信息熵时(如下图所示),由于我们对数据采用的是极差标准化方法,使得标准化后的数据的取值范围在[0,1]之间,也就是说该方法会使得部分数据取到0,而在计算信息熵时(如下图所示),ln0是无效的。而在相关文献中关于P的处理,有以下两种:一种是对标准化后的数据进行平移(本文中采取该方法),另一种则是令P*lnP=0。因此,对于这两种方法所求出来的权重之间的差异如何,本文在此利用上文中的数据对第二种方法进行计算。
第二种方法的处理方式:将下列代码删除即可
df4=df4.apply(lambda x:x+0.01)
结果对比:
由上述结果来看,不同方法求出的权重的确不同,但两者相差大概在0.01左右。因此可根据自己的需求自行选择。
注:本人能力有限,文中错漏之处在所难免,请各位多多包涵。
Original: https://blog.csdn.net/weixin_44121536/article/details/126971851
Author: 没事写写代码
Title: 面板数据熵值法-Python
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/674851/
转载文章受原作者版权保护。转载请注明原作者出处!