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

Pandas分组多条件过滤:筛选阳线且形成Lower Low的完整股票分组

股票筛选问题处理方案

原始数据

Date    Symbol   Open   High    Low  Close
0 2023-05-31  GEDIK.IS   7.90   8.01   7.77   7.87
1 2023-06-01  GEDIK.IS   7.92   8.20   7.89   8.14
2 2023-05-31  MIPAZ.IS   7.87   7.90   7.74   7.84
3 2023-06-01  MIPAZ.IS   7.84   8.06   7.80   8.05
4 2023-05-31  SUNTK.IS  36.20  37.52  35.48  37.00
5 2023-06-01  SUNTK.IS  37.20  38.30  36.60  38.30
6 2023-05-31  VANGD.IS   7.26   7.36   6.95   7.08
7 2023-06-01  VANGD.IS   7.09   7.63   6.92   7.48

需求

筛选同时满足以下两个条件的股票完整数据:

  • 2023-06-01当日为阳线(Close > Open)
  • 当日与前一日形成Lower Low(LL):2023-06-01的Low低于2023-05-31的Low

示例中仅VANGD.IS符合要求。

当前问题

现有代码df.groupby(['Symbol']).apply(lambda x: x[x["Low"] > x["Low"].shift(-1)])仅能筛选出LL相关的单行数据,无法获取符合条件股票的完整分组,且未结合阳线条件过滤,同时处理500只股票时效率不足。

高效解决方案

采用分组聚合计算条件+符号过滤的方式,避免逐组循环带来的性能损耗:

步骤1:排序并分组计算核心条件

先确保数据按股票和日期排序,再通过分组聚合验证两个条件:

# 按股票和日期排序,保证日期顺序正确
df_sorted = df.sort_values(['Symbol', 'Date']).reset_index(drop=True)

# 分组计算两个条件:6月1日是否阳线、是否形成Lower Low
grouped_check = df_sorted.groupby('Symbol').agg(
    is_rising=('Close', lambda x: x.iloc[-1] > x.iloc[-2] if len(x)>=2 else False),
    is_lower_low=('Low', lambda x: x.iloc[-1] < x.iloc[-2] if len(x)>=2 else False)
)

# 提取同时满足两个条件的股票符号
target_symbols = grouped_check[(grouped_check['is_rising'] & grouped_check['is_lower_low'])].index

步骤2:提取符合条件的完整股票数据

用筛选出的股票符号过滤原始排序数据,得到完整分组:

result = df_sorted[df_sorted['Symbol'].isin(target_symbols)]

执行结果

输出结果如下:

Date    Symbol   Open   High    Low  Close
6 2023-05-31  VANGD.IS   7.26   7.36   6.95   7.08
7 2023-06-01  VANGD.IS   7.09   7.63   6.92   7.48

性能说明

该方案利用groupby.agg做向量化计算,避免了apply的逐组循环,处理500只股票时效率远高于原方案。


内容的提问来源于stack exchange,提问作者Coin Bey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:22:38