基于股票年度数据按个股月度/季度提取高低价及对应日期需求
股票数据聚合解决方案
需求说明
针对所有股票名称(SC_NAME),按月度(Mt_Year)或季度(Qtr_Year)统计以下内容:
- HIGH字段的最大值
- LOW字段的最小值
- 上述极值对应的交易日期(TRADING_DATE)
- 同时保留ISIN_CODE、SC_GROUP字段
初始代码局限
用户提供的初始代码仅计算了HIGH最大值和LOW最小值,无法获取对应极值的交易日期,也未保留ISIN_CODE、SC_GROUP字段:
result = data.groupby(['Year','Mt_Year','SC_NAME']).agg({'HIGH':['max'],'LOW':['min']})
完整实现代码
按月度聚合
# 获取每个分组中HIGH最大值对应的整行数据 high_max_rows = data.loc[data.groupby(['Year', 'Mt_Year', 'SC_NAME'])['HIGH'].idxmax()] # 获取每个分组中LOW最小值对应的整行数据 low_min_rows = data.loc[data.groupby(['Year', 'Mt_Year', 'SC_NAME'])['LOW'].idxmin()] # 合并两个结果集,保留所需字段 result = high_max_rows.merge( low_min_rows, on=['Year', 'Mt_Year', 'SC_NAME', 'ISIN_CODE', 'SC_GROUP'], suffixes=('_high', '_low') )[['Year', 'Mt_Year', 'SC_NAME', 'HIGH_high', 'LOW_low', 'TRADING_DATE_high', 'TRADING_DATE_low', 'ISIN_CODE', 'SC_GROUP']] # 重命名列名以匹配期望格式 result.columns = ['Year', 'Mt_Year', 'SC_NAME', 'HIGH_max', 'LOW_min', 'Date for high', 'Date for low', 'ISIN_CODE', 'SC_GROUP'] # 设置多级索引(可选,匹配示例展示格式) result = result.set_index(['Year', 'Mt_Year', 'SC_NAME'])
按季度聚合
只需将分组字段替换为['Year', 'Qtr_Year', 'SC_NAME'],其余逻辑一致:
high_max_rows = data.loc[data.groupby(['Year', 'Qtr_Year', 'SC_NAME'])['HIGH'].idxmax()] low_min_rows = data.loc[data.groupby(['Year', 'Qtr_Year', 'SC_NAME'])['LOW'].idxmin()] result = high_max_rows.merge( low_min_rows, on=['Year', 'Qtr_Year', 'SC_NAME', 'ISIN_CODE', 'SC_GROUP'], suffixes=('_high', '_low') )[['Year', 'Qtr_Year', 'SC_NAME', 'HIGH_high', 'LOW_low', 'TRADING_DATE_high', 'TRADING_DATE_low', 'ISIN_CODE', 'SC_GROUP']] result.columns = ['Year', 'Qtr_Year', 'SC_NAME', 'HIGH_max', 'LOW_min', 'Date for high', 'Date for low', 'ISIN_CODE', 'SC_GROUP'] result = result.set_index(['Year', 'Qtr_Year', 'SC_NAME'])
输出示例(按月度)
| Year | Mt_Year | SC_NAME | HIGH_max | LOW_min | Date for high | Date for low | ISIN_CODE | SC_GROUP |
|---|---|---|---|---|---|---|---|---|
| 2021 | 12-21 | ABB LTD. | 2280.90 | 2224.20 | 2021-12-31 | 2021-12-31 | INE117A01022 | A |
| 2021 | 12-21 | AEGIS LOGIS | 223.90 | 217.65 | 2021-12-31 | 2021-12-31 | INE208C01025 | A |
| 2021 | 12-21 | AMAR RAJA BA | 638.35 | 621.05 | 2021-12-31 | 2021-12-31 | INE885A01032 | A |
内容的提问来源于stack exchange,提问作者Yogesh Kamboj
相关产品推荐
相关产品推荐

