继续之前的数据和工作,进行数据的标准化处理,具体数据可从下方博客链接获取
剔除异常值
放下表一和表二Excel的截图
大体思路:
实际问题中,不同数据可能有不同的性质和量纲,为进行模糊聚类,需进行标准化处理。这里采用极差变换:
放代码:
import numpy as np
import pandas as pd
path = "E:/Model_building/A/"
s2 = pd.read_excel(path+"sheet2.xlsx")
s1 = pd.read_excel(path+"sheet1.xlsx") # 导入1、2表
s1 = pd.DataFrame(s1.values) # dataframe
s2 = pd.DataFrame(s2.values)
s1 = s1.drop([s1.columns[0]], axis=1) # 去掉0列
s2 = s2.drop([s2.columns[0]], axis=1)
s1.columns = ['a', 'b', 'c', 'd', 'e'] # 之前作死删掉了列名,感觉还是用列名更方便
s2.columns = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
s2['1'] = s2['1'].astype('int64') # 输出发现表2的序号列为float,更改为int
看一下s1和s2的头部输出,其中a,1都为采样点的序号,b,c为xy坐标,d为海拔,e为地区类型,2到9为八种元素在每个采样点的浓度
s12 = pd.merge(s1, s2, how='inner', left_on='a', right_on='1') # 将表1、2按照索引,合并为s12
del s12['1']
s12.head()
看一下s12的头部输出 ,这样就明了了
path = "E:/Model_building/A/"
ma = s12.groupby(s12['e']).max().iloc[:, 4:12]
mi = s12.groupby(s12['e']).min().iloc[:, 4:12] # 按照地区列分组,得出每种元素最大最小值
s122 = s12.set_index(['a','e']) # 双重索引
print(mi,'\n')
print(s122.head())
s122.iloc[:, 3:12] = ( s122.iloc[:, 3:12] - mi )/(ma-mi) # 极差变换
s122.to_excel(path+"sheet_standardized.xlsx")
在进行极差变换时,由于s122和mi相减时,由于s122每种e有多个,所以一直报错 ,如下:
不能有重复索引,所以设置一个双重索引(即地区和序号),这样在相减时,自动匹配对应的行(e)和列(元素)
pathx = "E:/Model_building/A/cumcm2011A附件_数据.xls"
p = s12.iloc[:,5:].groupby(s12['e']).mean() # 每个地区每种元素的均值
print(p)
s122 = s122.reset_index() # 取消索引,以便下一步引用‘e’
p1 = s122.groupby(s122['e']).mean().iloc[:, 5:] # 每个地区每种元素,经过极差变换后的均值
print(p1)
p1.to_excel(path+"sheet1-6.xlsx") # 保存
p.to_excel(path+"sheet1-7.xlsx")
放一下两个表的结果