Какой самый быстрый тип сбора python имеет, когда вы знаете, где находятся данные в коллекции? - PullRequest
0 голосов
/ 22 февраля 2020

Мне нужно l oop через наборы данных (10000 записей каждый) одинакового размера и структуры данных и извлекать данные из различных точек в наборах данных в зависимости от ввода пользователя. Затем я делаю расчеты с этими данными по наборам данных и продолжаю цикл. Расчеты являются сложными и включают в себя несколько наборов данных (циклически проходя по всем одновременно). Учитывая данные, введенные пользователем, в сочетании с данными из строки, в которой я нахожусь, я знаю, где в наборах данных мне нужно извлечь данные, чтобы помочь в вычислениях IE

x = list[4][3]

В настоящее время я выполняю итерации по фреймам данных, и, если информация в строке соответствует пользовательским критериям, я выполняю и выполняю вычисления, хранящиеся в списке классов. Эти расчеты включают извлечение данных из известных точек в кадрах данных с использованием ilo c.

. Я проверил итерацию l oop кадра данных с использованием iterrows, itertuples и i в df.index и нашел df.index. чтобы быть быстрым.

Я могу переключить все коллекции на что-то вроде многомерного списка (даже списка классов), так как нет необходимости в поиске какой-либо коллекции из-за знания точных точек в коллекциях, которым даны данные расчеты. Я считаю, что на данный момент я сделал как можно больше векторизации данных.

В настоящее время, в зависимости от пользовательского ввода, это может занять более часа, поэтому мне нужно оптимизировать, где я могу.

Прежде чем я это сделаю (это обязательство), мне было интересно, что является самым быстрым сбором данных через l oop через и извлекает известные точки данных из python? Это может быть неизменным. Я склоняюсь к многомерным спискам. Я не прав?

РЕДАКТИРОВАТЬ:

Вот одна из основных функций l oop:

def runOnce(self,calcIterations):
        try:
            #create dataframe and dictionary
            columnNames = ["Decision Date"]
            for stock in GU.stockList:
                columnNames.append(stock.name + " price")
                columnNames.append(stock.name + " % from MA")
            columnNames.append("Trade Date")
            columnNames.append("TDate Value")
            columnNames.append("MOVEMENT")
            outdf = pd.DataFrame(columns = columnNames)

            #loop over each day
            totalDays = len(GU.stockList[0].df)
            monthCount = 0
            createData = True
            if len(calcIterations) > 1:
                #do not create daily data if doing more than one run
                createData = False

            for i in GU.stockList[0].df.index:

                #check if all dates on that day are equal
                iDate = GU.stockList[0].df.iloc[i]['Date']

                #dates are equal
                #check if next date is a new month as calculations only happen on that day
                if(i+1 == totalDays):
                    break
                if(iDate.month != GU.stockList[0].df.iloc[i-1]['Date'].month):
                    #new month
                    monthCount += 1
                    #loop through the iterations doing the calculations
                    for ci in calcIterations:
                        if(monthCount % int(ci.cycle) != 0):
                            #not right month cycle, no calculations
                            continue
                        if ci.trade+i >= totalDays:
                            #not enough data for this ci
                            continue
                        #time for calculations
                        #do percent difference
                        lStock = GU.stockList[0]
                        lStock.percentFromMA = 10000
                        outRow = [str(lStock.df.iloc[i+ci.decision]['Date'].date())] #Decision date
                        for stock in GU.stockList:
                            c = stock.df.iloc[i+ci.decision]['Close']
                            outRow.append(c) #close value
                            ma = Decimal(stock.df.iloc[i+ci.decision]['MA' + str(ci.ma)])
                            #calculate percent difference
                            stock.percentFromMA = (c / ma - 1) * 100

                            outRow.append(stock.percentFromMA) #percentfrom MA
                            #grab lowest stock
                            if stock.percentFromMA < lStock.percentFromMA:
                                lStock = stock
                        #percent difference is complete, do the sell and buy   '{0:.2f}'.format(pi)
                        outRow.append(str(lStock.df.iloc[i+ci.trade]['Date'].date())) #trade date
                        buySharePrice = (lStock.df.iloc[i+ci.trade]['High'] + lStock.df.iloc[i+ci.trade]['Low']) / Decimal(2)
                        comments = ""
                        sStock = lStock
                        if lStock.name == ci.stockName:
                            #same stock do nothing
                            outRow.append(ci.shareNum * buySharePrice + ci.residule)
                            outRow.append("Same stock no change")
                            if len(calcIterations) == 1:
                                #only 1 run so do csv dataframe
                                outdf = outdf.append(pd.Series(outRow,index=outdf.columns),ignore_index=True)
                            continue
                        if ci.shareNum != 0:
                            #sell before buying
                            #get current stock and trading price
                            for stock in GU.stockList:
                                if ci.stockName == stock.name:
                                    sStock = stock
                            sellSharePrice = (sStock.df.iloc[i+ci.trade]['High'] + sStock.df.iloc[i+ci.trade]['Low']) / Decimal(2)
                            ci.currentAmount = sellSharePrice * ci.shareNum + ci.residule
                            ci.currentAmount = ci.currentAmount - ci.fees
                            ci.feesPaid = ci.feesPaid + ci.fees
                            comments += "Sold " + sStock.name + ":" + str(ci.shareNum) + " shares at $" + str(sellSharePrice) + " and $" + str(ci.residule) + " residue : "
                        #buy stock at trade price
                        ci.currentAmount = ci.currentAmount - ci.fees
                        ci.feesPaid = ci.feesPaid + ci.fees
                        ci.shareNum = int(ci.currentAmount / buySharePrice)
                        ci.residule = ci.currentAmount - (ci.shareNum * buySharePrice)
                        ci.stockName = lStock.name
                        outRow.append(ci.currentAmount) #current worth on trade day
                        comments += "Purchased " + lStock.name + ":" + str(ci.shareNum) + " shares at $" + str(buySharePrice) + " and $" + str(ci.residule) + " residue."
                        outRow.append(comments) #movement
                        if len(calcIterations) == 1:
                            #only 1 run so do csv dataframe
                            outdf = outdf.append(pd.Series(outRow,index=outdf.columns),ignore_index=True)
            if len(calcIterations) == 1:
                #print the csv
                outdf.to_csv("OneRun.csv", index=False)
        except Exception:
            raise

EDIT2: Также, если это помогает, это профиль краткий прогон этой функции

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   320477   53.627    0.000  134.463    0.000 managers.py:878(fast_xs)
 33971951   22.461    0.000   28.917    0.000 {built-in method builtins.isinstance}
   640954   16.092    0.000   20.291    0.000 numerictypes.py:578(_can_coerce_all)
  3204912    7.762    0.000   10.305    0.000 common.py:1886(_is_dtype_type)
320482/320481    7.536    0.000  110.313    0.000 series.py:197(__init__)
  2884386    7.115    0.000   12.014    0.000 common.py:1743(is_extension_array_dtype)
   320496    6.162    0.000   61.699    0.000 construction.py:630(sanitize_array)
  1281919    5.521    0.000   15.087    0.000 common.py:1619(is_bool_dtype)
        1    5.339    5.339  291.905  291.905 FTATool.py:107(runOnce)
   320477    5.298    0.000  254.900    0.001 frame.py:2916(_ixs)
   320496    5.190    0.000   42.226    0.000 construction.py:759(_try_cast)
12837927/10915015    5.135    0.000    6.070    0.000 {built-in method builtins.len}

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...