Использование numba
Вы можете использовать numba
здесь, просто убедитесь, что сначала pip install numba
.Этот параметр медленнее, чем параметр cumsum
, но он помогает продемонстрировать, как будет выглядеть алгоритм для этой проблемы.
Настройка
from numba import njit
Создание логической серии с использованием shift
:
s = df.Volume.mul(df.Volume.shift(-1)).gt(0).tolist()
@njit
def increment(s):
rate = [int(s[0]>0)]
for idx, el in enumerate(s[1:]):
if el:
rate.append(rate[idx]+1)
else:
rate.append(0)
return rate
increment(s)
[1, 0, 0, 1, 0, 1, 2, 3, 0, 0, 1, 0, 0]
Использование cumsum
и groupby
:
s = df.Volume.mul(df.Volume.shift(-1)).gt(0).astype(int)
s.groupby(s.ne(s.shift()).cumsum()).cumsum()
0 1
1 0
2 0
3 1
4 0
5 1
6 2
7 3
8 0
9 0
10 1
11 0
12 0
Name: Volume, dtype: int32
Пояснение
Мы можем использовать shift
для проверки Volume[i] * Volume[i-1]
:
df.Volume.mul(df.Volume.shift(-1))
0 2.0
1 -0.0
2 0.0
3 3.0
4 -3.0
5 2.0
6 2.0
7 2.0
8 -4.0
9 -4.0
10 2.0
11 -0.0
12 NaN
Name: Volume, dtype: float64
Мы можем взять эту серию и проверить, что она больше чем 0
:
df.Volume.mul(df.Volume.shift(-1)).gt(0).astype(int)
0 1
1 0
2 0
3 1
4 0
5 1
6 1
7 1
8 0
9 0
10 1
11 0
12 0
Name: Volume, dtype: int32
Теперь вы можете увидеть структурувыходных данных становится ясным, но нам нужно увеличивать на основе последовательных диапазонов 1
, что мы можем сделать, используя трюк groupby
для группировки последовательных значений, и взять cumsum
.