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

如何按ISIN分组计算3/5/7/10天滚动High最大值

按ISIN分组计算多周期滚动High最大值解决方案

原始数据

BCode   Group   Type    Open    High    Low Close   Last    PClose  TradesB TTQB    TTVB    ISIN    Date    AvgPr
0   500002  A   Q   2810.00 2858.35 2809.85 2843.30 2843.55 2806.20 2454    77454   219527943.00    INE117A01022    06-Jan-23   2834.30
1   500003  A   Q   347.90  347.90  337.25  341.50  342.00  342.20  1177    21940   7462278.00  INE208C01025    06-Jan-23   340.12
2   500008  A   Q   575.15  588.95  575.15  585.80  582.70  574.85  1297    33943   19871165.00 INE885A01032    06-Jan-23   585.43
3   500009  X   Q   27.05   27.35   26.70   27.00   27.00   27.05   249 66931   1798686.00  INE432A01017    06-Jan-23   26.87
4   500010  A   Q   2622.65 2635.15 2590.00 2594.85 2594.85 2622.60 3134    18006   46983906.00 INE001A01036    06-Jan-23   2609.35

需求说明

需要对每个唯一的ISIN,分别计算3天、5天、7天、10天滚动周期内High字段的最大值。此前误用cumsum方法(该方法用于累加求和,无法实现滚动窗口最大值计算,且会得到整个分组的累计结果而非滚动窗口结果),现提供正确解决方案。

实现步骤

  1. 转换日期格式:确保Date列为datetime类型,保证滚动窗口按日期逻辑计算
  2. 分组计算滚动最大值:按ISIN分组后,对High列应用不同大小的滚动窗口,计算窗口内最大值

代码示例

import pandas as pd

# 转换Date列为datetime类型
df['Date'] = pd.to_datetime(df['Date'], format='%d-%b-%y')

# 定义需要计算的滚动窗口大小
window_sizes = [3, 5, 7, 10]

# 循环计算每个窗口的滚动最大值,添加为新列
for window in window_sizes:
    # rolling(window)设置窗口大小,min_periods=1允许不足窗口大小时返回已有数据的最大值
    # reset_index去掉分组索引,保证结果与原DataFrame对齐
    df[f'High_Rolling_{window}d'] = df.groupby('ISIN')['High'].rolling(window=window, min_periods=1).max().reset_index(level=0, drop=True)

关键说明

  • groupby('ISIN'):确保每个ISIN独立计算滚动窗口,不会跨ISIN混合数据
  • rolling(window=window, min_periods=1):window指定滚动窗口的天数,min_periods=1避免前N-1天因数据不足返回NaN,而是返回已有天数的最大值
  • reset_index(level=0, drop=True):移除分组产生的ISIN索引,让计算结果能直接匹配原DataFrame的行索引

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:05:41