让我们考虑一个数字帧,其数字分布在-1和1之间。在此序列中,有两个边界会更改系统状态:-0.5和0.5。如果系统越过0.5,它将保持其位置,直到系统通过-0.5(和对面)为止。在以下数据框中给出了一个直观的示例:
d = pd.DataFrame([[0.1,0.3,-0.1,-0.8,-0.7,0.2,0.9,0.4,-0.1,-0.8], [None, None, None, -1,-1,-1, 1, 1, 1, -1]]).T
如何在不使用for循环的情况下计算列 1 ?
答案 0 :(得分:3)
首先,设置您的条件:
c1 = (df[0].lt(-0.5) & df[0].shift().gt(-0.5)) | (df[0].gt(-0.5) & df[0].shift().lt(-0.5))
c2 = (df[0].lt(0.5) & df[0].shift().gt(0.5)) | (df[0].gt(0.5) & df[0].shift().lt(0.5))
然后使用np.select
和ffill
:
df.assign(out=np.select([c1, c2], [-1, 1], np.nan)).ffill()
0 out
0 0.1 NaN
1 0.3 NaN
2 -0.1 NaN
3 -0.8 -1.0
4 -0.7 -1.0
5 0.2 -1.0
6 0.9 1.0
7 0.4 1.0
8 -0.1 1.0
9 -0.8 -1.0
此方法不能处理的一件事是,如果两个阈值都在一个步骤中都超过,该怎么办。例如,如果您从-0.6
到0.8
,这将默认为第一个条件。您可能需要根据需要调整条件,但这会帮助您入门。