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

按Symbol分组统计当前Close到下一个更小Close值的行数

问题

现有股票数据如下:

Date, Symbol, Close
2021-01-01, AAPL, 10
2021-01-02, AAPL, 12
2021-01-03, AAPL, 3
2021-01-01, MSFT, 12
2021-01-02, MSFT, 20
2021-01-03, MSFT, 12
2021-01-04, MSFT, 1
2021-01-05, MSFT, 2
2021-01-06, MSFT, 3

需要按Symbol分组,统计每一行的Close值到下一个小于该值的Close值之间的行数,最终生成包含Output列的结果,期望输出如下:

Date, Symbol, Close, Output
2021-01-01, AAPL, 10, 2
2021-01-02, AAPL, 12,1
2021-01-03, AAPL, 3, NaN
2021-01-01, MSFT, 12, 3
2021-01-02, MSFT, 20, 1
2021-01-03, MSFT, 12, 1
2021-01-04, MSFT, 1, NaN
2021-01-05, MSFT, 2, 1
2021-01-06, MSFT, 1, NaN

解决方案(Python Pandas)

用Pandas可以通过分组遍历的方式实现需求,代码如下:

import pandas as pd

# 构造原始数据(实际可替换为pd.read_csv读取文件)
df = pd.DataFrame({
    'Date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06'],
    'Symbol': ['AAPL', 'AAPL', 'AAPL', 'MSFT', 'MSFT', 'MSFT', 'MSFT', 'MSFT', 'MSFT'],
    'Close': [10, 12, 3, 12, 20, 12, 1, 2, 3]
})

def get_days_to_drop(group):
    output = []
    closes = group['Close'].values
    n = len(closes)
    for i in range(n):
        current = closes[i]
        # 从下一行开始找第一个更小的值
        for j in range(i+1, n):
            if closes[j] < current:
                output.append(j - i)
                break
        else:
            # 没有找到则添加空值
            output.append(pd.NA)
    group['Output'] = output
    return group

# 按Symbol分组处理
result = df.groupby('Symbol', group_keys=False).apply(get_days_to_drop)
# 输出结果
print(result.to_csv(index=False))

代码解释

  1. 先构造数据框(实际使用时可以直接读取CSV文件)。
  2. 定义处理函数get_days_to_drop:对每个分组,遍历每一行的Close值,从下一行开始查找第一个小于当前值的位置,计算两行的索引差作为结果;如果遍历到末尾都没找到,就添加pd.NA。
  3. 按Symbol分组后应用该函数,得到最终结果。

运行代码后输出的内容和期望完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:51:06