Python數據分析處理(二)——數據的標準化處理歸一化(極差變換)以數學建模(CUMCM 2011 A)爲實例(兩表同名行列對應計算)

繼續之前的數據和工作,進行數據的標準化處理,具體數據可從下方博客鏈接獲取     

剔除異常值

 

放下表一和表二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")
放一下兩個表的結果

 

 

發佈了112 篇原創文章 · 獲贊 35 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章