Tenho uma pergunta muito parecida com esta, mas 1) quero que isso funcione para uma série também e 2) não tenho uma coluna representando meus valores de agrupamento; os valores estão no índice.
Imagine que eu tenho uma série que se parece com o seguinte:
2023-08-01 1515000.08
2023-09-01 2629410.80
2023-10-01 2548748.40
2023-11-01 2494398.04
2023-12-01 3397805.34
2024-01-01 3285501.49
2024-02-01 3173978.74
2024-03-01 3139235.65
2024-04-01 2927895.84
2024-05-01 2750708.29
dtype: float64
Gostaria de criar uma nova Série onde os valores representam o valor do último mês do trimestre anterior , assim:
2023-08-01 NaN
2023-09-01 NaN
2023-10-01 2629410.80 <--- the old value from 2023-09-01, which was the end of Q3
2023-11-01 2629410.80
2023-12-01 2629410.80
2024-01-01 3397805.34 <--- the old value from 2023-12-01
2024-02-01 3397805.34
2024-03-01 3397805.34
2024-04-01 3139235.65 <--- the old value from 2024-03-01
2024-05-01 3139235.65
dtype: float64
Estou achando muito difícil encontrar uma solução elegante aqui. Meu código é mais ou menos assim:
period_to_val = (
series.groupby(
lambda x: get_quarter(date=x)
)
.last()
.shift()
)
data = series.index.map(
lambda x: period_to_val[get_end_of_period(date=x, term_length=term_length, fiscal_year_start=fiscal_year_start)]
)
result = pd.Series(data=data, index=series.index)
Mas isso parece muito prolixo e feio. Eu queria uma operação no SeriesGroupBy
que fosse uma mistura entre a .shift()
e a .transform("last")
, mas tal coisa parece não existir.
Alguma ideia de como melhorar? Obrigado!