Python 删除大百分比轮班之间的值
我有一个timeseries df,由a列中的每日利率点(IR也称为利率)和B列中的从一天到下一天的相对变化(Rel Shift)组成 DF的外观如下所示: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%
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% -