Python 删除大百分比轮班之间的值

Python 删除大百分比轮班之间的值,python,pandas,loops,Python,Pandas,Loops,我有一个timeseries df,由a列中的每日利率点(IR也称为利率)和B列中的从一天到下一天的相对变化(Rel Shift)组成 DF的外观如下所示: IR Shift May/30/2019 5.9% 1.67% May/29/2019 6% 1.69% **May/28/2019 5.9% -292%** May/27/2019 20.2% -1.4%

我有一个timeseries df,由a列中的每日利率点(IR也称为利率)和B列中的从一天到下一天的相对变化(Rel Shift)组成

DF的外观如下所示:

                   IR      Shift
May/30/2019        5.9%    1.67% 
May/29/2019        6%      1.69%      
**May/28/2019      5.9%   -292%**
May/27/2019        20.2%  -1.4%
May/26/2019        20.5%   2.5% 
**May/25/2019      20%     292%** 
May/24/2019        5.1%    -
我的df形状是4000x2,这些大百分比的变化在整个df中都是持续的。换言之,利率上升,趋于平稳,然后在某个点再次下降,反之亦然。因此,在上述情况下,IR变化了292%,趋于平稳,然后急剧下降292%

目标是将高于50%的峰值之间的值转换为np.nan,包括峰值发生的日期-有效地删除这些数据点,以便我可以用更合理的数据对其进行插补-在5%-6%的范围内

因此DF应该是这样的:

                    IR      Shift
May/30/2019        5.9%    1.67% 
May/29/2019        6%      1.69%      
May/28/2019        np.nan
May/27/2019        np.nan
May/26/2019        np.nan
May/25/2019        np.nan    
May/24/2019        5.1%    -
这就是我到目前为止所做的循环--


为了在“清除范围”之后还有一些未清除的区域, 我将您的数据帧扩展了一行,因此它包含:

           Day     IR  Shift
0  May/30/2019   5.9%  1.67%
1  May/29/2019     6%  1.69%
2  May/28/2019   5.9%  -292%
3  May/27/2019  20.2%  -1.4%
4  May/26/2019  20.5%   2.5%
5  May/25/2019    20%   292%
6  May/24/2019   5.1%     2%
7  May/23/2019   5.0%      -
现在如何解决这个问题:

首先定义一个检测“清除范围”开始和结束的函数, 基于即将创建的2个辅助列:

def detect(row):
    if row.Shft1 < -50:
        detect.retVal = True
    elif row.Shft2 > 50:
        detect.retVal = False
    return detect.retVal
实际计算涉及以下代码:

detect.retVal=False
df.IR.mask(df.apply(detect, axis=1), np.nan, inplace=True)
df.apply(检测,轴=1)
开始读取上述代码。 此指令计算掩码,指示
IR
值所在的行 应清除(替换为NaN)

然后转到
mask
函数本身。它应用于
df.IR
列, 使用刚刚计算的掩码,从而清除指示的行

最后一步是删除两个辅助列:

df['Shft1'] = df.Shift.apply(lambda x: 0.0 if x == '-' else float(x.rstrip('%')))
df['Shft2'] = df.Shft1.shift(fill_value=0)
df.drop(columns=['Shft1', 'Shft2'], inplace=True)
结果是:

           Day    IR  Shift
0  May/30/2019  5.9%  1.67%
1  May/29/2019    6%  1.69%
2  May/28/2019   NaN  -292%
3  May/27/2019   NaN  -1.4%
4  May/26/2019   NaN   2.5%
5  May/25/2019   NaN   292%
6  May/24/2019  5.1%     2%
7  May/23/2019  5.0%      -

太好了,谢谢你。然而,有一件事。在执行df.IR.mask(df.apply(detect,axis=1),np.nan,inplace=True)时似乎出现了错误。错误指示:df1.IR.mask(df1.apply(detect,axis=1),np.nan,inplace=True),指向列名…..啊,ok通过df.['IR'].mask.修复了它。但不幸的是,它没有替换大移动之间的值…另外,我应该补充一点,没有任何值是“%”形式的。我提到这一点是因为我注意到您对%..使用了rstrip函数…不确定这是否是代码不起作用的原因…可能删除rstrip(“%”)就足够了。但请注意,一个单元格包含“-”,因此此列仍将具有对象类型(字符串和数字的混合)。至于df.IR的错误,可能您使用了一些较旧版本的Pandas,它不允许对列进行属性访问。哦,对不起,“--”只是为了澄清当前的问题。。。实际数据不包含任何字符串。。。。
           Day    IR  Shift
0  May/30/2019  5.9%  1.67%
1  May/29/2019    6%  1.69%
2  May/28/2019   NaN  -292%
3  May/27/2019   NaN  -1.4%
4  May/26/2019   NaN   2.5%
5  May/25/2019   NaN   292%
6  May/24/2019  5.1%     2%
7  May/23/2019  5.0%      -