Повторная выборка каждые полгода с накопленной суммой - PullRequest
0 голосов
/ 22 октября 2018

У меня есть данные с ежемесячными данными, такими как:

Date          Value
2016-12-01    0
2017-01-01    10
2017-02-01    20
2017-03-01    15
2017-04-01    25
2017-05-01    35
2017-06-01    1
2017-07-01    2
2018-08-01    3
2018-09-01    4
2018-10-01    5
2018-11-01    6

Я хочу взять полугодовую накопленную сумму за каждый месяц, но с концом года, а не декабрем.Таким образом, в течение года будет накоплено два 6-месячных периода за совокупную сумму.Таким образом, результат должен быть:

Date          Value
2016-12-01    0
2017-01-01    10
2017-02-01    30
2017-03-01    45
2017-04-01    70
2017-05-01    105

2017-06-01    1
2017-07-01    3
2018-08-01    6
2018-09-01    10
2018-10-01    15
2018-11-01    21

Я пробовал это:

import_monthly.groupby(by=[pd.Grouper(freq='2Q-MAY'), pd.Grouper(freq='A-MAY')]).cumsum()

, но он привязывает мою дату кумулятивной суммы 17 февраля и 17 августа вместо 17 маяи 17 ноября.Он также все еще заканчивает год в мае, поэтому даже для этих двух 6-месячных периодов он не имеет правильных 2 накопленных сумм.Что я делаю не так?

1 Ответ

0 голосов
/ 22 октября 2018

Этот вопрос заставил меня понять, что ежеквартальные якорные смещения панд непостоянны, и я до сих пор не совсем понимаю, как они работают.Исходя из этого SO вопроса и ответа , единственный способ получить ожидаемый результат - добавить фиктивное значение в качестве первой строки с индексом 1 мая или 1 ноября. Согласно @chrisb вэтот другой ответ связан с тем, что в смещении 2Q-NOV якорь NOV вычисляется / применяется до , к которому применяется множитель 2.

Начиная с вашего DataFrame:

# Insert a sentinel value into the first row to influence
# the behaviour of the anchored-offset groupby.
# Inserting at 2015-11-01 would work too
df.loc[pd.to_datetime('2015-05-01'), 'Value'] = 0
df.sort_index(inplace=True)

df.groupby(pd.Grouper(freq='2Q-NOV')).cumsum()

            Value
Date             
2015-05-01    0.0
2016-12-01    0.0
2017-01-01   10.0
2017-02-01   30.0
2017-03-01   45.0
2017-04-01   70.0
2017-05-01  105.0
2017-06-01    1.0
2017-07-01    3.0
2018-08-01    3.0
2018-09-01    7.0
2018-10-01   12.0
2018-11-01   18.0

# Workaround: groupby with the sentinel value, then immediately drop it
df.groupby(pd.Grouper(freq='2Q-NOV')).cumsum().drop(pd.to_datetime('2015-05-01'))

            Value
Date             
2016-12-01    0.0
2017-01-01   10.0
2017-02-01   30.0
2017-03-01   45.0
2017-04-01   70.0
2017-05-01  105.0
2017-06-01    1.0
2017-07-01    3.0
2018-08-01    3.0
2018-09-01    7.0
2018-10-01   12.0
2018-11-01   18.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...