Python,Pandas,逆风

2024-06-16 11:37:09 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们考虑以下系列:

s=pd.Series(data=[100, 110, 120, 150, 110, 90, 80, 70, 90, 95])

我迭代每个项目并执行以下操作:

for i in range(len(s)):
    m=max(s[i]-s[i:])

基本上是将每个项目与后面的所有项目进行比较,并检索最大值

我可以这样做:

r=[]
for i in range(len(s)):
    m=max(s[i]-s[i:])
    r.append(m)

result=pd.Series(r)

但我觉得这是摇窗能做的事?我正在努力使我的代码更干净一点,刚刚开始阅读和探索滚动函数,但我还不能,但我的手指在它。这个想法看起来像是一个反向扩展函数(即,当它沿着数据向下移动时,需要的数据越来越少)?你知道吗

如果有人对如何使用滚动/扩展窗口重新格式化代码有想法,请告诉我。你知道吗


Tags: 数据项目函数代码infordatalen
3条回答

使用[::-1]反转初始序列,取累计最小值,然后再次反转。从s中减去结果序列。你知道吗

>>> s.sub(s[::-1].cummin()[::-1])

0    30
1    40
2    50
3    80
4    40
5    20
6    10
7     0
8     0
9     0
dtype: int64

如果索引是单调递增的,则可以更为明确:

s.sub(s.sort_index(ascending=False).cummin().sort_index())

您可以在s上使用numpy.minimum.accumulate反转,然后从s中减去它:

import numpy as np
s - np.minimum.accumulate(s[::-1])[::-1]

#0    30
#1    40
#2    50
#3    80
#4    40
#5    20
#6    10
#7     0
#8     0
#9     0
#dtype: int64

或者我们可以使用rollingmin

s-s[::-1].rolling(len(s),min_periods=1).min()
Out[368]: 
0    30.0
1    40.0
2    50.0
3    80.0
4    40.0
5    20.0
6    10.0
7     0.0
8     0.0
9     0.0
dtype: float64

相关问题 更多 >