Условная скользящая сумма с использованием фильтра в строках групповой группы - PullRequest
0 голосов
/ 27 декабря 2018

Я безуспешно пытался найти способ создать "average_gain_up" в python и немного застрял.Будучи новичком в groupby, есть кое-что из того, как он обрабатывает функции, которые мне не удалось понять, поэтому любая интуиция в том, как продумать эти типы проблем, будет полезна.

Проблема: Создайте скользящую 14-дневную сумму, суммируя только если значение> 0.

new=pd.DataFrame([[1,-2,3,-2,4,5],['a','a','a','b','b','b']])
new= new.T #transposing into a friendly groupby format

#Group by a or b, filter to only have positive values and then sum rolling, we 
keep NAs to ensure the sum is ran over 14 values. 
groupby=new.groupby(1)[0].filter(lambda x: x>0,dropna=False).rolling(14).sum()

frame

Предполагаемая сумма Рамка:

enter image description here

x.all () / len (x) результат:

enter image description here

это выдает ошибку типа «фильтр должен вернуть логический результат».читая другие ответы, я понимаю, что спрашиваю, превосходит ли серия / кадр 0.Приведенный выше код работает с len (x), опять же имеет смысл в этом контексте.

Я пробовал также с all (), но он не работает должным образом.Функции .all () возвращают по одному логическому значению на группу, и тогда сумма является простой скользящей суммой.

Я пытался создать список логических значений, чтобы сказать, какие значения положительны, а какие нет, но это также приводит к ошибке, на этот раз я не уверен, почему.

groupby1=new.groupby(1)[0]
groupby2=[y>0 for x in groupby1 for y in x[1] ]
groupby_try=new.groupby(1)[0].filter(lambda x:groupby2,dropna=False).rolling(2).sum()

1) как заставить работать приведенный выше код и что не так в том, как я об этом думаю?

2) Является ли это «наилучшей практикой» для выполнения этих операций?

Любая помощь приветствуется, дайте мне знать, если я что-то пропустил или необходимы какие-либо дополнительные разъяснения.

1 Ответ

0 голосов
/ 27 декабря 2018

Согласно документу filter после groupby, не предполагается, что filter значения внутри группы, а группы в целом, если они не соответствуют некоторым критериям, напримеркак если бы sum всех элементов группы было больше 2, тогда группа сохраняется в первом примере с учетом

Одним из способов может быть замена всех отрицательных значений на 0 в new[0] сначала,используя, например, np.clip, а затем groupby, rolling и sum, например

print (np.clip(new[0],0,np.inf).groupby(new[1]).rolling(2).sum())
1   
a  0    NaN
   1    1.0
   2    3.0
b  3    NaN
   4    4.0
   5    9.0
Name: 0, dtype: float64

. Этот способ предотвращает изменение данных в new, есливы не возражаете, вы можете изменить столбец 0 с помощью new[0] = np.clip(new[0],0,np.inf), а затем выполнить new.groupby(1)[0].rolling(2).sum(), что даст тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...