我编写了一个小函数来获取系列的日志返回值:
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()
任何想法如何做到这一点?
答案 0 :(得分:3)
您应该使用&
运算符。
logs[(logs < numpy.inf) & (logs > 0)]
布尔系列不支持 and
和or
操作,因此您必须使用&
和|
运算符。
答案 1 :(得分:1)
在pandas 0.13中,您将能够执行以下操作:
logs[pd.eval('0 < logs < inf')]
它提供了比当前内置Python语法更好的语法,并且对于非常大的Series
,奖励可以快5倍。使用DataFrame
s的好处甚至更大,因为您实际上可以将查询传递给框架的[]
“方法”,就像这样
df['a < b < c']
假设DataFrame
df
列a
,b
和c
。
请注意,您无法使用and
的原因是因为Python,而不是numpy
或pandas
。 Here's the PEP。您将看到状态为“已拒绝”。假设不会实施此PEP可能是安全的。
还有a video here在某些时候他们会谈论这个问题。