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

循环计算RSI遇数据不足报错时,如何继续执行下一个循环项?

解决RSI计算中DataFrame数据量不足时的循环续行问题

你遇到的问题是循环处理多个DataFrame计算RSI时,当某份数据的记录数不足以支撑14周期RSI计算(少于15条记录),会触发IndexError导致循环中断。以下是两种可行的修复方案:

方案1:提前检查数据量(推荐)

在函数开头先判断DataFrame的行数是否满足计算要求,从根源避免触发异常:

import numpy as np
import pandas as pd

def rsi_indicator(df):
    n = 14
    # 检查数据量:需要至少n+1条记录才能完成初始均值计算及后续赋值
    if len(df) <= n:
        return np.full(len(df), np.nan)
    
    diff = df.close.diff().values
    gains = diff.copy()  # 改用副本避免修改原diff数组
    losses = -diff.copy()
    
    with np.errstate(invalid='ignore'):
        gains[(gains < 0) | np.isnan(gains)] = 0.0
        losses[(losses <= 0) | np.isnan(losses)] = 1e-10  # 避免除零/NaN
    
    m = (n - 1) / n
    ni = 1 / n
    
    g = gains[n] = np.nanmean(gains[:n])
    l = losses[n] = np.nanmean(losses[:n])
    
    gains[:n] = losses[:n] = np.nan
    for i, v in enumerate(gains[n:], n):
        g = gains[i] = ni * v + m * g
    for i, v in enumerate(losses[n:], n):
        l = losses[i] = ni * v + m * l
    
    rs = gains / losses
    rsi = 100 - (100 / (1 + rs))
    return rsi

方案2:捕获异常并返回全NaN

如果不想提前做数据量检查,也可以在except块中直接返回与DataFrame长度一致的全NaN数组,让循环继续执行后续项:

import numpy as np
import pandas as pd

def rsi_indicator(df):
    diff = df.close.diff().values
    gains = diff.copy()
    losses = -diff.copy()
    with np.errstate(invalid='ignore'):
        gains[(gains < 0) | np.isnan(gains)] = 0.0
        losses[(losses <= 0) | np.isnan(losses)] = 1e-10  # 避免除零/NaN
    n = 14
    m = (n - 1) / n
    ni = 1 / n
    try:
        g = gains[n] = np.nanmean(gains[:n])
        l = losses[n] = np.nanmean(losses[:n])
    except IndexError as e:
        # 数据量不足时返回全NaN数组
        return np.full(len(df), np.nan)
    gains[:n] = losses[:n] = np.nan
    for i, v in enumerate(gains[n:], n):
        g = gains[i] = ni * v + m * g
    for i, v in enumerate(losses[n:], n):
        l = losses[i] = ni * v + m * l
    rs = gains / losses
    rsi = 100 - (100 / (1 + rs))
    return rsi

循环处理示例

无论使用哪种方案,循环时都能正常处理每个DataFrame,数据量不足的情况会返回全NaN,不会中断后续循环:

df_list = [df1, df2, df3]  # 你的DataFrame列表
for df in df_list:
    rsi = rsi_indicator(df)
    # 后续处理逻辑,比如将RSI加入原DataFrame
    df['rsi'] = rsi

内容的提问来源于stack exchange,提问作者gabrsafwat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:25:22