没有 window 的 Pandas 系列的滚动最小值/累积最小值/扩展最小值

Rolling min of a Pandas Series without window / cumulative minimum / expanding min

我正在寻找一种方法来计算 Python Pandas rolling(*) min of a Series without window.

让我们考虑以下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 方法可能应该存在(并且效率更高),或者如果它不存在,则可能应该实施。

(*) "rolling" 可能不是合适的术语,也许应该将其命名为 "local" min.

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

您可以使用 np.minimum.accumulate:

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

使用Series.cummin:

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

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

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