如何用groupby计算分组滚动10期成交量排名?
按时间分组的滚动10期成交量排名实现方案
你的核心问题是之前的代码对每个时间组的全部历史成交量做了全局排名,而你需要的是每个时段仅基于最近10天同时段数据的滚动排名。以下是具体实现步骤:
步骤1:拆分日期与时间字段
先从Date_time中单独提取日期和时间,方便后续分组与排序:
raw_bn['Date'] = raw_bn['Date_time'].dt.date raw_bn['Time'] = raw_bn['Date_time'].dt.time
步骤2:实现滚动10期排名
通过groupby+rolling+rank的组合,完成每个时间组内的滚动排名计算:
# 按时间分组,组内按日期排序后计算滚动10期排名 raw_bn['Rolling_Rank'] = raw_bn.groupby('Time').apply( lambda group: ( group.sort_values('Date')['Volume'] .rolling(window=10, min_periods=1) .apply(lambda window: window.rank(ascending=False).iloc[-1]) ) ).reset_index(level=0, drop=True)
代码说明:
groupby('Time'):将数据按15分钟时段(如9:30、9:45)拆分,确保只在同时段内对比成交量sort_values('Date'):每个时段组内按日期排序,保证滚动窗口取的是过去的10天数据rolling(window=10, min_periods=1):设置滚动窗口大小为10,min_periods=1允许前9天数据不足10条时仍计算排名(可根据需求调整)apply(lambda window: window.rank(ascending=False).iloc[-1]):对每个滚动窗口内的成交量做降序排名,取窗口最后一条数据的排名(即当前日期该时段的排名)reset_index(...):清理分组后的索引,将结果合并回原DataFrame
可选调整
如果需要排除当前日期,仅对比过去10天的同时段数据,可以修改滚动逻辑,先将数据移位后再计算:
import pandas as pd import numpy as np raw_bn['Rolling_Rank_Exclude_Current'] = raw_bn.groupby('Time').apply( lambda group: ( group.sort_values('Date')['Volume'] .shift(1) # 移位后排除当前日期数据 .rolling(window=10, min_periods=1) .apply(lambda window: window.rank(ascending=False).iloc[-1] if not pd.isna(window.iloc[-1]) else np.nan) ) ).reset_index(level=0, drop=True)
内容的提问来源于stack exchange,提问作者aditya
相关产品推荐
相关产品推荐

