python – 根据列表中的字符串调用函数
发布时间:2020-12-20 11:38:25 所属栏目:Python 来源:网络整理
导读:Terms: talib: Technical Analysis Library (stock market indicators,charts etc)CDL: Candle or Candlestick 简短版本:我想基于字符串’some_function’运行my_lib.some_function() 在quantopian.com上,为了简洁起见,我想在循环中调用以CDL开头的所有60个
Terms: talib: Technical Analysis Library (stock market indicators,charts etc) CDL: Candle or Candlestick 简短版本:我想基于字符串’some_function’运行my_lib.some_function() 在quantopian.com上,为了简洁起见,我想在循环中调用以CDL开头的所有60个talib函数,如talib.CDL2CROWS().首先将函数名称作为字符串,然后通过与字符串匹配的名称运行函数. 那些CDL函数都采用相同的输入,一段时间内的开放,高,低和收盘价格列表,这里的测试只使用长度为1的列表来简化. import talib,re import numpy as np # Make a list of talib's function names that start with 'CDL' cdls = re.findall('(CDLw*)',' '.join(dir(talib))) # cdls[:3],the first three like ['CDL2CROWS','CDL3BLACKCROWS','CDL3INSIDE'] for cdl in cdls: codeobj = compile(cdl + '(np.array([3]),np.array([4]),np.array([5]),np.array([6]))','talib','exec') exec(codeobj) break # Output: NameError: name 'CDL2CROWS' is not defined 尝试第二个: import talib,re import numpy as np cdls = re.findall('(CDLw*)',' '.join(dir(talib))) for cdl in cdls: codeobj = compile('talib.' + cdl + '(np.array([3]),'','exec') exec(codeobj) break # Output: AssertionError: open is not double 我没有在网上找到这个错误. 相关的,我在那里问的问题:https://www.quantopian.com/posts/talib-indicators(111次观看,还没有回复) 对于任何对烛台感兴趣的人:http://thepatternsite.com/TwoCrows.html 更新 在Anzel的聊天帮助之后,这可能有用,可能浮动在列表中是关键. import talib,re import numpy as np cdls = re.findall('(CDLw*)',' '.join(dir(talib))) # O,H,L,C = Open,High,Low,Close O = [ 167.07,170.8,178.9,184.48,179.1401,183.56,186.7,187.52,189.0,193.96 ] H = [ 167.45,180.47,185.83,185.48,184.96,186.3,189.68,191.28,194.5,194.23 ] L = [ 164.2,169.08,178.56,177.11,177.65,180.5,185.611,186.43,188.0,188.37 ] C = [ 166.26,177.8701,183.4,181.039,182.43,185.3,188.61,190.86,193.39,192.99 ] for cdl in cdls: # the string that becomes the function name toExec = getattr(talib,cdl) out = toExec(np.array(O),np.array(H),np.array(L),np.array(C)) print str(out) + ' ' + cdl 选择如何为字符串转换函数添加参数: toExec = getattr(talib,cdl)(args) toExec() 要么 toExec = getattr(talib,cdl) toExec(args) 解决方法
如果你想根据字符串’some_function’运行my_lib.some_function(),请使用getattr,如下所示:
some_function = 'your_string' toExec = getattr(my_lib,some_function) # to call the function toExec() # an example using math >>> some_function = 'sin' >>> toExec = getattr(math,some_function) >>> toExec <function math.sin> >>> toExec(90) 0.8939966636005579 更新您的代码以便运行 for cdl in cdls: toExec = getattr(talib,cdl) # turns out you need to pass narray as the params toExec(np.narray(yourlist),np.narray(yourlist),np.narray(yourlist)) 我还建议您需要查看您的列表,因为它是当前的1维,而您需要n维数组. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |