Consider the following dataframe of time series data about the daily production of three factories : f1, f2 and f3 of a company that only has two products: A and B. Missing data about a factory on a given day for a given product should be considered as a 0.
import datetime
d = {
1: {'date': datetime.datetime(2000,1,1), 'Product': 'A', 'Factory': 'f1', 'number': 10},
2: {'date': datetime.datetime(2000,1,1),'Product': 'B', 'Factory': 'f1', 'number': 15},
3: {'date': datetime.datetime(2000,1,1),'Product': 'A', 'Factory': 'f2', 'number': 5},
4: {'date': datetime.datetime(2000,1,1),'Product': 'A', 'Factory': 'f3', 'number': 6},
5: {'date': datetime.datetime(2000,1,2),'Product': 'A', 'Factory': 'f2', 'number': 10},
6: {'date': datetime.datetime(2000,1,2),'Product': 'B', 'Factory': 'f3', 'number': 17},
7: {'date': datetime.datetime(2000,1,2),'Product': 'A', 'Factory': 'f3', 'number': 89},
8: {'date': datetime.datetime(2000,1,2),'Product': 'A', 'Factory': 'f1', 'number': 4},
9: {'date': datetime.datetime(2000,1,2),'Product': 'B', 'Factory': 'f2', 'number': 4},
10: {'date': datetime.datetime(2000,1,3),'Product': 'A', 'Factory': 'f2', 'number': 1},
11: {'date': datetime.datetime(2000,1,3),'Product': 'B', 'Factory': 'f3', 'number': 7},
12: {'date': datetime.datetime(2000,1,3),'Product': 'A', 'Factory': 'f1', 'number': 9},
13: {'date': datetime.datetime(2000,1,4),'Product': 'A', 'Factory': 'f3', 'number': 41},
14: {'date': datetime.datetime(2000,1,4),'Product': 'B', 'Factory': 'f4', 'number': 30},
}
dff = pd.DataFrame.from_dict(d).T
dff.groupby(['date','Factory','Product']).sum()
I would like to be able to calculate the average production of each factory across products in the last X days where X is a parameter. For example, if X = 2, for the date (2000,1,4) for f3 we would have in total 41 items from product A (41 from (2000,1,4) and 0 from (2000,1,3)) and in total 7 items from product B (0 from (2000,1,4) and 7 from (2000,1,3)). This would mean (7+41)/2 = 24 "on average per product" (this metric is defined by me). How to write a smart aggregation code that achieves this? I tried many aggregations but could not derive the result. For example, I expected something like this:
dff.groupby(['date','Factory','Product']).sum().rolling(2).sum()
to be the first step, but the rolling does not seem to be per date as I would like.
