【发布时间】:2021-07-31 17:42:04
【问题描述】:
所以我已经被这个问题困扰了一段时间了。我正在尝试在 Python 中复制以下公式:
FINAL UPPERBAND = IF( (Current BASICUPPERBAND < Previous FINAL
UPPERBAND) or (Previous Close > Previous FINAL UPPERBAND))
THEN (Current BASIC UPPERBAND) ELSE Previous FINALUPPERBAND)
我的问题是让我失望的是如何在 If 语句中使用它时创建 FINAL UPPERBAND。作为参考,BASIC UPPERBAND 和 CLOSES 是它们自己的数据帧,这也让它变得有点棘手。我能想到的唯一方法是 for 循环,但数据帧非常大,所以需要很长时间。
我尝试过其他东西,例如 pandas.where apply 和类似 final_uppers[(basic_uppers < basic_uppers.shift(1))] = basic_uppers 的东西,当我将它们加在一起时,大部分是正确的答案,但大约 1/4 是错误的。我相信这是由于不按顺序填充行。这就是我现在所拥有的,但就像我说的仍然存在不正确的值:
final_uppers = pd.DataFrame(columns=closes.columns, index=closes.index)
final_uppers = final_uppers.fillna(0)
final_uppers[(basic_uppers < basic_uppers.shift(1))] = basic_uppers
final_uppers[(closes.shift(1) > final_uppers.shift(1))] = basic_uppers
final_uppers = final_uppers.replace(to_replace=0, method='ffill')
编辑:可以使用 Lambda 函数和 .apply 吗?尝试过,但只是得到 DataFrame 是模棱两可的。
任何帮助将不胜感激,或者如果有人可以帮助我进行循环只是为了测试使用循环需要多长时间。但是任何关于如何解决这个问题的想法都将不胜感激。 :)
也许这样的事情可能会起作用:
final_uppers = pd.DataFrame(columns=closes.columns, index=closes.index)
final_uppers = final_uppers.fillna(0)
for i in range(1, len(final_uppers)):
if (basic_uppers.iloc[i] < final_uppers[i-1]) | (closes.iloc[i-1] > final_uppers[i-1]):
final_uppers.append(basic_uppers.iloc[i])
else:
final_uppers.append(final_uppers[i-1])
final_uppers = final_uppers
【问题讨论】:
标签: python pandas dataframe for-loop if-statement