如何按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方法(该方法用于累加求和,无法实现滚动窗口最大值计算,且会得到整个分组的累计结果而非滚动窗口结果),现提供正确解决方案。
实现步骤
- 转换日期格式:确保
Date列为datetime类型,保证滚动窗口按日期逻辑计算 - 分组计算滚动最大值:按
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
相关产品推荐
相关产品推荐

