如何使这个动态或第一类函数基本上将标准传递给np.where()调用?
def num_assets(obj, criteria=None):
"""
A flexible wrapper to return the number of assets in a portfolio.
# list (asset names or characteristics)
>>> num_assets([1, 2, 3, 4, 5])
5
# number (pre-specification)
>>> num_assets(7)
7
# column vector (weights)
>>> num_assets(np.zeros(shape=(3,1)))
3
# matrix (covariance matrix)
>>> num_assets(np.eye(10))
10
# criteria.
>>> num_assets([1, 2, 3, 4, 5], '> 3')
??? I AM STUCK HERE AND NEED SOME HELP! Should return 2
"""
if criteria is None:
if myc.is_iterable(obj):
shape_obj = np.shape(obj)
return max(shape_obj)
elif myc.is_number(obj):
return myc.is_number(obj, True)
else:
return np.where(criteria)
myc.is_iterable()本质上是一个布尔函数,包含一个try except子句,告诉我obj是否可迭代。 myc.is_number()告诉我obj是否是一个数字,当我传递True参数时,它解析数字(如果obj是一个字符串)。我认为自己是一个新手并且知道这不应该是一个难以解决的问题,只是因为我不确定我需要应用什么高级Python来解决标准类型问题(第一类对象,元编程,。 ..)?此外,如果有一个更清洁,更pythonic的方式来制定问题/得到答案,贡献将是最受欢迎的。
感谢。
答案 0 :(得分:2)
如果我理解你的意思,那么我认为这会做你想要的。
if criteria is None:
what you already have
else:
obj = np.asarray(obj)
return np.sum(eval('obj'+criteria))
使用eval
并不优雅,但我认为这是最简单的方法。对于criteria='>3'
的示例,此变为np.sum(obj>3)
,即np.sum([False,False,False,True,True])
,即2
。
where