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

Pandas按股票代码分组计算5日历日向前滚动最低收盘价报错排查

问题:按股票分组计算向前滚动5日历日的最低收盘价

需求说明

拥有包含Symbol(股票代码)、Date(日期)、Close(收盘价)的多只股票日度数据,需完成:

  • 计算向前滚动的最低Close值;
  • 窗口大小为5个日历日(而非5行数据);
  • 按Symbol分组。

测试数据

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

尝试代码与报错

尝试通过反转日期实现向前滚动,但使用时间窗口参数时触发错误:

df.assign(min_roll=df.iloc[::-1].groupby(df['Symbol']).rolling(on='Date',window='5D',min_periods=1)['Close'].min().sort_index(level=1).reset_index(0,drop=True))

错误信息:

ValueError: cannot reindex on an axis with duplicate labels

移除时间间隔参数、按5行计算时代码可正常运行:

df.assign(min_roll=df.iloc[::-1].groupby(df['Symbol']).rolling(5,min_periods=1)['Close'].min().sort_index(level=1).reset_index(0,drop=True))

错误原因

核心问题出在分组逻辑:
你用df.iloc[::-1]生成了反转后的DataFrame,但分组时却用了原DataFrame的Symbol列(groupby(df['Symbol'])),这导致反转后的行与分组标签完全错位。分组后每个组的索引出现重复,触发了rolling操作时的重索引错误。

正确实现方案

将分组依据改为反转后DataFrame自身的Symbol列(直接写groupby('Symbol')即可),修正后的代码如下:

import pandas as pd
from io import StringIO

# 构造测试数据
data = """Date, Symbol, Close
2021-01-01, AAPL, 10
2021-01-02, AAPL, 12
2021-01-03, AAPL, 3
2021-01-04, AAPL, 20
2021-01-05, AAPL, 15
2021-01-01, MSFT, 12
2021-01-02, MSFT, 20
2021-01-03, MSFT, 12
2021-01-04, MSFT, 20
2021-01-05, MSFT, 20"""

df = pd.read_csv(StringIO(data), parse_dates=['Date'])

# 修正后的代码
result = df.assign(
    min_roll=df.iloc[::-1]
               .groupby('Symbol')  # 使用反转后DataFrame的Symbol列分组
               .rolling(on='Date', window='5D', min_periods=1)['Close']
               .min()
               .sort_index(level=1)
               .reset_index(0, drop=True)
)

print(result)

运行后输出结果:

Date Symbol  Close  min_roll
0 2021-01-01   AAPL     10       3.0
1 2021-01-02   AAPL     12       3.0
2 2021-01-03   AAPL      3       3.0
3 2021-01-04   AAPL     20      15.0
4 2021-01-05   AAPL     15      15.0
5 2021-01-01   MSFT     12      12.0
6 2021-01-02   MSFT     20      12.0
7 2021-01-03   MSFT     12      12.0
8 2021-01-04   MSFT     20      20.0
9 2021-01-05   MSFT     20      20.0

该结果符合需求:以当前日期为起点,向后(未来方向)取5个日历日窗口内的最低收盘价(即你所说的“向前滚动”)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:20:00