首页 > 解决方案 > ValueError:值都是 NaN?

问题描述

谁能告诉我在代码中哪里出错了,因为值都是我不想要的 NaN。对于每个 RSIndex 值,我希望有一系列平均高 25 个以前的 RSIndex 值(您可以将其视为回溯期)。

def AvgHigh(ser, src, cnt, val) :
    total = 0.0
    count = 0
    for i in (0, ser) :
        for a in range(i, i+cnt) :
            if src[a] > val :
                count = count + 1
                total = total + src[a]
            elif src[a] <= val :
                count = count + 0
                total = total + 0
        return round(total / count)

df['RSI_high'] = pd.Series(AvgHigh(len(df['RSIndex']), df['RSIndex'], 25, 52)).fillna(0)

数据帧图像

标签: pythonpandasdataframefunctionnan

解决方案


  • 你真的不需要做循环,可以很简单地被矢量化
  • 首先过滤到大于指定值的行
  • 减少使用head()到你想要的行数
  • 那么它只是mean()
df = pd.DataFrame({"RSIndex":np.random.uniform(61,68,200)})

# really don't need length of series, so "ser" argument is redundant    
def AvgHigh(ser, src, cnt, val):
    return src.loc[src.gt(val)].head(cnt).mean()

# df['RSI_high'] = pd.Series(AvgHigh(len(df['RSIndex']), df['RSIndex'], 25, 52)).fillna(0)
df['RSI_high'] = AvgHigh(len(df['RSIndex']), df['RSIndex'], 25, 52)
df

取样

指数 RSI_high
0 65.9272 65.0022
1 67.5969 65.0022
2 63.9528 65.0022
3 67.0719 65.0022
4 64.2278 65.0022
5 64.9158 65.0022
6 66.0637 65.0022
7 66.3771 65.0022
8 66.9548 65.0022
9 63.3385 65.0022

推荐阅读