熊猫转发cummax

kzt*_*ztd 2 python lambda numpy pandas

在给定一系列价格数据的情况下,我想找到股票的最大可能回报.鉴于您只能以未来的价格出售,我认为我需要在每一行上设置最大的未来价格:

def maxf(idx):
    return prc[idx:].bid.max()

prc['MaxF'] = prc.index.map(lambda x: maxf(x))
Run Code Online (Sandbox Code Playgroud)

这段代码确实有效,但需要比pandas.cummax()更长的时间.是否有直接的矢量方式来编码?

Bou*_*oud 6

forward cummax是reverse cummax的同义词:

prc.bid[::-1].cummax()[::-1]
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

numpy@Boud 的答案的一个版本是

prc.assign(MaxF=np.maximum.accumulate(prc.bid.values[::-1])[::-1])
Run Code Online (Sandbox Code Playgroud)

考虑数据框 prc

np.random.seed([3,1415])
prc = pd.DataFrame(dict(bid=np.random.rand(10)))

prc

        bid
0  0.444939
1  0.407554
2  0.460148
3  0.465239
4  0.462691
5  0.016545
6  0.850445
7  0.817744
8  0.777962
9  0.757983
Run Code Online (Sandbox Code Playgroud)

然后:

prc.assign(MaxF=np.maximum.accumulate(prc.bid.values[::-1])[::-1])

        bid      MaxF
0  0.444939  0.850445
1  0.407554  0.850445
2  0.460148  0.850445
3  0.465239  0.850445
4  0.462691  0.850445
5  0.016545  0.850445
6  0.850445  0.850445
7  0.817744  0.817744
8  0.777962  0.777962
9  0.757983  0.757983
Run Code Online (Sandbox Code Playgroud)

小数据计时

在此处输入图片说明