2016-09-15 3 views
0

У меня есть программа python, которая сжимает большой набор данных с помощью Pandas. В настоящее время требуется около 15 минут. Я хочу записать (stdout & отправить метрику в Datadog) о ходе выполнения задачи. Есть ли способ получить% -полностью задачи (или функции)? В будущем я могу иметь дело с большими наборами данных. Задача Python, которую я делаю, представляет собой простую группировку большого кадра данных панд. Что-то вроде этого:процентное завершение долговременной задачи python

dfDict = {} 
for cat in categoryList: 
    df1 = df[df['category'] == cat] 
    if len(df1.index) > 0: 
     df1[dateCol] = pd.to_datetime(df[dateCol]) 
     dfDict[cat] = df1 

здесь, то categoryList имеет около 20000 пунктов, а ДФ большой кадр данных, имеющий (скажем) а 5 миллионов строк.

Я не ищу ничего интересного (например, progress-bars ..). Просто процентное значение. Есть идеи?

Спасибо!

+0

Возможный дубликат [Python Progress Bar] (http://stackoverflow.com/questions/3160699/python-progress-bar) – dodell

ответ

0

В соответствии с вашими потребностями вы можете изменить следующее.

from time import sleep 

for i in range(12): 
    sleep(1) 
    print("\r\t> Progress\t:{:.2%}".format((i + 1)/12), end='') 

То, что это в основном делает, является то, что он предотвращает print() писать торцевую по умолчанию символ (end='') в и в то же время, это написать возврат каретки ('\r'), прежде чем что-либо еще. Проще говоря, вы перезаписываете предыдущий оператор print().

0

наивным решением было бы просто использовать общее количество строк в наборе данных и индекса ваш находятся на, а затем рассчитать ход:

size = len(dataset) 
for index, element in enumerate(dataset): 
    print(index/size * 100) 

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

Также рассмотреть округление процента до одного десятичного знака:

size = len(dataset) 
for index, element in enumerate(dataset): 
    print(round(index/size * 100), 1) 

печати для каждой строки может замедлить вашу задачу вниз значительно так считает это улучшение:

size  = len(dataset) 
percentage = 0 
for index, element in enumerate(dataset): 
    new_percentage = round(index/size * 100), 1) 
    if percentage != new_percentage: 
     percentage = new_percentage 
     print(percentage) 

Есть, конечно, также модули для этого:

progressbar

progress

+0

точно! некоторые подмножества будут быстрее, а некоторые - дольше. Я видел прогресс баров ... и мое чувство кишки говорит, что они тоже будут вести себя одинаково. Тем не менее, я сейчас внимательно посмотрю на индикатор выполнения. – user1717931

Смежные вопросы