- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试对包含 NaN 的 pandas 系列进行 winsorize。使用掩码可以转义 NaN,但它只会在找到百分位值时转义 NaN,然后用该值替换 NaN,这不是我想要的。
例如,df 由 1, 2, ..., 98, 99, Inf, NaN 组成。对于 (0.01, 0.01) 缩尾,结果应为 2, 2, 3, 4, ..., 98, 99, 99, NaN。
直接使用 winsorize 得到 2, 2, 3, 4, ..., 98, 99, 99。我尝试先屏蔽 NaN,然后 winsorize,最后用 NaN 替换原来是 NaN 的数字:
import numpy as np
import pandas as pd
from scipy.stats.mstats import winsorize
df = pd.DataFrame(list(range(1,99))+[np.Inf, np.NaN])
np.where(df.isnull(), np.nan, winsorize(np.ma.masked_invalid(df),limits=(0.01,0.01)))
但是,结果现在是 1, 2, 3, ..., 98, 99, 99, NaN。最小的数字 1 未正确调整,我不明白为什么会这样。
之所以不先drop NaNs再winsorize,是因为需要保留索引。这是大型数据集的一部分,并没有丢失该观察的其他变量。
有没有办法(最好是优雅的)来实现我的目标?
最佳答案
您需要先屏蔽它。
df = pd.DataFrame({'A':list(range(1,99))+[np.Inf, np.NaN]})
df.loc[mask, 'A'] = winsorize(df['A'].loc[mask],limits=0.10)
1 未被缩尾处理的原因是因为忽略 NaN 会将样本减少到 98,第 1 个百分位数将是“第 0.98 个”观察值,这实际上是“第 0 个”观察值,因此 1 不被视为被缩尾处理。
关于python - 在 Python 中进行 winsorize 但忽略 nan 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47105278/
我试图弄清楚如何对纵向数据集中的个人分组观察进行 winsorize。 我从这个开始 excellent answer关于如何从变量的均值中删除 >2 个标准差的数据。作者还帮助展示了如何在类别内做到
我有一个时间序列 pandas 数据框,并且我计算了一个新列 df['std_series']= ( df['series1']-df['series1'].rolling(252).mean() )
正常的 groupby 均值很简单: df.groupby(['col_a','col_b']).mean()[col_i_want] 但是,如果我想应用一个 winsorized 均值(默认限制为
我想对 pandas 数据框中的几列数据进行winsorize。每列都有一些 NaN,这会影响 winsorization,因此需要将它们删除。我知道如何执行此操作的唯一方法是为所有 数据删除它们,而
我正在尝试在 pandas 中为 Python 运行 Winsorized 回归。 very helpful user manual提供此示例代码: winz = rets.copy() std_1y
我正在尝试实现一个 winsorization 函数,但对它的确切定义感到困惑。显然,R包中的winsorize函数,DescTool,以及Python库中的winsorize函数,scipy.sta
我正在尝试使用 Winsorize() 包中的 lapply 应用 library(DescTools) 函数。我目前拥有的是; data$col1 data$col1 [1] -0.0677
我正在尝试对包含 NaN 的 pandas 系列进行 winsorize。使用掩码可以转义 NaN,但它只会在找到百分位值时转义 NaN,然后用该值替换 NaN,这不是我想要的。 例如,df 由
我是一名优秀的程序员,十分优秀!