2

让我们考虑一个数字分布在 -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列?

在此处输入图像描述

4

1 回答 1

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.selectffill

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.60.8,这将默认为第一个条件。您可能希望根据需要调整条件,但这会让您开始。

于 2018-08-22T21:29:02.143 回答