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
相关产品推荐
相关产品推荐

