我正在尝试对数据帧进行简单的滚动乘法(每个新值应该是窗口中所有输入值的乘积)。意识到滚动不允许产品,我尝试寻找替代解决方案,但它们似乎不适用于可变长度窗口:
start_date = '2024-05-01'
date_index = pd.date_range(end=start_date, periods=15, freq='B')
df = pd.DataFrame(list(range(1,16)), index = date_index, columns=['A'])
df.rolling('1W').agg({"A": "prod"})
这会返回错误:ValueError:
对于这种类型的滚动有任何干净的解决方法吗?
pd.Timedelta
作为 pd.DataFrame.rolling
的参数
>>> df.rolling(pd.Timedelta(days=7)).agg(lambda a: np.prod(a))
... # works also: df.rolling(pd.Timedelta('1W')).agg(lambda a: np.prod(a))
... # as well as: df.rolling(pd.Timedelta(weeks=1)).agg(lambda a: np.prod(a))
A
2024-04-11 1.0
2024-04-12 2.0
2024-04-15 6.0
2024-04-16 24.0
2024-04-17 120.0
2024-04-18 720.0
2024-04-19 2520.0
2024-04-22 6720.0
2024-04-23 15120.0
2024-04-24 30240.0
2024-04-25 55440.0
2024-04-26 95040.0
2024-04-29 154440.0
2024-04-30 240240.0
2024-05-01 360360.0
看来你必须使用
lambda
;只是该方法抛出错误。或者您的窗口输入的是上周五的数据?如果是这样,请使用带有偏移量 (groupby
) 的 pd.offset.Weekday(weekday=THE_DAY)
。