Python: multiplication with RollingGroupby

Question:

I have a dataframe as follows

id return1 return2
weekday1 0.1 0.2
weekday1 0.2 0.4
weekday1 0.3 0.5
weekday2 0.4 0.7
weekday2 0.5 0.6
weekday2 0.6 0.1

I know how to do the rolling-groupby-sum, which is

df.groupby(df.index.dayofweek)  #originally the index is a time series
    .rolling(52).sum()
    .droplevel(level=0).sort_index()

Now I need to add 1 to all the elements first and then multiply those in the same group as follows.

Step 1 – add 1:

id return1 return2
weekday1 1.1 1.2
weekday1 1.2 1.4
weekday1 1.3 1.5
weekday2 1.4 1.7
weekday2 1.5 1.6
weekday2 1.6 1.1

Step2 – multiply by group:

id return1 return2
weekday1 1.1×1.2×1.3 1.2×1.4×1.5
weekday2 1.4×1.5×1.6 1.7×1.6×1.1

I use the following codes

df.transform(lambda x : x+1).groupby(df.index.dayofweek)
      .rolling(52).mul()
      .droplevel(level=0).sort_index()

but it gives an AttributeError: ‘RollingGroupby’ object has no attribute ‘mul’.

cumprod() doesn’t work either. Perhaps it has somthing to do with the rolling part for that there’s no such thing as rolling.cumprod() or rolling.mul().

Is there a better way to do the multiplication within a group with rolling part?

Asked By: idleriver

||

Answers:

Use numpy.prod in Rolling.apply:

df.add(1).groupby(df.index.dayofweek).rolling(52).apply(np.prod)

Btw, from expected ouput seems need GroupBy.prod:

df.add(1).groupby(df.index).prod()
Answered By: jezrael
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.