Dataframe - 滚动产品 - timedelta 窗口

问题描述 投票:0回答:1

我正在尝试对数据帧进行简单的滚动乘法(每个新值应该是窗口中所有输入值的乘积)。意识到滚动不允许产品,我尝试寻找替代解决方案,但它们似乎不适用于可变长度窗口:

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:是非固定频率

对于这种类型的滚动有任何干净的解决方法吗?

python pandas rolling-computation
1个回答
2
投票

这就是您正在寻找的 7 天窗口吗?该文档说您可以提供

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)

© www.soinside.com 2019 - 2024. All rights reserved.