【问题标题】:Python : Use of the previous value generated from a function in the same functionPython:使用从同一函数中的函数生成的先前值
【发布时间】:2021-06-21 04:28:50
【问题描述】:

我试图让 ['RSIndex'] 的所有高点的滚动平均值大于 52,如果第一个 ref 值小于 52,系列将具有 NaN 值,但我想要之前的迭代值['high_r'] 如果任何其他 ref 值小于 52,则该函数已生成。如果有人对此有任何解决方案,我将不胜感激。谢谢

def AvgHigh(src, val) :
    for a in range(len(src)) :
        if src[a] > val :
            yield src[a]
        elif src[a] <= val and a == 0 :
            yield np.nan
        elif src[a] <= val and a != 0 :
            yield src[a-1]

df1['high_r'] = pd.Series(AvgHigh(df1['RSIndex'], 52))
df1['RSI_high'] = df1['high_r'].rolling(window = 25, min_periods = 25).mean()

期望的输出:

【问题讨论】:

  • 我试过这段代码,但第二条 elif 语句没有给我所需的内容,因为 ref 属于原始 RSIndex 系列,而不是函数生成的系列

标签: python pandas dataframe function shift


【解决方案1】:

您可以使用np.where().shift() 来简化您的代码,如下所示:

df1['high_r'] = np.where(df1['RSIndex'] > 52, df1['RSIndex'], df1['RSIndex'].shift())
df1['RSI_high'] = df1['high_r'].rolling(window = 25, min_periods = 25).mean()

np.where() 检查第一个参数的条件,如果条件为真,则使用第二个参数的值[类似于循环中的if 语句]。当条件为假时[类似于循环中的 2 个elif 语句]。它使用第三个参数中的值。

.shift() 采用前一行值[类似于您的第二个elif 语句],对于没有前一个的第一个值,它采用其fill_value 参数给出的值,默认使用@987654334 @ 表示数值列。因此,它达到了与您的第一个elif 相同的效果,将np.nan 设置为第一个条目。

编辑

如果您希望从上次循环迭代中获取值而不是初始列值,您可以定义一个列表来累积循环的值,如下所示:

def AvgHigh(src, val) :
    dat_list = []
    last_src = np.nan              # init variable that keeps the prev iteration value
    for a in range(len(src)) :
        if src[a] > val :
#            yield src[a]
            dat_list.append(src[a])
            last_src = src[a]          # update prev iteration value (for subsequent iteration(s))
        elif (src[a] <= val) and (a == 0) :
#            yield np.nan
            dat_list.append(np.nan)
        elif (src[a] <= val) and (a != 0) :
#            yield src[a-1]
            dat_list.append(last_src)
        
    return dat_list

df1['high_r'] = AvgHigh(df1['RSIndex'], 52)
df1['RSI_high'] = df1['high_r'].rolling(window = 25, min_periods = 25).mean()

【讨论】:

  • 我真的很感激,你提到了这个,我肯定会使用它,因为这是一个更小更高效的代码,但是仍然错过了一件事,df1['high_r'] = np.where(df1['RSIndex'] &gt; 52, df1['RSIndex'], df1['RSIndex'].shift()) 在这个,当第一个参数为假,我不想要 RSIndex previoius 值,我想要 df1['high_r'] 的前一个值
  • 如示例列表 = 78,49,45,51,64 结果将是 = 78,78,49,45,64 我想要的 = 78,78,78,78,64
  • @r_goel 在这种情况下,您可以在第三个参数中使用df1['high_r'].shift(),而不是df1['RSIndex'].shift()
  • @r_goel 因此,您希望从上次迭代中获取值而不是初始列值,对吧?
  • 对,是的,我是这个意思。最后一次迭代是正确的词。现在,运行代码给了我 keyError: 'high_r'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2011-01-26
  • 1970-01-01
相关资源
最近更新 更多