使用 or 语句创建子集

问题描述

我有一个包含共享交易的 6 列和数千行数据框。我想识别价格数据不佳的行。以下函数为我提供了一个包含具有良好价格数据的行的子集:

function in_price_range(df)
    price_good = subset(df,:UnitPrice => X-> (trough_share_price .<= X .<= peak_share_price),skipmissing=true)
    return price_good
end

对于我尝试过的坏数据子集:

function out_price_range(df)
    price_discrepancy = subset(df,:UnitPrice => X-> (X .< trough_share_price || X .> peak_share_price),skipmissing=true)
    return price_discrepancy
end

然而,这个错误TypeError: non-boolean (BitVector) used in boolean context

我试过了。||而不是 ||但这会产生错误语法:“|”不是一元运算符

如何修复代码

解决方法

在 Julia 中,||

help?> ||
search: ||

  x || y

  Short-circuiting boolean OR.

短路部分的意思是,如果 x 为真,|| 甚至不会计算 y。换句话说,这将在代码中创建一个分支。例如:

julia> 5 < 7 || print("This is unreachable")
true

如果您想编写对这种情况有效的代码,这很棒

if something_easy_to_evaluate || something_costly_to_evaluate
    # Do something
end

换句话说,这就是控制流!显然,这不能广播。为此,您需要的是常规的 or 运算符 |,您可以使用 .| 进行广播。例如:

julia> a = rand(3) .< 0.5
3-element BitVector:
 1
 0
 0

julia> b = rand(3) .< 0.5
3-element BitVector:
 0
 1
 0

julia> a .|| b
ERROR: syntax: "|" is not a unary operator
Stacktrace:
 [1] top-level scope
   @ none:1

julia> a .| b
3-element BitVector:
 1
 1
 0

同样适用于&& vs &;前者仅用于控制流,后者是正常的按位and