程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python中應用Winsorize縮尾處理的操作經驗

編輯:Python

最近搞數據時發現,縮尾時本來是空值或者無效值的地方被填補了數據。傳統的研究會將空值剔除後再進行縮尾,但一些不需要剔除空值的數據集需要剔除極端值,因而不能省略縮尾。結合自己的操作經驗做些記錄:

以保存在Excel中的數據為例:

from scipy.stats.mstats import winsorizeimport pandas as pddf = pd.read_excel('Excel.xlsx', engine='openpyxl', header=0)df_list=["a","b","c"]#需要進行縮尾的列名

1:直接應用Winsorize,不考慮空值和無效值,縮尾結果可能導致部分空值被填充數據

for i in df_list(): df[i]=winsorize(df[i],limits=[0.01, 0.01])#對指定列中的連續數據進行1%和99%的縮尾(Winsorize)處理

2.1:屏蔽空值和無效值,僅對其他值進行Winsorize處理,縮尾結果不改變原來的空值和無效值

for i in df_list(): df[i]=np.where(df[i].isnull(), np.nan, winsorize(np.ma.masked_invalid(df[i]),limits=(0.01,0.01)))#np.where(condition, x, y),滿足condition是x,否則y#此處判斷是否空值,是的話為空,否的話進行屏蔽空值和無效值的1%和99%縮尾處理

2.2:winsorize提供的參數,但這個方法我沒有成功…僅供參考

for i in df_list(): df[i]=winsorize(df[i],limits=[0.01, 0.01], nan_policy='omit')

3:屏蔽空值和無效值,對所有值進行Winsorize處理,縮尾結果不改變原來的空值和無效值,與方法2的區別在於方法3沒有改變需要縮尾的數據長度

for i in df_list(): mask = df[i].notna() df.loc[mask,i] = winsorize(df[i].loc[mask],limits=[0.01, 0.01]) #這個mask就是一個bool index,指示哪些位置上是nan #比如一列數據是[1, NaN, 2],如果用df['A'].isnan()得到的就是一個[False, True, False]的數組 #這個數組就是所謂的mask,它可以把dataframe中的特定數據挑出來

我碰到後續描述性統計有負無窮值的問題,因而將其替換為空值

#如果需要將無窮值換為空值df=df.replace(-np.Inf,np.NaN)

(在此鳴謝不厭其煩給我提供參考的張老師、李老師、孫老師!)

參考文章:

1.Winsorize的正確方法但在Python中忽略nan

2.有關numpy.ma.masked_invalid的用法

3.Python數據分析 - 縮尾處理

總結

到此這篇關於Python中應用Winsorize縮尾處理的文章就介紹到這了,更多相關Python應用Winsorize縮尾內容請搜索軟件開發網以前的文章或繼續浏覽下面的相關文章希望大家以後多多支持軟件開發網!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved