为何Pandas中rolling(50)与rolling("50D")均值计算结果不同?
Pandas中
rolling("50D")滚动均值的计算逻辑与差异解释 核心差异先明确
rolling(50).mean():按数据条数取窗口,固定取当前行及之前的50条数据计算均值,完全不考虑这些数据对应的日期间隔。rolling("50D").mean():按时间跨度取窗口,以当前行的日期索引为基准,取过去50天内的所有数据计算均值,前提是你的数据索引为DatetimeIndex类型。
rolling("50D")的具体计算逻辑
- 索引校验:首先确认数据索引是日期时间类型,否则无法使用时间窗口参数。
- 时间区间划定:对每行数据,以其索引日期为终点,往前推50天作为起点,得到闭合时间区间:
[当前日期 - 50天, 当前日期]。 - 数据筛选:将所有索引落在这个时间区间内的行筛选出来,不管这些行是否连续,也不管最终筛选出的条数是多少。
- 均值计算:对筛选出的所有数据计算均值,结果对应当前行的滚动均值。
为什么会和rolling(50).mean()结果不同?
当你的数据是非连续日期(比如A股交易日数据,周末、节假日无数据):
rolling(50).mean()取的50条数据,对应的时间跨度肯定超过50天(因为中间有日期缺失)。rolling("50D").mean()只取50天内的所有数据,实际条数可能少于50条(比如50天内只有45个交易日)。
举个具体例子:
假设当前行日期是2024-06-01,往前50天是2024-04-12。如果这段时间内因为节假日只有45条交易数据,rolling("50D").mean()就用这45条计算;而rolling(50).mean()会取当前行及之前的50条数据,对应的日期可能要追溯到2024-03月底,时间跨度远大于50天。
内容的提问来源于stack exchange,提问作者Armando Contestabile
相关产品推荐
相关产品推荐

