gpt4 book ai didi

python - 在 Pandas 数据框中,使用 bool 输出,如何检测两个不同列(行)的交叉?

转载 作者:行者123 更新时间:2023-12-04 03:34:43 25 4
gpt4 key购买 nike

我仍在学习 Python 并尝试实时扫描最新的股票价格,在我的工作流程中我有两个不同的数据框。

(1) 数据框实时运行,根据最新的开盘价/最高价/最低价/收盘价 (OHLC) 以及 LineA 和 LineB 检测特定条件。后几行基于 OHLC 值。这些在具有相同名称的 6 列中显示。索引就是时间。在此示例中,每行代表 1 分钟,并且每过一分钟就会在数据框中出现新行。这里使用的基于最新行检查交叉的代码有以下类型的写法:

def check_crossover(df):

cond1 = any([(candles.lineA[-1] < candles.lineB[-1] and candles.lineA[-2] > candles.lineB[-2]),(candles.lineA[-2] < candles.lineB[-2] and candles.lineA[-3] > candles.lineB[-3])])

return any([cond1,cond2])

我正在尝试检测 LineB 是否已从上方下降到 LineA 以下。假设此刻是 0900,我正在尝试检测这种交叉是否发生在 0858 到 0859 之间,或者 0859 到 0900 之间。

转换为数据框中的行,我尝试使用上面的代码在当前和前两行中查找交叉点。

我试过在 python 中运行,它给了我一个 False 响应,所以我认为它是正确的。

可以建议这是否正确,或者是否有更好的写法?

(2) 完全相同的数据框,但这次我试图在每行中填充代表上面 cond1 的结果的附加列。因此,如果某行在当前和前两行中没有显示任何交叉,则“Cond1”列下的当前行将为“False”。

这里的目的是让我检查实时脚本是否正确运行。

def cond1(df):
df.loc[:, ('cond1a')] = df.LineA < df.LineB and df.LineA.shift(1) > df.LineB.shift(1)
df.loc[:, ('cond1b')] = (df.LineA.shift(1) < df.LineB.shift(1) and df.LineA.shift(2) > df.LineB.shift(2))
df.loc[:, ('cond1')] = df[['cond1a', 'cond1b']].all(axis=1)

return df

这给了我错误“系列的真值不明确”。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。我刚刚了解到 Python 和 Pandas 有自己的使用 .any() 和 .all() 的方式,但我在这里迷路了。

如果我需要两个条件都为真,或者只需要其中一个条件为真,我应该怎么写?

请指教!

最佳答案

问题是使用 and .对于您想使用的类数组对象的 bool 比较 & (参见 question )。此外,您需要确保使用括号来分隔逻辑 &。来自 < 的测试和 > .最后,函数 cond1更新数据框 df到位,因此无需使用 return在函数的末尾。

总结:

 def cond1(df):
df.loc[:, ('cond1a')] = (df.LineA < df.LineB) & (df.LineA.shift(1) > df.LineB.shift(1))
df.loc[:, ('cond1b')] = (df.LineA.shift(1) < df.LineB.shift(1)) & (df.LineA.shift(2) > df.LineB.shift(2))
df.loc[:, ('cond1')] = df[['cond1a', 'cond1b']].all(axis=1)

编辑:关于你的第一个问题,首先比较 lineA 可能更容易。和 lineB获取 bool 索引,然后检查此索引何时从 True 翻转至 False .这将为您提供到目前为止的所有交叉点:

cond = df.lineA < df.lineB  # checks for all times whether lineB is above lineA
cond != cond.shift(1) # returns True for all times, where lineB dips below lineA

关于python - 在 Pandas 数据框中,使用 bool 输出,如何检测两个不同列(行)的交叉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67146925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com