# 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?

## 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()
```