加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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维数组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读