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

如何根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:55:24