循环计算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
相关产品推荐
相关产品推荐

