Numba TypingError:无法捕获将转义的函数中与变量关联的非恒定值

2024-06-28 14:37:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新手,如果这是个简单的问题,我很抱歉。我第一次尝试在函数中使用Numba,但是我得到了“TypingError:无法捕获与将要转义的函数中的变量关联的非常量值”。我已经搜索了这个错误,但我没有找到任何东西来理解它的含义以及如何修复

我正在调用一个jitted函数,如下所示:

FindDynamicTPSLs(TADF_TP1,TAAction, 1, 'TP')
FindDynamicTPSLs(TADF_SL1,TAAction, 1, 'SL')
FindDynamicTPSLs(TADF_TP2,TAAction,2, 'TP')
FindDynamicTPSLs(TADF_SL2,TAAction,2, 'SL')
FindDynamicTPSLs(TADF_TP3,TAAction,3, 'TP')
FindDynamicTPSLs(TADF_SL3,TAAction,3, 'SL')
FindDynamicTPSLs(TADF_TP4,TAAction,4, 'TP')
FindDynamicTPSLs(TADF_SL4,TAAction,4, 'SL')

TADF_TP1是一个数据帧, TAAction=是一个字符串, 1,2,3,4是整数, TP是一个字符串

错误所指的变量是整数,它在日志中没有提供进一步的信息

这个错误意味着什么?我应该做什么不同的事情

以下是函数的主体:

@jit(nopython=True, nogil=True, parallel=True)#,debug=True)
def FindDynamicTPSLs(TADF1,taAction,RBNum,Type):
    global DynamTPs
    global DynamSLs
    global DynNumDF
    global TPStartValue
    global SLStartValue
    global TATicketNum
    global TAOpenPrice
    global DF1RBColList
    global DF1RBCompreColList
    global DF2RBColList
    global DF2RBCompreColList
    global DF3RBColList
    global DF3RBCompreColList
    global DF4RBColList
    global DF4RBCompreColList
    global MergeColList1
    global DynamTPColmns
    global DynamSLColmns

    @jit(nopython=True, nogil=True, parallel=True)
    def LowerDTSize(TADF_copy):
        global TPStartValue
        global SLStartValue

        if RBNum == 1:
            ComprList = DF1RBCompreColList
        elif RBNum == 2:
            ComprList = DF2RBCompreColList
        elif RBNum == 3:
            ComprList = DF3RBCompreColList
        elif RBNum == 4:
            ComprList = DF4RBCompreColList

        if Type == 'TP':
            if taAction == 'Buy':
                TADF_copy = TADF_copy[(TADF_copy[ComprList] > TPStartValue)]# & (TADF_copy[DF1RBCompreColList] < TADF_copy['High'])]# & (TADF_copy[DF1RBCompreColList] > TADF_copy['PrevHigh']) & (TADF_copy[DF1RBCompreColList] > TADF_copy['PrevClose'])]
                return TADF_copy
            else:
                TADF_copy = TADF_copy[(TADF_copy[ComprList] < TPStartValue)]# & (TADF_copy[DF1RBCompreColList] > TADF_copy['Low'])]# & (TADF_copy[DF1RBCompreColList] < TADF_copy['PrevLow']) & (TADF_copy[DF1RBCompreColList] < TADF_copy['PrevClose'])]
                return TADF_copy
        else:
            if taAction == 'Buy':
                TADF_copy = TADF_copy[(TADF_copy[ComprList] < SLStartValue)]# & (TADF_copy[DF1RBCompreColList] > TADF_copy['Low'])]# & (TADF_copy[DF1RBCompreColList] < TADF_copy['PrevLow']) & (TADF_copy[DF1RBCompreColList] < TADF_copy['PrevClose'])]
                return TADF_copy
            else:
                TADF_copy = TADF_copy[(TADF_copy[ComprList] > SLStartValue)]# & (TADF_copy[DF1RBCompreColList] < TADF_copy['High'])]# & (TADF_copy[DF1RBCompreColList] > TADF_copy['PrevHigh']) & (TADF_copy[DF1RBCompreColList] > TADF_copy['PrevClose'])]
                return TADF_copy

    #pdb.set_trace()
    if RBNum == 1:
        ColList = DF1RBColList
        ComprList = DF1RBCompreColList
    elif RBNum == 2:
        ColList = DF2RBColList
        ComprList = DF2RBCompreColList
    elif RBNum == 3:
        ColList = DF3RBColList
        ComprList = DF3RBCompreColList
    elif RBNum == 4:
        ColList = DF4RBColList
        ComprList = DF4RBCompreColList

    TADF_copy = TADF1[ColList].copy()
    TADF_copy = TADF_copy.set_index('Date_Time')
    TADF_copy2 = LowerDTSize(TADF_copy)
    TADF_copy2 =TADF_copy2[ComprList]
    TADF_copy2 = TADF_copy2.dropna(axis = 1, how = 'all')
    TADF_copy2 = TADF_copy2.dropna(axis = 0, how = 'all')
    TADF_copy = TADF_copy[MergeColList1]
    TADF_copy = TADF_copy.merge(TADF_copy2, how = 'outer', left_index = True, right_index = True, suffixes = (None,'2'))
    TADF_copy.reset_index(inplace = True)
    DfName = Type + RBNum
    #pdb.set_trace()
    for i in TADF_copy.index:
        rowSeries = TADF_copy.iloc[i]
        rowSeries = rowSeries.dropna()
        rowSeries = rowSeries.iloc[7:]
        CndlHigh = TADF_copy._get_value(i,'High')
        CndlLow = TADF_copy._get_value(i,'Low')
        PrevCndlClose = TADF_copy._get_value(i,'PrevClose')
        PrevCndlHigh = TADF_copy._get_value(i,'PrevHigh')
        PrevCndlLow = TADF_copy._get_value(i,'PrevLow')
        ColTime = TADF_copy._get_value(i,'Date_Time')
        for x in rowSeries:
            colval = x
            if Type == 'TP':
                if taAction == 'Buy':
                    if  colval > CndlHigh or colval < CndlLow or colval < PrevCndlHigh or colval < PrevCndlClose:
                        continue
                    else:
                        TimeColName = 'Dynamic_TP_'+str(DynNumDF[DfName])+'_lane_Time'
                        PriceColName = 'Dynamic_TP_'+str(DynNumDF[DfName])+'_lane_Price'
                        DynamTPs._set_value(TATicketNum, TimeColName, ColTime)
                        DynamTPs._set_value(TATicketNum, PriceColName, colval)
                        #pdb.set_trace()
                        return
                else:
                    if colval < CndlLow or colval > CndlHigh or colval > PrevCndlLow or colval > PrevCndlClose:
                        continue
                    else:
                        TimeColName = 'Dynamic_TP_'+str(DynNumDF[DfName])+'_lane_Time'
                        PriceColName = 'Dynamic_TP_'+str(DynNumDF[DfName])+'_lane_Price'
                        DynamTPs._set_value(TATicketNum, TimeColName, ColTime)
                        DynamTPs._set_value(TATicketNum, PriceColName, colval)
                        return
            else:
                if taAction == 'Buy':
                    if colval < CndlLow or colval > CndlHigh or colval > PrevCndlLow or colval < PrevCndlClose:
                        continue
                    else:
                        TimeColName = 'Dynamic_SL_'+str(DynNumDF[DfName])+'_lane_Time'
                        PriceColName = 'Dynamic_SL_'+str(DynNumDF[DfName])+'_lane_Price'
                        DynamSLs._set_value(TATicketNum, TimeColName, ColTime)
                        DynamSLs._set_value(TATicketNum, PriceColName, colval)
                        return
                else:
                    if colval > CndlHigh or colval < CndlLow or colval > PrevCndlHigh or colval > PrevCndlClose:
                        continue
                    else:
                        TimeColName = 'Dynamic_SL_'+str(DynNumDF[DfName])+'_lane_Time'
                        PriceColName = 'Dynamic_SL_'+str(DynNumDF[DfName])+'_lane_Price'
                        DynamSLs._set_value(TATicketNum, TimeColName, ColTime)
                        DynamSLs._set_value(TATicketNum, PriceColName, colval)
                        return

Tags: ortrueifvalueglobalelsecopyset