Procesamiento de Datos con Python: Entornos y Aplicaciones El proyecto CloudPYME (id: 0682_CLOUDPYME2_1_E) está cofinanciado por la Comisión Europea a través de el Fondo Europeo de Desarrollo Regional (FEDER), dentro de la tercera convocatoria de proyectos del Programa Operativo de Cooperación Transfronteriza España-Portugal 2007-2013 (POCTEP).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python • • • •
Lenguaje interpretado, orientado a objetos, de propósito general. Portable: intérpretes disponibles para prácticamente cualquier SO actual. Implementación de referencia de código abierto (CPython), pero existen implementaciones alternativas. Lenguaje potente y versátil: • Tipado dinámico. • Tipos básicos complejos: listas, diccionarios, strings. • Herramientas built-in: manejo de listas, strings, arrays, ... • Librerías: matemáticas, estadística, paralelización, … • Gestión automática de la memoria. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python • • • • • • •
Popular en comunidades científicas y de ingeniería. Alternativa libre y de propósito general a Matlab/R. Notación de tipo “slice” (similar a Matlab). Múltiples extensiones: Numpy, Matplotlib, SciPy, pytables, ... Fácil integración: C/C++/Fortran, servicios web, … Desarrollo de páginas web: Django, Flask, Pyramid, ... Entornos de computación científica: iPython, Anaconda
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Ejecución de programas 1.
Usando el intérprete.
>>> txt = “Luck, I am your father” >>> print txt Luck, I am your father
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Ejecución de programas 2.
Código Python:
------------------------------- > script.py txt = “Luck, I am your father” print txt ------------------------------$ python2 script.py Luck, I am your father
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Ejecución de programas 3. Script del shell: ------------------------------- > script.py #! /usr/bin/python2 txt = “Luck, I am your father” print txt ------------------------------$ ./script.py Luck, I am your father Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Ejecución de programas 4. Código embebido en C ------------------------------- > prueba.c #include <Python.h> … Py_Initialize(); PyRun_SimpleString( “txt = ‘Luck, I am your father’” ); PyRun_SimpleString( “print txt” ); … ------------------------------$ gcc -I /usr/include/python2.7 prueba.c -lpython2.7 $ ./a.out Luck, I am your father Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Indentación en lugar de llaves if x < threshold: print “x less than threshold” else: print “x greater than threshold”;
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Todo es un objeto • • •
Incluye números, strings, funciones, clases, módulos … Cada objeto tiene un tipo y sus propios datos. Esto dota de flexibilidad al lenguaje, permitiendo tratar a todos sus elementos de forma genérica.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Comentarios
# This is a dramatic moment. txt = “Luck, I am your father” print txt
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Llamadas a funciones • • •
Sintaxis C: • result = f( x, y, z ) Métodos de clase: • result = obj.f( x, y, z ) Las funciones pueden recibir parámetros posicionales o con clave: • result = f( x, y, z, tol=0.01, method=”fast” )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Variables y paso por referencia • •
La asignación a una variable genera una nueva referencia al objeto. ¡Pero el objeto no varía!
>>> a = [1,2,3] >>> b = a >>> a.append(4) >>> b [1,2,3,4]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Variables y paso por referencia Consecuencias: • • •
El paso de grandes variables a funciones es eficiente. ¡Las funciones pueden modificar sus parámetros permanentemente! No con parámetros de tipo inmutable. P. ej.
>>> a = 10 >>> b = a >>> a = 20 >>> print b 10 Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Referencias dinámicas, tipado fuerte En Python, las referencias (variables) no poseen tipo propio: >>> a = 10 >>> type(a) <type ‘int’> >>> a = “10” >>> type(a) <type ‘str’>
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Referencias dinámicas, tipado fuerte No obstante, se considera que Python posee tipado fuerte: >>> 5 + “5” TypeError: unsupported operand type(s) for +: 'int' and 'str' >>> “5” + 5 TypeError: cannot concatenate 'str' and 'int' objects >>> 5 + int(“5”) 10 >>> “5” + str(5) ‘55’
Todo objeto Python posee un tipo (clase) específico. Sólo se realizan conversiones implícitas en casos evidentes. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semรกntica & Sintaxis Referencias dinรกmicas, tipado fuerte Es posible saber si un objeto pertenece a una clase determinada usando el operador isinstance: >>> a = 4.5 >>> isinstance(a,int) False >>> isinstance(a,float) True
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Métodos y atributos Todos los objetos Python pueden poseer métodos y atributos: >>> a = 4.5 >>> dir(a) ['__abs__', '__add__', '__class__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getformat__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__long__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__pos__', '__pow__', '__radd__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__setformat__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', 'as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real']
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semántica & Sintaxis Métodos y atributos >>> a.hex() '0x1.2000000000000p+2' >>> hasattr( a, “hex” ) True >>> getattr( a, “hex” ) <built-in method hex of float object at 0x1ed86a0> >>> getattr( a, “hex” )() '0x1.2000000000000p+2'
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Semรกntica & Sintaxis Importando mรณdulos โ ข
Un mรณdulo Python es un fichero .py que contiene definiciones y cรณdigo.
------------------------------- > modulo1.py PI = 3.14159 def f(x): return x + 2 def g(a,b): return a + b -------------------------------
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Sem谩ntica & Sintaxis Operadores binarios a + b
Suma de a y b
a - b
Resta b de a
a * b
Multiplica a por b
a / b
Divide a por b (Python3)
a // b (Python3)
Divisi贸n entera de a por b
a ** b
Eleva a a b
a & b
True si a y b son True. Para enteros, bitwise-AND
a | b
True si a o b son True. Para enteros, bitwise-OR
a ^ b
True si a o b son True, pero no ambos. Para enteros, bitwise-XOR
a == b
True si a es igual a b
a != b
True si a es distinto de b
a < b, a <= b
True si a es menor (o igual) que b
a > b, a >= b
True si a es mayor (o igual) que b
a is b
True si a y b referencian al mismo objeto Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares None
El valor “null” en Python. Sólo existe una instancia del objeto None
str
Tipo string. ASCII en Python 2.x y Unicode en Python 3
unicode
String Unicode
float
Número en punto flotante, doble precisión (64 bits)
bool
Valor lógico, True o False
int
Entero con signo. 32 o 64 bits dependiendo de la plataforma
long
Entero con signo de precisión arbitraria Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Tipos numéricos • • •
int (32- o 64-bits), float (64 bits) y long (precisión arbitraria). La conversión entre int y long es transparente. El intérprete acepta notación científica:
>>> fval = 6.78e-5 •
La división de dos enteros en Python 2.x devuelve un entero (truncado).
>>> fval = a_int / float(b_int) •
Los números complejos se escriben usando j para la parte imaginaria:
>>> cval = 1 + 2j
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Strings •
Los literales de tipo string se escriben entre comillas, simples o dobles:
>>> a = ‘un modo de escribir un string’ >>> b = “otro modo” •
Para escribir strings con saltos de línea se usa entrecomillado triple:
>>> c = ‘‘‘ Éste es un string más largo que abarca varias líneas ’’’
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Strings •
Los strings son objetos inmutables: una vez creados, no pueden ser modificados.
>>> a = ‘esto es un string’ >>> a[10] = ‘f’ TypeError: ‘str’ object does not support item assignment >>> b = a.replace( ‘string’, ‘string mas largo’) >>> b ‘esto es un string mas largo’
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Strings •
Es posible crear strings a partir de diferentes tipos de objetos usando la función str():
>>> a = 5.6 >>> s = str(a) >>> s ‘5.6’
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Strings •
Un string es una secuencia de caracteres:
>>> s = ‘python’ >>> list(s) [ ‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’ ] >>> s[:3] ‘pyt’
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Strings • •
La barra invertida (\) es el caracter de escape, utilizado para codificar caracteres especiales como saltos de línea (\n) o caracteres Unicode. Puede indicarse que un string debe interpretarse de forma literal (raw) usando la notación r‘string’:
>>> s = r‘no\hay\caracteres\especiales\en\este\string’ >>> s ‘no\hay\caracteres\especiales\en\este\string’
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Strings •
La concatenación de strings se denota con el operador +:
>>> a = ‘primera mitad del string ’ >>> b = ‘y segunda mitad del string’ >>> a + b ‘primera mitad del string y segunda mitad del string’
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Strings • •
Para especificar un string en formato unicode, se usa la sintaxis u ‘string’. Para dar formato a un string existe una sintaxis de plantillas similar a printf() en C:
>>> plantilla = u“%.2f %s valen %d€” >>> plantilla % (1.08665, u‘dólares americanos’, 1) u'1.09 d\xf3lares americanos valen 1\u20ac' >>> print plantilla % (1.08665, u‘dólares americanos’, 1) ‘1.09 dólares americanos valen 1€’ Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Booleanos • •
Los dos valores booleanos se escriben True y False. Pueden combinarse con las palabras clave and y or.
>>> True and True True >>> False and True True
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Booleanos •
Todos los tipos predefinidos básicos en Python, así como cualquier clase que implemente el método __nonzero__() pueden ser interpretados como True o False en una instrucción condicional.
>>> a = [1,2,3] >>> if a: print “True” ‘True’ >>> b = [] >>> if not b: print “False” ‘False’ Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares None • • •
None es el valor nulo en Python. Si una función no devuelve un valor explícito, devuelve None implícitamente. Puede usarse como valor por defecto para parámetros opcionales a funciones:
def suma_y_quiza_multiplica( a, b, c = None ): result = a + b if c is not None: result *= c return result •
None no es una palabra reservada, sino una instancia (singleton) de NoneType. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Fechas y horas โ ข
El mรณdulo datetime proporciona los tipos datetime, date y time.
>>> from datetime import datetime, date, time dt = datetime( 2015, 04, 24, 12, 25, 32 )
>>> dt.day
>>> dt.time()
24
datetime.time( 12, 25, 32 )
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Fechas y horas •
El método strftime() formatea el objeto como string:
>>> dt.strftime( ‘%d/%m/%Y %H:%M’ ) ‘24/04/2015 12:25’ •
Puede crearse un objeto datetime a partir de un string usando strptime:
>>> datetime.strptime( ‘20150424’, ‘%Y%m%d’ ) datetime.datetime( 2015, 4, 24, 0, 0 )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Tipos escalares Fechas y horas â&#x20AC;˘
La diferencia de dos objetos de tipo datetime produce un objeto de tipo datetime.timedelta:
>>> dt2 = datetime( 2015, 4, 25, 12, 25, 32 ) >>> dt2 - dt datetime.timedelta(1) â&#x20AC;˘
Operar un datetime con un timedelta produce un nuevo datetime:
>>> from datetime import timedelta >>> dt + timedelta(days=1) >>> datetime.datetime(2015, 4, 25, 12, 25, 32) UniĂłn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo if, elif, else Estos bloques se comportan como en otros lenguajes: if x < 0: print ‘Es negativo’ elif x == 0: print ‘Es cero’ elif 0 < x < 5: print ‘Es positivo menor que 5’ else: print ‘Es positivo y mayor o igual que 5’ Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Bucles for •
Los bucles for se utilizan para iterar sobre una colección (como una lista o tupla) o sobre un iterador.
for val in collection: # Hacer algo con val • •
Puede saltarse a la siguiente iteración de un lazo usando continue. Puede abortarse la ejecución de un lazo usando break.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Funciones range y xrange •
La función range() produce una lista de enteros equiespaciados:
>>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] •
Acepta como parámetros el inicio, fin, y paso de la secuencia:
>>> range(5,20,3) [5,8,11,14,17] •
El intervalo generado es [inicio,fin).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Funciones range y xrange •
La función range() es muy útil para programar lazos for con semántica C:
>>> for x in range(10): ...
print 2*x
0 2 4 8 16 18
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Funciones range y xrange • • •
Al trabajar con rangos muy grandes es recomendable usar xrange(). La función xrange() acepta los mismos parámetros que range(), pero se comporta como un generador en lugar de construir la lista en memoria. Su evaluación es “perezosa” (lazy).
>>> xrange(10) xrange(10) >>> for x in xrange(10): ...
print 2*x
0 2 … Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Bucles while โ ข
Los bucles while iteran hasta que una condiciรณn deja de cumplirse:
x = 256 total = 0 while x > 0: if total > 500: break total += x x = x // 2
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Instrucción pass • •
La instrucción pass es un ‘no-op’ en Python. Se requiere debido a que Python utiliza espacios en blanco para delimitar bloques de ejecución:
if x < 0: print “Negativo” elif x == 0: pass else: print “Positivo”
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Gestión de excepciones •
En ocasiones una función u operación puede generar una excepción:
>>> 5 / 0 ZeroDivisionError: integer division or modulo by zero • •
Es posible manejar las excepciones para solventar errores detectados en tiempo de ejecución. Esto nos permite tratar dinámicamente algunos tipos seleccionados de errores.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Gestión de excepciones def calcular_division_flotante( a, b ): x = NaN try: x = a / float(b) except: print “Excepción durante la división” return x
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Gestión de excepciones •
Es posible acotar el tipo de excepciones a gestionar por except:
def calcular_division_flotante( a, b ): x = NaN try: x = a / float(b) except ZeroDivisionError: print “Intento de división por zero” return x
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Gestión de excepciones •
Es posible gestionar múltiples tipos de excepciones explícitamente:
def calcular_division_flotante( a, b ): x = NaN try: x = a / float(b) except ZeroDivisionError, TypeError: print “Excepción durante la división” return x
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Gestión de excepciones •
Es posible ejecutar código tras el bloque try independientemente de que haya tenido éxito:
f = open( path, ‘w’ ) try: write_to_file( f ) finally: f.close()
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Control de flujo Gestión de excepciones •
Es posible ejecutar código tras el bloque try únicamente si éste ha tenido éxito:
f = open( path, ‘w’ ) try: write_to_file( f ) except: print ‘Fallo’ else: print ‘Éxito’ finally: f.close()
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Tuplas •
Tupla: secuencia unidimensional, de tamaño fijo, de objetos Python.
>>> tup = (2, 3, 4) >>> nested_tup = ( (1, 2), (2, 3, 4) ) >>> tup_from_list = tuple( [2,3,4] ) >>> tup_from_iter = tuple( xrange(5) ) >>> tup_from_string = tuple( ‘string’ )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Tuplas •
Los elementos de una tupla son accedidos con el operador []:
>>> tup_from_iter[3] 3 >>> tup_from_iter[1:3] (1,2) >>> tup_from_string[0] ‘s’
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Tuplas •
Las tuplas son inmutables:
>>> tup_from_iter[3] = 5 TypeError: ‘tuple’ object does not support item assignment •
Si bien los objetos contenidos en una tupla pueden ser mutables:
>>> tup = ( (1,2), [3,4,5] ) >>> tup[1].append(6) >>> tup ((1, 2), [3, 4, 5, 6])
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Tuplas •
Al igual que listas y strings, las tuplas pueden ser concatenadas usando el operador +:
>>> tup_from_iter + tup_from_string (0, 1, 2, 3, 4, ‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’) •
El operador * es consistente con la semántica de suma/concatenación:
>>> tup_from_iter*3 (0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4)
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Tuplas โ ข
Nรณtese que los objetos contenidos en las tuplas no se copian, sino que se referencian:
>>> tup = ( (1, 2), (3, 4, 5) ) >>> tup2 = tup * 3 >>> tup[1].append(6) >>> tup2 ((1, 2), [3, 4, 5, 6], (1, 2), [3, 4, 5, 6], (1, 2), [3, 4, 5, 6])
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Tuplas โ ข
Si la parte derecha de una asignaciรณn es una tupla, Python intentarรก desempaquetarla:
>>> tup = (1,2,3) >>> a, b, c = tup >>> b 2
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Tuplas •
Es posible desempaquetar explícitamente tuplas anidadas:
>>> tup = ( 1, 2, (3, 4) ) >>> a, b, (c, d) = tup >>> c 3 >>> a, b = b, a >>> a 2
•
Un uso común de las tuplas es programar funciones que devuelven múltiples valores. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas •
A diferencia de las tuplas, las listas tienen longitud variable y son mutables.
>>> lista_1 = [2, 3, 7, None] >>> tup = ( ‘a’, ‘b’, ‘c’ ) >>> lista_2 = list( tup ) >>> lista_2[1] = ‘d’ >>> lista_2 [ ‘a’, ‘d’, ‘c’ ]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas •
Es posible añadir elementos al final de la lista usando la función append():
>>> lista_2.append( 5 ) >>> lista_2 [ ‘a’, ‘d’, ‘c’, 5 ]
•
Es posible insertar elementos en una posición específica con insert():
>>> lista_2.insert( 3, None ) >>> lista_2 [ ‘a’, ‘d’, ‘c’, None, 5 ]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas •
La operación inversa de insert() es pop():
>>> lista_2.pop() 5 >>> lista_2 [ ‘a’, ‘d’, ‘c’, None ] >>> lista_2.pop(2) ‘c’ >>> lista_2 [ ‘a’, ‘d’, None ] Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas •
Es posible eliminar elementos por valor usando remove():
>>> lista_2.append(‘a’) >>> lista_2 [ ‘a’, ‘d’, None, ‘a’ ] >>> lista_2.remove( ‘a’ ) >>> lista_2 [ ‘d’, None, ‘a’ ]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas •
Puede comprobarse si una lista contiene un valor mediante el operador in:
>>> ‘a’ in lista_2 True >>> ‘c’ in lista_2 False
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas •
El operador + se utiliza para concatenar listas:
>>> lista_1 + lista_2 [ 2, 3, 7, None, ‘d’, None, ‘a’ ] •
El método extend() se utiliza para añadir a listas preexistentes:
>>> lista_1.extend( lista2 ) >>> lista_1 [ 2, 3, 7, None, ‘d’, None, ‘a’ ]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas •
Puede ordenarse una lista, modificándola, usando sort():
>>> a = [ 7, 2, 5, 1, 3 ] >>> a.sort() >>> a [1, 2, 3, 5, 7] >>> b = [ ‘galicia’, ‘asturias’, ‘cantabria’, ‘euskadi’, ‘navarra’ ] >>> b.sort() >>> b [ ‘asturias’, ‘cantabria’, ‘euskadi’, ‘galicia’, ‘navarra’ ] Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas •
sort() acepta una función como llave de ordenación:
>>> b = [ ‘caladan’, ‘arrakis’, ‘corrin’, ‘ix’, ‘giedi prime’ ] >>> b.sort( key = len ) >>> b [ ‘ix’, ‘corrin’, ‘caladan’, ‘arrakis’, ‘giedi prime’ ]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Listas • •
El módulo bisect implementa manipulación de listas ordenadas mediante búsqueda binaria. No comprueba que la lista esté ordenada, por lo que usarlo sobre una lista desordenada provocará resultados erróneos.
>>> import bisect >>> c = [1, 2, 2, 2, 3, 4, 7] >>> bisect.bisect( c, 2 ) # Devuelve dónde insertar 4 >>> bisect.insort( c, 6 ) >>> c [1, 2, 2, 2, 3, 4, 6, 7] Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Slicing โ ข
Pueden seleccionarse secciones de tipos similares a listas (tuplas, arrays de Numpy) usando la notaciรณn de slices:
>>> a = [7, 2, 3, 7, 5, 6, 0, 1] >>> a[1:5] [2, 3, 7, 5] >>> a[3:4] = [6, 3] >>> a [7, 2, 3, 6, 3, 5, 6, 0, 1] Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Slicing • •
La sección [start:stop] incluye el elemento en la posición start, pero no el elemento en la posición stop. Cualquiera de ambos puede omitirse, en cuyo caso se utiliza por defecto el inicio o final de la secuencia, respectivamente:
>>> a[:5] [7, 2, 3, 6, 3] >>> a[3:] [6, 3, 5, 6, 0, 1]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Slicing •
El uso de índices negativos se refiere al final del array:
>>> a[-4:] [5, 6, 0, 1] >>> a[-6:-2] [6, 3, 5, 6]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Slicing •
Puede modificarse el paso usando [start:stop:step]:
>>> a[::2] [7, 3, 3, 6, 1] •
Un uso particular de esta funcionalidad es revertir una secuencia:
>>> a[::-1] [1, 0, 6, 5, 3, 6, 3, 2, 7]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Manipulando colecciones •
Es frecuente querer iterar los elementos de una colección al mismo tiempo que manejamos el índice de cada uno de ellos:
i = 0 for x in collection: # hacer algo con x i += 1
•
El código anterior es equivalente a:
for i, x in enumerate(collection): # hacer algo con x
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Manipulando colecciones •
La función sorted() devuelve una lista ordenada a partir de los elementos de cualquier secuencia:
>>> sorted( [7, 1, 2, 6, 0, 3, 2] ) [0, 1, 2, 2, 3, 6, 7] >>> sorted( ‘string de ejemplo’ ) [ ‘ ’, ‘ ’, ‘d’, ‘e’, ‘e’, ‘e’, ‘g’, ‘i’, ‘j’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘r’, ‘s’, ‘t’ ] >>> sorted( set( ‘string de ejemplo’ ) ) [‘ ’, ‘d’, ‘e’, ‘g’, ‘i’, ‘j’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘r’, ‘s’, ‘t’ ] Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Manipulando colecciones •
La función zip() agrupa los elementos de varias secuencias y crea una lista de tuplas:
>>> seq1 = [‘caladan’, ‘kaitain’, ‘giedi prime’, ‘arrakis’] >>> seq2 = [‘atreides’, ‘corrino’, ‘harkonnen’] >>> zip( seq1, seq2 ) [(‘caladan’, ‘atreides’), (‘kaitain’, ‘corrino’), (‘giedi prime’, ‘harkonnen’)] •
La longitud del resultado viene determinada por la longitud de la secuencia de entrada más corta. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Manipulando colecciones •
Un uso común de zip(), posiblemente en combinación con enumerate(), es la iteración simultánea de varias secuencias:
for i, (a,b) in enumerate( zip( seq1, seq2 ) ): #hacer algo con (a,b)
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Manipulando colecciones •
Paradójicamente, zip() puede ser usado para efectuar un unzip:
>>> l = [ (‘caladan’, ‘atreides’), (‘kaitain’, ‘corrino’), (‘giedi prime’, ‘harkonnen’) ] >>> unzip1, unzip2 = zip( *l ) >>> unzip1 (‘caladan’, ‘kaitain’, ‘giedi prime’) >>> unzip2 (‘atreides’, ‘corrino’, ‘harkonnen’)
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Manipulando colecciones โ ข
La funciรณn reversed() construye un iterador sobre los elementos de una secuencia en orden inverso:
>>> reversed( range(10) ) <listreverseiterator object at 0x7ff664159510> >>> list( reversed( range(10) ) ) [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios • •
Un diccionario (tipo ‘dict’) es un array asociativo (tabla hash). Es similar a un array, pero en lugar de indexar cada objeto con un entero lo indexa a través de una clave.
>>> empty_dict = {} >>> d1 = { ‘a’: ‘un valor’, ‘b’: [1,2,3,4] } >>> d1 {‘a’: ‘un valor’, ‘b’: [1,2,3,4]}
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios •
Los elementos de un diccionario pueden ser accedidos e insertados utilizando la misma sintaxis que para listas o tuplas:
>>> d1[7] = ‘un entero’ >>> d1 {‘a’: ‘un valor’, ‘b’: [1,2,3,4], 7: ‘un entero’} >>> d1[‘b’] [1,2,3,4]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios •
Puede comprobarse si un diccionario contiene una clave usando in:
>>> ‘b’ in d1 True >>> 42 in d1 False
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios •
Para eliminar valores se usa el operador del o el método pop():
>>> del d1[‘a’] >>> d1 {‘b’: [1,2,3,4], 7: ‘un entero’} >>> d1.pop(‘b’) [1,2,3,4] >>> d1 {7: ‘un entero’}
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios •
Las funciones keys() y values() devuelven las claves y valores almacenados en el diccionario, respectivamente:
>>> d1[5] = ‘otro entero’ >>> d1.keys() [5,7] >>> d1.values() [‘otro entero’, ‘un entero’] •
Las llaves y valores no se devuelven en ningún orden particular, pero los órdenes de ambas listas son consistentes (i.e. d1[d1.keys()[x]] = d1.values()[x]). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios •
Pueden fusionarse dos diccionarios usando el método update():
>>> d1.update( { ‘b’: ‘caladan’, ‘c’: ‘arrakis’ } ) >>> d1 {‘c’: ‘arrakis’, ‘b’: ‘caladan’, 5: ‘otro entero’, 7: ‘un entero’ }
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios •
Puede crearse un diccionario a partir de dos listas:
mapping = {} for key, value in zip( key_list, value_list ): mapping[key] = value •
Podemos usar esto utilizando zip:
>>> mapping = dict( zip( key_list, value_list ) )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios •
También es posible acceder a un diccionario proporcionando un valor por defecto en caso de no encontrar la clave. El código:
if key in dict: value = dict[key] else: value = default_value es equivalente a (también válido con el método pop()): dict.get( key, default_value )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios •
El método setdefault() permite insertar un valor sólo si la clave no existe. En el código:
planets = [‘caladan’, ‘corrin’, ‘arrakis’, ‘giedi prime’] by_letter = {} for p in planets: letter = p[0] if letter in by_letter: by_letter[letter].append( p ) else: by_letter[letter] = [p] el condicional puede sustituirse por: by_letter.set_default( letter, [] ).append( p ) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios โ ข
El lazo anterior puede simplificarse usando la clase defaultdict, que proporciona un constructor que recibe una funciรณn de inicializaciรณn que usarรก automรกticamente al insertar una nueva clave:
from collections import defaultdict by_letter = defaultdict( list ) for p in planets: by_letter[p[0]].append( p )
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Diccionarios • • •
Para poder utilizarse como clave de un diccionario, un objeto Python debe ser “hashable”. Los objetos de tipos básicos inmutables en Python son “hashables”, los contenedores mutables no (p. ej., listas). Un objeto “hashable” debe tener métodos __hash__(), __eq__(), y __cmp__(), cumpliendo las siguientes condiciones: 1. El valor de __hash__() no cambia durante la vida del objeto. 2. Si dos objetos son iguales de acuerdo a __eq__(), deben tener el mismo valor de __hash__(). 3. __cmp__() debe servir para comparar los objetos de forma consistente. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Conjuntos •
Un conjunto (clase set) es una colección no ordenada de elementos únicos:
>>> set( [2,2,2,1,3,3] ) set([1, 2, 3]) >>> {2, 2, 2, 1, 3, 3} set([1, 2, 3])
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Conjuntos Método
Sintaxis alternativa
Descripción
a.add(x)
--
Añadir elemento x.
a.remove(x)
--
Eliminar elemento x.
a.union(b)
a | b
Unión de a y b.
a.intersection(b)
a & b
Intersección de a y b.
a.difference(b)
a - b
Diferencia de conjuntos.
a.symmetric_difference(b)
a ^ b
Diferencia simétrica de conjuntos.
a.issubset(b)
--
True si b es subconjunto de a.
a.issuperset(b)
--
True si a es superconjunto de b.
a.isdisjoint(b)
--
True si a y b son disjuntos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Comprensión de listas, conjuntos y diccionarios •
•
Las comprensiones son “azúcar sintáctico” que permite generar nuevas colecciones mediante modificaciones y filtrados de colecciones preexistentes de forma sencilla. La sintaxis básica es la siguiente:
>>> [expr for val in collection if condition] equivalente a: new_list = [] for val in collection: if condition: new_list.append( expr ) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Comprensión de listas, conjuntos y diccionarios •
La condición de filtro puede omitirse:
>>> strings = [‘u’, ‘un’, ‘los’, ‘gato’, ‘coche’, ‘paloma’] >>> [x.upper() for x in strings if len(x) > 2] [‘LOS’, ‘GATO’, ‘COCHE’, ‘PALOMA’] >>> [x.upper() for x in strings] [‘U’, ‘UN’, ‘LOS’, ‘GATO’, ‘COCHE’, ‘PALOMA’]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Comprensiรณn de listas, conjuntos y diccionarios โ ข
Usando una sintaxis similar pueden efectuarse comprensiones sobre conjuntos y diccionarios:
{ key-expr: val-expr for value in collection if condition } { set-expr for value in collection if condition }
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Comprensión de listas, conjuntos y diccionarios •
Es posible implementar comprensión de colecciones anidadas:
>>> tuplas = ((1, 2, 3), (4, 5, 6), (7, 8, 9)) >>> [x for tup in tuplas for x in tup if x > 3] [4, 5, 6, 7, 8, 9] •
El orden de los lazos en la comprensión es el mismo que en un código equivalente:
>>> lista = [] >>> for tup in tuplas: ... ...
for x in tup: if x > 3: lista.append( x ) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Estructuras de datos Comprensión de listas, conjuntos y diccionarios •
También es perfectamente válido el anidamiento de comprensiones:
>>> [[x for x in tup] for tup in tuplas] [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones โ ข
Las funciones se definen usando la palabra reservada def y devuelven un valor usando return:
def mi_func( x, y, z = 1.5 ): if z > 1: return z * (x+y) else: return z / (x+y)
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones • • • •
Si se alcanza el final de una función sin ejecutarse una instrucción return, se devolverá None automáticamente. Las funciones reciben argumentos de dos tipos: posicionales y de palabra clave (keyword). Los argumentos de palabra clave se utilizan habitualmente para dar valores por defecto a parámetros opcionales. En la función de ejemplo x e y son parámetros posicionales, mientras que z lo es de palabra clave. Puede ser invocada de diversas formas: >>> mi_func( 5, 6, z=0.7 )
>>> mi_func( 3.14, 7, 3.5 )
6.14
17.990000000000002
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Espacios de nombres, ámbitos, y funciones locales
• • • • •
Una función puede acceder a variables en dos ámbitos (scopes): globales y locales. Alternativamente, las variables pueden ser definidas explícitamente dentro de un espacio de nombres (namespace). Por defecto, las variables que se asignan dentro de una función se encuentran en el ámbito local. El ámbito local a una función se crea en el momento de su llamada e inicialmente incluye sus parámetros. El ámbito local se destruye al terminar la ejecución de la función (con la excepción de las funciones de clausura que veremos más adelante).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Espacios de nombres, ámbitos, y funciones locales
def func(): a = [] for i in range(5): a.append( i ) •
Al llamar a la función se crea la variable a. A continuación se ejecuta el lazo donde se le añaden componentes. Finalmente, se alcanza el final de la función y la variable es destruida.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Espacios de nombres, 谩mbitos, y funciones locales
>>> a = [] >>> def func(): ...
for i in range(5):
...
a.append( i )
>>> func() >>> a [0, 1, 2, 3, 4]
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Espacios de nombres, 谩mbitos, y funciones locales
>>> a = [] >>> def func(): ...
a = range(5)
>>> func() >>> a []
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Espacios de nombres, 谩mbitos, y funciones locales
>>> a = [] >>> def func(): ...
global a
...
a = range(5)
>>> func() >>> a [0, 1, 2, 3, 4]
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Espacios de nombres, ámbitos, y funciones locales • •
Pueden declararse nuevas funciones en cualquier momento. En particular, es legal declarar funciones dentro de funciones. Éstas se crean al invocar la función contenedora:
def outer_f( x, y, z ): def inner_f( a, b, c ): pass pass • •
inner_f() no existe hasta que se llama a outer_f(). Tan pronto como termina la ejecución de outer_f(), inner_f() es destruida. inner_f() tiene acceso a las variables en el ámbito local de outer_f(), pero no puede añadir nada al mismo. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Retorno de valores múltiples •
Una diferencia notable con respecto a otros lenguajes como C/C++/Java es la capacidad de que una función devuelva múltiples valores.
def f(): a = 5; b = 6; c = 7; return a, b, c x, y, z = f() •
En realidad la implementación es sencilla: la función devuelve un único valor, que resulta ser una tupla.
>>> f() (5, 6, 7) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones como objetos • •
Dado que una función Python no deja de ser un objeto, es posible utilizar functores para expresar operaciones complejas de forma sencilla. Ejemplo: supongamos que queremos realizar transformaciones de limpieza sobre los strings que conforman el siguiente array:
>>> planetas = [ ‘ Caladan ’, ‘Ix!’, ‘Ix’, ‘ix’, ‘aRraKIs’, ‘giedi prime##’, ‘Salusa secundus?’ ] •
Se desea conseguir una lista de strings uniforme y lista para su análisis. Es necesario aplicar: eliminación de espacios superfluos y símbolos de puntuación, y arreglar la capitalización.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones como objetos import re # Módulo de expresiones regulares def clean_strings( strings ): result = [] for value in strings: value = value.strip() value = re.sub(‘[!#?]’, ‘’, value) # elimina puntuación value = value.title() result.append( value ) return result Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones como objetos def clean_strings_v2( strings, ops ): result = [] for value in strings: for function in ops: value = function( value ) result.append( value ) return result
def remove_punctuation( value ): return re.sub( “[!#?]”, “”, value )
clean_ops = [ str.strip, remove_punctuation, str.title ] Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones como objetos • •
Es posible pasar funciones como parámetros a otras funciones. P. ej., Python proporciona, de forma nativa, mecanismos para aplicar una lista de funciones a una lista de objetos:
>>> map( str.strip, planetas ) [‘Caladan’, ‘Ix!’, ‘Ix’, ‘ix’, ‘aRraKIs’, ‘giedi prime##’, ‘Salusa secundus?’]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones anónimas (λ) •
Una función anónima, o función lambda, es una expresión funcional sencilla (instrucción única), el resultado de la cual es su valor de retorno.
def short_function(x): return x*2 equiv_anon = lambda x: x*2
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones anónimas (λ) •
En ocasiones es más sencillo usar una referencia a una función anónima que escribir una función con nombre ad-hoc:
>>> a = [4, 0, 1, 5, 6] >>> map( lambda x: x*2, a ) [8, 0, 2, 10, 12] >>> strings = [‘caladan’, ‘ix’, ‘corrin’, ‘giedi prime’] >>> strings.sort( key = lambda x: len(set(list(x))) ) # Ordena por número de letras diferentes en el string >>> strings [‘ix’, ‘caladan’, ‘corrin’, ‘giedi prime’] Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones de clausura •
Se denomina función de clausura a una función generada dinámicamente y devuelta por otra función.
•
La característica principal de una función de clausura es que ésta continúa teniendo acceso al ámbito local de la función generadora incluso después de su fin.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones de clausura >>> def make_closure( a ): ... ... ...
def closure(): print( “Variable en ámbito local: %d” % a ) return closure
>>> closure = make_closure(5) >>> closure() ‘Variable en ámbito local: 5’
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones de clausura •
En el ejemplo anterior se ha creado una función de clausura cuyo estado interno (variable a) es inmutable (un entero).
•
Pueden introducirse variables mutables en el estado interno de una función de clausura. Estas variables pueden ser modificadas, alterando dinámicamente el comportamiento de la función.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones de clausura >>> def make_watcher(): ...
have_seen = set([])
...
def has_been_seen( x ):
...
if x in have_seen: return True
...
else: have_seen.add(x)
...
return False
...
return has_been_seen
>>> watcher = make_watcher() >>> vals = [5, 6, 1, 5, 1, 6, 3, 5] >>> [watcher(x) for x in vals] [False, False, False, True, True, True, False, True] Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones de clausura •
Pueden modificarse libremente las variables mutables del ámbito local de la función de clausura.
•
No pueden añadirse nuevas variables. Una alternativa es añadir pares clave/valor a un diccionario.
•
Esta técnica permite “fabricar” funciones muy generales, con muchas opciones, que dinámicamente fabrican funciones más especializadas, eficientes y sencillas.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Funciones de clausura >>> def format_and_pad( template, space ): ... ... ...
def formatter( x ): return (template % x).rjust( space ) return formatter
>>> fmt = format_and_pad( “%.4f”, 15 ) >>> fmt(1.756) '
1.7560'
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Sintaxis extendida: *args, *kwargs •
Las funciones se invocan usando una mezcla de parámetros posicionales y de palabra clave:
>>> func( a, b, c, d = un_valor, e = otro_valor ) •
Internamente, la función: 1. Recibe una tupla args conteniendo los parámetros posicionales. 2. Recibe un diccionario kwargs contiendo los parámetros de palabra clave. 3. Realiza el equivalente a la asignación: >>> (a, b, c) = args >>> d = kwargs.get( ‘d’, d_default_value ) >>> e = kwargs.get( ‘e’, e_default_value )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Sintaxis extendida: *args, *kwargs def g( x, y, z=1 ): return (x+y) / z def hello_world_then_call( f, *args, *kwargs ): print ‘args is’, args print ‘kwargs is’, kwargs print “Hello world! Now I’m going to call %s” % f return f( *args, *kwargs ) >>> hello_world_then_call( g, 1, 2, z=5 ) args is (1, 2) kwargs is {‘z’: 5.0} Hello world! Now I’m going to call <function g at 0x2dd5cf8> 0.6 Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Currying: instanciación parcial de funciones
•
El currying consiste en la creación de nuevas funciones a partir de otras preexistentes mediante el fijado de algunos de sus parámetros:
>>> def suma(x, y): return x+y >>> suma_5 = lambda y: suma(5,y) •
Alternativamente:
>>> from functools import partial >>> suma_5 = partial( suma, 5 )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Generadores •
Un generador es una función que devuelve una secuencia de valores de forma “perezosa”, realizando una pausa en la ejecución de la función tras cada valor.
•
Son muy útiles para generar secuencias iterables eficientes.
•
Se construyen mediante funciones que retornan su valor usando la palabra reservada yield en lugar de return.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Generadores >>> def cuadrados( n = 10 ): ...
for i in xrange( 1, n+1 ):
...
print “Generando cuadrados de 1 a %d” % (n**2)
...
yield i ** 2
>>> gen = cuadrados() >>> gen <generator object cuadrados at 0x7fd9e3e796e0>
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Generadores • •
Al invocar la función generadora no se ejecuta ningún código. Deben solicitarse los elementos explícitamente:
>>> for x in gen: ...
print x
Generando cuadrados de 1 a 100 1 Generando cuadrados de 1 a 100 4 . . . Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Generadores def make_change( amount, coins=[1, 2, 5, 10, 20, 50], hand=[] ): if amount == 0: yield hand for coin in coins: if coin > amount or (len(hand) > 0 and hand[-1] < coin): continue for result in make_change(amount-coin, coins=coins, hand=hand+[coin]): yield result >>> len(list(make_change(53))) 530 Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Expresiones generadoras •
Una manera compacta de crear un generador sencillo es usar una expresión generadora:
>>> gen = ( x ** 2 for x in xrange(100) ) >>> gen <generator object <genexpr> at 0x7fd9e3e798c0> •
Esta expresión es equivalente a la función:
def _make_gen(): for x in xrange(100): yield x**2 Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Módulo itertools • •
El módulo itertools contiene diversas funciones útiles para la creación de generadores específicos. P. ej., groupby toma una secuencia y una función y agrupa los elementos consecutivos de la secuencia para los cuáles la función toma el mismo valor.
>>> import itertools; primera_letra = lambda x: x[0] >>> nombres = [‘Alberto’,‘Abel’,‘Guillermo’,‘Gabriel’,‘Adán’,‘Saúl’] >>> for letra, lista in itertools.groupby( nombres, primera_letra): ...
print letra, list(lista) # nombres es un generador
A ['Alberto', 'Abel'] G ['Guillermo', 'Gabriel'] A ['Ad\xc3\xa1n'] S ['Sa\xc3\xbal'] Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python - Funciones Módulo itertools Función imap( func, *iterables ) ifilter( func, iterable )
Descripción Versión generador de map. Versión generador de filter.
combinations( iterable, k )
Genera todas las posibles k-tuplas de elementos en iterable, ignorando el orden.
permutations( iterable, k )
Genera todas las posibles k-tuplas de elementos en iterable, respetando el orden.
groupby( iterable[, keyfunc] )
Genera pares (clave, subgenerador) para cada clave única. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python Ficheros y Sistema Operativo •
Para abrir un fichero en modo lectura o escritura se usa la función open() junto con un path absoluto o relativo:
>>> f = open( ‘directorio/fichero.txt’ ) •
Por defecto el fichero se abre en modo lectura (‘r’). A continuación, puede iterarse sobre las líneas del fichero con la sintaxis habitual:
>>> for line in f: ...
#hacer algo con line
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python Ficheros y Sistema Operativo Modo de apertura
Descripción
r
Sólo lectura.
w
Sólo escritura. Crea un fichero nuevo, sobreescribiendo cualquiera preexistente.
a
Concatenar a un fichero preexistente (lo crea si no existe).
r+
Lectura-escritura.
b
Modificador de apertura en modo binario (p.ej. ‘rb’).
U
Modificador de fin de línea universal. Traduce los fines de línea específicos del fichero a ‘\n’. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python Ficheros y Sistema Operativo •
Para escribir a un fichero pueden usarse los métodos write() o writelines():
•
Por ejemplo, para eliminar las líneas en blanco de un fichero:
>>> f_in = open( path, ‘r’) >>> f_out = open( ‘tmp.txt’, ‘w’ ) >>> f_out.writelines( [x for x in f_in if len(x) > 1] )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python Ficheros y Sistema Operativo M茅todo read( [size] )
readlines( [size] )
Descripci贸n Leer datos de fichero como string. El argumento opcional [size] indica el n煤mero de bytes a leer. Igual que read(), pero devuelve una lista de strings. Sin [size] lee el fichero completo.
write( str )
Escribir el string str en el fichero.
writelines( str )
Escribir la lista de strings al fichero.
close()
Cerrar el fichero. Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Python Ficheros y Sistema Operativo
Método flush() seek( pos )
Descripción Volcar el buffer de I/O a disco. Mover el puntero a fichero a la posición indicada.
tell()
Devuelve la posición actual del puntero a fichero.
closed
True si el fichero está cerrado.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython • Intérprete Python interactivo. • No proporciona ninguna herramienta de análisis o de computación, pero facilita enormemente el uso de Python y el proceso de desarrollo. • Incluye entornos GUI para facilitar la visualización de datos. • Permite trabajar usando un navegador web, así como guardar las sesiones HTML facilitando la compartición de ejemplos, código y datos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython $ ipython2 Python 2.7.9 (default, Dec 11 2014, 04:42:00) Type "copyright", "credits" or "license" for more information. IPython 3.0.0 -- An enhanced Interactive Python. ?
-> Introduction and overview of IPython's features.
%quickref -> Quick reference. help
-> Python's own help system.
object?
-> Details about 'object', use 'object??' for extra details.
In [1]: Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Caracter铆sticas Pretty printing In [1]: a = 5
In[4]: data {0: -2.171772092191186,
In [2]: a
1: 0.2947739898361525,
Out[2]: 5
2: -0.3602586072105093, 3: 1.300393521182511,
In[3]: from numpy.random import randn
4: -0.00033416357123924607, 5: -0.572174661598875, 6: 0.8141305611469151}
In[4]: data = { i: randn() for i in range(7)} Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Prompt enumerado •
iPython proporciona un prompt en el que las entradas y salidas están numeradas. Esto es útil para recuperar tanto unas como otras:
In[5]: _i3 Out[5]: u'data = { i: randn() for i in range(7) }' In[6]: _4 {0: -2.171772092191186, 1: 0.2947739898361525, ... Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Autocompleción • •
Una de las grandes mejoras en facilidad de uso con respecto al intérprete estándar es el mecanismo de tab completion. Durante la introducción de un comando en el prompt, pulsar <Tab> activa una búsqueda del espacio de nombres del entorno intentando identificar cualquier variable (objetos, funciones, etc.) que coincida con lo que se ha tecleado hasta el momento.
In[1]: un_entero = 1 In[2]: una_letra = ‘a’ In[3]: un<Tab> %unalias unicode
%unload_ext
un_entero
una_letra
unichr
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Autocompleción •
•
Además de encontrar las variables un_entero y una_letra, en el ejemplo anterior también son compleciones válidas los magics %unalias y %unload_ext, así como las funciones unichr() y unicode(). El mecanismo también permite explorar los métodos de un objeto:
In[3]: b = [1,2,3] In[4]: b.<Tab> b.append b.count reverse b.sort
b.extend b.index
b.insert b.pop
b.remove b.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Autocompleción •
También es posible completar con el contenido de un módulo:
In[5]: import datetime In[6]: datetime.<Tab> datetime.MAXYEAR datetime.MINYEAR datetime.date datetime.datetime datetime.datetime_CAPI datetime.time timedelta datetime.tzinfo
datetime.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Autocompleción • •
Por defecto se ocultan los métodos y atributos que comienzan con un guión bajo. Para poder verlos es necesario teclear el guión bajo explícitamente:
In[7]: datetime._<Tab> datetime.__class__ datetime.__dict__ datetime.__getattribute__ datetime.__init__
datetime.__file__ datetime.__new__
...
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Autocompleción • Además de buscar variables y funciones, la función de autocompleción también busca ficheros cuando el intérprete lo considera adecuado. • También es útil al introducir nombres de parámetros de nombre clave.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Introspección •
Introducir un interrogante (?) antes o después del nombre de un objeto devuelve información sobre el mismo:
In[1]: b = [1,2,3] In[2]: b? Type:
list
String form: [1, 2, 3] Length:
3
Docstring: list() -> new empty list list(iterable) -> new list initialized from iterable's items Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Introspección •
Si el objeto a inspeccionar es una función, se imprime además la documentación (docstring) que ésta incluya:
In[1]: import numpy as np In[2]: np.linalg.det? Type:
function
String form: <function det at 0x7f27c44b4ed8> File:
/usr/lib/python2.7/site-packages/numpy/linalg/linalg.py
Definition:
numpy.linalg.det(a)
Docstring: Compute the determinant of an array.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Caracter铆sticas Introspecci贸n Parameters ---------a : (..., M, M) array_like Input array to compute determinants for. Returns ------det : (...) array_like Determinant of `a`. ... Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Características Introspección • •
Si se utilizan dos interrogantes (p. ej. numpy.linalg.det??) se mostrará también el código fuente de la función, si está disponible. El interrogante también permite hacer búsquedas del espacio de nombres usando expresiones regulares propias. Esto permite búsquedas más complejas que el uso de la autocompleción con tabulador:
In[3]: np.linalg.*rank*? numpy.linalg.matrix_rank
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias” • • • •
iPython define una serie de comandos, denominados “magias” (magics) diseñados para facilitar algunas tareas comunes. La sintaxis de estos comandos es %magicname. Se comportan como programas que son interpretados por iPython. Pueden recibir argumentos opcionales.
In[1]: %reset? … Resets the namespace by removing all names defined by the user ... Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias” %run •
El comando %run permite ejecutar el código Python contenido en cualquier fichero:
-------------------------------------> test.py print “Hello world!” ------------------------------------In[1]: %run test.py Hello world!
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias” %run • • •
•
El script es ejecutado en un espacio de nombres vacío. En este sentido, su ejecución es equivalente a hacerlo en línea de comandos a través de un nuevo intérprete. Sin embargo, todos los nombres (imports, funciones, variables globales) definidos en el script (hasta el lanzamiento de una excepción, si éste se produce) serán después accesibles en el entorno iPython. Si el script espera argumentos, estos pueden proporcionarse normalmente:
In[1]: %run script.py <args>
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias” %paste / %cpaste • •
Una manera rápida de ejecutar código Python es hacer copia-pega desde una página web u otra fuente. El uso de <Ctrl-C> y <Ctrl-V> no es adecuado al trabajar con Python, debido a la semántica especial de la indentación:
x=5 y=7 if x > 5: x += 1 y += 8 •
La línea en blanco en el código anterior no funciona correctamente: en algunos intérpretes arroja IndentationError , en otros ejecuta y += 8 fuera del condicional. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias” %paste / %cpaste • Las magias %paste y %cpaste permiten hacer copiapega de código sin preocuparnos por la indentación. • %paste ejecuta automáticamente el texto que se encuentre en el portapapeles en el momento de su invocación. • %cpaste es similar, pero permite la edición del texto del portapapeles antes de su ejecución.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias” Comando
Descripción
%quickref
Muestra documentación abreviada de las magias iPython disponibles.
%magic
Muestra documentación detallada de las magias iPython disponibles.
%debug
Inicia el depurador interactivo en el fondo de la pila de la última excepción.
%hist
Muestra el historial de entrada/salida de comandos.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias” Comando
Descripción
%pdb
Activa el modo de depuración automática.
%paste
Ejecuta código preformateado proveniente del portapapeles.
%cpaste
%reset
%page <objeto>
Abre un prompt especial para copiar y formatear código manualmente. Borrar todas las variables/nombres definidos en una sesión. Imprime <objeto> con formato (pretty printing) y lo pagina.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias” Comando %run script.py
Descripción Ejecuta el script contenido en el fichero script.py.
%prun <instrucción>
Ejecuta <instrucción> usando cProfile (profiler Python).
%time <instrucción>
Mide el tiempo de una ejecución de <instrucción>.
%timeit <instrucción>
Ejecuta <instrucción> múltiples veces y mide el tiempo de ejecución. Útil para temporizar comandos con ejecuciones muy cortas. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - “Magias”
Comando
Descripción
%who / %who_ls / %whos
Muestra las variables definidas en la sesión con diferentes niveles de verbosidad.
%xdel <variable>
Borra <variable> .
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Atajos de teclado Comando
Descripción
<Ctrl+P> / <cursor arriba>
Buscar hacia atrás en la historia de comandos, teniendo en cuenta el texto ya introducido.
<Ctrl+N> / <cursor abajo>
Buscar hacia delante en la historia de comandos, teniendo en cuenta el texto ya introducido.
<Ctrl+R>
<Ctrl+Shift+V> <Ctrl+C>
Búsqueda hacia atrás en la historia de comandos al estilo readline. Pegar texto desde el portapapeles. Interrumpir la ejecución en progreso. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Atajos de teclado Comando
Descripción
<Ctrl+A>
Mover el cursor al principio de línea.
<Ctrl+E>
Mover el cursor al final de línea.
<Ctrl+K>
Borrar texto desde el cursor hasta el final de línea.
<Ctrl+U>
Borrar todo el texto de la línea actual.
<Ctrl+F> / <cursor derecho> <Ctrl+B> / <cursor izquierdo> <Ctrl+L>
Mover el cursor hacia delante un caracter. Mover el cursor hacia atrás un caracter. Borrar la pantalla. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Historia de comandos Búsqueda y reuso • •
•
Se trata de una de las mejoras más cómodas del intérprete iPython. Usando <cursor arriba> y <cursor abajo> es posible explorar la historia de comandos. La diferencia con el intérprete estándar es que, en este caso, se tiene en cuenta la línea actual para hacer una búsqueda restringida. Usando <Ctrl+R> es posible introducir texto que es automáticamente buscado en la historia de comandos. Para descartar un resultado y continuar la búsqueda hacia el pasado es posible seguir pulsando <Ctrl+R>.
In[1]: un_comando = f( x, y, z ) (reverse-i-search)‘com’: un_comando = f( x, y, z ) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Historia de comandos Entrada y salida • • •
•
Como ya hemos mencionado, iPython almacena referencias tanto a los comandos de entrada como a los de salida. Las dos últimas salidas de comando se almacenan en las variables _ (un guión bajo) y __ (dos guiones bajos), respectivamente. Las líneas de la entrada se almacenan en las variables _iX, donde X corresponde con la numeración de la entrada en cuestión. Del mismo modo, las variables _X almacenan las salidas correspondientes. Precaución: el almacenamiento de estas referencias implica que Python nunca hará garbage collection de las variables de salida. Esto puede provocar problemas de memoria, solucionables usando %xdel y %reset. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Historia de comandos Log de entrada y salida • iPython permite registrar toda la sesión, incluyendo entradas y salidas. • El log se activa usando la magia %logstart. • Se desactiva mediante %logoff. • Puede ser pausado temporalmente y posteriormente reactivado usando %logstop y %logon, respectivamente. • %logstate imprime el estado actual del sistema de log. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Interacciones con el SO Comando !cmd
Descripci贸n Ejecuta cmd en el shell del SO.
output = !cmd
Ejecuta cmd y almacena su salida est谩ndar en la variable output.
%alias alias_name cmd
Define un alias para el comando cmd con el nombre alias_name .
%bookmark
Uso del sistema de marcadores de directorios de iPython.
%cd <dir>
Cambia el directorio de trabajo a <dir>. Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Interacciones con el SO Comando %pwd
Descripci贸n Imprime el directorio de trabajo actual.
%pushd <dir>
Apila el directorio actual en la pila de directorios y cambia el directorio de trabajo a <dir>.
%popd
Cambia el directorio de trabajo a la cima de la pila de directorios y desapila.
%dirs
Muestra la pila de directorios actual.
%dhist %env
Muestra la historia de directorios visitados. Devuelve un diccionario con el entorno. Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software Depurador ipdb •
•
El depurador ipdb, incluido en iPython, mejora el estándar pdb introduciendo autocompleción, resaltado de sintaxis, y más contexto en la notificación de excepciones. Existen varias maneras de invocarlo: 1. Mediante %debug se accede al último punto de fallo. 2. Activando la depuración automática mediante %pdb. 3. Ejecutando %debug <comando> se depura el comando indicado. 4. %run -d script.py lanza el script a través de ipdb. 5. Ejecutando import ipdb; ipdb.run( “<comando>” )
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software Comandos de ipdb Comando h(elp) help <command> c(ontinue) q(uit)
Descripción Muestra la lista de comandos disponibles. Muestra la documentación de <command>. Continúa la ejecución del programa. Termina la sesión de depuración.
b(reak) número
Fija un punto de interrupción en la línea número del fichero actual.
b path:número
Fija un punto de interrupción en la línea número del fichero path. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software Comandos de ipdb Comando
Descripción
s(tep)
Entrar en una llamada a función.
n(ext)
Ejecutar la línea de código actual y avanzar a la siguiente línea al mismo nivel.
u(p) / d(own)
a(rgs)
debug instrucción
Desplazarse hacia arriba / abajo en la pila de llamadas. Muestra los parámetros de la función actual. Invoca instrucción en un nuevo depurador (recursivo). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software Comandos de ipdb
Comando
Descripción
l(ist) [desde[,hasta]]
Muestra el código alrededor de la instrucción actual, o entre las líneas desde y hasta.
w(here)
Imprime la pila de llamadas actual.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software Consola gr谩fica QT $ ipython2 qtconsole --pylab=inline
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software Consola gráfica QT •
•
La consola QT facilita algunas tareas, por ejemplo: • Permite abrir varias ventanas sobre el mismo kernel iPython. • Abre automáticamente la documentación de las funciones al escribir código de forma interactiva. La opción --pylab activa varios cambios en el entorno. La idea es obtener, automáticamente, un entorno de análisis y desarrollo similar a Matlab: • Carga matplotlib para permitir representar gráficas. • Importa numpy automáticamente. • Activa el soporte para gráficas empotradas con --inline. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software HTML Notebook • • • • •
Además de la consola QT, iPython incluye un entorno HTML conocido como Notebook. Utiliza un formato JSON para permitir compartir código, salidas y gráficas de forma sencilla. Se organiza a través de un servidor web al que los clientes pueden conectarse a través de un navegador. Permite utilizar de forma sencilla un entorno iPython remoto a través de un entorno web. Para lanzar un par servidor/cliente de forma sencilla, se utiliza el comando:
$ ipython2 notebook Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software HTML Notebook
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
iPython - Herramientas software HTML Notebook Notebook-001.ipynb
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy • •
NumPy (Numerical Python) es el paquete fundamental que permite a Python trabajar de forma eficiente con arrays y operaciones vectoriales. Proporciona: • La clase ndarray, que representa un array multidimensional y proporciona operaciones aritméticas vectorizadas y capacidad de broadcasting. • Funciones para aplicar operaciones a arrays enteros de forma vectorial (sin lazos). • Funciones de álgebra lineal, generación de números aleatorios, transformadas de Fourier… • Herramientas para integrar Python con C/C++/Fortran. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Notebook-002.ipynb
• • • •
Objeto array n-dimensional usado como contenedor de datos. Permiten realizar operaciones sobre grandes bloques de datos con sintaxis escalar. A diferencia de una lista, un array NumPy tiene un tipo específico y homogéneo (no necesariamente numérico). Un ndarray contiene, entre otros, dos variables: • shape: tupla que contiene las dimensiones del array. • dtype: objeto de clase dtype que contiene el tipo de sus elementos.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Creaci贸n Funci贸n array()
asarray()
arange()
ones() ones_like()
Notebook-002.ipynb
Descripci贸n Convierte la secuencia de entrada (p. ej. una lista) a un array. Copia los datos de entrada al nuevo array. Convierte la secuencia de entrada, pero no realiza una copia los datos si la entrada ya es un array. Como range() pero devuelve un ndarray en lugar de una lista. Producen un array de 1s a partir de sus dimensiones, o copiando shape y dtype de otro array. Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Creaciรณn Funciรณn
Notebook-002.ipynb
Descripciรณn
zeros() zeros_like()
Producen un array de 0s a partir de sus dimensiones, o copiando shape y dtype de otro array.
empty() empty_like()
Producen un array sin inicializar a partir de sus dimensiones, o copiando shape y dtype de otro array.
eye(), identity()
Producen una matriz con 1s en la diagonal y 0s en el resto. identity() requiere ademรกs que la matriz sea cuadrada.
Uniรณn Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Tipos de datos
Tipo
C贸digo
Descripci贸n
int8, uint8
i8, u8
int16, uint16
i16, u16
Entero con/sin signo, 16 bits (2 bytes).
int32, uint32
i32, u32
Entero con/sin signo, 32 bits (4 bytes).
int64, uint64
i64, u64
Entero con/sin signo, 64 bits (8 bytes).
Entero con/sin signo, 8 bits (1 byte).
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Tipos de datos Tipo
Código
Descripción
float16
f2
float32
f4 o f
float64
f64 o d
Flotante, doble precisión (8 bytes). Compatible con double en C y con float en Python.
float128
f16 o g
Flotante, precisión extendida (16 bytes).
Flotante, media precisión (2 bytes). Flotante estándar, compatible con el tipo float en C (4 bytes).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Tipos de datos
Tipo
Código
Descripción
complex64
c8
Número complejo representado como dos números de tipo float32.
complex128
c16
Número complejo representado como dos números de tipo float64.
complex256
c32
Número complejo representado como dos números de tipo float128.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Tipos de datos Tipo
Código
Descripción
bool
?
Tipo booleano (True o False).
object
O
Objeto Python (referencia).
string_
S_
Tipo string de longitud fija (1 byte por caracter). Ej. S10 representa un string de 10 caracteres.
unicode_
U_
Tipo unicode de longitud fija (el número de bytes por caracter varía entre plataformas). Similar a string_.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Tipos de datos
Notebook-002.ipynb
• Es posible hacer conversiones (casts) entre diferentes tipos de datos usando el método astype(). • La llamada a astype() siempre crea una copia de la memoria del array, aunque se use el mismo tipo que el del array original. • Si la conversión falla por cualquier motivo, la función lanzará una excepción de tipo TypeError.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Broadcasting
• Cuando se operan dos arrays, NumPy decide, en primer lugar, qué tipo de operación se debe realizar. • Si ambos arrays tienen la misma forma la operación se realizará elemento a elemento. • En otro caso, NumPy intentará realizar un broadcasting, o replicación, del array menor para adaptarlo al tamaño del mayor.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Broadcasting •
•
• •
Si es necesario, el broadcasting comienza por las dimensiones más internas (las que aparecen a la derecha) y se va moviendo hacia la izquierda. Dos dimensiones son compatibles si: 1. Ambas son iguales, o 2. Una de ellas es 1. Si ninguna de las condiciones anteriores se cumple, la operación lanza un ValueError. Si se cumple la segunda condición, el array cuya dimensión es 1 es “replicado” n veces hasta hacer coincidir ambas. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Broadcasting • •
Notebook-002.ipynb
No es necesario que los arrays tengan el mismo número de dimensiones. Se asume que las dimensiones inexistentes son 1. Por ejemplo: A
: 256 x 256 x 3
A
: 256 x 256 x 3
B
:
B
: 256 x
3
A*B: 256 x 256 x 3
1 x 3
A*B: 256 x 256 x 3
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Indexación básica
Notebook-002.ipynb
• Los arrays unidimensionales se comportan de forma similar a las listas. • Una distinción importante es que en NumPy los slices no son copias, sino vistas sobre los datos del array. Esto implica una mejora en la eficiencia, pero también que las operaciones con slices tienen efectos colaterales sobre el array original. • Es posible obtener una copia de un slice (o de cualquier array) invocando el método copy() de la clase ndarray. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Indexaci贸n b谩sica
Notebook-002.ipynb
Los elementos en cada 铆ndice de un array ndimensional no son escalares, sino arrays (n1)-dimensionales.
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Indexación con slices • •
Notebook-002.ipynb
La sintaxis de slices válida para listas también lo es para arrays. Al trabajar con arrays n-dimensionales, es posible utilizar cualquier combinación de indexación básica e indexación con slices en cada una de las n dimensiones.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Indexación booleana • • •
• •
Notebook-002.ipynb
Es posible indexar un array a través de un array de booleanos. El array debe tener la misma dimensión que el eje que está indexando. La indexación booleana permite seleccionar los elementos de un array a partir de condiciones semánticas, y no posicionales (p. ej. los elementos mayores que un número determinado). Las condiciones no tienen por qué referirse al array indexado. La indexación booleana siempre crea una copia de los datos (es decir, no devuelve una vista). Es legal mezclar, en el acceso a un array n-dimensional, indexación básica, con slices, y booleana (un tipo arbitrario en cada una de las n dimensiones). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Fancy indexing • •
•
• •
Notebook-002.ipynb
Es el término empleado en NumPy para describir la indexación a través de arrays de enteros. Para seleccionar un subconjunto arbitrario de los elementos de una dimensión determinada es posible indexar el array a través de un array (o lista) que contenga los elementos a seleccionar. Si se proporciona una lista de listas, el comportamiento cambia: se devuelve un array 1D con las posiciones correspondientes a las tuplas resultantes de aplicar zip() a las listas. La selección mediante fancy indexing siempre crea una copia de los datos. Es legal mezclar, en el acceso a un array n-dimensional, indexación básica, con slices, booleana, y fancy indexing (un tipo arbitrario en cada una de las n dimensiones). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - ndarray Transposición
Notebook-002.ipynb
• La clase ndarray proporciona el método transpose() y la variable T. • Para arrays n-dimensionales, transpose() acepta una tupla de números de eje para realizar la permutación. • La variable T es un acceso rápido a la transposición clásica de la matriz (reflejar la matriz sobre su diagonal). • Se proporciona también el método swapaxes(), que intercambia dos ejes cualesquiera. • Todas estas transformaciones devuelven una vista sobre la matriz original. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Funciones universales Notebook-002.ipynb
• Una función universal, o ufunc, realiza operaciones elemento a elemento sobre ndarrays. • Se trata de envoltorios vectoriales sobre funciones simples que cogen uno o más valores escalares y producen un escalar. • Muchas ufuncs son funciones sobre un elemento (p. ej. sqrt() o exp()). Se denominan ufuncs unarias. • Otras toman dos elementos y producen uno (ufuncs binarias, p. ej. add() o maximum()). • Algunas ufuncs devuelven más de un array (p. ej, modf(), que devuelve la parte integral y fraccionaria de un array de flotantes). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Funciones universales ufuncs unarias Función abs, fabs
sqrt square exp log, log10, log2, loglp
Retorno Valor absoluto de números enteros, flotantes o complejos. fabs() es una alternativa más rápida para números no complejos. Raíz cuadrada: arr ** 0.5 . Cuadrado: arr ** 2. Exponenciación: np.e ** arr . Logaritmo natural, base 10, base 2, y log (1+x), respectivamente. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Funciones universales ufuncs unarias Funci贸n sign
ceil / floor / rint
modf isnan isfinite, isinf
Retorno El signo de cada elemento: 1 (positivo), 0 (cero), -1 (negativo). Redondeo hacia arriba / abajo / m谩s cercano. Partes integrales y fraccionarias de array. True si un elemento es np.nan (NaN). Array de booleanos indicando si un elemento es finito / infinito. Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Funciones universales ufuncs unarias
Función cos, cosh, sin, sinh, tan, tanh
arccos, arccosh, arcsin, arcsinh, arctan, arctanh logical_not
Retorno Funciones trigonométricas normales e hiperbólicas. Funciones trigonométricas inversas. NOT elemento a elemento: -arr.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Funciones universales ufuncs binarias Función add
Retorno Suma de los arrays de entrada.
subtract
Resta el 2º parámetro del 1º.
multiply
Multiplicación de los arrays de entrada.
divide / floor_divide power
División / división entera. Elevación de los elementos del primer array a las potencias indicadas en el 2º array.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Funciones universales ufuncs binarias Función
Retorno
maximum / fmax
Máximo elemento a elemento. fmax() ignora NaN.
minimum / fmin
Mínimo elemento a elemento. fmin() ignora NaN.
mod copysign
Módulos elemento a elemento. Copia el signo de los valores en el 2º argumento a los valores en el 1º.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Funciones universales ufuncs binarias
Funci贸n
Retorno
greater / greater_equal / less / less_equal / equal / not_equal
Operaciones booleanas que comparan si el primer par谩metro es mayor / mayor o igual / menos / menor o igual / igual / distinto del segundo par谩metro.
logical_and / logical_or / logical_xor
Operaciones booleanas elemento a elemento AND / OR / XOR.
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Procesado de datos Notebook-002.ipynb
• El uso de NumPy permite expresar muchas clases de algoritmos de procesado de datos como expresiones matriciales que, de otro modo, requerirían ser escritos usando lazos. • Este proceso de vectorización lleva aparejado, en el caso general, mejoras de rendimiento de varios órdenes de magnitud. • A continuación exploraremos diversos ejemplos de uso de NumPy para el tratamiento de diferentes tipos de datos.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Procesado de datos Lógica condicional Notebook-002.ipynb • •
La función numpy.where() permite construir la versión vectorizada de la expresión x if c else y. Usando Python puro, esto podría escribirse como:
>>> result = [(x if c else y) for x, y, c in zip(xarr, yarr, cond)]
•
•
Sin embargo, esta versión… • es muy lenta. • sólo funciona con arrays 1D. Usando where(), el equivalente se escribiría:
>>> result = np.where( cond, xarr, yarr ) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Procesado de datos Mateḿaticas y estadística
Método sum
mean
Descripción Suma todos los elementos del array a lo largo de un eje. Media aritmética.
std, var
Desviación típica y varianza.
min, max
Mínimo y máximo.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Procesado de datos Mateḿaticas y estadística Notebook-002.ipynb
Método
Descripción
argmin, argmax
Índices de los elementos mínimo y máximo.
cumsum cumprod
Suma acumulada. Producto acumulado.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Procesado de datos Arrays booleanos Notebook-002.ipynb • Al trabajar con arrays booleanos, los métodos anteriores utilizan True == 1 y False == 0. Esto permite reducir valores booleanos imitando operaciones AND y OR. • No obstante, existen métodos nativos para reducir arrays booleanos de forma nativa: any() y all(). • Estos métodos también funcionan con arrays no booleanos, interpretando non-zero == True, zero == False.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Procesado de datos Ordenación Notebook-002.ipynb • Al igual que las listas, los arrays NumPy pueden ser ordenados (con modificación) usando el método sort(). • sort() acepta un parámetro axis para indicar el eje de ordenación en arrays multidimensionales. • La función numpy.sort() devuelve una copia ordenada del array, sin modificarlo. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Procesado de datos Lógica de conjuntos Función unique(x)
intersect1d(x,y) union1d(x,y) in1d(x,y)
setdiff1d(x,y) setxor1d(x,y)
Descripción Computa los elementos únicos en el array x (1D). Elementos comunes en x e y. Unión de x e y. Array booleano indicando si cada elemento de x está en y. Diferencia de conjuntos x-y. Diferencia simétrica de conjuntos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - E/S con arrays Almacenando arrays en disco • •
np.save() y np.load() son las funciones encargadas de almacenar arrays a disco en formato binario. Por defecto, se utiliza un formato binario sin compresión y extensión .npy.
>>> np.save( path_string, arr ) . . . >>> arr = np.load( path_string ) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - E/S con arrays Almacenando arrays en disco •
Es posible almacenar varios arrays en el mismo fichero, comprimidos en formato ZIP con extensión .npz, usando np.savez():
>>> np.savez( path_string, a = arr1, b = arr2 ) •
Al leer un fichero .npz el resultado es un diccionario que cargará los arrays individuales de forma “perezosa”:
>>> arch = np.load( ‘fichero.npz’ ) >>> arch[‘b’] array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - E/S con arrays Almacenando arrays en disco • • • •
• •
Es muy habitual leer matrices de disco (posiblemente generadas a través de otras aplicaciones) en formato texto. Pandas, una librería de análisis numérico que analizaremos más adelante, incluye funciones muy potentes para este fin. NumPy proporciona np.loadtxt() y np.genfromtxt(). Ambas permiten especificar numerosas variaciones en el tipo de fichero de texto, como el formato de comentarios, delimitadores, funciones de conversión, filas a saltar, o columnas a interpretar. np.savetxt() realiza la operación inversa: escribe un array en un fichero de tipo CSV. np.genfromtxt() es similar a loadtxt(), pero permite hacer tratamiento de valores que faltan y estructurar el array de salida. Unión Europea FEDER
Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Álgebra lineal (numpy.linalg) Función diag
dot trace
Descripción Devuelve los elementos de la diagonal de una matriz cuadrada como un array 1D, o construye una matriz cuadrada a partir de un array 1D. Producto de matrices. Suma de los elementos de la diagonal.
det
Determinante.
eig
Autovalores y autovectores.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Álgebra lineal (numpy.linalg) Función inv pinv qr svd
Descripción Inversa de matriz cuadrada. Pseudo-inversa Moore-Penrose. Descomposición QR. Singular-value decomposition.
solve
Resuelve el sistema Ax = b, con A matriz cuadrada.
lstsq
Solución de mínimos cuadráticos a y = Xb. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Números aleatorios (numpy.random) Función seed permutation
shuffle
Descripción Cambia la semilla del generador. Devuelve una permutación aleatoria de una secuencia dada. Permuta aleatoriamente una secuencia (modifica el array).
rand
Genera muestras de una distribución uniforme dada.
randint
Genera enteros aleatorios distr. uniformemente en un intervalo dado. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Números aleatorios (numpy.random) Función
Descripción
randn
Genera muestras de una distribución normal estándar.
binomial
Genera muestras de una distribución binomial dada.
normal
Genera muestras de una distribución normal dada.
beta
Genera muestras de una distribución beta dada.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
NumPy - Números aleatorios (numpy.random) Notebook-002.ipynb
Función chisquare
Descripción Genera muestras de una distribución χ² dada.
gamma
Genera muestras de una distribución gamma dada.
uniform
Genera muestras de una distribución uniforme [0,1).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib • •
• •
En los ejemplos anteriores hemos representado alguna gráfica, pero no hemos entrado en detalles sobre cómo hacerlo. Matplotlib proporciona capacidades para realizar representaciones gráficas fundamentalmente 2D, aunque también permite algunas representaciones 3D. Los tipos de gráficas fundamentales soportados son líneas, diagramas de barras, histogramas, tartas, y variaciones de los anteriores. Cubriremos Matplotlib de forma muy sucinta, pues su cantidad de opciones es inabarcable en un curso como este. En su lugar, estudiaremos librerías de más alto nivel que facilitan el uso de Matplotlib. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Introducción • •
•
La magia %matplotlib configura automáticamente el entorno iPython para realizar representaciones gráficas. Por defecto, iPython detecta el backend adecuado para generar nuevas ventanas. Con %matplotlib inline se configurará un intérprete QT o Notebook para mostrar las gráficas embebidas en el entorno. Una gráfica básica Matplotlib incluye los siguientes elementos: • Ejes x e y: ejes horizontal y vertical, respectivamente. • Marcas en x e y (tickers): marcas segmentando los ejes. • Etiquetas en x e y (tick labels): valores de los ejes en las marcas. • Área de dibujo, o lienzo (canvas). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Introducción Notebook-003.ipynb
• • • • • •
La función plot() se utiliza para dibujar líneas y marcas. Recibe varios pares de secuencias x e y, del mismo tamaño cada par, junto con un string que indica el estilo de representación. Une cada punto con el siguiente utilizando rectas. Los puntos y las líneas son dibujados atendiendo al estilo indicado. La función devuelve la lista de líneas que han sido añadidas al gráfico. Si sólo se indica la secuencia de puntos en el eje y, plot() generará automáticamente x = range( len(y) ).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Introducción Notebook-003.ipynb
Función
Descripción
figure
Crea una nueva figura. Acepta como parámetro un entero, que permite referirse a ella para activarla y modificarla en el futuro.
subplot( x, y, z )
Divide una figura en una malla de subfiguras con x filas e y columnas. Además, activa la subfigura número z (numeración entre 1 y x*1, por filas ) para su modificación.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Introducción Notebook-003.ipynb
Función
Descripción
bar / barh
Crean gráficas de barras verticales / horizontales. Para apilar gráficas de barras se utiliza el parámetro bottom, que será una referencia al punto de inicio de las nuevas barras.
boxplot
Diagramas de cajas.
scatter
Dibuja puntos, pero no los une mediante líneas.
hist pie
Dibuja histogramas. Gráfico circular (tarta). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Apariencia Notebook-003.ipynb
Función
Descripción
title
Permite configurar el título de la gráfica. Como todas las funciones relacionadas con la adición de texto, acepta sintaxis LaTeX.
xlim / ylim
Permiten configurar los límites de los ejes x / y.
autoscale
Límites de ejes automáticos.
xticks / yticks
Fijan los ticks en cada eje y, opcionalmente, sus etiquetas correspondientes. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Apariencia Notebook-003.ipynb
Función axis
axhline / axvline
axhspan / axvspan
Descripción Permite fijar los límites de los ejes en bloque. Dibuja una línea horizontal / vertical en la gráfica. Dibuja rectángulos que abarcan todo el ancho / alto de la gráfica.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Estilos Notebook-003.ipynb
Propiedad
Tipo de valor
alpha
float
color
Color matplotlib
dashes
Secuencia
label
string
linestyle
Ver documentación
linewidth
float
Descripción Valor alpha usado al dibujar el elemento. Color de la línea. Tipo de adorno de línea. Etiqueta de la línea en la leyenda. Tipo de línea. Anchura de línea, en puntos.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Estilos Notebook-003.ipynb
Propiedad
Tipo de valor
marker
Ver documentación
mec
Color matplotlib.
mew
float
mfc
Color matplotlib.
markersize
float
Descripción Marcadores de los puntos de la línea. (markeredgecolor ) color de los bordes de los marcadores. (markeredgewidth ) grosor de los bordes de los marcadores, en puntos. (markerfacecolor ) color de relleno de los marcadores. Tamaño de los marcadores, en puntos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Estilos Notebook-003.ipynb
Propiedad
Tipo de valor
Descripción
solid_capstyle
[‘butt’|‘round’| ‘projecting’]
solid_joinstyl e
[‘miter’|‘round’|‘bevel’]
visible
[ True | False ]
xdata
numpy.ndarray
Datos en eje x.
ydata
numpy.ndarray
Datos en eje y.
Zorder
Número
Orden en eje z.
Estilo de final de línea. Estilo de unión de líneas. Visibilidad.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Colores Notebook-003.ipynb
• •
• •
El módulo matplotlib.colors incluye utilidades para especificar y convertir colores entre diferentes tipos de representación. Los colores básicos predefinidos pueden ser especificados usando una única letra: b (blue), g (green), r (red), c (cyan), m (magenta), y (yellow), k (black), w (white). Las sombras de gris pueden codificarse usando un flotante en [0, 1]. Otros colores pueden especificarse usando diferentes formatos: • HTML hex string: “#eeefff” • Tupla (R, G, B), con R, G y B en [0, 1]. • HTML string: “red”, “burlywood”, “chartreuse”, … Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Colores Mapas de colores • •
•
Notebook-003.ipynb
El módulo matplotlib.cm incluye un conjunto de ColorMaps: mapas de colores que pueden ser aplicados automáticamente a las figuras. Los mapas de colores son útiles en conjunción con imshow(): similar a plot(), pero interpreta los valores en el array de entrada como índices a un mapa de colores. Si el array de entrada es 2D, se dibujará una imagen en lugar de una barra. Es posible modificar los límites de los ejes en imshow() a través del parámetro extent.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Colores Manipulación de ejes •
• •
•
Notebook-003.ipynb
Es posible obtener una referencia a una instancia de clase matplotlib. axes.Axes, que permite configurar ciertos aspectos de alto detalle de las gráficas. La función matplotlib.pyplot.gca() devuelve una referencia a los ejes actualmente activos. P. ej., la llamada ax.xaxis.set_major_locator( matplotlib. ticker.MultipleLocator(10)) configura el eje x del objeto ax para ubicar los ticks en los valores múltiplo de 10. P. ej, la lamada ax.xaxis.set_major_formatter() permite especificar funciones que modificarán el formato de las etiquetas de los ticks del eje x del objeto ax. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Colores Leyendas y anotaciones •
•
•
•
Notebook-003.ipynb
Todas las funciones de dibujo que hemos visto (plot(), hist(), etc.) aceptan un parámetro label que indica el nombre a usar en la leyenda de la figura. La función matplotlib.pyplot.legend() permite construir, de forma automática, una leyenda a partir de una lista de handles. Si no se proporciona la lista, se usan todos los elementos de la figura cuya etiqueta no empiece por guión bajo. En otro caso, podemos usar las listas de líneas, etc. que son devueltas por cada función de dibujo para especificar qué elementos de la figura deben añadirse a la leyenda. La función matplotlib.pyplot.annotate() añade una anotación textual en el lugar indicado. Unión Europea FEDER
Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Guardado a fichero Notebook-003.ipynb
• • •
•
La figura activa puede ser guardada a un fichero usando matplotlib. pyplot.savefig(). El tipo de fichero a almacenar es inferido de la extensión en la ruta proporcionada para almacenar el fichero (.svg, .pdf, etc.). Los parámetros más importantes para controlar la calidad de la figura al ser almacenada son: • dpi: resolución en puntos por pulgada. • bbox_inches: pulgadas de espacio en blanco alrededor de la figura. No es necesario almacenar a disco: puede escribirse a cualquier objeto que soporte E/S, como StringIO. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Histogramas 2D
Parámetro de hist() bins
range
normed
Descripción Número de clases del histograma, o secuencia de límites entre las clases. Rango de cada clase. No usando si bins se proporciona como secuencia. Si es True, los valores son normalizados y el resultado es una distribución de densidad de probabilidad.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Histogramas 2D Notebook-003.ipynb
Parámetro de hist()
Descripción
histtype
Por defecto, diagrama de barras. Otros valores: ● barstacked : al trabajar con múltiples series de datos, apila las cajas. ● step: línea sin relleno. ● stepfilled : línea con relleno.
align
Indica cómo centrar las barras de cada clase: mid, left, o right.
color
Colores a usar en el histograma.
orientation
horizontal o vertical. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Gráficas circulares Notebook-003.ipynb
Parámetro de pie()
Descripción
explode
Fracción del radio a usar como offset de cada cuña.
autopct
String o función indicando cómo etiquetar cada cuña con un valor numérico.
pctdistance
Ratio entre el centro de cada cuña y el comienzo del texto de autopct.
labeldistance
Distancia radial para dibujar las etiquetas.
startangle
Ángulo de rotación del origen de la gráfica.
wedgeprops
Diccionario de propiedades de las cuñas. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Matplotlib - Gráficas 3D Notebook-003.ipynb
• •
•
A pesar de que Matplotlib está centrada en gráficas 2D, existen diversas extensiones (toolkits) que proporcionan capacidades 3D limitadas. El módulo mpl_toolkits.mplot3d proporciona métodos para dibujar gráficas 3D de puntos, superficies, lineas y mallas. A pesar de no ser la librería 3D más completa, la interfaz es muy similar a Matplotlib y por ello es muy utilizada. La diferencia fundamental es que los ejes que se usarán en las figuras pertenecen a la clase mpl_toolkits.mplot3d.Axes3D. La proyección de las figuras es realizada por clases especializadas, mientras que otras partes (etiquetas, ticks, etc.) son gestionadas directamente por Matplotlib, al igual que con gráficas 2D. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Formatos de texto JSON • • •
•
JSON (JavaScript Object Notation) es un estándar abierto en formato texto orientado a la transmisión de datos consistentes en pares atributo-valor. Se utiliza fundamentalmente como alternativa a HTML en la transmisión de datos en aplicaciones cliente-servidor. A pesar de que originalmente deriva de JavaScript, JSON es un formato independiente y mecanismos para facilitar su lectura y escritura están disponibles en un gran número de lenguajes de programación. Se trata de un formato mucho más flexible que otras alternativas de modo texto, como CSV.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Formatos de texto JSON obj = “““ { “nombre”: “Juan”, “residencias”: [“Estados Unidos”, “España”, “Alemania”], “mascota”: null, “parientes”: [ {“nombre”: “Andrés”, “edad”: 25, “mascota”: “Zuko” }, {“nombres”: “Elena”, “edad”: 33, “mascota”: “Cisco”} ] } ””” Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Formatos de texto JSON • • • •
Prácticamente código Python válido. Tipos básicos: objetos (diccionarios), arrays (listas), strings, números, booleanos y nulos. Todas las claves de un objeto deben ser strings. El módulo json, incluido en la librería estándar de Python, permite leer y escribir objetos Python en formato JSON mediante sus métodos loads() y dumps(), respectivamente.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Formatos de texto HTML y XML • • • • •
Notebook-004.ipynb
Muchos servicios web proporcionan sus datos en formatos HTML/XML. El módulo urllib2 permite establecer conexiones HTTP. El módulo lxml permite parsear diversos documentos XML, por ejemplo documentos HTML. Parsear páginas web no semánticas requiere un conocimiento detallado de su estructura. Muchos elementos HTML existen únicamente para dar formato a la página. A la hora de extraer la semántica subyacente será necesario manipular formatos, sintaxis, etc. Este proceso se conoce en inglés con el nombre de data wrangling, o data munging. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas •
• • •
Pandas proporciona estructuras de datos y funciones diseñadas para mejorar las capacidades de procesamiento de datos estructurados nativas de Python. La estructura básica de datos en Pandas es el DataFrame (similar al data.frame en R). Es una tabla 2D, muy similar a una hoja Excel. Pandas combina las capacidades de manipulación de arrays de NumPy con la flexibilidad de las hojas de cálculo y las bases de datos relacionales. Proporciona capacidades de indexación, redimensionamiento, troceo, agregación, y selección de subconjuntos.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas •
El objetivo de Pandas cuando se diseñó era solucionar determinadas carencias del tratamiento de datos con Python: • Estructuras de datos con ejes etiquedos que soporten alineamiento de datos explícito o implícito. • Tratamiento de series temporales: deben utilizarse las mismas estructuras de datos para tratar datos temporales y no temporales. • Operaciones aritméticas y reducciones teniendo en cuenta los ejes. • Tratamiento flexible de datos desconocidos. • Merges y operaciones similares típicas de bases de datos relacionales. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos Series Notebook-005.ipynb • • • •
Un objeto de tipo Series representa un objeto similar a un array 1D. Contiene un array de datos (de cualquier tipo NumPy) y un array asociado de etiquetas sobre los datos, llamado índice. Abusando del lenguaje, llamaremos “serie” a un objeto de tipo Series. También podemos pensar en una serie como en un diccionario de tamaño fijo y ordenado (dado que empareja índices y datos). De hecho, es posible usar series como entrada a funciones que esperan dicts.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos DataFrame Notebook-005.ipynb • • •
•
Un objeto de tipo DataFrame representa una estructura tabular, similar a una hoja de cálculo (o a data.frame en R) Contiene una colección ordenada de columnas, cada una de las cuales puede tener un tipo diferente (numérico, strings, etc.). Contiene un índice por filas y otro por columnas. En este sentido, puede verse como una agregación (o diccionario) de Series, en la que todas ellas comparten el mismo índice. Internamente los datos se almacenan en un formato 2D, aunque es posible representar datos de mayor dimensionalidad utilizando índices jerárquicos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos Constructor DataFrame() Argumento (tipo)
Notas
ndarray 2D
Matriz de datos, con etiquetas de filas y columnas opcionales.
dict de arrays, listas, o tuplas
Cada secuencia se convierte en una columna del DataFrame. Todas deben tener la misma longitud.
dict de Series
Cada valor se convierte en una columna. Los índices de las diferentes series son unificados si no se proporciona un índice explícito.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos Constructor DataFrame() Argumento (tipo)
Notas
dict de dicts
Cada diccionario interno se convierte en una columna. Las claves de los diferentes diccionarios son unificados igual que en el caso anterior.
list de dicts o Series
Cada item se convierte en una fila del DataFrame. La uni贸n de las claves de los diccionarios o de los 铆ndices de las series se convierte en las etiquetas de las columnas.
list de lists o tuplas
Tratado como el caso ndarray 2D . Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos Constructor DataFrame()
Argumento (tipo) DataFrame
Notas Se usan los índices del DataFrame proporcionado, a menos que se proporcionen otros explícitamente.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos Index Notebook-005.ipynb • • • •
Los objetos de tipo Index son los responsables de almacenar las etiquetas y nombres de los ejes. Cualquier otro array o secuencia proporcionada al construir un objeto de tipo Series o DataFrame es internamente convertida en Index. Los objetos de tipo Index son inmutables. Esto posibilita su compartición por diferentes estructuras. La clase Index proporciona métodos y propiedades para soportar lógica de conjuntos y examinar sus valores.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos Clases de Index Clase Index
Tipo de índice Array de objetos Python genérico.
Int64Index
Números enteros.
MultiIndex
Índice jerárquico, representando múltiples niveles de indexación en un único eje. Es similar a un array de tuplas.
DatetimeIndex
PeriodIndex
Marcas de tiempo, con resolución de nanosegundos. Períodos de tiempo. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos Métodos de Index Método append
diff intersection union isin
delete
Descripción Concatena objetos Index adicionales, produciendo un nuevo objeto. Diferencia de conjuntos entre Index. Intersección de conjuntos. Unión de conjuntos. Computa un array booleano indicando si cada uno de los objetos en el Index está contenido en una colección. Crea un nuevo objeto Index eliminando un elemento. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estructuras de datos Métodos de Index Método drop
insert is_monotonic is_unique unique
Descripción Crea un nuevo Index eliminando un grupo de elementos. Crea un nuevo Index insertando un nuevo elemento. True si cada elemento es mayor o igual que el anterior. True si el índice no tiene elementos duplicados. Computa el array de elementos únicos en el Index.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Funcionalidad esencial Notebook-005.ipynb
• • • • •
• •
Reindexación: método reindex(). Eliminación de entradas: método drop(). Indexación, selección y filtrado: operador [] y atributo ix de DataFrame. Operaciones aritméticas: operadores +, -, *, / y métodos add(), sub(), mul() y div(). Aplicación de funciones y mapeo: métodos básicos (mean(), sum(), …), método Series.map(), métodos DataFrame.apply() y DataFrame. applymap(). Ordenación y clasificación: métodos order(), sort(), sort_index() y rank(). Tratamiento de índices con duplicados: método Index.is_unique(). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Funcionalidad esencial Parámetros de reindex() Parámetro index method fill_value
Descripción Nueva secuencia a usar como índice. Método de interpolación (ffill o bfill). Valor a usar en caso de datos desconocidos.
limit
Tamaño máximo del hueco a rellenar mediante interpolación.
level
Nivel jerárquico sobre el que comparar un índice simple.
copy
Indica si se deben copiar los datos en caso de que el nuevo índice y el antiguo sean equivalentes (True por defecto). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Funcionalidad esencial Modos de indexaci贸n de DataFrame
Sintaxis
Notas
obj[val]
Selecciona una columna o subconjunto de ellas, excepto si val es un array o DataFrame booleano, en cuyo caso act煤a como filtro sobre las filas.
obj.ix[val]
Selecciona una fila o subconjunto de ellas.
obj.ix[:,val]
Selecciona columna o subconjunto de ellas.
obj.ix[val1, val2]
Selecciona tanto filas como columnas.
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Funcionalidad esencial Modos de indexación de DataFrame
Sintaxis reindex() xs()
icol() / irow() get_value() / set_value()
Notas Organiza uno o más ejes conforme a nuevos índices. Selecciona una única fila o columna como Series a través de su etiqueta. Selecciona una columna / fila única mediante su posición. Selecciona un valor único a través de sus etiquetas por filas y columnas.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Funcionalidad esencial Rotura de empates en rank()
Method ‘average’
Descripción Por defecto. Asigna la media de los rangos a todos los elementos del grupo empatados.
‘min’
Asigna el rango mínimo a todos los elementos del grupo.
‘max’
Asigna el rango máximo a todos los elementos del grupo.
‘first’
Clasifica los elementos del grupo atendiendo a su posición relativa.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estadísticos descriptivos Parámetros de reducciones
Parámetro axis skipna level
Descripción Eje sobre el que ejecutar la reducción (filas=0,columnas=1). Excluir valores desconocidos. True por defecto. Reducción agrupada al nivel level en índices jerárquicos.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estadísticos descriptivos Métodos Método count describe
min / max
Descripción Número de valores distintos de NaN. Computa una serie de estadísticos para una serie o las columnas de un DataFrame. Valor mínimo / máximo.
argmin / argmax
Posiciones de los valores mínimo / máximo.
idxmin / idxmax
Índices (etiquetas) de los valores mínimo / máximo.
quantile sum
Devuelve el cuantil del orden p indicado. Suma de los datos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estadísticos descriptivos Métodos Método mean median
Descripción Media aritmética. Mediana.
mad
Desviación media.
var
Varianza muestral.
std
Desviación típica.
skew
Coeficiente de asimetría (tercer momento estándar).
kurt
Coeficiente de curtosis (cuarto momento estándar). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estadísticos descriptivos Métodos
Método cumsum cummin, cummax cumprod diff pct_change
Descripción Suma acumulada. Mínimo / máximo acumulado. Producto acumulado. Diferencias de primer orden. Diferencia porcentual.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Estadísticos descriptivos Conteo y pertenencia en Series
Método isin unique value_counts
Descripción Pertenencia vectorizada. Extracción de valores únicos. Frecuencia de los valores únicos.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Datos desconocidos Notebook-005.ipynb
• •
•
La existencia de datos desconocidos es muy común en la mayor parte de aplicaciones de análisis de datos. Pandas facilita el tratamiento de este tipo datos, p. ej., todas las funciones que computan estadísticos descriptivos omiten de forma automática los valores desconocidos. Por defecto, se utiliza numpy.nan como marca de valor desconocido. None también es tratado como valor desconocido por Pandas.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Datos desconocidos Parámetros de fillna()
Parámetro value method
Descripción Valor escalar o diccionario con el que rellenar. Interpolación (“ffill” o “bfill”).
axis
Eje sobre el que rellenar (por defecto 0, por filas).
inplace
Modifica el objeto en lugar de devolver uno nuevo.
limit
Número máximo de valores consecutivos a interpolar.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Indexación jerárquica Notebook-005.ipynb
• • • •
La indexación jerárquica permite trabajar (a nivel conceptual) con objetos DataFrame de más de dos dimensiones. Se implementa a través de la creación de diferentes niveles en los índices de la tabla. Los índices jerárquicos se implementan a través de la clase MultiIndex. Es posible aplicar las operaciones previamente estudiadas a diferentes niveles en la jerarquía de índices, permitiendo obtener objetos de tipo DataFrame (en lugar de Series) tras una reducción.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Otras consideraciones Indexación con enteros •
Los objetos Pandas indexados mediante enteros pueden llegar a ser confusos, pues la semántica de indexación posicional y por etiquetas es diferente.
obj = Series( range(5), index=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’] ) obj[-1] ?? obj = Series( range(5), index=range(5) ) obj[-1] ?? Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Otras consideraciones Indexación con enteros • En objetos con índices enteros, Pandas no puede decidir si el usuario quiere realizar indexación posicional o basada en etiquetas. • Lo soluciona realizando siempre indexación basada en etiquetas. • Proporciona el método Series.iget_value() y DataFrame.irow().
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas - Otras consideraciones Panel Notebook-005.ipynb • •
• •
Aunque no lo analizaremos en profundidad, Pandas proporciona una clase Panel que es el análogo 3D de un DataFrame. No es la clase más desarrollada de Pandas: se ha optado en su lugar por dar soporte a los índices jerárquicos, que hacen innecesarios datos 3D en la mayoría de los casos. Un panel tiene tres índices: items (cada uno de ellos es un DataFrame), major_axis (las filas) y minor_axis (las columnas). Se proporcionan métodos Panel.to_frame() y DataFrame. to_panel() para realizar conversiones entre ambos tipos de objeto.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: E/S de datos Lectura/escritura de texto •
Pandas proporciona un conjunto de funciones para crear objetos DataFrame a partir de datos tabulares almacenados en ficheros. Los más utilizados son read_csv() y read_table() (equivalentes a día de hoy), que proporcionan opciones para: •
• • • •
•
Notebook-006.ipynb
Utilizar una o más columnas del fichero como índices del DataFrame, así como dar nombres a las columnas bien mediante parámetros, bien extrayéndolos de alguna fila del fichero. Inferencia de tipos y conversiones de datos. Parseo de fechas, incluyendo combinaciones de varias columnas en una sola en el resultado. Iteración sobre trozos (chunks) en grandes ficheros. Limpieza de datos: ignorar algunas filas o columnas, comentarios, etc.
La inferencia de tipos implica que no es necesario especificar qué columnas son numéricas, enteras, booleanas, o strings. La gestión de fechas u otros tipos propios implica más esfuerzo. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: E/S de datos Parámetros de read_csv / read_table Parámetro path sep / delimiter header
index_col
Descripción URL del fichero a abrir. Expresión regular a usar para la división de campos. Número de fila que contiene los nombres de las columnas (0 por defecto), o None. Columnas a usar como índice del DataFrame.
names
Nombres para las columnas del DataFrame. Combinar con header=None .
skiprows
Número de filas a ignorar al comienzo del fichero, o lista de números de filas a ignorar. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: E/S de datos Parámetros de read_csv / read_table Parámetro na_values comment parse_dates
keep_date_col
Descripción Valores a considerar NaN. Expresión regular a interpretar como comentarios. Intenta parsear fechas a un objeto datetime. False por defecto. Si es True, intentará parsear todas las columnas. También puede ser una lista de columnas específicas. Si un elemento de la lista es una tupla/lista, intentará combinar las columnas indicadas para parsear una única fecha. Si se unen columnas para construir fechas, ignorar las columnas unidas. True por defecto. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: E/S de datos Parámetros de read_csv / read_table Parámetro
Descripción
converters
Diccionario conteniendo un mapeo de columnas a funciones. Se aplicará la función correspondiente a todos los elementos de una determinada columna antes de introducirlo en el resultado.
dayfirst
date_parser
Al parsear fechas potencialmente ambiguas, tratarlas como fechas internacionales (DD/MM/AAAA). False por defecto. Función a usar para parsear fechas.
nrows
Número de filas a leer desde el comienzo del fichero.
iterator
Si True, el valor de retorno será un objeto de tipo TextFileReader para procesar el fichero a trozos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: E/S de datos Parámetros de read_csv / read_table Parámetro chunksize skip_footer verbose encoding squeeze
thousands
Descripción Si la iteración está activada, tamaño de cada trozo. Número de líneas a ignorar al final del fichero. Si True, imprime información variada sobre el parseo. Codificación de caracteres, p. ej. ‘utf-8’. Si True, en caso de que el fichero sólo contenga una columna, devolver una serie. Separador de millares, p. ej. ‘,’ o ‘.’ Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: E/S de datos Formatos binarios •
• •
•
Notebook-006.ipynb
El módulo pickle de la librería estándar Python incorpora un sencillo y cómodo método para serializar (marshall) y deserializar (unmarshall) objetos a formato binario. Pandas proporciona métodos to_pickle()/read_pickle() que permiten almacenar/leer objetos a/desde ficheros pickle. El uso de pickle no está recomendado como método de almacenamiento a largo plazo. El motivo es que la retrocompatibilidad de pickle no está garantizada. Pandas también incorpora funciones para leer y escribir ficheros Excel, HDF5, Stata, y HTML, entre otros. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: E/S de datos HTML y servicios web • • • • •
Notebook-006.ipynb
Muchos sitios web proporcionan APIs que dan acceso a fuentes de datos en formato JSON. Existen varias maneras de acceder a estos servicios desde Python. Una de las más sencillas es a través del paquete requests. A través de las funciones de este paquete, es posible cargar los objetos JSON en nuestra aplicación. A partir de estos, la construcción de objetos Pandas es trivial, como hemos visto anteriormente.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: E/S de datos Bases de datos • • •
•
Notebook-006.ipynb
Los ficheros de texto o binarios son ineficientes en el almacenamiento de grandes cantidades de datos. Las bases de datos, tanto SQL como no SQL, son una de las fuentes de datos más comunes en muchas aplicaciones. Pandas proporciona métodos para cargar datos a partir de consultas SQL de forma sencilla. El módulo pandas.io.sql permite ejecutar sentencias SQL y procesar los resultados. Otro tipo de bases de datos NoSQL, como por ejemplo MongoDB, almacenan datos en diferentes formatos: JSON, texto, etc. La carga de datos deberá adaptarse a cada caso concreto. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos • •
Gran parte del trabajo de análisis de datos se centra en la preparación, carga, limpieza, transformación, y reorganización de los datos. Pandas y Python, proporcionan un conjunto de herramientas de manipulación flexibles y de alto nivel para realizar estas transformaciones: • • •
•
Combinación y mezcla de conjuntos de datos: merge(), concat(), combine_first(). Reorganización y pivotado: stack(), unstack(), pivot(). Transformación: gestión de duplicados, aplicación de funciones, reemplazo de valores, renombrado de ejes, discretización y agrupación, filtrado de valores atípicos, permutación y muestreo aleatorio. Manipulación de strings: normalización, limpieza, uso de expresiones regulares... Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Combinación y mezcla Notebook-007.ipynb
•
•
•
pandas.merge() conecta filas en diferentes objetos DataFrame basándose en una o más claves. Similar a una operación join en una base de datos relacional. pandas.concat() pega o apila objetos, permitiendo configurar la operación: • ¿Cuáles son las nuevas etiquetas de ejes? (unión, intersección, …) • ¿Son los grupos originales identificables en el objeto resultante? • ¿Es importante el eje de concatenación? El método combine_first() permite combinar conjuntos de datos que presentan solapamiento para rellenar valores ausentes en los campos de un objeto con valores presentes en el otro. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Parámetros de merge()
Parámetro
Descripción
left
Operando izquierdo del merge.
right
Operando derecho del merge.
how
on
[‘inner’|’outer’|’left’|’right’] . ‘inner’ por defecto. Nombres de las columnas para formar la clave de join. Deben encontrarse en ambos objetos DataFrame. Si no se especifican, se usarán todas las columnas con nombres coincidentes.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Parámetros de merge()
Parámetro left_on
Descripción Columnas en el operando izquierdo a usar como clave de join.
right_on
Columnas en el operando derecho a usar como clave de join.
left_index
[True|False] . Utiliza los índices en el operando izquierdo como clave de join.
right_index
[True|False] . Utiliza los índices en el operando derecho como clave de join.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Parámetros de merge()
Parámetro
Descripción
sort
[True|False] . Ordenar lexicográficamente el merge por las claves de join. True por defecto. Desactivar para mejorar el rendimiento con tablas grandes.
suffixes
Tupla de valores a añadir a los nombres de las columnas con solapamiento. (‘_x’, ‘_y’) por defecto.
copy
Si es False, intenta evitar la copia de datos en una nueva estructura en algunos casos extraordinarios. True por defecto.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Parámetros de concat()
Parámetro
Descripción
objs
Lista o diccinario de objetos a concatenar. Es el único argumento obligatorio.
axis
Eje sobre el que concatenar. 0 por defecto (filas).
join
[‘inner’|’outer’] . ‘outer’ por defecto. Determina si los índices deben unirse o intersecarse.
join_axes
Índices específicos a utilizar para los (n-1) ejes sobre los que no se realiza la concatenación (en lugar de unión o intersección).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Parámetros de concat() Parámetro
Descripción
keys
Valores a asociar con los objetos concatenanados, formando un índice jerárquico sobre el eje.
levels
Índices específicos a utilizar como niveles jerárquicos. Si no se proporcionan, se inferirán de keys.
names
Nombres para los niveles jerárquicos creados si se utilizan keys y/o levels.
verify_integrity
Comprobar el eje concatenado en el nuevo objeto y lanzar una excepción si hay duplicados. False por defecto.
ignore_index
No preservar los valores de los índices en el eje de concatenación. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Reorganización y pivotado Notebook-007.ipynb
• • •
Una clase de transformaciones diferentes a la combinación de datos de diversas tablas es su reorganización, en ocasiones denominada pivotado. Consiste en la transposición de filas y columnas, modificando la dimensionalidad de los datos. Las operaciones básicas de las que dispone Pandas para realizar este tipo de transformaciones son: • stack(): pivota las columnas de la tabla hacia las filas. • unstack(): pivota las filas de la tabla hacia las columnas. • pivot(): reorganiza índices y columnas, permitiendo transformar en un solo paso tablas en formato “largo” a formas compactas. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Transformaciones de datos Notebook-007.ipynb
•
Hasta ahora nos hemos centrado en la reorganización estructural de las tablas. Existen otro tipo de transformaciones importantes, centradas sobre los datos: • Eliminación de duplicados: duplicated(), drop_duplicates(). • Aplicación de funciones: apply(), map(), applymap(). • Reemplazo de valores: replace(). • Renombrado de índices: rename(). • Discretización y agrupación: cut(), qcut(). • Detección y filtrado de valores atípicos. • Permutación y muestreo aleatorio: permutation(), take(). • Cómputo de indicadores y variables cualitativas: get_dummies(). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Manipulación de strings Notebook-007.ipynb
• •
• •
Una de las características más populares de Python es su capacidad de manipulación de strings. Los objetos de la clase str incluyen métodos que permiten realizar numerosas transformaciones sobre strings de forma sencilla, desde troceo hasta búsquedas, sustituciones, etc. Muchas de estas operaciones aceptan expresiones regulares como parámetros. Pandas suma funcionalidades al permitir aplicar operaciones sobre strings sobre tablas de datos gestionando automáticamente los valores ausentes.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Métodos de la clase str Método count
endswidth / startswidth
Descripción Devuelve el número de ocurrencias sin solapamiento de un substring en un string. True si el string termina / empieza con el sufijo / prefijo indicado.
join
Utiliza el string como delimitador para concatenar una secuencia de strings proporcionada como parámetro.
index
Devuelve la posición del primer caracter de la primera aparición de una subcadena especificada. Lanza ValueError si no se encuentra. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Métodos de la clase str Método
Descripción
find
Como index(), pero devuelve -1 si no encuentra la cadena.
rfind
Como find(), pero devuelve la posición de la última aparición de la subcadena.
replace strip / rstrip / lstrip split
Reemplaza las ocurrencias de una subcadena con otra. Elimina espacios en blanco al principio y final / final / principio de un string. Rompe una cadena en subcadenas usando el delimitador especificado. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Métodos de la clase str
Método
Descripción
lower / upper
Convierte los caracteres alfabéticos de la cadena a minúsculas / mayúsculas.
ljust / rjust
Justifica a la izquierda / derecha. Inserta espacios en blanco en el lado opuesto del string para alcanzar una longitud mínima.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Expresiones regulares Notebook-007.ipynb
• •
• •
Las expresiones regulares proporcionan una manera flexible de especificar cadenas de caracteres con ciertas propiedades estructurales. Una expresión regular es una cadena de caracteres que contiene ciertos elementos, denominados caracteres especiales, con una semántica específica. Una expresión regular describe un patrón a localizar en el texto, o un modo de manipularlo. El módulo re de la librería estándar Python is responsable de la aplicación de expresiones regulares a strings. Sus funciones se dividen en tres categorías: emparejamiento de patrones, sustituciones, y división. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Métodos de objetos regex Método
Descripción
findall / finditer
Devuelve una lista / un iterador de todas las ocurrencias no solapadas del patrón.
match
Empareja el patrón con el comienzo del string. Devuelve un objeto de tipo match o None.
search
Busca el patrón en todo el string, devolviendo un match a la primera ocurrencia en tal caso.
split
Rompe el string en trozos separados por ocurrencias del patrón.
sub, subn
Reemplaza todas / las primeras n ocurrencias del patrón Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Métodos string vectorizados en Pandas Método cat contains
count endswith / startswith findall
Descripción Concatena los strings en la serie con delimitador opcional. Devuelve un array booleano indicando si cada elemento contiene el patrón. Cuenta las ocurrencias del patrón. Aplicación de las funciones homónimas de str, elemento a elemento. Computa la lista de todas las ocurrencias del patrón para cada elemento. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Métodos string vectorizados en Pandas Método get join
len lower / upper match pad
Descripción Indexa cada elemento de la serie. Une las listas de strings contenidas en la serie con el delimitador especificado. Longitud de cada string. Convierte a minúsculas / mayúsculas cada elemento. Utiliza re.match con el patrón proporcionado en cada string. Añade espacios en blanco a izquierda, derecha o ambos lados de cada string. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Limpieza y transformación de datos Métodos string vectorizados en Pandas Método
Descripción
center
Equivalente a pad(side=“both” ) .
repeat
Replica valores, p. ej. s.str.repeat(3) es equivalente a x*3 para cada string en la serie.
replace
Reemplaza elementos del patrón con otro patrón.
slice
Extrae substrings de cada string de la serie.
split
Divide los strings de la serie usando un delimitador.
strip / rstrip / lstrip
Equivalentes a las funciones homónimas en str, aplicadas a cada elemento de la serie. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Visualización Notebook-008.ipynb
• • •
•
Matplotlib proporciona una enorme potencia a la hora de realizar representaciones gráficas, pero es una herramienta de bajo nivel. Motivo: una gráfica habitualmente involucra información contenida en diversos objetos Python sin semántica implícita. Los objetos Pandas centralizan la mayor parte de los datos necesarios para representarlos gráficamente, y su semántica es al menos parcialmente conocida. Los objetos Pandas proporcionan un método plot() que permite construir representaciones complejas de forma concisa.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Visualización Parámetros de plot() Parámetro
Descripción
ax
Objeto matplotlib sobre el que realizar la representación. Si no se proporciona nada se usará el subplot activo.
kind
[‘line’|‘bar’|‘barh’|‘hist’|‘box’|‘kde’| ‘density’|‘area’|‘pie’|‘scatter’|‘hexbin’] . Tipo de gráfica.
logx / logy use_index rot xticks / yticks
Utilizar escala logarítmica en el eje X / Y. Utilizar los valores del índice en las etiquetas de los ticks. Ángulo de rotación de las etiquetas de los ticks. Valores a usar en los ticks del eje X / Y.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Visualización Parámetros de plot() Parámetro xlim / ylim grid subplots
sharex / sharey layout figsize
Descripción Límites del eje X / Y (formato: [min,max]). [True|False]. Muestra las líneas de los ejes. [True|False] . Si True, dibuja cada columna en gráficas separadas. [True|False] . Si subplots=True , compartir el eje X / Y. Tupla indicando la geometría de subplots a utilizar. Tamaño de la figura. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Visualización Parámetros de plot() Parámetro title legend style
loglog
Descripción Título de la gráfica. [True|False|‘reverse’]. Incluir leyendas. Diccionario emparejando las columnas con el estilo a usar en su representación. Usar escala logarítmica en ambos ejes.
fontsize
Tamaño de fuente para los ticks.
colormap
Mapa de colores. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Visualización Parámetros de plot() Parámetro
Descripción
colorbar
[True|False] . Indica si dibujar la leyenda de valores (sólo para gráficas ‘scatter’ y ‘hexbin’).
table
stacked sort_columns
secondary_y
Si se le proporciona un objeto Series o DataFrame, lo incluye en la gráfica. Útil para combinar gráficas y tablas. Crear gráficas apiladas. [True|False]. Determina si ordenar lexicográficamente las columnas a la hora de representarlas. Lista de columnas a referenciar a eje Y secundario. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Visualización Parámetros de plot()
Parámetro
Descripción
mark_right
[True|False] . Al utilizar un eje secundario, añade automáticamente a las leyendas de las series referenciadas a éste el sufijo “(right)”.
**kwds
Los parámetros no procesados por Pandas serán pasados directamente a Matplotlib.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Agregación •
•
Uno de los motivos de la popularidad de las BBDD relacionales y SQL es la facilidad para la agrupación, filtrado, transformación y agregación de los datos. Sin embargo, la expresividad de SQL es limitada. Usando Pandas es posible implementar flujos split-apply-combine de forma sencilla: • Dividir un objeto Pandas en trozos usando una o más claves complejas (p. ej. aplicando funciones discriminantes). • Computar estadísticos sumarizando los datos de cada trozo, y aplicar transformaciones a cada grupo: normalización, regresión lineal, ... • Aplicar una o varias funciones a cada columna de un DataSet. • Computar tablas pivote y tabulaciones cruzadas. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Agregaci贸n
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Agregación Agrupación de datos • • • •
Notebook-009.ipynb
Un aspecto crítico de todas estas transformaciones es la categorización del conjunto de datos. Los datos de un objeto Pandas son divididos en grupos basándose en una clave de agrupación sobre un eje particular. El mecanismo proporcionado por Pandas para realizar este tipo de operaciones es la función groupby(). Una clave de agrupación puede tomar muchas formas, p. ej: • Una lista o array de valores que tenga la misma longitud del eje de agrupación. • Un valor indicando un nombre de columna. • Un diccionario con correspondencias entre valores y grupos. • Una función a ser invocada sobre el índice del eje. Unión Europea FEDER
Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Agregación Funciones de agregación • •
•
Notebook-009.ipynb
Con agregación nos referimos a cualquier transformación de datos que produce un valor escalar a partir de arrays (también llamada reducción). Las operaciones de agregación implementadas en los objetos GroupBy han sido optimizadas y son computadas sobre los datos originales de las tablas o series. Pandas no limita las operaciones de agregación a este conjunto: cualquier función, incluidas las definidas por el usuario, puede ser aplicada sobre un objeto agrupado.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Agregación Métodos en GroupBy
Método count
Descripción Número de valores no-NaN en el grupo.
sum
Suma de valores no-NaN.
mean
Media de valores no-NaN.
median
Mediana aritmética de valores no-NaN.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Agregación Métodos en GroupBy
Método
Descripción
std / var
Desviación típica / varianza muestral.
min / max
Mínimo / máximo de valores no-NaN.
prod
Producto de valores no-NaN.
first / last
Primer / último valor no-NaN.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Operaciones sobre grupos Notebook-009.ipynb
• • •
La agregación sólo representa a una clase de transformaciones: utiliza funciones que aceptan múltiples entradas y producen un resultado escalar. En el caso general, es deseable aplicar operaciones de cualquier tipo sobre los grupos. Esto se hace a través de las funciones transform() y apply(): • transform() permite hacer broadcast del resultado de una operación sobre grupos sobre los miembros originales del grupo. • apply() ejecuta una función sobre cada grupo y pega los resultados de las mismas mediante pandas.concat().
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: tablas pivote y tabulaciones cruzadas Notebook-009.ipynb
• •
•
Pandas soporta la generación de tablas pivote y tabulaciones cruzadas mediante los métodos pivot_table() y crosstab(). Una tabla pivote no es más que una tabla compuesta de un conjunto de estadísticos resumen agrupada de una determinada forma. Puede ser calculada mediante groupby() y otras funciones, pero pivot_table() proporciona una interfaz cómoda de alto nivel. Una tabulación cruzada es un caso especial de tabla pivote que computa frecuencias grupales. Igualmente podría ser calculada a través de otras funciones, pero crosstab() simplifica el proceso.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Notebook-010.ipynb
• • • •
•
Cualquier conjunto de datos que incluya la observación de un fenómeno en diferentes puntos temporales es una serie temporal. Algunas series temporales usan frecuencia fija, repitiendo las observaciones cada cierto tiempo. Otras son irregulares, sin un intervalo único entre observaciones. El modo de representar el tiempo depende de la aplicación. Entre otros: • Marcas de tiempo (instantes específicos con granularidad definida). • Periodos fijos (p. ej. un mes determinado, un trimestre, un año…). • Intervalos de tiempo (marcas temporales de inicio y final). • Tiempo transcurrido (con respecto a una referencia fija). Pandas proporciona diferentes herramientas y algoritmos para trabajar con datos temporales: selección, transformación, agregación, remuestreo, etc. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Frecuencias base Alias
Tipo de Offset
Descripci贸n
D
Day
Diaria (d铆as naturales).
B
BusinessDay
Diaria (d铆as laborables).
H
Hour
T / min
Minute
Cada minuto.
S
Second
Cada segundo.
L / ms
Milli
Cada milisegundo.
U
Micro
Cada microsegundo.
Horaria.
Uni贸n Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Frecuencias base Alias
Tipo de Offset
Descripción
M
MonthEnd
BM
BusinessMonthEnd
MS
MonthBegin
BMS
BusinessMonthBegin
W-MON, ...
Week
Semanalmente en el día de la semana especificado.
WOM1MON,...
WeekOfMonth
Mensualmente en el día de la semana especificada (primer lunes, etc.).
Cada último día natural del mes. Cada último día laborable del mes. Cada primer día natural del mes. Cada primer día laborable del mes.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Frecuencias base Alias
Tipo de Offset
Descripción
Q-JAN, ...
QuarterEnd
Trimestral, con anclaje en el último día natural del mes especificado.
BQ-JAN, ...
BusinessQuarterEnd
Trimestral, con anclaje en el últiumo día laborable del mes especificado.
QS-JAN, ...
QuarterBegin
Trimestral, con anclaje en el primer día natural del mes especificado.
BQS-JAN, ...
BusinessQuarterBegin
Trimestral, con anclaje en el primer día laborable del mes especificado.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Frecuencias base Alias
Tipo de Offset
Descripción
A-JAN, ...
YearEnd
Anual, con anclaje en el último día natural del mes especificado.
BA-JAN, ...
BusinessYearEnd
Anualmente, con anclaje en el último día laborable del mes especificado.
AS-JAN, ...
YearBegin
Anualmente, con anclaje en el primer día natural del mes especificado.
BAS-JAN, ...
BusinessYearBegin
Anualmente, con anclaje en el primer día laborable del mes especificado.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Parámetros de resample() Parámetros freq how axis fill_method
closed
label
Descripción String o DateOffset indicando la nueva frecuencia. Función o nombre de función de agregación. Eje del remuestreo (0 por defecto, filas). Método de interpolación en operaciones de upsampling (‘ffill’ o ‘bfill’). En operaciones de downsampling, qué lado del intervalo se considera cerrado (‘right’ o ‘left’). En operaciones de downsampling, como etiquetar el resultado agregado (‘right’ o ‘left’). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Parámetros de resample() Parámetros loffset limit
kind
convention
Descripción Ajuste de las etiquetas de los datos remuestreados. Al hacer interpolación, número máximo de huecos consecutivos a rellenar. Al remuestrear, generar objetos de tipo Timestamp o Period. Por defecto, conserva el tipo actual. Al remuestrear periodos, la convención (‘start’ o ‘end’) a usar al hacer upsampling.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Funciones ventana Función rolling_count rolling_sum rolling_mean rolling_median rolling_std / rolling_var rolling_skew / rolling_kurt
Descripción Número de observaciones no-NaN. Suma acumulada. Media muestral. Mediana. Desviación típica / varianza. Coeficiente de apuntamiento / curtosis.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Funciones ventana
Función rolling_min / rolling_max rolling_quantile rolling_corr / rolling_cov rolling_apply
Descripción Valor mínimo / máximo. Cálculo de cuantiles. Correlación / covarianza. Aplica una función array genérica sobre la ventana móvil.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pandas: Series temporales Funciones ventana
Función ewma ewmstd / ewmvar ewmcorr / ewmcov
Descripción Media móvil con pesos exponenciales. Desviación típica / varianza con pesos exponenciales. Correlación / covarianza con pesos exponenciales.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos •
Un computador utiliza múltiples tecnologías de E/S en su interacción con el mundo: • Cintas para backup. • Discos magnéticos para HDD. • SSD para acceso rápido a funciones del sistema. • Flash (llaveros USB) para portabilidad. • Discos ópticos (DVD) para distribución de software.
•
POSIX define funciones de acceso a datos independientes del medio físico de almacenamiento (read(), write(), fread(), etc.) Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos •
Sin embargo, bajo el estándar POSIX la aplicación (programador) es responsable de: • Utilizar las primitivas proporcionadas por el SO (¡no todos son POSIX!) • Organizar los datos según un modelo de secuencia de bytes. • Realizar las conversiones necesarias entre diferentes formatos de almacenamiento (p. ej. al leer ficheros generados por una arquitectura big-endian en una máquina little-endian).
•
Idea: independizar a las aplicaciones de la lógica de almacenamiento. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF • •
•
En 1982, la NASA concibe CDF. Su objetivo es mostrar al piloto de un transbordador datos climatológicos, obtenidos de diferentes fuentes, de forma unificada en una sola pantalla a través del sistema Pilot Climate Data System (PCDS). Se basa en dos conceptos fundamentales: • Inclusión en el fichero de datos de una sección de metadatos: datos descriptivos que permiten conocer lo que el fichero contiene. • Desarrollo de un API entre la aplicación y el operativo que desacople la semántica de los datos de su lógica de almacenamiento.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF • •
• •
NetCDF surge en 1990 como continuación del proyecto CDF. Mantiene los objetivos de CDF, y añade: • Portabilidad y formato independiente de la máquina. • Interfaz C (CDF solamente dispone de interfaz Fortran). • Implementación UNIX. • Mecanismo de acceso instantáneo a múltiples datos (notación de slices, en el mundo Python). API común utilizada por todos los productores/consumidores de datos: desacopla clientes de servidores. Abstracción prestada del modelo relacional, que no se adaptaba bien a datos científicos (grandes arrays multidimensionales con coordenadas). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF •
Un fichero NetCDF modela un conjunto de datos usando los siguientes conceptos: • Variables multidimensionales: • Tipo de datos. • Forma (dimensionalidad). • Propiedades (pares atributo/valor). • Dimensiones (coordenadas): • Tamaño. • Propiedades (pares atributo/valor). • Propiedades del fichero (pares atributo/valor). Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF •
• •
Forman parte de los datos: • Los nombres de dimensiones, variables y atributos. • Los sistemas de coordenadas asociados a las variables. • Las unidades de las coordenadas y variables. • Los atributos que capturan cualquier otra información descriptiva sobre los datos contenidos en el fichero. Interfaz de alto nivel: se accede a los datos usando su nombre y la hiperlámina (slice) a acceder (en contraposición a ristras de bytes). Se soportan los tipos de datos típicos de aplicaciones científicas: strings y números, tanto enteros como en punto flotante. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF • •
•
Posee interfaz C, pero lo utilizaremos desde Python. En lugar de funciones estilo C (nc_get_var(), nc_put_var()) se utiliza sintaxis de arrays NumPy junto con funciones de creación y lectura de objetos. La sintaxis de slices propia de NumPy es directamente transformable a sintaxis vector de esquina + vector de longitud de aristas: [ … , ek + ak, … ] = [ … , ek:ek+ak, … ]
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF • • •
• •
En NetCDF, los accesos de hiperlámina siempre devuelven memoria contigua, incluso si los datos originales no son contiguos en disco. No es posible utilizar un “paso” distinto de 1 en el acceso a hiperláminas (menos versátil que slices). Las APIs NetCDF son consistentes con las convenciones de memoria del lenguaje huésped: p. ej., en la interfaz C la última dimensión es la que varía más rápido, mientras que en la interfaz Fortran es la primera. Un array definido en Fortran como [N][M] será leído en C/Python como [M][N]. Una única dimensión puede ser ilimitada (crecer arbitrariamente tras su definición). Debe ser la de crecimiento más lento. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF •
Internamente, NetCDF (hasta su versión 4) utiliza el formato XDR (eXternal Data Representation): • Estándar no propietario de Sun Microsystems para la representación de datos de forma independiente de la arquitectura. • XDR soporta la representación de estructuras C arbitrarias, aunque NetCDF sólo soporta arrays multidimensionales de tipos básicos. • Todas las conversiones entre formatos de datos dependientes de la arquitectura tienen lugar en el nivel XDR, por lo que son totalmente transparentes al usuario de NetCDF, que siempre verá los datos en el formato nativo de la máquina. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos NetCDF Notebook-011.ipynb
•
Limitaciones de NetCDF-3: • Dimensión ilimitada única, debido a problemas de representación interna. • No es posible realizar acceso secuencial de datos, por lo que es imposible leer/escribir de/a entrada/salida estándar. Deben usarse ficheros intermedios. • No es un sistema de BBDD. Es imposible acceder a los datos excepto a través de su nombre y coordenadas (p. ej. no es posible hacer búsquedas por datos mayores que un determinado valor automáticamente). • No es posible representar otra cosa que arrays multidimensionales. (p. ej. listas de estructuras). Unión Europea FEDER
Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos Convenciones COARDS
Atributo long_name scale_factor
add_offset
Descripción Nombre descriptivo de los datos de una variable. Si está presente, el programa que lea los datos debe multiplicarlos por un factor de escalado. Si está presente, se interpreta como un desplazamiento a aplicar a todos los puntos de datos de la variable.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos Convenciones COARDS
Atributo valid_range _FillValue
missing_value
Descripción Rango válido de valores. si está presente, se usará al inicializar los datos en disco. Se considera un valor tipo N/A, por lo que debería estar fuera del rango válido de datos. Igual que el anterior, pero sin tratamiento especial (no se inicializan los datos tras la reserva).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos HDF5 • • • •
HDF: Hierarchical Data Format. Surge en 1987 de forma paralela a NetCDF. Desarrollado por University of Illinois at Urbana-Champaign y National Center for Supercomputing Applications. Sus objetivos difieren de los de NetCDF: • Conseguir independencia de arquitectura subyacente. • Acceder y almacenar grandes objetos de forma eficiente. • Almacenar objetos de diferentes tipos en un único contenedor. • Definir un formato flexible capaz de acomodar nuevos tipos de objetos y metadatos. • Proporcionar interfaces C y Fortran. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos HDF5 •
•
•
En la década de los 90, mediante financiación de la NSF, HDF mejora sus capacidades de cara al público (documentación, soporte, etc.) e introduce compatibilidad con ficheros NetCDF. En 1996 se crea, sobre HDF4, un nuevo formato capaz de E/S paralela para su uso en los supercomputadores de Sandia, Los Alamos, y Lawrence-Livermore National Laboratory. Surge HDF5. Conceptualmente, un fichero HDF5 es similar a un fichero NetCDF: contiene datos + metadatos, pero sólo trabaja con dos tipos de objeto: • Grupo: estructura que agrupa cero o más objetos HDF5, + metadatos. • Dataset: array multidimensional de datos, + metadatos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos HDF5 • •
•
La estructura jerárquica formada por grupos y datasets es similar a un árbol de directorios. Los objetos se referencian mediante rutas: • “/” es el grupo raíz del fichero. • “/foo” es el objeto foo dentro del grupo raíz del fichero. • “/foo/bar” es el objeto bar dentro del grupo foo dentro del grupo raíz del fichero. En HDF5 un Dataset agrupa los conceptos de variable + dimensión NetCDF: las dimensiones no existen como concepto independiente de un Dataset. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos HDF5 •
• •
Un Dataset se crea a partir de: • Una ubicación: el grupo que contiene al objeto. • Un nombre. • Un tipo de datos. • Un espacio de datos (dataspace, que indica la dimensionalidad del dataset). El módulo h5py soporta el almacenamiento en HDF5 de cualquier objeto Python, a excepción de strings Unicode y Object genéricos. Básicamente intenta soportar cualquier cosa que esté soportada por NumPy. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos HDF5 •
•
El dataspace define la dimensionalidad del dataset: • Existen dos tipos: simple y complejo. • Dataspace simple: array multidimensional. • Dataspace complejo: concepto pendiente de implementación. • Cada dimensión puede ser de tamaño fijo o ilimitado. Permite múltiples dimensiones ilimitadas. En el momento de crear un objeto, HDF5 permite especificar ciertas propiedades. Existen propiedades relativas a: • El fichero HDF5. • Cada dataset. • Acceso a datos. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos HDF5 •
Propiedades de creación del fichero: • Tamaño de bloque de usuario (userblock): se trata de un bloque al inicio del fichero de formato libre, que el usuario puede escribir a voluntad (por defecto 0 bytes). • Tamaño de los punteros de offset y longitudes usados en los índices del fichero (por defecto sizeof(size_t) = 8 bytes). • Tamaño de los punteros en la tabla de símbolos (por defecto 16 bits). • Tamaño de los punteros en árboles B para indexar chunked datasets (por defecto 32 bits).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos HDF5 •
•
Propiedades de creación de un dataset: • Tipo de almacenamiento: contiguo, compacto, chunked. • Filtros aplicados: compresión, checksums, filtros definidos por el usuario. • Reserva de espacio: early, incremental, late. • Valores de relleno: ifset, alloc, never. Propiedades de acceso: • Tamaños de caché y buffers. • Tamaños de bloques de metadatos. • Modo de E/S paralela. • etc. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos HDF5 Notebook-011.ipynb
• • •
En HDF5 una lista de atributos se asocian a grupos y datasets. El atributo se implementa a su vez como un pequeño dataset. Incluso posee su propio dataspace. Diferencias con un dataset normal: • No acepta operaciones de E/S parcial (hiperláminas). • No se especifica tipo de datos en disco diferente al de memoria.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Librerías de datos científicos Integración de NetCDF y HDF5 • •
• •
NetCDF-4 es un proyecto conjunto entre Unidata y el HDF Group. Consiste en la integración de ambos formatos, usando HDF5 como capa de almacenamiento de NetCDF: • Permite la representación de datos jerárquicos. • Mantiene la sencillez de la interfaz NetCDF (apreciable sobre las interfaces C y Fortran). NetCDF-4 mantiene la compatibilidad con ficheros NetCDF clásicos. Añade la posibilidad de crear tipos de datos compuestos, existente en HDF5, así como grupos, múltiples dimensiones ilimitadas, compresión y E/S paralela. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pytables • • •
• • •
Pytables es un motor de base de datos jerárquica basado en HDF5. Diseñado para manejar de forma eficiente grandes cantidades de datos. Optimiza la memoria y el uso de disco de forma que los datos ocupan menos espacio (especialmente si se activa la compresión) que en bases de datos relacionales u objetuales. Permite definir tablas similares a las de una base de datos relacional. La diferencia fundamental es que cada “columna” de una tabla puede ser un escalar o un array NumPy (potencialmente multidimensional). Junto con tablas, un fichero Pytables puede almacenar arrays NumPy.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pytables Características • • • • • •
Soporta hasta 263 filas por tabla. A diferencia de las bases de datos relacionales, las celdas de una tabla jerárquica pueden tener cualquier número de dimensiones. Soporte a indexación de cualquier columna de la tabla. El usuario puede definir metadatos para dar semántica a los datos. Soporta compresión de datos a través de Zlib, LZO, bzip2 y Blosc. Hereda todas las características de HDF5: soporte para ficheros de más de 2GB, E/S de alto rendimiento, ficheros portables entre diferentes arquitecturas...
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Pytables Características Notebook-012.ipynb
• • •
Todos los objetos de un árbol PyTables son instancias de la clase Node. Las clases Group y Leaf son descendientes de Node: un grupo contiene otros grupos y objetos hoja (similar a HDF5). Un objeto hoja es un contenedor de datos, y puede ser de varias clases: • Table. • Array. • CArray: chunked, permite compresión. • EArray: extensible, permite ampliar una de sus dimensiones. • VLArray: variable length, sus filas tienen diferente nº de columnas. • UnImplemented: datos HDF5 no soportados por PyTables. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Blaze • • •
•
Los arrays NumPy y los DataFrames Pandas son las estructuras fundacionales de Python como herramienta de análisis de datos. Sin embargo sus capacidades están restringidas por la memoria de la máquina. Además, existen múltiples tipos de almacenes de datos (JSON, XML, SQL, etc.) y en ocasiones la lectura a Pandas de este tipo de datos no es trivial. Blaze tiene dos objetivos fundamentales: • Integrar diferentes backends computacionales y almacenes de datos de forma transparente. • Trivializar la computación out-of-core. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Blaze Fuentes de datos • • • • • • • •
Objetos Python nativos (listas, diccionarios, …). NumPy. Pandas. SQL. HDF5. MongoDB. Spark. Impala.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Blaze • •
• • •
Blaze no computa nada. “Simplemente” realiza transformaciones de datos y adapta interfaces para gestionar la interacción de backends computacionales y fuentes de datos de forma cohesiva. Organiza funcionalidades que ya existen en el ecosistema Python. Permite realizar transformaciones entre fuentes de datos (p. ej. CSV a SQL). Blaze no tiene la madurez de Pandas, por lo que su documentación deja hoy en día bastante que desear y las APIs cambian con frecuencia.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Blaze Notebook-013.ipynb
• • •
El servidor Blaze ofrece un API de servicio web a través de JSON a los datos. Cualquier fuente de datos aceptada por Blaze puede ser expuesta través de este API. Puede interactuarse con el servidor de diversas maneras: • Mediante programas en cualquier lenguaje, directamente usando el módulo requests para construir las peticiones manualmente. • Mediante el propio módulo blaze, definiendo como fuente de datos la dirección del servidor a través del protocolo blaze://.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Seaborn Notebook-014.ipynb
•
•
Seaborn es una librería gráfica que mejora el aspecto de las gráficas Matplotlib y añade funciones y métodos adicionales (fundamentalmente estadísticos): • Permite usar “temas” para definir la estética de las gráficas. • Añade funciones para visualizar y comparar distribuciones de una y dos variables. • Herramientas de regresión lineal. • Funciones de visualización de matrices de datos y clustering. • Representación de series temporales estadísticas. Objetivos similares a ggplot en R. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Bokeh Notebook-015.ipynb
• • • • • •
Bokeh es otra librería gráfica, con objetivos diferentes a Seaborn. Parte de las herramientas de análisis de Continuum (Anaconda), junto con Blaze. Bokeh se centra en producir gráficas que puedan ser presentadas en páginas web mediante Javascript. Se centra en proporcionar interactividad a las gráficas. Permite obtener la salida en diferentes formatos, entre los que se incluyen HTML, inline en un Notebook iPython, o PNG. No permite (de momento) obtener versiones vectoriales (p. ej. SVG).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Análisis de rendimiento • • •
Python es un lenguaje intrínsecamente ineficiente en la ejecución de códigos sobre matrices (es decir, códigos científicos/de ingeniería). Sin embargo, como hemos visto, se comporta muy bien para el análisis de datos y el procesamiento limitado por la E/S. Sería deseable mejorar el rendimiento de Python, permitiendo su uso como “lenguaje universal”, capaz de implementar: • Generación de datos (cálculos). • Análisis de datos (estadística, crunching). • Generación de informes (gráficas).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Análisis de rendimiento • • • •
En esta última parte del curso nos centraremos en la implementación eficientes de códigos científicos sobre Python. El ciclo de desarrollo de los códigos científicos es generalmente incremental: análisis, desarrollo, depuración, evaluación. Durante la fase de evaluación es fundamental entender las causas de un comportamiento ineficiente para poder corregirlas en una iteración futura. El análisis de rendimiento (profiling) es el proceso mediante el cuál se investiga el comportamiento del código y se desarrolla un modelo de comportamiento que permita, en fases de análisis sucesivas, corregir los problemas existentes. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Análisis de rendimiento Medición de tiempos Notebook-016.ipynb
• • • • •
El módulo time nos permite medir el tiempo de ejecución de un bloque de código. En iPython también existen las magias %time y %timeit, como ya hemos visto. El tiempo de ejecución de una sección de código es una métrica útil. Sin embargo, no es cómodo ni funcional hacer grandes modificaciones a nuestros códigos incluyendo llamadas a las funciones de time y a print. Python proporciona potentes herramientas de análisis de rendimiento capaces de automatizar el proceso, evitando (en su mayor parte) modificaciones al código. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Análisis de rendimiento cProfile Notebook-016.ipynb
•
•
• •
El módulo cProfile, parte de la librería estándar Python, interactúa con la VM para medir el tiempo empleado en la ejecución de cada función del código. Su salida es básicamente idéntica a la de GNU gprof: una lista de funciones incluyendo número de llamadas, tiempo acumulado y tiempo por llamada. Debido a la instrumentación, el código ejecutado bajo cProfile es mucho más lento que el original. La información proporcionada es tan solo al nivel de función, es decir, no permite saber qué partes de una función son más costosas. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Análisis de rendimiento line_profiler Notebook-016.ipynb
• • • •
El módulo line_profiler, permite conocer el tiempo de ejecución gastado en cada una de las líneas de una función. La salida es similar a la de cProfile, pero en lugar de ofrecer los datos para cada función del código, los ofrece para cada línea de una función. Al igual que cualquier herramienta de profiling introduce una sobrecarga, en este caso muy superior a la de cProfile. Por este motivo, lo ideal es hacer primero un análisis del código completo con cProfile y a continuación un análisis detallado de las líneas de las funciones críticas del código con line_profiler.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Análisis de rendimiento memory_profiler Notebook-016.ipynb
•
•
• •
El módulo memory_profiler funciona línea a línea, al igual que line_profiler, pero indicando el consumo de memoria de cada línea del código. En este caso, la salida del análisis es una lista de las líneas de la función, junto con el consumo del intérprete y la diferencia que cada línea representa. Permite también la visualización gráfica del consumo de memoria con respecto al tiempo. La sobrecarga introducida por esta herramienta es muy superior a la de las herramientas de análisis de carga computacional, por lo que en ocasiones será necesario reducir el tamaño del problema antes de realizar el análisis. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Compilación a C: Cython Notebook-016.ipynb
• •
•
•
Cython es un framework que permite la compilación de código Python a C. La estructura de un programa Cython es similar a OpenCL: existe un programa principal escrito en Python que realiza llamadas a kernels computacionales escritos en Python anotado (ficheros .pyx). El código C obtenido de un .pyx no anotado es muy similar al Python original: realiza continuamente llamadas al intérprete para averiguar de forma dinámica los tipos de las expresiones ejecutadas. Si se anota el .pyx indicando los tipos de las variables utilizadas, es posible ahorrar comprobaciones de tiempo de ejecución y por tanto llamadas al intérprete, consiguiendo mejoras de rendimiento espectaculares con un esfuerzo mínimo. Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Compilación a C Paralelismo en Python Notebook-016.ipynb
•
•
•
• •
Una de las características más discutidas de Python es el GIL: Global Interpreter Lock, que impide que dos threads diferentes ejecuten bytecode Python al mismo tiempo. El GIL tiene una serie de ventajas (ejecución monohilo más eficiente, integración con librerías C, etc.), pero es evidente que no beneficia a la programación paralela. No afecta a operaciones limitadas por la E/S. Un proceso que está esperando por E/S de disco u operaciones sobre grandes arrays NumPy está fuera del GIL. Cython permite la paralelización automática mediante OpenMP. Los problemas que presenta la existencia del GIL se solventan trabajando con tipos C nativos y evitando las llamadas al intérprete. Unión Europea FEDER
Invertimos en su futuro
0682_CLOUDPYME2_1_E
Compilación a C Numba Notebook-017.ipynb
• • • •
Numba es una herramienta similar a Cython: permite generar código C a partir de código Python mediante compilación JIT. Aparte de su interfaz, la diferencia fundamental con Cython es que Numba utiliza LLVM para generar el código ejecutable. Proporciona un decorador @jit, así como una función numba.jit(), para compilar funciones. La versión de pago del software, NumbaPro, permite generar automáticamente código para su ejecución en GPUs.
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Paralelismo en Python threading Notebook-018.ipynb
• •
•
El módulo threading permite escribir programas multihilo. Funciona correctamente si el paralelismo está limitado por la E/S, pero no tanto en programas limitados por CPU excepto si la computación utiliza intensivamente librerías C (Cython, Numpy). Modelo de paralelismo similar a los hilos POSIX (pthreads).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E
Paralelismo en Python multiprocessing Notebook-018.ipynb
• • • •
El módulo multiprocessing intenta copiar la interfaz de threading, pero crea procesos en lugar de hilos. Cada proceso se ejecuta sobre su propio intérprete Python, y por tanto cada uno tiene su propio GIL. Se evita la competencia por el GIL y se permite aprovechar los recursos de la máquina. Sin embargo, diferentes procesos no comparten memoria. Se proporciona la clase Manager para permitir la compartición de diferentes tipos de objetos Python (listas, diccionarios, semáforos, colas, arrays, …).
Unión Europea FEDER Invertimos en su futuro
0682_CLOUDPYME2_1_E