我有一个数据框“资产”,列包括“方向”、“打开”、“关闭”和“摆动”。我想生成一个列“Break”,因此:if (((asset['Direction'] == 1) & (asset.open.shift(2) <= asset['Swing']) & (asset.close.shift(2) >= asset['Swing']) & (asset.open.shift(1) >= asset['Swing']) & (asset.close.shift(1) >= asset['Swing']) & (asset.open >= asset['Swing']) & (asset.close >= asset['Swing'])) |
((asset['Direction'] == -1) & (asset.open.shift(2) >= asset['Swing']) & (asset.close.shift(2) <= asset['Swing']) & (asset.open.shift(1) <= asset['Swing']) & (asset.close.shift(1) <= asset['Swing']) & (asset.open <= asset['Swing']) & (asset.close <= asset['Swing']))):
asset['Break'] = True但是,这会产生以下错误:"The truth value of a {type(self).__name__} is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."我以为我使用了正确的“按位”运算符来避免这种情况,但错误仍然存在......
1 回答
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
这个巨大的表达式会产生一系列布尔值。你需要按照它说的去做:决定你是否希望条件if
是“所有这些布尔值都为真”,“这些布尔值都不为真”等。
但我认为您真正想做的是将 True 分配给break
满足条件的列。为此你应该这样做:
asset['Break'] = ((asset['Direction'] == 1) & ...
这会将一个数组分配给一个数组,而不是像您的代码那样将数组与标量混淆。
添加回答
举报
0/150
提交
取消