Мин. Прокатки серии Pandas без окна / кумулятивный минимум / мин. Расширения - PullRequest
3 голосов
/ 19 июня 2019

Я ищу способ вычисления с помощью Python Pandas: прокатка (*) мин серии без окна.

Давайте рассмотрим следующее 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

но я думаю, что метод Панд, вероятно, должен существовать (и быть гораздо более эффективным) или, если он не существует, его, вероятно, следует реализовать.

(*) «переходящий» может быть не подходящим термином, может быть, он должен быть назван вместо «локальный» мин.

Редактировать: на самом деле он называется кумулятивным минимумом или расширяющимся минимумом

Ответы [ 3 ]

7 голосов
/ 19 июня 2019

Использование Series.cummin:

print(s.cummin())
0    10
1    10
2    10
3     9
4     9
5     8
6     8
7     8
dtype: int64
3 голосов
/ 19 июня 2019

Другой способ - использовать 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
3 голосов
/ 19 июня 2019

Вы можете использовать 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
...