1

我写了一个小函数来获取一系列的日志返回:

def get_log_returns(series):
    logs = numpy.log(series.astype('float64') / series.astype('float64').shift(1))
    return logs 

现在我想确保我只包含“合理”的日志。我知道我可以where用来排除无穷大的日志:

def get_log_returns(series):
    logs = numpy.log(series.astype('float64') / series.astype('float64').shift(1))
    return logs.where(logs < numpy.inf)

但是,如果我想排除负面的日志怎么办?我希望这样的事情会起作用:

def get_log_returns(series):
    logs = numpy.log(series.astype('float64') / series.astype('float64').shift(1))
    return logs.where((logs < numpy.inf) and (logs > 0))

但这给了我一个

ValueError: The truth value of an array with more than one element is ambiguous.
 Use a.any() or a.all()

任何想法如何做到这一点?

4

2 回答 2

3

您应该使用&运算符。

logs[(logs < numpy.inf) & (logs > 0)]

and并且or不支持布尔系列的操作,因此您必须使用&and|运算符。

于 2013-08-12T17:33:03.647 回答
1

在 pandas 0.13 中,您将能够执行以下操作:

logs[pd.eval('0 < logs < inf')]

它提供了比当前内置 Python 语法稍好的语法,而且对于非常大的Series. 使用DataFrames 的好处更大,因为您实际上可以[]像这样将查询传递给框架的“方法”

df['a < b < c']

假设 aDataFrame df具有ab和列c

请注意,您不能使用的原因and是因为 Python,而不是因为numpyor pandas这是 PEP。您会看到状态为“已拒绝”。假设这个 PEP 永远不会实施可能是安全的。

这里还有一个视频,他们有时会谈论这个。

于 2013-08-12T18:26:30.097 回答