from pylab import mpl
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 读取数据
# 选择Excel文件
wine = pd.read_excel("E:\\秦皇岛海上平台项目\\关联度分析1.xlsx")
wine.head()
# 无量纲化
def dimensionlessProcessing(df):
newDataFrame = pd.DataFrame(index=df.index)
columns = df.columns.tolist()
for c in columns:
d = df[c]
MAX = d.max()
MIN = d.min()
MEAN = d.mean()
newDataFrame[c] = ((d - MEAN) / (MAX - MIN)).tolist()
return newDataFrame
def GRA_ONE(gray, m=0):
# 读取为df格式
gray = dimensionlessProcessing(gray)
# 标准化
std = gray.iloc[:, m] # 为标准要素
gray.drop(str(m),axis=1,inplace=True)
ce = gray.iloc[:, 0:] # 为比较要素
shape_n, shape_m = ce.shape[0], ce.shape[1] # 计算行列
# 与标准要素比较,相减
a = np.zeros([shape_m, shape_n])
for i in range(shape_m):
for j in range(shape_n):
a[i, j] = abs(ce.iloc[j, i] - std[j])
# 取出矩阵中最大值与最小值
c, d = np.amax(a), np.amin(a)
# 计算值
result = np.zeros([shape_m, shape_n])
for i in range(shape_m):
for j in range(shape_n):
result[i, j] = (d + 0.5 * c) / (a[i, j] + 0.5 * c)
# 求均值,得到灰色关联值,并返回
result_list = [np.mean(result[i, :]) for i in range(shape_m)]
result_list.insert(m,1)
return pd.DataFrame(result_list)
def GRA(DataFrame):
df = DataFrame.copy()
list_columns = [
str(s) for s in range(len(df.columns)) if s not in [None]
]
df_local = pd.DataFrame(columns=list_columns)
df.columns=list_columns
for i in range(len(df.columns)):
df_local.iloc[:, i] = GRA_ONE(df, m=i)[0]
return df_local
import seaborn as sns
def ShowGRAHeatMap(DataFrame):
colormap = plt.cm.RdBu
ylabels = DataFrame.columns.values.tolist()
f, ax = plt.subplots(figsize=(14, 14))
ax.set_title('GRA HeatMap')
# 设置展示一半,如果不需要注释掉mask即可
mask = np.zeros_like(DataFrame)
mask[np.triu_indices_from(mask)] = True
with sns.axes_style("white"):
sns.heatmap(DataFrame,
cmap="YlGnBu",
annot=True,
mask=mask,
)
plt.show()
data_wine_gra = GRA(wine)
ShowGRAHeatMap(data_wine_gra)
但是会出现
E:\pythonProject2\影响因素分析\灰色关联法.py:65: DeprecationWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`
df_local.iloc[:, i] = GRA_ONE(df, m=i)[0]
你所看到的 DeprecationWarning
是由于你正在使用的 Pandas 版本开始弃用某种方式来给 DataFrame 分配值。在你的代码中,这个问题来自以下这行:
df_local.iloc[:, i] = GRA_ONE(df, m=i)[0]
警告建议你用以下两种方式来替换:
df[df.columns[i]] = newvals
df.isetitem(i, newvals)
所以,针对你的代码,你可以这样修改来消除这个警告:
df_local[df_local.columns[i]] = GRA_ONE(df, m=i)[0]
或者:
df_local.isetitem(i, GRA_ONE(df, m=i)[0])
上述更改会确保你的代码在未来的 Pandas 版本上仍能正常运行。【gpt4.0参考率<30%】
df_local.iloc[:, i] = GRA_ONE(df, m=i)[0]
修改为
df[df.columns[i]] = GRA_ONE(df, m=i)[0]