You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 03:15:03