如何根据DataFrame列动态调整滚动周期计算Swing高低点以避免Inf错误
问题描述
处理K线DataFrame时,需添加Swing_High和Swing_Low列。低波动时段中,Close等于Swing_Low会导致后续close/Swing_Low运算出现Inf错误。需求是根据Close是否等于Swing_Low动态调整滚动周期:默认用10周期,若Close == Swing_Low则改用15周期。
原固定周期代码:
import pandas as pd df = pd.read_csv('Data/bybit_BTCUSD_15m.csv') df["Date"] = df["Date"].astype('datetime64[ns]') # 计算固定10周期的高低点 df['Swing_High'] = df['High'].rolling(10).agg('max') df['Swing_Low'] = df['Low'].rolling(10).agg('min')
尝试自定义函数时触发ValueError: The truth value of a Series is ambiguous错误,函数代码:
def swing_high(close, high, period1, period2): a = high.rolling(period1).agg('max') b = high.rolling(period2).agg('max') if a != close: return a else: return b df['Swing_High'] = swing_high(df['Close'], df['High'], 10, 15)
解决方案
错误原因
自定义函数中直接用if a != close会报错,因为a和close都是Series,直接比较会返回布尔值Series,而if判断需要单个布尔值,导致歧义。Pandas中逐元素的条件判断需用np.where或pd.Series.where实现。
实现方法
方法1:动态选择周期结果
先计算两种周期的高低点,再根据条件选对应值:
import pandas as pd import numpy as np df = pd.read_csv('Data/bybit_BTCUSD_15m.csv') df["Date"] = df["Date"].astype('datetime64[ns]') # 预计算两种周期的高低点 df['Swing_High_10'] = df['High'].rolling(10).max() df['Swing_High_15'] = df['High'].rolling(15).max() df['Swing_Low_10'] = df['Low'].rolling(10).min() df['Swing_Low_15'] = df['Low'].rolling(15).min() # 动态选择:默认用10周期,若Close等于10周期Swing_Low则用15周期 df['Swing_High'] = np.where(df['Close'] == df['Swing_Low_10'], df['Swing_High_15'], df['Swing_High_10']) df['Swing_Low'] = np.where(df['Close'] == df['Swing_Low_10'], df['Swing_Low_15'], df['Swing_Low_10']) # 可选:清理临时列 df.drop(['Swing_High_10', 'Swing_High_15', 'Swing_Low_10', 'Swing_Low_15'], axis=1, inplace=True)
方法2:直接规避Inf错误
如果仅需解决close/Swing_Low的Inf问题,可直接给Swing_Low加极小偏移量,或替换Inf值,无需调整周期:
# 方式A:给Swing_Low加极小值避免除零 df['Swing_Low'] = df['Low'].rolling(10).min() + 1e-8 # 方式B:计算比率后替换Inf df['Ratio'] = df['Close'] / df['Swing_Low'] df['Ratio'] = df['Ratio'].replace([np.inf, -np.inf], np.nan)
注意事项
- 15周期滚动窗口的有效数据会比10周期晚出现(前14行是NaN),需注意数据完整性。
- 若需递归判断(如调整15周期后仍满足
Close == Swing_Low需继续延长周期),可使用逐行apply或循环,但会降低效率,仅适合小数据集。
内容的提问来源于stack exchange,提问作者Stack
相关产品推荐
相关产品推荐

