Python:如何用Pandas从多年股票数据按月生成新DataFrame并筛除每月市值最低x%股票
月度维度剔除低市值股票的实现方法
按月份拆分数据集做过滤的核心逻辑是成立的,完全可以通过pandas的原生分组能力简化流程,避免逐轮循环拆分临时DataFrame的冗余操作,适配多年跨度的股票数据集处理,具体实现逻辑:
- 首先对表中的交易日期字段做标准化解析,统一提取为
年-月粒度的分组标识,不需要逐月份筛选数据生成独立的临时DataFrame - 以提取的月度标识为分组键,直接对全表做分组操作,无需逐轮循环切分单月数据切片
- 针对每个月度分组,按照市值字段计算要剔除的x%对应的分位阈值,仅保留市值高于该阈值的股票样本
- 全表过滤完成后直接得到完整的处理后数据集,不需要逐段拼接单月的临时计算结果
- 相比逐月份循环的实现思路,这套方案能大幅减少临时对象创建带来的内存开销,处理5年以上、覆盖数千只股票的长周期数据时运行效率提升明显
- 分组计算的逻辑天然保证每个月份的筛选规则完全统一,不会出现循环过程中字段错位、格式不一致的问题
可直接复用的核心代码:
import pandas as pd # 解析交易日期字段,提取月度分组键 df['交易日期'] = pd.to_datetime(df['交易日期']) df['统计月份'] = df['交易日期'].dt.to_period('M') # 设置待剔除的低市值占比,比如exclude_ratio=0.1代表每月剔除市值排名垫底10%的股票 exclude_ratio = 0.1 # 按月份分组计算每个组内的市值分位阈值,将阈值广播匹配回全表 market_cap_cutoff = df.groupby('统计月份')['市值'].transform( lambda monthly_caps: monthly_caps.quantile(exclude_ratio) ) # 过滤得到符合要求的数据集 filtered_df = df[df['市值'] >= market_cap_cutoff]
实操注意:如果遇到单月样本量较少、分位值跨同市值样本的边界场景,可以调整
quantile方法的插值参数匹配对应的剔除规则,不需要手动写排序、计数算占比的冗余逻辑。
内容的提问来源于stack exchange,提问作者orange123
相关产品推荐
相关产品推荐

