如何遍历多列并计算多ETF的ATR相关指标最大值?
批量生成ETF的ATR最大值列方案
思路说明
你的DataFrame里,同一ETF的high_low、high_close、low_close三组数据列名完全重复,所以可以先提取所有唯一的ETF名称,再针对每个ETF筛选出对应的三列,逐行取最大值生成新列,这种逻辑可以无缝扩展到50只ETF的场景。
基础循环实现版
假设前50列的列名就是各ETF的名称,直接提取后遍历处理:
import pandas as pd import numpy as np # 获取所有唯一的ETF名称(前50列是每个ETF的high_low列,列名即ETF名称) etf_list = df.columns[:50].tolist() # 遍历每个ETF生成最大值列 for etf_name in etf_list: # 筛选当前ETF的三列数据 target_cols = df[df.columns == etf_name] # 逐行取最大值,生成命名为"Max [ETF名]"的新列 df[f"Max {etf_name}"] = target_cols.max(axis=1)
高效批量处理版(适合大规模数据)
如果处理50只ETF,用groupby按列名分组批量计算能避免循环开销,效率更高:
# 按列名分组,每组对应一个ETF的三列数据 etf_groups = df.groupby(df.columns, axis=1) # 对每组取最大值,并重命名列为"Max [ETF名]" max_columns = etf_groups.max().rename(lambda col: f"Max {col}", axis=1) # 将最大值列合并到原DataFrame df = pd.concat([df, max_columns], axis=1)
关键细节
- 因为同一ETF的三组数据列名完全一致,
groupby(df.columns, axis=1)会自动把同名列归为一组,正好对应每个ETF的三组计算值。 - 两种方法都不需要针对ETF数量修改核心逻辑,3只和50只的处理方式完全一致。
内容的提问来源于stack exchange,提问作者BHor
相关产品推荐
相关产品推荐

