Оптимизация производительности (python): ускорение .append () для панд DataFrame - PullRequest
0 голосов
/ 28 июня 2018

У меня есть очень большой набор данных в mongoDB, который запрашивается и добавляется в результирующий DataFrame.

for tree in db.im_tree_active.find({"date" : { '$gte' : startdate , 
'$lte' : enddate },"depth" : {'$gte' : 1, '$lte' : 4}, no_cursor_timeout = True).batch_size(1500):
    if count % 1000 == 0:
        print(count, tot)
    #keyFill(keylist, tree)  <-- added to compensate for mismatched columns
    #im = im.append(tree)  <-- ran too slowly
    im.loc[count, :] = tree  <-- runs much faster but keyFill() slows down
    count+=1

С помощью функции pandas .append() была создана копия фрейма данных, что заняло слишком много времени, когда фрейм данных стал намного больше.

Я заменил оператор добавления на оператор .loc[], который я прочитал, должен немного ускорить запрос, однако я получаю несоответствующую ошибку столбца. Это потому, что некоторые из trees, которые повторяются в MongoDB, не имеют некоторых полей, которые есть у других. Я исправил это, добавив функцию keyFill(), заданную следующим простым кодом:

def keyFill(keylist, tree):
    for key in keylist:
        if key not in tree.keys():
            tree[key] = ""
    return tree

Однако выполнение этого перед каждым вызовом .loc[] приводит к замедлению запроса почти на 1000% (по оценкам).

Есть ли способ ускорить весь этот процесс? Запрос выполняется намного быстрее, прежде чем он достигает около 50% по набору данных, а затем продолжает замедляться до такой степени, что последние 1000 деревьев, которые он добавляет, выполняются почти в 10 раз дольше, чем первая 1000.

...