无窗序列的滚动最小值/累积最小值/扩张最小值

2024-05-23 14:58:06 发布

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

我正在寻找一种方法来计算一个系列没有窗口(*)分钟。你知道吗

让我们考虑下面的Series

In [26]: s = pd.Series([10, 12, 14, 9, 10, 8, 16, 20])
Out[26]:
0    10
1    12
2    14
3     9
4    10
5     8
6    16
7    20
dtype: int64

我想拍一部像这样的连续剧

0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64

我试过了

s.rolling().min()

但我得到以下错误

TypeError: rolling() missing 1 required positional argument: 'window'

是我干的

r = s.copy()
val_min = r.iloc[0]
for i, (idx, val) in enumerate(r.iteritems()):
    if i > 0:
        if val < val_min:
            val_min = val
        else:
            r[idx] = val_min

并且有一个正确的答案

In [30]: r
Out[30]:
0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64

但是我认为Pandas方法应该存在(而且效率更高),或者如果不存在,应该实现它。你知道吗

(*)“滚动”可能不是合适的术语,也许应该将其命名为“本地”min

编辑:它实际上被命名为累积最小值或扩展最小值


Tags: 方法inif错误valoutmin命名
3条回答

使用^{}

print(s.cummin())
0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64

您可以使用^{}

import numpy as np

pd.Series(np.minimum.accumulate(s.values))

0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64

另一种方法是使用s.expanding.min(参见^{}):

s.expanding().min()

输出:

0    10.0
1    10.0
2    10.0
3     9.0
4     9.0
5     8.0
6     8.0
7     8.0

相关问题 更多 >