Saya memiliki banyak Seri seperti ini:

0   0.1
1   -0.1
2   -0.2
3   0.14
4   0.17
5   -0.34
6   -0.78
7   -0.22
8   -0.9
9   -0.01
10  0.12
11  0.13
12  0.22
13  -0.24
14  -0.44
15  -0.91

Saya ingin memeriksa apakah ada 5 atau lebih baris negatif satu demi satu. Jadi untuk Seri ini hasil yang diharapkan:

True          

Jika tidak, dalam Seri ini tidak ada 5 baris negatif satu demi satu.

0   0.14
1   0.15
2   -0.24
3   0.11
4   0.17
5   0.31
6   -0.79
7   0.22
8   -0.91
9   0.11
10  0.22
11  0.34
12  0.12
13  -0.44
14  -0.14
15  0.31

Keluaran yang diharapkan:

False              

Saya tahu cara mengulangi melalui Seri. Itu bisa dilakukan dengan iterasi.
Tetapi saya membutuhkan panda berkecepatan tinggi untuk melakukannya dengan sangat cepat. Seri saya sangat besar. Mungkin ada metode di bawah tenda.

0
Igor K. 3 Januari 2021, 22:44

3 jawaban

Jawaban Terbaik

Menggunakan rolling dan sum, bersama dengan centang untuk apa pun yang lebih besar atau sama dengan 5.

import pandas as pd    

s = pd.Series([0.1,-0.1,-0.2,0.14,0.17,-0.34,-0.78,-0.22,-0.9,-0.01,0.12,0.13,0.22,-0.24,-0.44,-0.91])

((s < 0).rolling(5).sum() >= 5).any()
>>> True
1
ScootCork 3 Januari 2021, 20:15

Coba masking dan penjumlahan ini :) :

sr = ... #your data Series
bool_sr = sr < 0
has_5 = ((bool_sr == True) & (bool_sr.shift(1) ==True)).sum() >= 5
1
adir abargil 3 Januari 2021, 19:54
import numpy as np
def is_n_negative_sequence(x, N=5):
    dif = np.diff(x >= 0)
    dif = np.hstack((True, dif, True))
    loc = np.where(dif)
    return bool(np.any(np.diff(loc) >= N))

assert is_n_negative_sequence(np.array([-5,-4,-3,-2,-1,0])) is True  # left case
assert is_n_negative_sequence(np.array([5,-4,-3,-2,-1,-1, 0])) is True # middle case
assert is_n_negative_sequence(np.array([5,-4,-3,-2,-1, -1])) is True  # right case
assert is_n_negative_sequence(np.array([5,-4,-3,-2,-1, 0])) is False # False case
1
Lior Cohen 3 Januari 2021, 20:19