Archivo de la etiqueta: python

PyCon: Las tres charlas que me gustaron

El PyCon2018 fue del 9 al 17 de mayo en Cleveland. La conferencia nos dejó una gran cantidad de charlas interesantes. A mi personalmente me gustaron tres. Dos de machine learning y una de optimización de código. Aquí dejo los vídeos para que podáis echarles una ojeada. Además dejo un mini-resumen con cada vídeo.

A practical guide to Singular Value Decomposition in Python

Esta charla es una introducción a los SVD (Singular Value Decomposition). Los SVD descomponen cada punto en vectores y miden las diferencias basándose en el ángulo de separación entre los elementos. Daniel Pyrathon defiende el uso de este algoritmo gracias a la demostrada efectividad de Netflix. Como ejemplo pone a Netflix, dónde la mayoría de vídeos recomendados nos gustan. Nos gustan porque el algoritmo ha sabido encontrar similitudes entre otros usuarios y entre series/películas. La charla es amena y recomendable.

Fighting the Good Fight: Python 3 in your organization

Durante unos 30min muy entretenidos Jason Fried nos explica como entrenó la inteligencia artificial para aprender a jugar al Street fighter. Des del principio el conferenciante engancha y nos explica la pipeline usada dónde el ordenador aprende a “entender” la pantalla (barras de salud, tiempo, y los jugadores) y pasa a optimizar las acciones para maximizar la recompensa. Optimizando para conseguir la mayor recompensa el algoritmo encuentra combinaciones de movimientos para ganar a los sus oponentes.

Performance Python: Seven Strategies for Optimizing Your Numerical Code

Quizás esta sea la charla más técnica de las tres. Jake VanderPlas nos explica como podemos optimizar la ejecución de nuestro código. En la charla expone siete herramientas que los programadores podemos usar para optimizar nuestro código. Des del uso de librerías para manejar vectores de forma eficiente, hasta compiladores que transforman el código de Python a C. Pasando por herramientas para paralelizar el código. Numpy, Cython, Numba, y Dask son algunas de las herramientas mencionadas.

¿Que te parecieron a ti las otras charlas? ¿Tienes alguna que recomiendes?

Script en python para convertir secuencias de proteínas de Stockholm a fasta

Aquí os dejo un pequeño python script que convierte “multiple sequence alignments” del formato Stockholm a Fasta de una forma sencilla y rápida.

[code language=”python”]
import sys
from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord

if(len(sys.argv) <3):
print(‘two arguments needed: input path, output path’)
exit(2)

with open(sys.argv[1],’r’) as inFile:
with open(sys.argv[2], "w") as output_handle:
SeqIO.write(list(SeqIO.parse(inFile,’stockholm’)), output_handle, "fasta")

[/code]

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í.