日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:啥都不懂的鱷魚 ? 更新時間: 2022-08-23 編程語言

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

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

from scipy.stats.mstats import winsorize
import pandas as pd
df = 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')

winsorize官方文檔

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) 

(在此鳴謝不厭其煩給我提供參考的張老師、李老師、孫老師?。?/p>

參考文章:

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

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

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

總結

原文鏈接:https://blog.csdn.net/m0_53119847/article/details/122729777

欄目分類
最近更新