numpy / pandas векторизованная логика "пересечения порога" - PullRequest
0 голосов
/ 06 июня 2019

Я хотел бы реализовать эту логику "пересечения порога" (из-за отсутствия лучшего термина):

  • Начните со столбца num и столбца switch, установленного в 1.
  • Когда num падает (или проходит) на определенную lower_bound, поверните switch в 0.
  • Держите switch на 0, пока num не достигнет (или не превысит) upper_bound, после чего switch вернется к 1.

Для иллюстрации приведем настройки с lower_bound 3 и upper_bound 6.

df = pd.DataFrame([6, 5, 3, 2, 4, 5, 6, 3, 7, 5], columns=['num'])
df['switch'] = 1

А вот мой желаемый вывод.

    num switch
0   6   1
1   5   1
2   3   0
3   2   0
4   4   0
5   5   0
6   6   1
7   3   0
8   7   1
9   5   1

Конечно, можно легко выполнить итерацию, но я ищу некоторые идеи векторизованного подхода (numpy / pandas). Спасибо.

Ответы [ 2 ]

4 голосов
/ 06 июня 2019

Я думаю, что вы можете сделать с

s=df.num.ge(6).astype(int)-df.num.le(3).astype(int)
s.mask(s==0).ffill().replace(-1,0).fillna(1)
0    1.0
1    1.0
2    0.0
3    0.0
4    0.0
5    0.0
6    1.0
7    0.0
8    1.0
9    1.0
Name: num, dtype: float64
1 голос
/ 06 июня 2019

Вот подход, основанный на numpy, который, будучи немного многословным, должен быть довольно эффективным.

a = df.num
lw, up = 3, 6

pd.Series(
    np.select([a.le(lw), a.ge(up)], [-1, 1], np.nan)
).ffill().clip(0, 1).fillna(1)

0    1.0
1    1.0
2    0.0
3    0.0
4    0.0
5    0.0
6    1.0
7    0.0
8    1.0
9    1.0
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...