【问题标题】:After using scipy.stats.mstats.winsorize to winsorize my sample at 1% and 99%, the Maximum value of my sample still bigger than value at 99% [duplicate]使用 scipy.stats.mstats.winsorize 在 1% 和 99% 处对我的样本进行 winsorize 后,我的样本的最大值仍然大于 99% 的值 [重复]
【发布时间】:2019-09-04 08:57:16
【问题描述】:

我想在 1% 和 99% 处对我的样本进行 winsorize,因此我使用 scipy 对我的样本进行了winsorize。在 Winsorizing 之后,我的样本的最大值疯狂地大于 99% 百分位数的值。我想知道为什么会这样? 我的示例是:

Total Sales         Assets     Market value 
1000                 123        4892  
1232                 12         NaN
125                  1569       156

我用过:

import scipy.stats as sp

for col in df.columns: 
     sp.mstats.winsorize(df[col], limits=0.01, inplace=True)

在对我的代码进行优化后,我发现样本中的最大值仍然大于 99% 的值。我想我犯了一些错误,但我不知道它在哪里?

【问题讨论】:

    标签: python-3.x pandas scipy


    【解决方案1】:

    问题是就地操作。而是将列分配回去:

    for col in df.columns: 
         df[col] = stats.mstats.winsorize(df[col], limits=0.01)
    

    样本数据

    import numpy as np
    import pandas as pd
    from scipy import stats
    
    df = pd.DataFrame(np.random.randint(1, 10000, (500000, 2)))
    print(df.describe())
    #                   0              1
    #count  500000.000000  500000.000000
    #mean     4993.512288    5004.678502
    #std      2888.254381    2884.128073
    #min         1.000000       1.000000
    #25%      2486.000000    2513.000000
    #50%      4985.000000    5005.000000
    #75%      7492.000000    7502.000000
    #max      9999.000000    9999.000000
    
    # inpalce doesn't change anything when looping over columns:
    for col in df.columns: 
         stats.mstats.winsorize(df[col], limits=0.01, inplace=True)
    print(df.describe())
    #                   0              1
    #count  500000.000000  500000.000000
    #mean     4993.512288    5004.678502
    #std      2888.254381    2884.128073
    #min         1.000000       1.000000
    #25%      2486.000000    2513.000000
    #50%      4985.000000    5005.000000
    #75%      7492.000000    7502.000000
    #max      9999.000000    9999.000000
    
    for col in df.columns: 
         df[col] = stats.mstats.winsorize(df[col], limits=0.01)
    print(df.describe())
    #                   0              1
    #count  500000.000000  500000.000000
    #mean     4993.505330    5004.690118
    #std      2886.521538    2882.414353
    #min       101.000000     101.000000
    #25%      2486.000000    2513.000000
    #50%      4985.000000    5005.000000
    #75%      7492.000000    7502.000000
    #max      9899.000000    9901.000000
    

    【讨论】:

    • 非常感谢。它不起作用。我认为问题应该是缺失值。我的最后一列包含缺失值。缺失值被视为 + 无穷大,因此 scipy 会自动更改缺失值。
    • 请看这个答案。这个答案回答了我的问题。太感谢了。 stackoverflow.com/questions/50612095/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2021-06-25
    • 2018-01-23
    • 2019-05-31
    相关资源
    最近更新 更多