У меня есть следующий набор данных, где у меня есть столбец Дата и Значения для каждой строки. Он имеет значения + 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
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
Примечание . Стоит добавить несколько нулей в образец набора данных, чтобы убедиться, что вы не ошиблись при их атрибуции в этом случае. ( Нет, но все же )
Это может быть то, что вы ищете:
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
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.