在函数中重新分配参数值的最佳方法



我认为首先显示代码来解释我的意思是最简单的:

def indicator(
self, symbol: str = None, timeframe: str = None,
indicator: str = None, period: int = 0, instances: int = 0,
*args, **kwargs):
data = self.ohlcv(symbol, timeframe, instances + period)
for arg in args:
if arg == 'open':
arg = data['open'].to_numpy()
elif arg == 'high':
arg = data['high'].to_numpy()
elif arg == 'low':
arg = data['low'].to_numpy()
elif arg == 'close':
arg = data['close'].to_numpy()
elif arg == 'volume':
arg = data['volume'].to_numpy()
else:
pass
values = getattr(ta.func, indicator)(args, kwargs)
return values

在这里,我将字符串(即打开(的参数重新分配给数据帧中的开放值数组。有没有比使用一堆 if 和 elif 语句更简单的方法,或者更 pythonic/简洁的方法?我觉得我可以为数据帧中的每一列做类似setattr的事情,但我不知道如何将它们传递给第二个ta.func函数。

谢谢!

只需使用 arg 变量直接访问数据帧:

for arg in args:
arg = data[arg].to_numpy()

但是,这不会有我认为您想要的预期行为。当您迭代列表时,必须通过args[i] =而不是arg =直接引用列表来完成重新分配值。请参阅链接。

此外,当将*args传递给函数时,args将是一个元组,而不是一个列表。因此,您需要:

  1. 将参数转换为列表。
  2. 使用args[i] =而不是arg =重新分配 args 中的值,这可以使用 python 中的enumerate()函数轻松完成:
args = list(args)
for i, arg in enumerate(args):
try:
args[i] = data[arg].to_numpy()
except:
continue

它围绕着 try/catch 语句,以确保如果 arg 不是数据帧中的有效位置,它只会忽略它。

相关内容

  • 没有找到相关文章

最新更新