Generar una barra de progreso en ipython notebooks
Manual con código para generar una barra de progreso en nuestro código para saber en que porcentaje de compleción estamos sin llenar el output con números. Muchos de los que usáis jupyter (el nuevo ipython notebooks) podéis imprimir por pantalla la iteración en la que vuestro loop reside. Eso es solo posible para una cantidad pequeña de iteraciones. Cuando llegamos a varios miles se puede generar un output bastante engorroso. Googleando un poco encontré la solución. Este código nos genera una clase que luego podemos llamar para obtener la barra de progreso junto con el porcentaje completado.
[code language=”python”] import sys, time try: from IPython.core.display import clear_output have_ipython = True except ImportError: have_ipython = False
class ProgressBar: def __init__(self, iterations): self.iterations = iterations self.prog_bar = ‘[]’ self.fill_char = ‘*’ self.width = 40 self.__update_amount(int(0)) if have_ipython: self.animate = self.animate_ipython else: self.animate = self.animate_noipython
def animate_ipython(self, iter): try: clear_output() except Exception: # terminal IPython has no clear_output pass print ‘\r’, self, sys.stdout.flush(), self.update_iteration(iter + 1) def update_iteration(self, elapsed_iter): self.__update_amount((elapsed_iter / float(self.iterations)) * 100.0) self.prog_bar += ‘ %d of %s complete’ % (elapsed_iter, self.iterations)
def __update_amount(self, new_amount): percent_done = int(round((new_amount / 100.0) * 100.0)) all_full = int(self.width - 2) num_hashes = int(round((percent_done / 100.0) * all_full)) self.prog_bar = ‘[’ + self.fill_char * num_hashes + ‘ ‘ * (all_full - num_hashes) + ‘]’ pct_place = int((len(self.prog_bar) / 2) - len(str(percent_done))) pct_string = ‘%d%%’ % percent_done self.prog_bar = self.prog_bar[0:pct_place] + \ (pct_string + self.prog_bar[pct_place + len(pct_string):])
def __str__(self): return str(self.prog_bar)
[/code]
Y el siguiente código vemos un ejemplo de como llamaremos la clase para obtener la funcionalidad deseada
[code language=”python”] c = ProgressBar(1000) for i in range(1000): c.animate_ipython(i) [/code]
Para los interesados encontré el código aquí.