Python的循环计算效率太低/太长

时间:2018-09-07 11:02:06

标签: python-3.x pandas for-loop calculation

我正在python上运行回测程序。但是,即使数学/逻辑很简单,Python似乎也要花费极长的时间来计算FOR循环。

每行平均需要1秒钟;并且当我有成千上万到潜在的几万行数据时,花费的时间是不切实际的。

我使用熊猫数据框作为基础,并通过for循环生成正向计算。有没有更有效的方法,或者我该怎么做以减少计算时间?

def signal_TA1(data, periods):
    columns = ['x1', 'x2', 'x3', .......]
    pd_Append = pd.DataFrame((np.zeros((len(data.index),len(columns)))), columns = columns) #create and initialize as zeros needed columns
    data = data.join(pd_Append)
    data['Size'] = data.bidQ + data.askQ
    data['prx'] = (data.bid * data.askQ + data.ask * data.bidQ)/data.Size

    for i in range(1, len(data.index), 1):
        data.emaX.iloc[i] = data.lambda_.iloc[i] * data.Size.iloc[i] + (1 - data.lambda_.iloc[i]) * data.emaX.iloc[i-1]
        xxxxxx
        xxxxx
        xxxxx
    return data

1 个答案:

答案 0 :(得分:0)

(似乎,相对来说,numpy进程比熊猫更有效地循环了计算(因为每次都必须重新构建整个数组)。

基本上,我在函数内创建一个numpy数组[x,y]。然后,我通过for循环进行计算,并逐行填充numpy数组。最后,我仅将完成的numpy数组转换为pandas数据框(以便于显示和绘制)。 对于大约2500行数据和计算,时间差永远小于1秒。

def signal_M2(data, weight, pandas = True):
    bid = np.array(data.bid)
    ask = np.array(data.ask)
    askQ = np.array(data.askQ)
    bidQ = np.array(data.bidQ)
    size = bidQ + askQ
    VWAP = (bid * askQ + ask * bidQ)/(bidQ + askQ)

    columns = [x1, x2, x3, x4, x5, .....]
    datB = np.zeros((len(data.index), len(columns)))
    datA = pd.DataFrame(index=[0], columns = columns)

    lambda_ = 0.5
    weight = 0.3
    x1 = VWAP[0]
    x2 = VWAP[0]
    x3 = VWAP[0]
    x4 = VWAP[0]
    x5 = size[0]
    ....
    ....
    datB[0] = (bid[0], ask[0], bidQ[0], askQ[0], size[0], ..........)

    for row in range(1, len(data.index), 1):
        x1 = lambda_ * size[row] + (1 - lambda_) * emaInertia
        x2 = weight * VWAP[row] + (1 - weight) * emaPrx
        x3 = weight * VWAP[row] + (1 -weight) * emaPrxSlow
        x4 = weight * VWAP[row] + (1 -weight) * emaPrxFast
        x5 = weight * VWAP[row] + (1 -weight) * emaPrxLead

        if pandas == True:
            datB[row] = (bid[row], ask[row], bidQ[row], ...........)
        else:
            print(................)

    if pandas == True:
        datB = pd.DataFrame(datB, columns = columns)
        return datB 
    else : 
        print('no pandas dataframe was asked to be be stored')