如何找到另一个系列将达到/交叉给定值的索引?

qua*_*ant 7 python numpy pandas

假设我有一个名为的时间序列X

我现在想知道第一个索引,之后其他数列的值Y将通过X。换句话说,对每一个指标i,我想知道的第一指标j 之后,它通过形成的线Xj-1j相交的价值Yi

下面是一个例子组示例XY系列,显示了所得到的值Z这些系列的长度始终相同

X | Y   | Z
2 | 3   | 2
2 | 3   | NaN
4 | 4.5 | 3
5 | 5   | NaN
4 | 5   | NaN
3 | 2   | 6
1 | 2   | NaN
Run Code Online (Sandbox Code Playgroud)

是否提供pandasnumpy提供有助于此的东西?此函数将在大型数据集上运行,因此我无法使用python循环。

jez*_*ael 4

使用numpy broadcastingby 与shifted值进行比较,然后通过小幅改进获取第一个Trues by的索引 - 添加列以获取每行的所有值,最后删除重复值:DataFrame.idxmaxNaNNaNFalse

a = df['X']
b = df['Y']

a1 = a.values
a2 = a.shift(-1).ffill().values
b1 = b.values[:, None]

arr = (((a1 < b1) & (a2 > b1)) | ((a1 > b1) & (a2 < b1)))
df = pd.DataFrame(arr)
df[np.nan] = True
out = df.idxmax(axis=1) + 1
out = out.mask(out.duplicated())
print (out)
0    2.0
1    NaN
2    3.0
3    NaN
4    NaN
5    6.0
6    NaN
dtype: float64
Run Code Online (Sandbox Code Playgroud)