没有 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
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
我正在寻找一种方法来计算 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
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