У меня есть следующий набор данных, где у меня есть столбец Дата и Значения для каждой строки. Он имеет значения + ve и -ve . Я должен получить количество всех положительных значений за последние 150 строк. В каждом ряду. Поэтому первые 150 строк будут иметь нулевые значения. Затем следующие строки будут иметь количество последних 150 строк + ve , и аналогично столбец -ve будет заполнен количеством отрицательных значений до этой строки.

Я пробовал использовать:

def get_count_of_all_150_positive_rows_before_this_row(row):
    df1 = row.tail(2)
    df1 = df1.to_frame()
    print(df1.tail())
    # if df1['positive_values'] > 0:
        return (df1['positive_values'].count())


df.apply(get_count_of_all_150_positive_rows_before_this_row, axis=1)

Dataset :

Date        values      positive_values    negative_values
01/01/08    0.12344     
02/01/08    -0.12344        
03/01/08    -0.1234433      
04/01/08    -0.12344        
05/01/08    -0.1234433      
06/01/08    -0.12344        
07/01/08    -0.1234433      
08/01/08    -0.12344        
09/01/08    -0.1234433      
10/01/08    0.12344     
11/01/08    -0.12344        
12/01/08    -0.1234433      
13/01/08    -0.12344        
14/01/08    -0.1234433      
15/01/08    -0.12344        
16/01/08    -0.1234433      
17/01/08    -0.12344        
18/01/08    -0.1234433      
19/01/08    0.12344     
0
jason 14 Мар 2018 в 14:27

2 ответа

Лучший ответ

Вы хотите использовать pd.rolling () для выполнения скользящего подсчета положительных и отрицательных результатов с учетом предыдущего «периода».

period = 5
df['less_than_zero'] = (df['values']
                        .rolling(window=period, min_periods=period)
                        .agg(lambda x: (x < 0).sum()))

df['greater_than_zero'] = (df['values']
                          .rolling(window=period,min_periods=period)
                          .agg(lambda x: (x > 0).sum()))

Это должно дать вам то, что вы хотите

Out[30]: 
         date    values  less_than_zero  greater_than_zero
0   01/01/08  0.123440             NaN                NaN
1   02/01/08 -0.123440             NaN                NaN
2   03/01/08 -0.123443             NaN                NaN
3   04/01/08 -0.123440             NaN                NaN
4   05/01/08 -0.123443             4.0                1.0
5   06/01/08 -0.123440             5.0                0.0
6   07/01/08 -0.123443             5.0                0.0
7   08/01/08 -0.123440             5.0                0.0
8   09/01/08 -0.123443             5.0                0.0
9   10/01/08  0.123440             4.0                1.0
10  11/01/08 -0.123440             4.0                1.0
11  12/01/08 -0.123443             4.0                1.0
12  13/01/08 -0.123440             4.0                1.0
13  14/01/08 -0.123443             4.0                1.0
14  15/01/08 -0.123440             5.0                0.0
15  16/01/08 -0.123443             5.0                0.0
16  17/01/08 -0.123440             5.0                0.0
17  18/01/08 -0.123443             5.0                0.0
18  19/01/08  0.123440             4.0                1.0

Примечание . Стоит добавить несколько нулей в образец набора данных, чтобы убедиться, что вы не ошиблись при их атрибуции в этом случае. ( Нет, но все же )

1
emmet02 14 Мар 2018 в 11:57

Это может быть то, что вы ищете:

import numpy as np

tail = df.tail(5)
pos = len(tail[df['values']>0])
neg = len(tail[df['values']<0])

df['pos_values'], df['neg_values'] = np.nan, np.nan
df.loc[df.index.values[-5:], 'pos_values'] = pos
df.loc[df.index.values[-5:], 'neg_values'] = neg

#         Date    values  pos_values  neg_values
# 0   01/01/08  0.123440         NaN         NaN
# 1   02/01/08 -0.123440         NaN         NaN
# 2   03/01/08 -0.123443         NaN         NaN
# 3   04/01/08 -0.123440         NaN         NaN
# 4   05/01/08 -0.123443         NaN         NaN
# 5   06/01/08 -0.123440         NaN         NaN
# 6   07/01/08 -0.123443         NaN         NaN
# 7   08/01/08 -0.123440         NaN         NaN
# 8   09/01/08 -0.123443         NaN         NaN
# 9   10/01/08  0.123440         NaN         NaN
# 10  11/01/08 -0.123440         NaN         NaN
# 11  12/01/08 -0.123443         NaN         NaN
# 12  13/01/08 -0.123440         NaN         NaN
# 13  14/01/08 -0.123443         NaN         NaN
# 14  15/01/08 -0.123440         1.0         4.0
# 15  16/01/08 -0.123443         1.0         4.0
# 16  17/01/08 -0.123440         1.0         4.0
# 17  18/01/08 -0.123443         1.0         4.0
# 18  19/01/08  0.123440         1.0         4.0
1
jpp 14 Мар 2018 в 11:51