Mostrando entradas con la etiqueta Pyhton. Mostrar todas las entradas
Mostrando entradas con la etiqueta Pyhton. Mostrar todas las entradas

6 de junio de 2016

16.5 Algoritmo de inserción directa


 



= = =

# *-* coding: utf-8 *-*

import random

# =============================================================
# ALGORITMO DE ORDENACION POR INSERCIÓN DIRECTA
# =============================================================

# Genero un vector con 100 elementos colocados en posiciones aleatorias
misNumeros = []
for i in range(1,11):
    longitud = len(misNumeros)
    misNumeros.insert(random.randint(0,longitud),i)

# print misNumeros

# ================================
# Ordenacion por insercion directa
# ================================

misNumerosID = misNumeros[:] #COPIO los valores del array
indice=1 # corresponde a la SEGUNDA posicion del array, la posición cero es la primera
pivote = 0 # corresponde al pivote, que puede ser el último elemento del array

print "ANTES: ",misNumerosID
# print "Longitud del elemento: ",str(len(misNumerosID))
# print "Rango negativo: ",str(range(len(misNumerosID),0,-1))

while indice<len(misNumerosID): # mientras indice sea menor que la longitud. Acabará en el índice 9, el último, ya
    # que la longitud es 10. O en n, y el índice es n-1
    # print indice
    for i in range(indice,0,-1): #desde la posición indice hasta 1, 0 es el límite inferior. 
        # print " - ",str(misNumerosID[i])
        if misNumerosID[i]<misNumerosID[i-1]: # si el anterior es MAYOR que el que estoy evaluando...
            pivote = misNumerosID[i] # Asigno este al pivote
            misNumerosID[i]=misNumerosID[i-1] # al de la posición i le pongo el de la posición i-1
            misNumerosID[i-1]=pivote # a la posición i-1 pongo el pivote
            pivote=0
            # print misNumerosID
    indice+=1 #importante. Aumento el pivote en 1
print " = = = "
print "DESPUÉS: ",misNumerosID

23 de mayo de 2016

58. Análisis de documentos XML en Python

Acceso al XML de ejemplo: catalogo.xml
  1. Tutorial DOM y XML (inglés).
  2. Para saber más.
  3. Datos abiertos Gobierno de España

Analizar contenido XML con DOM

Al escribir un programa en Python, usaremos el estándar DOM del W3C. Cargaremos el documento como un objeto, usando el módulo xml.dom y recuperando el objeto "minidom", que provee un acceso rápido al documento.
NOTA: tanto el fichero en Python como el fichero de ejemplo cd_catalogo.xml (descárgalo) deben estar en la misma carpeta.
#!/usr/bin/python
# coding: utf-8

from xml.dom.minidom import parse
import xml.dom.minidom

# Abre el documento XML usando el analizador (parser) minidom
DOMTree = xml.dom.minidom.parse("cd_catalogo.xml") #-> Modelo del Documento en forma de árbol
collection = DOMTree.documentElement # -> Objeto raíz
print "El nombre de la coleccion es: %s \n" % collection.localName

# Obtiene una lista de los objetos con la etiqueta CD
cds = collection.getElementsByTagName("CD")

# Muestra en pantalla cada detalle de cada CD
for cd in cds:    
   print "*****CD*****" 
   titulo = cd.getElementsByTagName('TITULO')[0]
   print "Título: %s" % titulo.childNodes[0].data.encode("utf-8")
   artista = cd.getElementsByTagName('ARTISTA')[0]
   print "artista: %s" % artista.childNodes[0].data.encode("utf-8")
   pais = cd.getElementsByTagName('PAIS')[0]
   print "País: %s" % pais.childNodes[0].data.encode("utf-8")
   comp = cd.getElementsByTagName('PAIS')[0]
   print "Compañía: %s" % comp.childNodes[0].data.encode("utf-8")
   precio = cd.getElementsByTagName('PRECIO')[0]
   print "Precio: %s €" % precio.childNodes[0].data.encode("utf-8")
   anno = cd.getElementsByTagName('ANNO')[0]
   print "Año: %s" % anno.childNodes[0].data.encode("utf-8")
   print "=" * 20 + "\n"
Todos los métodos del xml.dom pueden encontrarse en: https://docs.python.org/2.7/library/xml.dom.html
= = =

Abrir fichero XML y presentarlo en pantalla

Apertura del fichero XML y presentación en pantalla
#!/usr/bin/python
# coding: utf-8

from xml.dom.minidom import parse
import xml.dom.minidom

# Abre el documento XML usando el analizador (parser) minidom
modelo = xml.dom.minidom.parse("cd_catalogo.xml") #-> Modelo # #  del Documento en forma de árbol. Apertura por nombre
# O bien
# fichero = open("cd_catalogo.xml")
# modelo = parse(fichero) # Otra forma de abrir el fichero.

coleccion = modelo.documentElement # -> Objeto raíz
print "El nombre de la coleccion es: %s \n" % coleccion.localName

print coleccion.toxml()
# print coleccion.toprettyxml() # --> formas de presentar los daros como un bloque
 
= = = 
 

Crear un fichero XML y guardarlo

Crear un fichero XML
# coding: utf-8

from xml.dom import minidom

Ordenador1 = ['Pentium M', '512MB']
Ordenador2 = ['Pentium Core 2', '1024MB']
Ordenador3 = ['Pentium Core Duo', '1024MB']
listaOrdenadores = [Ordenador1, Ordenador2, Ordenador3]

# Abro un modelo DOM en modo implementar
DOMimpl = minidom.getDOMImplementation()

#Crear el documento econ la etiqueta principal estacionesTrabajo
xmldoc = DOMimpl.createDocument(None,"estacionesTrabajo", None)
doc_root = xmldoc.documentElement

# Recorro la lista de ordenadores
for ordenador in listaOrdenadores:
    
    #Crear Nodo... (*)
    nodo = xmldoc.createElement("Ordenador")

    # Crear un subnodo, llamado procesador
    elemento = xmldoc.createElement('Procesador')
    # Le añado un nodo de texto, y le asigno la posición 0 de la lista
    elemento.appendChild(xmldoc.createTextNode(ordenador[0]))
    # Añado el subnodo al nodo anterior
    nodo.appendChild(elemento)
    
    # Idéntico.
    elemento = xmldoc.createElement('Memoria')
    elemento.appendChild(xmldoc.createTextNode(ordenador[1]))
    nodo.appendChild(elemento)

    # (*)... que se añade como hijo al doc_root
    doc_root.appendChild(nodo)

# Recorrer para presentar en pantalla la lista de los nodos
listaNodos = doc_root.childNodes
for nodo in listaNodos:
    print nodo.toprettyxml()

# Guardar la información en un fichero de texto
fichero = open("ordenadores.xml", 'w')
# fichero.write(xmldoc.toxml())
# fichero.write(xmldoc.toprettyxml()) --> diferentes formas de guardar un fichero xml
fichero.write(xmldoc.toprettyxml(encoding="utf-8"))
fichero.close()
 
= = = 
 

Análisis de los elementos de la primera etiqueta en cd_catalogo.xml

# coding: utf-8

from xml.dom import minidom                                      

xmldoc = minidom.parse('cd_catalogo.xml')   
print xmldoc                                                               
grammarNode = xmldoc.firstChild
print grammarNode # CATALOGO

refNode = grammarNode.childNodes[1]     
print refNode #--> Nivel 1, etiqueta CD.
print refNode.childNodes  # --> Todo lo que hay bajo la etiqueta CD                         

pNode = refNode.childNodes[3]
print pNode #--> El elemento que está tercero. "ARTISTA"
print pNode.toxml()  # -> Impresión de dicho nodo.

print pNode.firstChild      #-> Texto que hay dentro de "ARTISTA", pero como objeto                         
print pNode.firstChild.data #-> Texto extraído del objeto anterior.
 
= = = 
 

Extraer texto y modificarlo

Extraigo texto del fichero de ejemplo cd_catalogo.xml y lo modifico. En particular a la primera entrada "Empire Burlesque", se le hace la modificación "Imperio Burlesco". En el ejemplo, los datos se escriben en un nuevo fichero cd_catalog2.xml
#!/usr/bin/python
# coding: utf-8

from xml.dom.minidom import parse
import xml.dom.minidom

# Abre el documento XML usando el analizador (parser) minidom
modelo = xml.dom.minidom.parse("cd_catalogo.xml") #-> Modelo # #  del Documento en forma de árbol. Apertura por nombre
# O bien
# fichero = open("cd_catalogo.xml")
# modelo = parse(fichero) # Otra forma de abrir el fichero.
# después al final habrá que cerrar el fichero. fichero.close()

coleccion = modelo.documentElement # -> Objeto raíz
print "El nombre de la coleccion es: %s \n" % coleccion.localName

cds = coleccion.getElementsByTagName("CD")

for cd in cds:    
    
    titulo = cd.getElementsByTagName("TITULO")
    # titulo es una lista de Nodos, aunque sólo sea uno. Lo siguiente print titulo.toxml() no funcionará
    # print titulo[0].toxml() Esto si funcionará
    # print titulo[0].childNodes # --> Esto es un objeto
    print titulo[0].childNodes[0].data #--> Accede a un dato de texto
    # print titulo[0].childNodes[0].data.encode("utf-8") #-> no está de más codificar en utf-8
    if titulo[0].childNodes[0].data.encode("utf-8") == "Empire Burlesque":
        print "detectado"
        titulo[0].childNodes[0].data = u'Imperio Burlesco' # --> Tiene que ser en formato UNICODE u''
        print titulo[0].childNodes[0].data #--> Accede a un dato de texto
    print "=" * 20    

fichero = open("cd_catalogo2.xml","w")
# fichero = open("cd_catalogo.xml","w") # --> Para sobrescribir en el mismo fichero.
fichero.write(coleccion.toxml(encoding='utf-8')) #--> Forzar la codificación a UTF-8
fichero.close()
# print coleccion.toprettyxml() # --> formas de presentar los daros como un bloque '''
 
= = =
 

Generar fichero XML con DOM

Generar fichero XML con DOM
# coding: utf-8

from xml.dom import minidom, Node

doc = minidom.Document() #--> Crear un documento xml

doc.appendChild(doc.createComment("Creando documento de ejemplo XML")) #-> Escribir comentario

book = doc.createElement('libro') # --> Crear elemento dentro del documento
doc.appendChild(book) #-> Añadirlo a la raíz del documento

title = doc.createElement('Título') # --> Crear elemento título
title.appendChild(doc.createTextNode('D. Quijote de La Mancha')) # --> Agrgar nodo de texto
book.appendChild(title) # --> Añadir dentro del elemento book

author = doc.createElement('Autor') # --> Crear elemento Autor
book.appendChild(author) # --> Añadir al elemento libro

name = doc.createElement('Nombre y Apellidos')  # --> Crear elemento Nombre y Apellidos
author.appendChild(name) # --> Añadir dentro de Autor

firstname = doc.createElement('Nombre') # --> Crear elemento Nombre
name.appendChild(firstname)
firstname.appendChild(doc.createTextNode('Miguel'))
name.appendChild(doc.createTextNode('Texto añadido aquí'))
lastname = doc.createElement('Apellidos') # --> Crear elemento  Apellidos
name.appendChild(lastname)
lastname.appendChild(doc.createTextNode('De Cervantes Saavedra'))

chapter = doc.createElement('Capítulo')
book.appendChild(chapter)
chapter.setAttribute('number', '1')
title = doc.createElement('title')
chapter.appendChild(title)
title.appendChild(doc.createTextNode('Capítulo Primero'))

print doc.toprettyxml(indent =' ')

= =  =

Presentar documento XML en forma de árbol

Presentar documento XML en forma de árbol
# coding: utf-8

from xml.dom import minidom, Node

def scanNode(node, level = 0):
    msg = node.__class__.__name__
    texto=""
    if node.nodeType == Node.ELEMENT_NODE:
        msg += ", tag: " + node.tagName
    elif node.nodeType == Node.TEXT_NODE:
        texto = ": "+node.data
    print " " * level * 4, msg, texto
    if node.hasChildNodes:
        for child in node.childNodes:
            scanNode(child, level + 1)
            
doc = minidom.parse('cd_catalogo.xml') 
scanNode(doc)
 
= = =  
 

 
 

19 de mayo de 2016

47. Instalando módulo MATPLOTLIB en Ubuntu. Trabajando con él.

Instalando matplotlib (y numpy) en Ubuntu

Para instalar matplotlib simplemente, desde la terminal de Linux, escribes

apt-get install python-matplotlib

Y se iniciará el proceso de instalación (a menos que ya esté instalado). Si tienes problemas, accedes a al web del proyecto matplotlib http://matplotlib.org/users/installing.html

Si necesitas instalar otros paquetes, como numpy, también:

apt-get install python-numpy


Trabajando con matplotlib

El módulo matplotlib es un módulo que trabajando junto a numpy consigue representación gráfica de muy alto nivel. Una razón para usarlo es que es un módulo propio del proyecto Python. Otra, que en combinación con el ya mencionado numpy, y scipy, se convierte una alternativa a matlab.
Mi primer gráfico
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
plt.plot([-1, -4.5, 16, 23])
plt.show()
En la primera línea importamos el submódulo pyplot de matplotlib , usualmente con el alias plt. En la segunda se representan 4 valores (eje Y) y la orden final es mostrarlo en pantalla. Aunque no hemos escrito valores de eje X, se toman de uno en uno empezando por cero.
  • Con esta modificación plt.plot([-1, -4.5, 16, 23], "ob") se obtienen los puntos discretos. Una lista con los colores y modificadores, se muestra a continuación:
tipos de líneas  colores
= = =
Gráfico con valores en ejes X e Y
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np

# our X values:
dias = np.linspace(1,30,30)
# our Y values:
celsius_values = np.random.rand(30)*15+15
print celsius_values
print dias

plt.plot(dias, celsius_values)
plt.show()
Utilizamos la generación de listas con numpy para crear los valores en X y en Y
  • Se puede mejorar con las sentencias plt.xlabel('Días'), plt.ylabel('Grados centígrados') ; es necesaria la inclusión de la instancia from __future__ import unicode_literals (NOTA: repasar este punto porque entra en conflicto con la escritura en el terminal de caracteres en utf-8).
= = =
Dibujando más de una gráfica
 -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np

# our X values:
dias = np.linspace(1,30,30)
# our Y values:
celsius_values_min = np.random.rand(30)*15+15
celsius_values_max = np.random.rand(30)*10
celsius_values_max += celsius_values_min
print celsius_values_min
print celsius_values_max
print dias

plt.plot(dias, celsius_values_min,"b-",dias,celsius_values_max,'m-')
plt.show()
  • Escribo en plt.plot más de una referencia a una gráfica.
  • Si amplío con estas dos líneas, defino los límites de la función:
    • xmin, xmax, ymin, ymax = 1, 30, celsius_values_min.min()*0.95, celsius_values_max.max()*1.051
    • plt.axis([xmin, xmax, ymin, ymax])
= = =
Otro ejemplo
No aporta nada nuevo pero es muy ilustrativo
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np

X = np.linspace(-2 * np.pi, 2 * np.pi, 50, endpoint=True)
F1 = 3 * np.sin(X)
F2 = np.sin(2*X)
F3 = 0.3 * np.sin(X)
startx, endx = -2 * np.pi - 0.1, 2*np.pi + 0.1
starty, endy = -3.1, 3.1
plt.axis([startx, endx, starty, endy])
plt.plot(X,F1)
plt.plot(X,F2)
plt.plot(X,F3)
plt.plot(X, F1, 'ro')
plt.plot(X, F2, 'bx')
plt.show()
  • Intenta cambiar el estilo de una de las funciones usando parámetros plt.plot(X, F1, color="blue", linewidth=2.5, linestyle="-")
= = =
Rellenando con color
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)
plt.plot (X, Y, color='blue', alpha=1.00)
plt.fill_between(X, 0, Y, color='blue', alpha=0.5)
plt.show()
Donde tenemos, para fill_between que:
  • X, es el rango de los valores de X
  • el siguiente, 0, es el valor de Y a partir del que se dibuja.
  • el siguiente, Y, son los valores Y de la función hasta los que se dibuja.
  • el resto son parámetros como color y alpha (transparencia, un número entre 0 y 1, tipo float).
  • Intenta cambiar a... plt.fill_between(X, Y, 1, color='blue', alpha=0.1)
= = =

Merece la pena trabajar un poco más este módulo

Ejemplo de dos gráficas en la misma ventana
211 significa que se disponen en 2 filas y 1 columna, y 1 que ocupa la primera posición; 212 significa que se disponen en 2 filas y 1 columna, y 2 que ocupa la segunda posición.
import numpy as np
import matplotlib.pyplot as plt

def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)

t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)

plt.figure(1)
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')

plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
plt.show()
Si después queremos más gráficas podemos poner plt.figure(2) en otra ventana. A lo que ya sabemos del apartado anterior, podemos añadir comandos como:
  • plt.title('Título del gráfico'), que añade un título y complementa a xlabel e ylabel.
  • plt.grid(True), que muestra una cuadrícula en la gráfica.
= = =
Insertando anotaciones en la gráfica
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

ax = plt.subplot(111)

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)

plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
            arrowprops=dict(facecolor='red', shrink=0.1),
            )

plt.ylim(-2,2)
plt.show()
 = = =
Se puede cambiar las escalas lineales a logarítmicas con plt.xscale('log') (o yscale). Admite 'linear', 'log', 'symlog', 'logit'.
= = =
  1. Para conocer algunos estilos predefinidos, imprimir plt.style.available. Para usar uno de la lista, plt.style.us('ggplot'). Para saber más.
  2. Para trabajar con textos, y evitar el problema de los acentos y las ñ's.
  3. Tutorial para insertar imágenes en las gráficas.
Leyendas
import matplotlib.pyplot as plt
from numpy.random import randn

z = randn(10)

red_dot, = plt.plot(z, "ro", markersize=15)
# Put a white cross over some of the data.
white_cross, = plt.plot(z[:5], "w*", markeredgewidth=1, markersize=10)

plt.legend([red_dot, (red_dot, white_cross)], ["Attr A", "Attr A+B"])
plt.show()
  1. Tutorial para insertar leyendas en los gráficos
  2. Tutorial para anotaciones
= = =
Y para saber más, referenciarnos al manual de usuario: http://matplotlib.org/users/index.html