Python Data Analytics - With Pandas, NumPy, and Matplotlib
Python Data Analytics - With Pandas, NumPy, and Matplotlib
Página 1
Datos de Python
Analítica
Con Pandas, NumPy y Matplotlib
-
Segunda edicion
-
Fabio Nelli
Página 2
Segunda edicion
Fabio Nelli
Página 3
En este libro pueden aparecer nombres, logotipos e imágenes de marcas comerciales. En lugar de utilizar un símbolo de marca comercial con
cada aparición de un nombre, logotipo o imagen de marca registrada, usamos los nombres, logotipos e imágenes solo en un
editorial y en beneficio del propietario de la marca, sin intención de infringir la
marca comercial.
El uso en esta publicación de nombres comerciales, marcas comerciales, marcas de servicio y términos similares, incluso si no son
identificadas como tales, no debe tomarse como una expresión de opinión sobre si están o no sujetos a
derechos de propiedad.
Si bien se cree que los consejos y la información de este libro son verdaderos y precisos en la fecha de publicación,
ni los autores ni los editores ni el editor pueden aceptar ninguna responsabilidad legal por cualquier error o
omisiones que se puedan hacer. El editor no ofrece ninguna garantía, expresa o implícita, con respecto a la
material contenido aquí.
Distribuido al comercio de libros en todo el mundo por Springer Science + Business Media New York, 233 Spring Street,
6th Floor, Nueva York, NY 10013. Teléfono 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny @ springer-
sbm.com o visite www.springeronline.com. Apress Media, LLC es una LLC de California y el único miembro
(propietario) es Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc es una
Corporación de Delaware .
Para obtener información sobre traducciones, envíe un correo electrónico a rights@apress.com o visite http://www.apress.com/
https://translate.googleusercontent.com/translate_f 2/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
derechos-permisos.
Los títulos de Apress se pueden comprar al por mayor para uso académico, corporativo o promocional. Versiones de libros electrónicos y
las licencias también están disponibles para la mayoría de los títulos. Para obtener más información, consulte nuestras ventas a granel de libros electrónicos e impresos
página web en http://www.apress.com/bulk-sales.
Cualquier código fuente u otro material complementario al que el autor haga referencia en este libro está disponible para
lectores en GitHub a través de la página del producto del libro, ubicada en www.apress.com/9781484239124. Para más
información detallada, visite http://www.apress.com/source-code.
Página 4
Página 5
Tabla de contenido
https://translate.googleusercontent.com/translate_f 3/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 6
TABLA DE CONTENIDO
https://translate.googleusercontent.com/translate_f 4/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Tipos de datos ............................................... .................................................. ........................ 53
La opción dtype ............................................... .................................................. .................. 54
Creación intrínseca de una matriz ............................................. .................................................. .. 55
vi
Página 7
TABLA DE CONTENIDO
vii
Página 8
TABLA DE CONTENIDO
https://translate.googleusercontent.com/translate_f 5/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
El DataFrame ................................................ .................................................. .................. 102
Los objetos de índice ............................................... .................................................. ............... 112
viii
Página 9
TABLA DE CONTENIDO
Lectura y escritura de datos con una base de datos NoSQL: MongoDB ........................................ .......... 178
ix
Página 10
TABLA DE CONTENIDO
https://translate.googleusercontent.com/translate_f 7/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 11
TABLA DE CONTENIDO
xi
Pagina 12
TABLA DE CONTENIDO
xii
Página 13
TABLA DE CONTENIDO
Perceptrón multicapa (con dos capas ocultas) con TensorFlow ....................................... ... 397
Fase de prueba y cálculo de precisión ............................................. ..................................... 402
Evaluación de datos experimentales .............................................. ............................................ 404
Conclusiones ................................................. .................................................. ............................ 407
xiii
https://translate.googleusercontent.com/translate_f 9/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 14
TABLA DE CONTENIDO
Capítulo 13: Análisis de datos textuales con NLTK .......................................... ............. 487
Técnicas de análisis de texto ............................................... .................................................. ......... 487
El kit de herramientas de lenguaje natural (NLTK) ........................................... ........................................ 488
Importar la biblioteca NLTK y la herramienta de descarga NLTK ......................................... ............ 489
Buscar una palabra con NLTK ............................................ .................................................. .493
Analizar la frecuencia de las palabras ............................................. ........................................... 494
Selección de palabras del texto ............................................. .................................................. 497
Bigrams y colocaciones ............................................... .................................................. ... 498
xiv
Página 15
TABLA DE CONTENIDO
Capítulo 14: Análisis de imágenes y visión por computadora con OpenCV .......................... 507
Análisis de imágenes y visión artificial ............................................. ........................................... 507
https://translate.googleusercontent.com/translate_f 10/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Mezcla de imágenes ................................................ .................................................. .................. 520
Análisis de imagen ................................................ .................................................. ........................ 521
xv
Página 16
TABLA DE CONTENIDO
https://translate.googleusercontent.com/translate_f 11/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
xvi
Página 17
Sobre el Autor
Fabio Nelli es científico de datos y consultor de Python, diseña y desarrolla Python
aplicaciones para análisis y visualización de datos. Tiene experiencia con la ciencia
mundo, habiendo desempeñado varios roles de análisis de datos en química farmacéutica para
empresas privadas de investigación y universidades. Ha sido consultor informático para
muchos años en IBM, EDS y Hewlett-Packard, junto con varios bancos y seguros
compañías. Tiene una maestría en química orgánica y una licenciatura en
tecnologías de la información y sistemas de automatización, con muchos años de experiencia en
ciencias de la vida (como Tech Specialist en Beckman Coulter, Tecan, Sciex).
Para obtener más información y otros ejemplos, visite su página en https: //www.meccanismocomplesso.
org y la página de GitHub https://github.com/meccanismocomplesso .
xvii
Página 18
https://translate.googleusercontent.com/translate_f 12/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Instituto de Tecnología, nunca ha conocido una red neuronal o
conjunto de datos que no le gustó. Le gusta evangelizar el uso de
Herramientas DevOps para ciencia de datos y desarrollo de software.
Raúl disfruta de la energía de su ciudad natal de Toronto,
Canadá, donde corre maratones, se ofrece como voluntario
instructor de tecnología de la Universidad de Toronto
codificadores, y le gusta trabajar con datos en Python y R.
xix
Página 19
CAPÍTULO 1
Introducción a
Análisis de los datos
En este capítulo, comenzará a dar los primeros pasos en el mundo del análisis de datos, aprendiendo en
detalle sobre todos los conceptos y procesos que componen esta disciplina. Los conceptos
discutidos en este capítulo son antecedentes útiles para los siguientes capítulos, donde estos
Los conceptos y procedimientos se aplicarán en forma de código Python, mediante el uso de
varias bibliotecas que se discutirán en tantos capítulos.
https://translate.googleusercontent.com/translate_f 13/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
a partir de datos brutos se denomina análisis de datos .
El propósito del análisis de datos es extraer información que no es fácilmente deducible
pero que, entendido, conduce a la posibilidad de realizar estudios sobre la
mecanismos de los sistemas que los han producido, lo que le permite pronosticar
posibles respuestas de estos sistemas y su evolución en el tiempo.
1
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_1
Página 20
Página 21
https://translate.googleusercontent.com/translate_f 14/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
conceptos.
Un buen analista de datos debe poder moverse y actuar en muchas disciplinas diferentes.
áreas. Muchas de estas disciplinas son la base de los métodos de análisis de datos, y
el dominio de ellos es casi necesario. Es necesario el conocimiento de otras disciplinas
dependiendo del área de aplicación y estudio del proyecto de análisis de datos en particular
está a punto de emprender y, de manera más general, la experiencia suficiente en estas áreas puede
ayudarlo a comprender mejor los problemas y el tipo de datos necesarios.
A menudo, con respecto a los problemas importantes del análisis de datos, es necesario tener un
equipo interdisciplinario de expertos que pueden contribuir de la mejor manera posible en su
respectivos campos de competencia. En cuanto a problemas menores, un buen analista debe ser capaz de
reconocer los problemas que surgen durante el análisis de datos, indagar para determinar qué disciplinas
y habilidades son necesarias para resolver estos problemas, estudiar estas disciplinas y tal vez incluso
pregunte a las personas más conocedoras del sector. En resumen, el analista debe poder saber
cómo buscar no solo datos, sino también información sobre cómo tratarlos.
Ciencias de la Computación
El conocimiento de la informática es un requisito básico para cualquier analista de datos. De hecho,
sólo cuando tenga buenos conocimientos y experiencia en informática podrá
administrar de manera eficiente las herramientas necesarias para el análisis de datos. De hecho, cada paso relativo
El análisis de datos implica el uso de software de cálculo (como IDL, MATLAB, etc.) y
lenguajes de programación (como C ++, Java y Python).
La gran cantidad de datos disponibles en la actualidad, gracias a las tecnologías de la información, requiere
habilidades específicas para ser gestionadas de la manera más eficiente posible. De hecho, la investigación de datos
y la extracción requieren conocimiento de estos diversos formatos. Los datos están estructurados y
almacenados en archivos o tablas de bases de datos con formatos particulares. XML, JSON o simplemente XLS
o archivos CSV, son ahora los formatos comunes para almacenar y recopilar datos, y muchos
Las aplicaciones le permiten leer y administrar los datos almacenados en ellas. Cuando se trata de
extrayendo datos contenidos en una base de datos, las cosas no son tan inmediatas, pero es necesario
conocer el lenguaje de consulta SQL o utilizar software especialmente desarrollado para la extracción de
datos de una base de datos determinada.
Página 22
Además, para algunos tipos específicos de investigación de datos, los datos no están disponibles en un
formato explícito, pero están presentes en archivos de texto (documentos y archivos de registro) o páginas web, y
se muestran como gráficos, medidas, número de visitantes o tablas HTML. Esto requiere
experiencia técnica para el análisis y la eventual extracción de estos datos (llamado web
raspado ).
Por tanto, el conocimiento de las tecnologías de la información es necesario para saber utilizar
Varias herramientas puestas a disposición por la informática contemporánea, como aplicaciones
y lenguajes de programación. Estas herramientas, a su vez, son necesarias para realizar análisis de datos.
y visualización de datos.
El propósito de este libro es proporcionar todos los conocimientos necesarios, en la medida de lo posible,
en cuanto al desarrollo de metodologías para el análisis de datos. El libro usa Python
lenguaje de programación y bibliotecas especializadas que aportan una contribución decisiva a
la realización de todos los pasos que constituyen el análisis de datos, desde la investigación de datos hasta los datos
minería, a la publicación de los resultados del modelo predictivo.
Matemáticas y Estadística
Como verá a lo largo del libro, el análisis de datos requiere muchas matemáticas complejas
durante el tratamiento y tratamiento de datos. Necesitas ser competente en todo esto,
al menos para entender lo que estás haciendo. Alguna familiaridad con las principales estadísticas
conceptos también es necesario porque todos los métodos que se aplican en el análisis y
La interpretación de los datos se basa en estos conceptos. Como puedes decir que la computadora
la ciencia le brinda las herramientas para el análisis de datos, por lo que puede decir que las estadísticas brindan la
conceptos que forman la base del análisis de datos.
Esta disciplina proporciona muchas herramientas al analista y un buen conocimiento de cómo
https://translate.googleusercontent.com/translate_f 15/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Utilizarlos mejor requiere años de experiencia. Entre los estadísticos más utilizados
Las técnicas de análisis de datos son
• Métodos bayesianos
• Regresión
• Agrupación
Teniendo que lidiar con estos casos, descubrirás cómo las matemáticas y la estadística son
estrechamente relacionada. Gracias a las bibliotecas especiales de Python que se tratan en este libro, podrá
capaz de gestionarlos y manejarlos.
Página 23
Página 24
https://translate.googleusercontent.com/translate_f 16/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Tipos de datos
Los datos se pueden dividir en dos categorías distintas:
Los datos categóricos son valores u observaciones que se pueden dividir en grupos o
categorías. Hay dos tipos de valores categóricos: nominal y ordinal . Un nominal
La variable no tiene un orden intrínseco que se identifique en su categoría. Una variable ordinal
en cambio, tiene un orden predeterminado.
Los datos numéricos son valores u observaciones que provienen de mediciones. Existen
dos tipos de valores numéricos: números discretos y continuos . Los valores discretos pueden ser
contados y son distintos y separados entre sí. Valores continuos, por otro
mano, son valores producidos por mediciones u observaciones que asumen cualquier valor
dentro de un rango definido.
Página 25
El análisis no es más que una secuencia de pasos, cada uno de los cuales juega un papel clave en la
posteriores. Por tanto, el análisis de datos se esquematiza como una cadena de proceso que consta de
siguiente secuencia de etapas:
• Extracción de datos
• Modelado predictivo
Figura 1-1 muestra una representación esquemática de todos los procesos involucrados en el
análisis de los datos.
https://translate.googleusercontent.com/translate_f 17/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 26
Página 27
https://translate.googleusercontent.com/translate_f 18/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Extracción de datos
Una vez definido el problema, el primer paso es obtener los datos para poder
realizar el análisis. Los datos deben elegirse con la finalidad básica de construir el
modelo predictivo, por lo que la selección de datos también es crucial para el éxito del análisis.
Los datos de muestra recopilados deben reflejar tanto como sea posible el mundo real, es decir, cómo
el sistema responde a los estímulos del mundo real. Por ejemplo, si usa enormes
conjuntos de datos de datos brutos y no se recopilan de manera competente, estos pueden representar datos falsos o
situaciones de desequilibrio.
Por lo tanto, una mala elección de datos, o incluso la realización de análisis en un conjunto de datos que no
perfectamente representativo del sistema, dará lugar a modelos que se alejarán del
sistema en estudio.
La búsqueda y recuperación de datos a menudo requiere una forma de intuición que va más allá
mera investigación técnica y extracción de datos. Este proceso también requiere un cuidadoso
comprensión de la naturaleza y forma de los datos, que solo una buena experiencia y
el conocimiento en el campo de aplicación del problema puede proporcionar.
Independientemente de la calidad y cantidad de datos necesarios, otro problema es utilizar los mejores
fuentes de datos.
Si el entorno del estudio es un laboratorio (técnico o científico) y los datos
generados son experimentales, entonces, en este caso, la fuente de datos es fácilmente identificable. En esto
En este caso, los problemas serán solo relacionados con la configuración experimental.
Página 28
Pero no es posible que el análisis de datos reproduzca sistemas en los que los datos
recopilados de forma estrictamente experimental en todos los campos de aplicación. Muchos campos requieren
buscando datos del mundo circundante, a menudo confiando en experimentos externos
datos, o incluso más a menudo recogiéndolos a través de entrevistas o encuestas. Entonces en estos
casos, encontrar una buena fuente de datos que pueda proporcionar toda la información que necesita
para el análisis de datos puede resultar bastante complicado. A menudo es necesario recuperar datos de
múltiples fuentes de datos para complementar cualquier deficiencia, para identificar cualquier discrepancia,
y hacer que el conjunto de datos sea lo más general posible.
Cuando desee obtener los datos, un buen lugar para comenzar es la Web. Pero la mayor parte de
los datos en la Web pueden ser difíciles de capturar; de hecho, no todos los datos están disponibles en un archivo o
base de datos, pero puede ser contenido dentro de páginas HTML en muchos formatos diferentes. A
Para ello, una metodología denominada web scraping permite la recopilación de datos a través del
reconocimiento de la ocurrencia específica de etiquetas HTML dentro de las páginas web. Hay software
diseñado específicamente para este propósito, y una vez que se encuentra una ocurrencia, extrae la
datos deseados. Una vez finalizada la búsqueda, obtendrá una lista de datos listos para ser sometidos
al análisis de datos.
https://translate.googleusercontent.com/translate_f 19/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Preparación de datos
Entre todos los pasos involucrados en el análisis de datos, la preparación de datos, aunque aparentemente
menos problemático, de hecho requiere más recursos y más tiempo para completarse. Datos
a menudo se recopilan de diferentes fuentes de datos, cada una de las cuales tendrá datos con un
diferente representación y formato. Por tanto, todos estos datos deberán estar preparados para la
proceso de análisis de datos.
La preparación de los datos tiene que ver con la obtención, limpieza, normalización y
transformar datos en un conjunto de datos optimizado, es decir, en un formato preparado que normalmente
tabular y es adecuado para los métodos de análisis que se han programado durante el
fase de diseño.
Pueden surgir muchos problemas potenciales, incluidos valores no válidos, ambiguos o faltantes,
campos replicados y datos fuera de rango.
10
Página 29
En los últimos años, la visualización de datos se ha desarrollado hasta tal punto que ha
convertirse en una verdadera disciplina en sí misma. De hecho, numerosas tecnologías se utilizan exclusivamente
para mostrar datos, y se aplican muchos tipos de visualización para extraer la mejor
información de un conjunto de datos.
La exploración de datos consiste en un examen preliminar de los datos, que es
importante para comprender el tipo de información que se ha recopilado y qué
significa. En combinación con la información adquirida durante el problema de definición,
esta categorización determinará qué método de análisis de datos será el más adecuado
para llegar a una definición de modelo.
Generalmente, esta fase, además de un estudio detallado de las cartas a través del
Los datos de visualización pueden consistir en una o más de las siguientes actividades:
• Resumen de datos
• Agrupar datos
Generalmente, el análisis de datos requiere resumir declaraciones sobre los datos a ser
estudió. El resumen es un proceso mediante el cual los datos se reducen a interpretación sin
sacrificar información importante.
La agrupación en clústeres es un método de análisis de datos que se utiliza para encontrar grupos unidos por
atributos (también llamado agrupamiento ).
Otro paso importante del análisis se centra en la identificación de relaciones,
tendencias y anomalías en los datos. Para encontrar este tipo de información, a menudo
tener que recurrir a las herramientas, así como realizar otra ronda de análisis de datos, esta vez en
la visualización de datos en sí.
Otros métodos de minería de datos, como árboles de decisión y reglas de asociación,
Extrae automáticamente hechos o reglas importantes de los datos. Estos enfoques pueden ser
se utiliza en paralelo con la visualización de datos para descubrir las relaciones entre los datos.
11
https://translate.googleusercontent.com/translate_f 20/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 30
Modelado predictivo
El modelado predictivo es un proceso utilizado en el análisis de datos para crear o elegir un
modelo estadístico para predecir la probabilidad de un resultado.
Después de explorar los datos, tiene toda la información necesaria para desarrollar el
modelo matemático que codifica la relación entre los datos. Estos modelos son
útiles para comprender el sistema en estudio, y de una manera específica se utilizan para
dos propósitos principales. El primero es hacer predicciones sobre los valores de datos producidos por
el sistema; en este caso, tratará con modelos de regresión. El segundo propósito
es clasificar nuevos productos de datos y, en este caso, utilizará modelos de clasificación
o modelos de agrupamiento . De hecho, es posible dividir los modelos según el tipo de
resultado que producen:
Los métodos simples para generar estos modelos incluyen técnicas como el lineal
árboles de regresión, regresión logística, clasificación y regresión, y k-más cercano
vecinos. Pero los métodos de análisis son numerosos y cada uno tiene
características que lo hacen excelente para algunos tipos de datos y análisis. Cada uno de estos
Los métodos producirán un modelo específico, y luego su elección es relevante para la naturaleza de
el modelo de producto.
Algunos de estos modelos proporcionarán valores correspondientes al sistema real y
según su estructura. Explicarán algunas características del sistema en
estudiar de forma sencilla y clara. Otros modelos seguirán dando buenas predicciones,
pero su estructura no será más que una "caja negra" con capacidad limitada para explicar
características del sistema.
12
Página 31
Modelo de validación
La validación del modelo, es decir, la fase de prueba, es una fase importante que le permite
validar el modelo construido sobre la base de datos iniciales. Eso es importante porque permite
usted para evaluar la validez de los datos producidos por el modelo comparándolos directamente
con el sistema actual. Pero esta vez, sale del conjunto de datos iniciales en
que se ha establecido todo el análisis.
Generalmente, se referirá a los datos como el conjunto de entrenamiento cuando los utilice para
construyendo el modelo, y como el conjunto de validación cuando los está usando para validar el
modelo.
Así, al comparar los datos producidos por el modelo con los producidos por el
sistema, podrá evaluar el error y, utilizando diferentes conjuntos de datos de prueba, puede
Estimar los límites de validez del modelo generado. De hecho, lo predicho correctamente
https://translate.googleusercontent.com/translate_f 21/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
los valores pueden ser válidos solo dentro de un cierto rango o tener diferentes niveles de coincidencia
dependiendo del rango de valores tomados en cuenta.
Este proceso le permite no solo evaluar numéricamente la efectividad de
el modelo sino también para compararlo con cualquier otro modelo existente. Hay varios
técnicas al respecto; el más famoso es la validación cruzada . Esta técnica es
basado en la división del conjunto de formación en diferentes partes. Cada una de estas partes, en
turn, se utilizará como conjunto de validación y cualquier otro como conjunto de entrenamiento. En este iterativo
manera, tendrá un modelo cada vez más perfeccionado.
Despliegue
Este es el paso final del proceso de análisis, que tiene como objetivo presentar los resultados, es decir, la
conclusiones del análisis. En el proceso de implementación del entorno empresarial, el
El análisis se traduce en un beneficio para el cliente que lo ha encargado. En técnica
o entornos científicos, se traduce en soluciones de diseño o publicaciones científicas.
Es decir, el despliegue consiste básicamente en poner en práctica los resultados obtenidos
del análisis de datos.
Hay varias formas de implementar los resultados del análisis de datos o la minería de datos.
Normalmente, la implementación de un analista de datos consiste en escribir un informe para la administración o
para el cliente que solicitó el análisis. Este documento describirá conceptualmente
los resultados obtenidos del análisis de datos. El informe debe dirigirse al
gerentes, que luego pueden tomar decisiones. Luego, pondrán en práctica el
conclusiones del análisis.
13
Página 32
En la documentación suministrada por el analista, cada uno de estos cuatro temas será
discutido en detalle:
• Resultados de analisis
• Implementación de decisiones
• Análisis de riesgo
Cuando los resultados del proyecto incluyen la generación de modelos predictivos, estos
Los modelos se pueden implementar como aplicaciones independientes o se pueden integrar en otros
software.
https://translate.googleusercontent.com/translate_f 22/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
predicciones , con el resultado de que las conclusiones a las que puede llegar el analista de datos
también puede incluir interpretaciones subjetivas . Por otro lado, el análisis cualitativo
14
Página 33
Puede explorar sistemas más complejos y sacar conclusiones que no son posibles utilizando un
enfoque estrictamente matemático. A menudo, este tipo de análisis implica el estudio de sistemas
como fenómenos sociales o estructuras complejas que no son fácilmente mensurables.
Figura 1-2 muestra las diferencias entre los dos tipos de análisis.
Información abierta
En apoyo de la creciente demanda de datos, ahora hay una gran cantidad de fuentes de datos.
disponible en Internet. Estas fuentes de datos brindan información libremente a cualquier persona en
necesitan, y se denominan datos abiertos .
Aquí hay una lista de algunos datos abiertos disponibles en línea. Puedes encontrar una lista más completa
y detalles de los datos abiertos disponibles en línea en el Apéndice B.
• DataHub ( http://datahub.io/dataset)
• Data.gov ( http://data.gov )
15
Página 34
• Healthdata.gov (http://www.healthdata.gov)
Como una idea de las fuentes de datos abiertas disponibles en línea, puede mirar la nube LOD
https://translate.googleusercontent.com/translate_f 23/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
diagrama (http://lod-cloud.net ), que muestra las conexiones del enlace de datos
entre varias fuentes de datos abiertas actualmente disponibles en la red (ver Figura 1-3).
Figura 1-3. Vinculando el diagrama de nube de datos abiertos 2014, por Max Schmachtenberg,
Christian Bizer, Anja Jentzsch y Richard Cyganiak. http://lod-cloud.net/
[Licencia CC-BY-SA]
dieciséis
Página 35
Conclusiones
En este capítulo, aprendió qué es el análisis de datos y, más específicamente, los diversos
procesos que lo componen. Además, ha comenzado a ver el papel que juegan los datos en la construcción
un modelo de predicción y cómo su selección cuidadosa está en la base de una cuidadosa y
análisis de datos preciso.
En el próximo capítulo, tomará esta visión de Python y las herramientas que proporciona para
realizar análisis de datos.
https://translate.googleusercontent.com/translate_f 24/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
17
Página 36
CAPITULO 2
Introducción a
el mundo de Python
El lenguaje Python, y el mundo que lo rodea, está hecho por intérpretes, herramientas, editores,
bibliotecas, cuadernos, etc. Este mundo de Python se ha expandido enormemente en los últimos años, enriqueciendo
y adoptando formas que los desarrolladores que lo abordan por primera vez pueden encontrar
complicado y algo engañoso. Por lo tanto, si se está acercando a Python por primera vez
tiempo, es posible que se sienta perdido entre tantas opciones, especialmente sobre por dónde empezar.
Este capítulo le brinda una descripción general de todo el mundo de Python. Primero leerás un
descripción del lenguaje Python y sus características únicas. Verás a donde ir
start, qué es un intérprete y cómo empezar a escribir las primeras líneas de código en Python.
Luego se le presentan algunas formas nuevas y más avanzadas de escritura interactiva.
con respecto a los shells, como IPython e IPython Notebook.
• Interpretado
• Portátil
• Orientado a objetos
• Interactivo
• Interfaz
• Fuente abierta
19
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_2
Página 37
https://translate.googleusercontent.com/translate_f 25/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
El intérprete como interfaz para leer y ejecutar código tiene una ventaja clave: la portabilidad.
De hecho, puede instalar un intérprete en cualquier plataforma (Linux, Windows y Mac)
y el código Python no cambiará. Debido a esto, Python se usa a menudo como el
lenguaje de programación para muchos dispositivos de formato pequeño, como Raspberry Pi y otros
microcontroladores.
Python es un lenguaje de programación orientado a objetos. De hecho, te permite especificar
clases de objetos e implementar su herencia. Pero a diferencia de C ++ y Java, no existen
constructores o destructores. Python también le permite implementar construcciones específicas en
su código para administrar excepciones. Sin embargo, la estructura del lenguaje es tan
flexible que le permite programar con enfoques alternativos con respecto a la
uno orientado a objetos. Por ejemplo, puede utilizar enfoques funcionales o vectoriales.
Python es un lenguaje de programación interactivo . Gracias al hecho de que Python usa
un intérprete a ejecutar, este lenguaje puede asumir aspectos muy diferentes según
en el contexto en el que se utiliza. De hecho, puede escribir código compuesto de muchas líneas,
similar a lo que podría hacer en lenguajes como C ++ o Java, y luego iniciar el programa,
o puede ingresar la línea de comando a la vez y ejecutarla, obteniendo inmediatamente el
resultados del comando. Luego, dependiendo de los resultados, puede decidir qué comando
para ejecutar a continuación. Esta forma altamente interactiva de ejecutar código hace que la computación Python
entorno similar a MATLAB. Esta característica de Python es una de las razones por las que es popular entre
la comunidad científica.
Python es un lenguaje de programación que puede interactuar . De hecho, esta programación
El lenguaje puede interactuar con el código escrito en otros lenguajes de programación como
como C / C ++ y FORTRAN. Incluso esta fue una elección ganadora. De hecho, gracias a este aspecto,
Python puede compensar lo que quizás sea su único punto débil, la velocidad de ejecución.
La naturaleza de Python, como lenguaje de programación altamente dinámico, a veces puede conducir
a la ejecución de programas hasta 100 veces más lenta que los correspondientes programas estáticos
compilado con otros lenguajes. Por tanto, la solución a este tipo de problema de rendimiento es
para conectar Python con el código compilado de otros lenguajes usándolo como si fuera
su propio.
20
Página 38
Python: el intérprete
Como se describe en las secciones anteriores, cada vez que ejecuta el comando python, el
Se inicia el intérprete de Python, caracterizado por un >>> indicador.
El intérprete de Python es simplemente un programa que lee e interpreta los comandos
pasado al indicador. Ha visto que el intérprete puede aceptar una sola
comando a la vez o archivos completos de código Python. Sin embargo, el enfoque por el cual
realiza esto es siempre el mismo.
Cada vez que presiona la tecla Enter, el intérprete comienza a escanear el código (ya sea
https://translate.googleusercontent.com/translate_f 26/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
una fila o un archivo completo de código) token por token (llamado tokenización ). Estos tokens son
fragmentos de texto que el intérprete organiza en una estructura de árbol. El árbol obtenido es el
estructura lógica del programa, que luego se convierte a bytecode (.pyc o .pyo). los
la cadena de proceso termina con el código de bytes que será ejecutado por una máquina virtual Python
(PVM). Ver figura 2-1.
21
Página 39
Puede encontrar muy buena documentación sobre este proceso en https: //www.ics.uci.
edu / ~ pattis / ICS-31 / lectures / tokens.pdf.
El intérprete estándar de Python se informa como Cython, ya que fue escrito en C.
Hay otras áreas que se han desarrollado utilizando otros lenguajes de programación,
como Jython, desarrollado en Java; IronPython, desarrollado en C # (solo para Windows); y
PyPy, desarrollado íntegramente en Python.
Cython
El proyecto Cython se basa en la creación de un compilador que traduce el código Python en
C. Este código luego se ejecuta dentro de un entorno Cython en tiempo de ejecución. Este tipo de
El sistema de compilación ha hecho posible introducir la semántica de C en Python
código para hacerlo aún más eficiente. Este sistema ha llevado a la fusión de dos mundos
del lenguaje de programación con el nacimiento de Cython, que puede considerarse un nuevo
lenguaje de programación. Puede encontrar mucha documentación al respecto en línea; te aconsejo
para visitar http://docs.cython.org .
Jython
En paralelo a Cython, existe una versión totalmente construida y compilada en Java, llamada Jython . Eso
fue creado por Jim Hugunin en 1997 (http://www.jython.org). Jython es una implementación
del lenguaje de programación Python en Java; se caracteriza además por el uso de clases Java
en lugar de módulos de Python para implementar extensiones y paquetes de Python.
PyPy
El intérprete de PyPy es un compilador JIT (justo a tiempo) y convierte el código Python
directamente en el código de máquina en tiempo de ejecución. Esta elección se tomó para acelerar la ejecución de
Pitón. Sin embargo, esta elección ha llevado al uso de un subconjunto más pequeño de comandos de Python,
definido como RPython . Para obtener más información al respecto, consulte el sitio web oficial en
http://pypy.org.
22
Página 40
Python 2 y Python 3
https://translate.googleusercontent.com/translate_f 27/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Instalación de Python
Para desarrollar programas en Python tienes que instalarlo en tu sistema operativo.
Las distribuciones de Linux y las máquinas MacOS X ya deberían tener una versión preinstalada
de Python. Si no es así, o si desea reemplazar esa versión por otra, puede
instalarlo. La instalación de Python difiere de un sistema operativo a otro;
sin embargo, es una operación bastante simple.
En los sistemas Linux Debian-Ubuntu, ejecute este comando
En los sistemas Red Hat Fedora Linux que trabajan con paquetes rpm, ejecute este comando
23
Página 41
Distribuciones de Python
Debido al éxito del lenguaje de programación Python, muchas herramientas de Python se han
desarrollado para cumplir con diversas funcionalidades a lo largo de los años. Hay tantos que es
prácticamente imposible gestionarlos todos manualmente.
En este sentido, muchas distribuciones de Python administran de manera eficiente cientos de Python
paquetes. De hecho, en lugar de descargar individualmente el intérprete, que incluye
solo las bibliotecas estándar, y luego necesita instalar individualmente todas las
bibliotecas, es mucho más fácil instalar una distribución de Python.
En el corazón de estas distribuciones están los administradores de paquetes, que no son más
que las aplicaciones que administran, instalan, actualizan, configuran y eliminan automáticamente
Paquetes de Python que forman parte de la distribución.
Su funcionalidad es muy útil, ya que el usuario simplemente realiza una solicitud en un
paquete particular (que podría ser una instalación, por ejemplo), y el paquete
gerente, generalmente a través de Internet, realiza la operación analizando los
https://translate.googleusercontent.com/translate_f 28/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
versión, junto con todas las dependencias con cualquier otro paquete, y descargándolos si
no están presentes.
Anaconda
Anaconda es una distribución gratuita de paquetes de Python distribuidos por Continuum Analytics
( https://www.anaconda.com). Esta distribución es compatible con Linux, Windows y MacOS
X sistemas operativos. Anaconda, además de proporcionar los últimos paquetes lanzados
en el mundo de Python, viene con la mayoría de las herramientas que necesita para configurar un Python
entorno de desarrollo.
De hecho, cuando instala la distribución Anaconda en su sistema, puede usar
muchas herramientas y aplicaciones descritas en este capítulo, sin preocuparse por tener que
instalar y administrar cada uno por separado. La distribución básica incluye Spyder como IDE,
IPython QtConsole y Notebook.
24
Página 42
Esto generará un nuevo entorno Anaconda con todos los paquetes relacionados con el
Versión de Python 3.6. Esta instalación no afectará de ninguna manera el entorno construido con
Python 2.7. Una vez instalado, puede activar el nuevo entorno ingresando al
siguiente comando.
activar py36
Puede crear tantas versiones de Python como desee; solo necesitas cambiar el
parámetro pasado con la opción python en el comando conda create. Cuando quieres
para volver a trabajar con la versión original de Python, debes usar el siguiente comando:
fuente desactivar
25
Página 43
https://translate.googleusercontent.com/translate_f 29/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Canopy entusiasta
Existe otra distribución muy similar a Anaconda y es la distribución Canopy
proporcionado por Enthought, una empresa fundada en 2001 y conocida por el proyecto SciPy
( https://www.enthought.com/products/canopy/ ). Esta distribución es compatible con Linux,
Sistemas Windows y MacOS X y consta de una gran cantidad de paquetes, herramientas,
y aplicaciones administradas por un administrador de paquetes. El administrador de paquetes de Canopy, como
opuesto a conda, es gráfico.
Desafortunadamente, solo la versión básica de esta distribución, llamada Canopy Express, es
gratis; además del paquete normalmente distribuido, también incluye IPython y un IDE
de Canopy que tiene una característica especial que no está presente en otros IDE. Tiene incrustado el
IPython para utilizar este entorno como una ventana para probar y depurar código.
Python (x, y)
Python (x, y) es una distribución gratuita que solo funciona en Windows y se puede descargar desde
http://code.google.com/p/pythonxy/. Esta distribución utiliza Spyder como IDE.
Usando Python
Python es rico pero simple y muy flexible. Permite la expansión de tu desarrollo
actividades en muchas áreas de trabajo (análisis de datos, científico, interfaces gráficas, etc.).
Precisamente por esta razón, Python se puede utilizar en muchos contextos diferentes, a menudo de acuerdo con
al gusto y habilidad del desarrollador. Esta sección presenta los diversos enfoques
a usar Python en el curso del libro. Según los diversos temas tratados en
diferentes capítulos, estos diferentes enfoques se utilizarán específicamente, ya que serán
más adecuado para la tarea en cuestión.
Shell de Python
La forma más fácil de acercarse al mundo de Python es abrir una sesión en el shell de Python,
que es una terminal que ejecuta una línea de comando. De hecho, puede ingresar un comando en
una vez y pruebe su funcionamiento inmediatamente. Este modo aclara la naturaleza de la
intérprete que subyace a Python. De hecho, el intérprete puede leer un comando en un
tiempo, manteniendo el estado de las variables especificadas en las líneas anteriores, un comportamiento similar
a la de MATLAB y otros programas de cálculo.
26
Página 44
Este enfoque es útil cuando se acerca a Python por primera vez. Puedes probar
comandos uno a la vez sin tener que escribir, editar y ejecutar un programa completo, que
podría estar compuesto por muchas líneas de código.
Este modo también es bueno para probar y depurar el código Python una línea a la vez, o
simplemente para hacer cálculos. Para iniciar una sesión en el terminal, simplemente escriba esto en el
línea de comando:
>>> pitón
Python 3.6.3 (predeterminado, 15 de octubre de 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)]
en win32
Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información.
>>>
Ahora el shell de Python está activo y el intérprete está listo para recibir comandos en
Pitón. Comience ingresando los comandos más simples, pero un clásico para comenzar
programación.
https://translate.googleusercontent.com/translate_f 30/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Hola Mundo!
python MyFirstProgram.py
¿Cuál es tu nombre? Fabio Nelli
Hola Fabio Nelli, me alegra decirte: ¡Hola mundo!
27
Página 45
28
https://translate.googleusercontent.com/translate_f 31/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 46
Hacer cálculos
Ya ha visto que la función print () es útil para imprimir casi cualquier cosa.
Python, además de ser una herramienta de impresión, también es una gran calculadora. Iniciar una sesión en
el shell de Python y comenzar a realizar estas operaciones matemáticas:
>>> 1 + 2
3
>>> (1.045 * 3) / 4
0,78375
>>> 4 ** 2
dieciséis
>>> ((4 + 5j) * (2 + 3j))
(-7 + 22j)
>>> 4 <(2 * 3)
Cierto
Python puede calcular muchos tipos de datos, incluidos números complejos y condiciones
con valores booleanos. Como puede ver en estos cálculos, el intérprete de Python
devuelve directamente el resultado de los cálculos sin la necesidad de utilizar print ()
función. Lo mismo se aplica a los valores contenidos en variables. Es suficiente llamar al
variable para ver su contenido.
>>> a = 12 * 3.4
>>> un
40,8
29
Página 47
De esta forma, todas las funciones contenidas en el paquete matemático están disponibles en su
Sesión de Python para que pueda llamarlos directamente. Por lo tanto, ha ampliado el conjunto estándar de
funciones disponibles cuando inicia una sesión de Python. Estas funciones se llaman con la
siguiente expresión.
nombre_biblioteca.nombre_función ()
Por ejemplo, ahora puede calcular el seno del valor contenido en la variable a.
Como puede ver, la función se llama junto con el nombre de la biblioteca. Algunas veces
puede encontrar la siguiente expresión para declarar una importación.
Incluso si esto funciona correctamente, se debe evitar por buenas prácticas. De hecho, escribir un
https://translate.googleusercontent.com/translate_f 32/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
importar de esta manera implica la importación de todas las funciones sin necesariamente definir
la biblioteca a la que pertenecen.
Esta forma de importación puede dar lugar a errores muy grandes, especialmente si las bibliotecas importadas
son numerosos. De hecho, no es improbable que diferentes bibliotecas tengan funciones con la
mismo nombre, e importar todos estos daría como resultado una anulación de todas las funciones con
el mismo nombre importado previamente. Por tanto, el comportamiento del programa podría
generar numerosos errores o peor, comportamiento anormal.
En realidad, esta forma de importar se usa generalmente solo para un número limitado de funciones,
es decir, funciones que son estrictamente necesarias para el funcionamiento del programa, por lo que
evitando la importación de una biblioteca completa cuando es completamente innecesaria.
Estructura de datos
En los ejemplos anteriores viste cómo usar variables simples que contienen un solo valor.
Python proporciona una serie de estructuras de datos extremadamente útiles. Estas estructuras de datos son
capaz de contener muchos datos simultáneamente y, a veces, incluso datos de diferentes tipos.
30
Página 48
Las diversas estructuras de datos proporcionadas se definen de manera diferente dependiendo de cómo se
los datos están estructurados internamente.
• Lista
• Establecer
• Cuerdas
• Tuplas
• Diccionario
• Deque
• Montón
Esta es solo una pequeña parte de todas las estructuras de datos que se pueden crear con Python.
Entre todas estas estructuras de datos, las más utilizadas son los diccionarios y las listas .
El diccionario de tipos , también definido como dictados , es una estructura de datos en la que cada
El valor está asociado con una etiqueta particular, llamada clave . Los datos recopilados en un diccionario.
no tienen orden interno, pero son solo definiciones de pares clave / valor.
https://translate.googleusercontent.com/translate_f 33/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
31
Página 49
La lista de tipos es una estructura de datos que contiene varios objetos en un orden preciso
para formar una secuencia a la que se pueden agregar y eliminar elementos. Cada artículo está marcado
con un número correspondiente al orden de la secuencia, llamado índice .
Si está utilizando índices negativos en su lugar, esto significa que está considerando el último elemento
en la lista y pasando gradualmente al primero.
Para hacer un escaneo de los elementos de una lista, puede usar la construcción for-in.
32
Página 50
Programación funcional
El bucle for-in que se muestra en el ejemplo anterior es muy similar a los bucles que se encuentran en otros
lenguajes de programación. Pero en realidad, si quieres ser un desarrollador de "Python",
debe evitar el uso de bucles explícitos. Python ofrece enfoques alternativos, especificando
técnicas de programación como la programación funcional (orientada a expresiones
programación).
Las herramientas que proporciona Python para desarrollar la programación funcional comprenden una serie
de funciones:
• lambda
• comprensión de listas
El bucle for que acaba de ver tiene un propósito específico, que es aplicar un
operación en cada elemento y luego de alguna manera recopilar el resultado. Esto lo puede hacer el
función map ().
33
Página 51
Otras dos funciones que funcionan de manera similar son filter () y reduce (). los
La función filter () extrae los elementos de la lista para los que la función devuelve True.
La función reduce () en cambio considera todos los elementos de la lista para producir un solo
resultado. Para usar reduce (), debe importar el módulo functools.
Ambas funciones implementan otros tipos utilizando el bucle for. Ellos reemplazan
estos ciclos y su funcionalidad, que pueden expresarse alternativamente con simples
funciones. Eso es lo que constituye la programación funcional.
El concepto final de la programación funcional es la comprensión de listas. Este concepto es
utilizado para construir listas de una manera muy natural y simple, refiriéndose a ellas de una manera similar
a cómo los matemáticos describen los conjuntos de datos. Los valores en la secuencia están definidos
a través de una función u operación particular.
Sangría
Una peculiaridad para quienes proceden de otros lenguajes de programación es el papel que
la sangría juega. Mientras que solía administrar la muesca por motivos puramente estéticos
razones, haciendo el código algo más legible, en Python la sangría asume una
papel integral en la implementación del código, dividiéndolo en bloques lógicos. De hecho,
mientras que en Java, C y C ++, cada línea de código está separada de la siguiente por un punto y coma (;),
en Python no debe especificar ningún símbolo que los separe, incluidas las llaves para
indicar un bloque lógico.
https://translate.googleusercontent.com/translate_f 35/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Estos roles en Python se manejan mediante sangría; es decir, dependiendo de la
punto de partida de la línea de código, el intérprete determina si pertenece a una lógica
bloquear o no.
34
Página 52
>>> a = 4
>>> si a> 3:
... si a <5:
... print ("tengo cuatro")
... más:
... print ("Soy un pequeño número")
...
yo tengo cuatro
>>> si a> 3:
... si a <5:
... print ("Tengo cuatro")
... más:
... print ("Soy un gran número")
...
yo tengo cuatro
En este ejemplo, puede ver que, dependiendo de cómo esté el comando else
sangrado, las condiciones asumen dos significados diferentes (especificados por mí en las cadenas
sí mismos).
IPython
IPython es un desarrollo adicional de Python que incluye una serie de herramientas:
• Una QtConsole, que es un híbrido entre un shell y una GUI, lo que permite
que muestre gráficos dentro de la consola en lugar de por separado
ventanas.
35
Página 53
Shell de IPython
Este shell aparentemente se parece a una sesión de Python que se ejecuta desde una línea de comandos, pero en realidad,
Proporciona muchas otras características que hacen que esta carcasa sea mucho más potente y versátil.
que el clásico. Para iniciar este shell, simplemente escriba ipython en la línea de comando.
> ipython
https://translate.googleusercontent.com/translate_f 36/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Python 3.6.3 (predeterminado, 15 de octubre de 2017, 3:27:45) [MSC v.1900 64bit (AMD64)]
Escriba "derechos de autor", "créditos" o "licencia" para obtener más información.
En 1]:
Como puede ver, aparece un mensaje en particular con el valor In [1]. Esto significa que
es la primera línea de entrada. De hecho, IPython ofrece un sistema de indicaciones numeradas (indexadas)
con almacenamiento en caché de entrada y salida.
En [2]: 3/2
Fuera [2]: 1,5
En [3]: 5.0 / 2
Fuera [3]: 2.5
En [4]:
Lo mismo se aplica a los valores de salida que se indican con los valores Out [1],
Fuera [2], y así sucesivamente. IPython guarda todas las entradas que ingresa almacenándolas como variables.
De hecho, todas las entradas ingresadas se incluyeron como campos en una lista llamada In.
En [4]: En
Fuera [4]: [", 'imprimir" ¡Hola mundo! "', '3/2', '5.0 / 2', 'In']
Los índices de los elementos de la lista son los valores que aparecen en cada solicitud. Así, para
acceder a una sola línea de entrada, simplemente puede especificar ese valor.
En [5]: en [3]
Fuera [5]: '5.0 / 2'
36
Página 54
En [6]: Fuera
Fuera [6]:
{2: 1,
3: 2,5,
4: ['',
u'print "¡Hola mundo!" ',
u'3 / 2 ',
u'5.0 / 2 ',
u'_i2 ',
u'In ',
u'En [3] ',
u'Out '],
5: u'5.0 / 2 '}
El proyecto Jupyter
IPython es un proyecto que ha crecido enormemente en los últimos tiempos, y con la
lanzamiento de IPython 3.0, todo se está moviendo hacia un nuevo proyecto llamado Jupyter
( https://jupyter.org) —Ver Figura 2-2.
https://translate.googleusercontent.com/translate_f 37/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
37
Página 55
IPython seguirá existiendo como un shell de Python y como un núcleo de Jupyter, pero el
Notebook y los otros componentes independientes del lenguaje que pertenecen a IPython
El proyecto se moverá para formar el nuevo proyecto Jupyter.
Jupyter QtConsole
Para ejecutar esta aplicación desde la línea de comando, debe ingresar lo siguiente
mando:
ipython qtconsole
jupyter qtconsole
La aplicación consta de una GUI que tiene toda la funcionalidad presente en el IPython
cáscara. Ver figura 2-3.
38
Página 56
Cuaderno Jupyter
https://translate.googleusercontent.com/translate_f 38/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Jupyter Notebook es la última evolución de este entorno interactivo (consulte la Figura 2-4 ).
De hecho, con Jupyter Notebook, puede combinar código ejecutable, texto, fórmulas, imágenes,
y animaciones en un solo documento web. Esto es útil para muchos propósitos, como
presentaciones, tutoriales, depuración, etc.
39
Página 57
python get-pip.py
https://translate.googleusercontent.com/translate_f 39/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
40
Página 58
Spyder
Spyder (Scientific Python Development Environment) es un IDE que tiene características similares a
el IDE de MATLAB (ver Figura 2-5 ). El editor de texto está enriquecido con resaltado de sintaxis y
herramientas de análisis de código. Además, puede integrar widgets listos para usar en sus aplicaciones gráficas.
Eclipse (pyDev)
Aquellos de ustedes que se han desarrollado en otros lenguajes de programación ciertamente saben
Eclipse, un IDE universal desarrollado completamente en Java (por lo tanto, requiere la instalación de Java
en su PC) que proporciona un entorno de desarrollo para muchos programas
idiomas (consulte la Figura 2-6 ). También hay una versión de Eclipse para desarrollar en Python,
gracias a la instalación de un complemento adicional llamado pyDev .
41
Página 59
https://translate.googleusercontent.com/translate_f 40/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Sublime
Este editor de texto es uno de los entornos preferidos por los programadores de Python (consulte
Figura 2-7). De hecho, hay varios complementos disponibles para esta aplicación que hacen
Implementación de Python fácil y agradable.
42
Página 60
https://translate.googleusercontent.com/translate_f 41/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Liclipse
Liclipse, al igual que Spyder, es un entorno de desarrollo diseñado específicamente para
el lenguaje Python (ver Figura 2-8). Es muy similar al IDE de Eclipse pero es completamente
adaptado para un uso específico en Python, sin necesidad de instalar complementos como PyDev. Entonces es
la instalación y la configuración son mucho más simples que Eclipse.
43
Página 61
NinjaIDE
NinjaIDE (NinjaIDE es "No es simplemente otro IDE"), que se caracteriza por un nombre que es
un acrónimo recursivo, es un IDE especializado para el lenguaje Python (ver Figura 2-9). Sus
una aplicación muy reciente en la que se centran los esfuerzos de muchos desarrolladores. Ya
muy prometedor, es probable que en los próximos años, este IDE sea una fuente de muchos
sorpresas.
44
https://translate.googleusercontent.com/translate_f 42/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 62
IDE de Komodo
Komodo es un IDE muy poderoso lleno de herramientas que lo convierten en un completo y profesional
entorno de desarrollo (consulte la Figura 2-10 ). Software pagado y escrito en C ++, el
El entorno de desarrollo de Komodo se puede adaptar a muchos lenguajes de programación,
incluido Python.
45
Página 63
https://translate.googleusercontent.com/translate_f 43/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Ciencia
SciPy (pronunciado "sigh pie") es un conjunto de bibliotecas de Python de código abierto especializadas para
computación científica. Muchas de estas bibliotecas son protagonistas de muchos capítulos de la
libro, dado que su conocimiento es fundamental para el análisis de datos. Juntos constituyen un
conjunto de herramientas para calcular y visualizar datos. Tiene poco que envidiar a otros especializados
entornos de cálculo y análisis de datos (como R o MATLAB). Entre la
bibliotecas que forman parte del grupo SciPy, hay tres en particular que se discuten
en los siguientes capítulos:
• NumPy
• matplotlib
• Pandas
46
Página 64
NumPy
Esta biblioteca, cuyo nombre significa Python numérico, constituye el núcleo de muchas otras
Bibliotecas de Python que se han originado a partir de él. De hecho, NumPy es la biblioteca básica
para la computación científica en Python, ya que proporciona estructuras de datos y alto rendimiento
funciones que el paquete básico de Python no puede proporcionar. De hecho, como verás
más adelante en el libro, NumPy define una estructura de datos específica que es una matriz N- dimensional
definido como ndarray .
El conocimiento de esta biblioteca es esencial en términos de cálculos numéricos ya que su
el uso correcto puede influir en gran medida en el rendimiento de sus cálculos. En todo
el libro, esta biblioteca es casi omnipresente debido a sus características únicas, por lo que un
todo el capítulo está dedicado a ella (Capítulo 3).
Este paquete proporciona algunas características que se agregarán al Python estándar:
Pandas
Este paquete proporciona estructuras de datos complejas y funciones diseñadas específicamente para
hacer que el trabajo en ellos sea fácil, rápido y eficaz. Este paquete es el núcleo del análisis de datos
en Python. Por tanto, el estudio y aplicación de este paquete es el principal objetivo en el que
trabajará a lo largo del libro (especialmente en los capítulos 4 , 5 y6 ). Conocimiento de su
cada detalle, especialmente cuando se aplica al análisis de datos, es un objetivo fundamental de
este libro.
El concepto fundamental de este paquete es el DataFrame , un bidimensional
https://translate.googleusercontent.com/translate_f 44/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
estructura de datos tabular con etiquetas de fila y columna.
47
Página 65
matplotlib
Este paquete es la biblioteca de Python que es actualmente más popular para producir gráficos y
otras visualizaciones de datos en 2D. Dado que el análisis de datos requiere herramientas de visualización, esta es la
biblioteca que mejor se adapte a este propósito. En el capítulo7, aprenderá sobre esta rica biblioteca en detalle
así sabrás representar los resultados de tu análisis de la mejor manera.
Conclusiones
Durante el transcurso de este capítulo, todos los aspectos fundamentales que caracterizan a Python
El mundo ha sido ilustrado. Los conceptos básicos del lenguaje de programación Python
se presentaron, con breves ejemplos que explican sus aspectos innovadores y cómo se
en comparación con otros lenguajes de programación. Además, diferentes formas de utilizar
Se presentaron Python en varios niveles. Primero vio cómo usar un comando simple:
intérprete de línea, luego se mostró un conjunto de interfaces gráficas de usuario simples hasta que obtuviste
a entornos de desarrollo complejos, conocidos como IDE, como Spyder, Liclipse y
NinjaIDE.
Incluso se presentó el proyecto altamente innovador Jupyter (IPython), mostrándole
cómo puede desarrollar código Python de forma interactiva, en particular con Jupyter Notebook.
Además, se destacó la naturaleza modular de Python con la capacidad de expandirse
el conjunto básico de funciones estándar proporcionadas por las bibliotecas externas de Python. A este respecto,
el repositorio en línea de PyPI se mostró junto con otras distribuciones de Python, como
Anaconda y Canopy Enthought.
En el capítulo siguiente, se ocupará de la primera biblioteca que es la base de todas las
cálculos en Python: NumPy. Aprende sobre ndarray, una estructura de datos que
es la base de las estructuras de datos más complejas utilizadas en el análisis de datos en los siguientes
capítulos.
48
Página 66
CAPÍTULO 3
La biblioteca de NumPy
NumPy es un paquete básico para computación científica con Python y especialmente para datos
análisis. De hecho, esta biblioteca es la base de una gran cantidad de conocimientos matemáticos y científicos.
https://translate.googleusercontent.com/translate_f 45/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Paquetes de Python, y entre ellos, como verá más adelante en el libro, los pandas
biblioteca. Esta biblioteca, especializada para el análisis de datos, está completamente desarrollada utilizando los conceptos
introducido por NumPy. De hecho, las herramientas integradas proporcionadas por la biblioteca estándar de Python
podría ser demasiado simple o inadecuado para la mayoría de los cálculos del análisis de datos.
Tener conocimiento de la biblioteca NumPy es importante para poder usar todos
paquetes científicos de Python y, en particular, para usar y comprender la biblioteca de pandas.
La biblioteca de pandas es el tema principal de los siguientes capítulos.
Si ya está familiarizado con esta biblioteca, puede pasar directamente a la siguiente
capítulo; de lo contrario, puede ver este capítulo como una forma de revisar los conceptos básicos o de
Vuelva a familiarizarse con él ejecutando los ejemplos de este capítulo.
Página 67
La instalación de NumPy
Generalmente, este módulo está presente como un paquete básico en la mayoría de las distribuciones de Python;
sin embargo, si no es así, puede instalarlo más tarde.
En Linux (Ubuntu y Debian), use:
En Linux (Fedora)
Una vez que NumPy está instalado en su distribución, para importar el módulo NumPy dentro
su sesión de Python, escriba lo siguiente:
https://translate.googleusercontent.com/translate_f 46/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
definido como ejes y el número de ejes como rango .
Además, otra peculiaridad de las matrices NumPy es que su tamaño es fijo, es decir, una vez
define su tamaño en el momento de la creación, permanece sin cambios. Este comportamiento es
diferente de las listas de Python, que pueden aumentar o reducir su tamaño.
50
Página 68
La forma más fácil de definir un nuevo ndarray es usar la función array (), pasando un
Lista de Python que contiene los elementos que se incluirán en ella como argumento.
Puede comprobar fácilmente que un objeto recién creado es un ndarray pasando el nuevo
variable a la función type ().
Tenga en cuenta que el resultado de dtype, shape y otros atributos pueden variar entre diferentes
sistemas operativos y distribuciones de Python.
>>> a.dtype
dtype ('int64')
La matriz recién creada tiene un eje, y luego su rango es 1, mientras que su forma debe ser
(3,1). Para obtener estos valores de la matriz correspondiente, es suficiente usar el ndim
atributo para obtener los ejes, el atributo de tamaño para conocer la longitud de la matriz y la forma
atributo para obtener su forma.
>>> a.ndim
1
>>> a.tamaño
3
>>> una. forma
(3,)
51
Página 69
Lo que acaba de ver es el caso más simple de una matriz unidimensional. Pero el uso
de matrices se puede ampliar fácilmente a varias dimensiones. Por ejemplo, si define dos
matriz dimensional 2x2:
https://translate.googleusercontent.com/translate_f 47/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> b.ndim
2
>>> b.tamaño
4
>>> b. forma
(2, 2)
Esta matriz tiene rango 2, ya que tiene dos ejes, cada uno de longitud 2.
Otro atributo importante es el tamaño de los elementos , que se puede utilizar con objetos ndarray. Eso
define el tamaño en bytes de cada elemento de la matriz, y los datos son el búfer que contiene el
elementos reales de la matriz. Este segundo atributo todavía no se usa generalmente, ya que para
acceder a los datos dentro de la matriz, utilizará el mecanismo de indexación que verá en
las siguientes secciones.
>>> b.itemsize
8
>>> b.data
<búfer de lectura y escritura para 0x0000000002D34DF0, tamaño 32, desplazamiento 0 en
0x0000000002D5FEA0>
52
Página 70
La función array (), además de listas, puede aceptar tuplas y secuencias de tuplas.
Tipos de datos
Hasta ahora, solo ha visto valores numéricos enteros y flotantes simples, pero las matrices NumPy son
diseñado para contener una amplia variedad de tipos de datos (consulte la Tabla 3-1 ). Por ejemplo, puede utilizar
la cadena de tipo de datos:
https://translate.googleusercontent.com/translate_f 48/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
'str32'
53
Página 71
intp entero utilizado para la indexación (igual que C size_t; normalmente int32 o int64)
float16 flotador de precisión media: bit de signo, exponente de 5 bits, mantisa de 10 bits
float32 Flotante de precisión simple: bit de signo, exponente de 8 bits, mantisa de 23 bits
float64 Flotante de doble precisión: bit de signo, exponente de 11 bits, mantisa de 52 bits
complex64 Número complejo, representado por dos flotantes de 32 bits (componentes reales e imaginarios)
complex128 Número complejo, representado por dos flotantes de 64 bits (componentes reales e imaginarios)
La opción dtype
La función array () no acepta un solo argumento. Has visto que cada
El objeto ndarray está asociado con un objeto dtype que define de forma única el tipo de datos
que ocupará cada elemento de la matriz. Por defecto, la función array () puede asociar
el tipo más adecuado según los valores contenidos en la secuencia de listas o
tuplas. En realidad, puede definir explícitamente el dtype usando la opción dtype como argumento
de la función.
54
Página 72
Por ejemplo, si desea definir una matriz con valores complejos, puede usar la
dtype opción de la siguiente manera:
https://translate.googleusercontent.com/translate_f 49/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> f = np.array ([[1, 2, 3], [4, 5, 6]], dtype = complex)
>>> f
matriz ([[1. + 0.j, 2. + 0.j, 3. + 0.j],
[4. + 0.j, 5. + 0.j, 6. + 0.j]])
Mientras que la función ones () crea una matriz llena de unos de una manera muy similar.
De forma predeterminada, las dos funciones crearon matrices con el tipo de datos float64. Una característica
que será particularmente útil es arange (). Esta función genera matrices NumPy
con secuencias numéricas que responden a reglas particulares dependiendo de la pasada
argumentos. Por ejemplo, si desea generar una secuencia de valores entre 0 y 10,
se le pasará solo un argumento a la función, ese es el valor con el que
quiere terminar la secuencia.
55
Página 73
Si en lugar de comenzar desde cero desea comenzar desde otro valor, simplemente
especifique dos argumentos: el primero es el valor inicial y el segundo es el valor final.
También es posible generar una secuencia de valores con intervalos precisos entre
ellos. Si se especifica el tercer argumento de la función arange (), esto representará la
brecha entre un valor y el siguiente en la secuencia de valores.
https://translate.googleusercontent.com/translate_f 50/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
[8, 9, 10, 11]])
Otra función muy similar a arange () es linspace (). Esta función todavía toma como
sus dos primeros argumentos son los valores inicial y final de la secuencia, pero el tercer argumento,
en lugar de especificar la distancia entre un elemento y el siguiente, define la
número de elementos en los que queremos que se divida el intervalo.
Finalmente, otro método para obtener matrices que ya contienen valores es llenarlos
con valores aleatorios. Esto es posible usando la función random () de numpy.random
módulo. Esta función generará una matriz con muchos elementos como se especifica en el
argumento.
56
Página 74
Los números obtenidos variarán con cada ejecución. Para crear una matriz multidimensional,
simplemente pasa el tamaño de la matriz como argumento.
Operaciones básicas
Hasta ahora, ha visto cómo crear una nueva matriz NumPy y cómo se definen los elementos en ella.
Ahora es el momento de ver cómo aplicarles varias operaciones.
Operadores aritméticos
Las primeras operaciones que realizará en matrices son los operadores aritméticos. los
los más obvios son sumar y multiplicar una matriz por un escalar.
>>> a + 4
matriz ([4, 5, 6, 7])
>>> a * 2
matriz ([0, 2, 4, 6])
Estos operadores también se pueden utilizar entre dos matrices. En NumPy, estas operaciones
son elemento-sabio, es decir, los operadores se aplican sólo entre los correspondientes
elementos. Estos son objetos que ocupan la misma posición, por lo que el resultado final será
una nueva matriz que contiene los resultados en la misma ubicación de los operandos (consulte la Figura 3-1).
57
Página 75
https://translate.googleusercontent.com/translate_f 51/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Capítulo 3 la biblioteca Numpy
>>> a + b
matriz ([4, 6, 8, 10])
>>> a - b
matriz ([- 4, –4, –4, –4])
>>> a * b
matriz ([0, 5, 12, 21])
Además, estos operadores también están disponibles para funciones, siempre que el valor
devuelto es una matriz NumPy. Por ejemplo, puede multiplicar la matriz por el seno o el
raíz cuadrada de los elementos de la matriz b .
58
Página 76
El producto Matrix
La elección de los elementos operativos es un aspecto peculiar de la biblioteca NumPy. En
De hecho, en muchas otras herramientas para el análisis de datos, el operador * se entiende como una matriz
https://translate.googleusercontent.com/translate_f 52/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
producto cuando se aplica a dos matrices. Usando NumPy, este tipo de producto es en cambio
indicado por la función punto (). Esta operación no es por elementos.
59
Página 77
Una forma alternativa de escribir el producto de la matriz es ver la función punto () como una
función del objeto de una de las dos matrices.
Tenga en cuenta que dado que el producto de la matriz no es una operación conmutativa, el orden de la
operandos es importante. De hecho, A * B no es igual a B * A.
60
https://translate.googleusercontent.com/translate_f 53/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 78
Por lo tanto, el uso de estos operadores es mucho más extenso que el simple
operadores incrementales que aumentan los valores en una unidad, y se pueden aplicar en
muchos casos. Por ejemplo, los necesita cada vez que desea cambiar los valores en un
matriz sin generar una nueva.
61
Página 79
Funciones agregadas
Las funciones agregadas realizan una operación en un conjunto de valores, una matriz, por ejemplo, y
producir un único resultado. Por lo tanto, la suma de todos los elementos de una matriz es un agregado
función. Muchas funciones de este tipo se implementan dentro de la clase ndarray.
https://translate.googleusercontent.com/translate_f 54/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> a.sum ()
15.0
>>> a.min ()
0,29999999999999999
>>> a.max ()
5.7000000000000002
>>> a.mean ()
3,0
>>> a.std ()
2.0079840636817816
62
Página 80
Indexación
La indexación de matrices siempre usa corchetes ([]) para indexar los elementos de la matriz, por lo que
que los elementos pueden ser referidos individualmente para varios usos, como extraer un
valor, seleccionando elementos, o incluso asignando un nuevo valor.
Cuando crea una nueva matriz, un índice de escala apropiado también se
creado (ver figura 3-3).
Las matrices NumPy también aceptan índices negativos. Estos índices tienen el mismo
secuencia incremental de 0 a –1, –2, y así sucesivamente, pero en la práctica causan la
elemento para moverse gradualmente hacia el elemento inicial, que será el que tiene la
valor de índice más negativo.
>>> a [–1]
15
>>> a [–6]
10
Para seleccionar varios elementos a la vez, puede pasar una matriz de índices entre corchetes.
https://translate.googleusercontent.com/translate_f 55/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
63
Página 81
>>> A [1, 2]
15
64
Página 82
Rebanar
El corte le permite extraer partes de una matriz para generar nuevas matrices. Cuando cuando
usa las listas de Python para dividir matrices, las matrices resultantes son copias, pero en NumPy, el
las matrices son vistas del mismo búfer subyacente.
Dependiendo de la parte de la matriz que desee extraer (o ver), debe
use la sintaxis de sector; es decir, utilizará una secuencia de números separados por dos puntos (:)
entre corchetes.
Si desea extraer una parte de la matriz, por ejemplo, una que vaya del
segundo al sexto elemento, debe insertar el índice del elemento inicial, es decir, 1,
y el índice del elemento final, es decir 5, separado por:.
https://translate.googleusercontent.com/translate_f 56/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> a [1: 5: 2]
matriz ([11, 13])
Para comprender mejor la sintaxis de los segmentos, también debe examinar los casos en los que
no utilice valores numéricos explícitos. Si omite el primer número, NumPy implícitamente
interpreta este número como 0 (es decir, el elemento inicial de la matriz). Si omite el segundo
número, esto se interpretará como el índice máximo de la matriz; y si omites el
último número esto se interpretará como 1. Todos los elementos se considerarán sin
intervalos.
sesenta y cinco
Página 83
>>> a [:: 2]
matriz ([10, 12, 14])
>>> a [: 5: 2]
matriz ([10, 12, 14])
>>> a [: 5:]
matriz ([10, 11, 12, 13, 14])
Como puede ver en el segundo índice, si deja solo los dos puntos sin definir un
número, seleccionará todas las columnas. En cambio, si desea extraer todos los valores de
la primera columna, tienes que escribir la inversa.
>>> A [:, 0]
matriz ([10, 13, 16])
En cambio, si desea extraer una matriz más pequeña, debe definir explícitamente todos
intervalos con índices que los definen.
>>> A [0: 2, 0: 2]
matriz ([[10, 11],
[13, 14]])
https://translate.googleusercontent.com/translate_f 57/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> A [[0,2], 0: 2]
matriz ([[10, 11],
[16, 17]])
66
Página 84
>>> para i en a:
... imprimir (i)
...
10
11
12
13
14
15
Si desea hacer una iteración elemento por elemento, puede usar lo siguiente
construir, usando el bucle for en A.flat.
67
Página 85
dieciséis
17
18
Sin embargo, a pesar de todo esto, NumPy ofrece una solución alternativa y más elegante
que el bucle for. Generalmente, necesita aplicar una iteración para aplicar una función en el
filas o en las columnas o en un artículo individual. Si desea lanzar un agregado
https://translate.googleusercontent.com/translate_f 58/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
función que devuelve un valor calculado para cada columna o en cada fila,
hay una forma óptima que deja que NumPy gestione la iteración: el apply_
función along_axis ().
Esta función toma tres argumentos: la función agregada, el eje sobre el que
aplique la iteración y la matriz. Si el eje de la opción es igual a 0, la iteración evalúa
los elementos columna por columna, mientras que si el eje es igual a 1, la iteración evalúa
los elementos fila por fila. Por ejemplo, puede calcular los valores promedio primero por
columna y luego por fila.
68
Página 86
Como puede ver, la función ufunc divide a la mitad el valor de cada elemento de la entrada
matriz independientemente de si la iteración se realiza por fila o por columna.
Una vez que se define una matriz de números aleatorios, si aplica una condición de operador,
recibirá como valor de retorno una matriz booleana que contiene valores verdaderos en las posiciones
en el que se cumple la condición. En este ejemplo, son todas las posiciones en las que
los valores son inferiores a 0,5.
>>> A <0,5
array ([[Verdadero, Verdadero, Falso, Falso],
[Verdadero, Verdadero, Falso, Verdadero],
[Falso, Verdadero, Falso, Falso],
[Falso, Falso, Verdadero, Verdadero]], dtype = bool)
https://translate.googleusercontent.com/translate_f 59/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
En realidad, las matrices booleanas se utilizan implícitamente para realizar selecciones de partes de
matrices. De hecho, al insertar la condición anterior directamente dentro de los corchetes,
extraerá todos los elementos menores a 0.5, para obtener una nueva matriz.
>>> A [A <0,5]
matriz ([0.03536295, 0.0035115, 0.21264709, 0.17121982, 0.43408927,
0.04523647, 0.42582897, 0.22286282])
69
Página 87
Manipulación de formas
Ya viste, durante la creación de una matriz bidimensional, cómo es posible
convierte una matriz unidimensional en una matriz, gracias a la función reshape ().
La función reshape () devuelve una nueva matriz y, por lo tanto, puede crear nuevos objetos.
Sin embargo, si desea modificar el objeto modificando la forma, debe asignar un
tupla que contiene las nuevas dimensiones directamente a su atributo de forma.
Como puede ver, esta vez es la matriz inicial para cambiar de forma y no hay
objeto devuelto. La operación inversa también es posible, es decir, puedes convertir un
matriz bidimensional en una matriz unidimensional, utilizando la función ravel ().
>>> a = a.ravel ()
matriz ([0.77841574, 0.39654203, 0.38188665, 0.26704305, 0.27519705,
0.78115866, 0.96019214, 0.59328414, 0.52008642, 0.10862692,
0,41894881, 0,73581471])
70
Página 88
https://translate.googleusercontent.com/translate_f 60/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> un
matriz ([0.77841574, 0.39654203, 0.38188665, 0.26704305, 0.27519705,
0.78115866, 0.96019214, 0.59328414, 0.52008642, 0.10862692,
0,41894881, 0,73581471])
Otra operación importante es la transposición de una matriz, que invierte las columnas.
con las filas. NumPy proporciona esta característica con la función transpose ().
>>> A.transpose ()
matriz ([[0.77841574, 0.27519705, 0.52008642],
[0.39654203, 0.78115866, 0.10862692],
[0.38188665, 0.96019214, 0.41894881],
[0.26704305, 0.59328414, 0.73581471]])
Manipulación de matrices
A menudo es necesario crear una matriz utilizando matrices ya creadas. En esta sección,
vea cómo crear nuevas matrices uniendo o dividiendo matrices que ya están definidas.
Unir matrices
Puede fusionar varias matrices para formar una nueva que contenga todas las matrices. NumPy
utiliza el concepto de apilamiento , proporcionando una serie de funciones en este sentido. por
ejemplo, puede realizar apilamiento vertical con la función vstack (), que combina
la segunda matriz como nuevas filas de la primera matriz. En este caso, la matriz crece en vertical
dirección. Por el contrario, la función hstack () realiza un apilado horizontal; eso es el
la segunda matriz se agrega a las columnas de la primera matriz.
71
Página 89
Otras dos funciones que realizan el apilamiento entre varias matrices son column_
stack () y row_stack (). Estas funciones operan de manera diferente a las dos
funciones. Generalmente estas funciones se utilizan con matrices unidimensionales, que son
apilados como columnas o filas para formar una nueva matriz bidimensional.
https://translate.googleusercontent.com/translate_f 61/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
División de matrices
En la sección anterior, vio cómo ensamblar múltiples arreglos mediante apilamiento. Ahora
verá cómo dividir una matriz en varias partes. En NumPy, usa la división para hacer
esta. Aquí también, tiene un conjunto de funciones que funcionan tanto horizontalmente con hsplit ()
función y verticalmente con la función vsplit ().
Página 90
Por lo tanto, si desea dividir la matriz horizontalmente, lo que significa que el ancho de la matriz es
dividida en dos partes, la matriz A de 4x4 se dividirá en dos matrices de 2x4.
En cambio, si desea dividir la matriz verticalmente, lo que significa que la altura de la matriz es
dividida en dos partes, la matriz A de 4x4 se dividirá en dos matrices de 4x2.
73
Página 91
https://translate.googleusercontent.com/translate_f 62/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Capítulo 3 la biblioteca Numpy
[8],
[12]])
>>> A2
matriz ([[1, 2],
[5, 6],
[9, 10],
[13, 14]])
>>> A3
matriz ([[3],
[7],
[11],
[15]])
Conceptos generales
Esta sección describe los conceptos generales subyacentes a la biblioteca NumPy. los
La diferencia entre copias y vistas es cuando devuelven valores. El mecanismo de
broadcasting, que ocurre implícitamente en muchas funciones de NumPy, también se trata en
esta sección.
74
Página 92
>>> c = a [0: 2]
>>> c
https://translate.googleusercontent.com/translate_f 63/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
matriz ([1, 2])
>>> a [0] = 0
>>> c
matriz ([0, 2])
Como puede ver, incluso al cortar, en realidad está apuntando al mismo objeto. Si tu
desea generar una matriz completa y distinta, use la función copy ().
En este caso, incluso cuando cambia los elementos de la matriz a, la matriz c permanece sin cambios.
75
Página 93
Vectorización
La vectorización , junto con la radiodifusión , es la base de la implementación interna
de NumPy. La vectorización es la ausencia de un bucle explícito durante el desarrollo de la
código. Estos bucles en realidad no se pueden omitir, pero se implementan internamente y luego
son reemplazados por otras construcciones en el código. La aplicación de la vectorización conduce a
un código más conciso y legible, y puede decir que aparecerá más "Pythonic"
en su apariencia. De hecho, gracias a la vectorización, muchas operaciones adquieren un carácter más
expresión matemática. Por ejemplo, NumPy te permite expresar la multiplicación
de dos matrices como se muestra:
a*b
A*B
Puede ver que el uso de NumPy hace que el código sea más legible y más
matemático.
Radiodifusión
La transmisión permite que un operador o una función actúen en dos o más arreglos para operar
incluso si estas matrices no tienen la misma forma. Dicho esto, no todas las dimensiones pueden ser
sometido a radiodifusión; deben cumplir ciertas reglas.
76
https://translate.googleusercontent.com/translate_f 64/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 94
4x4
4
4x4
4x1
77
Página 95
Ahora que las dos matrices tienen las mismas dimensiones, se pueden agregar los valores internos
juntos.
>>> A + b
matriz ([[0, 2, 4, 6],
[4, 6, 8, 10],
[8, 10, 12, 14],
https://translate.googleusercontent.com/translate_f 65/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
[12, 14, 16, 18]])
Este es un caso simple en el que una de las dos matrices es más pequeña que la otra. Ahí
Pueden ser casos más complejos en los que las dos matrices tienen formas diferentes y cada una es
más pequeño que el otro solo en ciertas dimensiones.
[[2, 3]],
[[4, 5]]])
>>> n
matriz ([[[0],
[1]],
[[2],
[3]],
[[4],
[5]]])
78
Página 96
Incluso en este caso, al analizar las formas de las dos matrices, puede ver que son
compatible y por lo tanto se pueden aplicar las reglas de radiodifusión.
3x1x2
3x2x1
m * = [[[0,1], n * = [[[0,0],
[0,1]], [1,1]],
[[2,3], [[2,2],
[2,3]], [3,3]],
[[4,5], [[4,4],
[4,5]]] [5,5]]]
Entonces puede aplicar, por ejemplo, el operador de suma entre las dos matrices,
elemento operativo.
>>> m + n
matriz ([[[0, 1],
[1, 2]],
[[4, 5],
[5, 6]],
[[8, 9],
[9, 10]]])
Matrices estructuradas
Hasta ahora, en los diversos ejemplos de las secciones anteriores, vio monodimensionales y
matrices bidimensionales. NumPy te permite crear matrices que son mucho más complejas
no solo en tamaño, sino en la estructura, llamados arreglos estructurados. Este tipo de matriz contiene
estructuras o registros en lugar de elementos individuales.
Por ejemplo, puede crear una matriz simple de estructuras como elementos. Gracias al dtype
opción, puede especificar una lista de especificadores separados por comas para indicar los elementos que
constituirá la estructura, junto con el tipo de datos y el orden.
https://translate.googleusercontent.com/translate_f 66/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
79
Página 97
bytes b1
En t i1, i2, i4, i8
entradas sin firmar u1, u2, u4, u8
flotadores f2, f4, f8
complejo c8, c16
cadenas de longitud fija a <n>
Por ejemplo, si desea especificar una estructura que consta de un entero, un carácter
cadena de longitud 6 y un valor booleano, especificará los tres tipos de datos en el
dtype con el orden correcto utilizando los especificadores correspondientes.
Tenga en cuenta que el resultado de dtype y otros atributos de formato pueden variar entre diferentes
sistemas operativos y distribuciones de Python.
>>> estructurado = np.array ([(1, 'Primero', 0.5, 1 + 2j), (2, 'Segundo', 1.3,
2-2j), (3, 'Tercero', 0.8, 1 + 3j)], dtype = ('i2, a6, f4, c8'))
>>> estructurado
matriz ([(1, b'Primero ', 0.5, 1 + 2.j),
(2, b'Segundo ', 1.3, 2.-2.j),
(3, b'Tercero ', 0.8, 1. + 3.j)],
dtype = [('f0', '<i2'), ('f1', 'S6'), ('f2', '<f4'), ('f3', '<c8')])
También puede utilizar el tipo de datos especificando explícitamente int8, uint8, float16, complex64,
Etcétera.
>>> estructurado = np.array ([(1, 'Primero', 0.5, 1 + 2j), (2, 'Segundo', 1.3,2-2j),
(3, 'Tercero', 0.8, 1 + 3j)], dtype = ('
int16, a6, float32, complex64 '))
>>> estructurado
matriz ([(1, b'Primero ', 0.5, 1. + 2.j),
(2, b'Segundo ', 1.3, 2.-2.j),
(3, b'Tercero ', 0.8, 1. + 3.j)],
dtype = [('f0', '<i2'), ('f1', 'S6'), ('f2', '<f4'), ('f3', '<c8')])
Ambos casos tienen el mismo resultado. Dentro de la matriz, ves una secuencia dtype
que contiene el nombre de cada elemento de la estructura con el tipo de datos correspondiente.
80
Página 98
Los nombres que se asignan automáticamente a cada elemento de estructura se pueden considerar
como los nombres de las columnas de la matriz. Utilizándolos como índice estructurado, puede consultar
a todos los elementos del mismo tipo, o de la misma columna.
https://translate.googleusercontent.com/translate_f 67/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Como acaba de ver, los nombres se asignan automáticamente con una f (que significa
para campo) y un entero progresivo que indica la posición en la secuencia. De hecho,
Sería más útil especificar los nombres con algo más significativo. Esto es
posible y puede hacerlo en el momento de la declaración de la matriz:
>>> estructurado = np.array ([(1, 'Primero', 0.5,1 + 2j), (2, 'Segundo', 1.3,2-2j),
(3, 'Tercero', 0.8,1 + 3j)], dtype = [(
'id', 'i2'), ('posición', 'a6'), ('valor', 'f4'), ('complejo', 'c8')])
>>> estructurado
matriz ([(1, b'Primero ', 0.5, 1. + 2.j),
(2, b'Segundo ', 1.3, 2.-2.j),
(3, b'Tercero ', 0.8, 1. + 3.j)],
dtype = [('id', '<i2'), ('posición', 'S6'), ('valor', '<f4'),
('complejo', '<c8')])
O puede hacerlo más tarde, redefiniendo las tuplas de nombres asignados al dtype
atributo de la matriz estructurada.
Ahora puede utilizar nombres significativos para los distintos tipos de campos:
81
Página 99
Cuando necesite recuperar los datos almacenados en un archivo .npy, use la función load ()
especificando el nombre del archivo como argumento, esta vez agregando la extensión .npy.
https://translate.googleusercontent.com/translate_f 68/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
[0.58401239, 0.93455057, 0.28972379]])
82
Página 100
Para poder leer sus datos en un archivo de texto e insertar valores en una matriz, NumPy
proporciona una función llamada genfromtxt (). Normalmente, esta función toma tres
argumentos: el nombre del archivo que contiene los datos, el carácter que separa
valores entre sí (en este caso es una coma), y si los datos contienen columnas
encabezados.
Como puede ver en el resultado, obtiene una matriz estructurada en la que la columna
los encabezados se han convertido en los nombres de los campos.
Esta función realiza implícitamente dos bucles: el primer bucle lee una línea a la vez,
y el segundo bucle separa y convierte los valores contenidos en él, insertando el
elementos consecutivos creados específicamente. Un aspecto positivo de esta característica es que si
faltan algunos datos, la función puede manejarlos.
Tomemos, por ejemplo, el archivo anterior (ver Listado 3-2 ) con algunos elementos eliminados. Guárdalo
como data2.csv.
83
Página 101
https://translate.googleusercontent.com/translate_f 69/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
los espacios en blanco en el archivo con valores nan.
>>> data2 = np.genfromtxt ('ch3_data2.csv', delimiter = ',', names = True)
>>> datos2
matriz ([(1.0, 123.0, 1.4, 23.0), (2.0, 110.0, nan, 18.0),
(3,0, nan, 2,1, 19,0)],
dtype = [('id', '<f8'), ('valor1', '<f8'), ('valor2', '<f8'),
('valor3', '<f8')])
En la parte inferior de la matriz, puede encontrar los encabezados de columna contenidos en el archivo.
Estos encabezados pueden considerarse etiquetas que actúan como índices para extraer los valores mediante
columna:
Conclusiones
En este capítulo, aprendió sobre todos los aspectos principales de la biblioteca NumPy y se convirtió en
familiarizado con una variedad de características que forman la base de muchos otros aspectos que enfrentará en
el curso del libro. De hecho, muchos de estos conceptos se tomarán de otras fuentes científicas.
y bibliotecas informáticas que son más especializadas, pero que han sido estructuradas y
desarrollado sobre la base de esta biblioteca.
84
Página 102
https://translate.googleusercontent.com/translate_f 70/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
85
Página 103
CAPÍTULO 4
87
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_4
Página 104
pandas surge de la necesidad de contar con una biblioteca específica para analizar datos que brinde,
de la forma más sencilla posible, todos los instrumentos para el procesamiento, extracción de datos y
manipulación de datos.
https://translate.googleusercontent.com/translate_f 71/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Este paquete de Python está diseñado sobre la base de la biblioteca NumPy. Esta elección, nosotros
puedo decir, fue fundamental para el éxito y la rápida propagación de los pandas. De hecho, esta elección no
solo hace que esta biblioteca sea compatible con la mayoría de los otros módulos, pero también aprovecha
la alta calidad del módulo NumPy.
Otra opción fundamental fue diseñar estructuras de datos ad hoc para el análisis de datos.
De hecho, en lugar de utilizar estructuras de datos existentes integradas en Python o proporcionadas por otros
bibliotecas, se desarrollaron dos nuevas estructuras de datos.
Estas estructuras de datos están diseñadas para trabajar con datos relacionales o datos etiquetados, por lo que
lo que le permite administrar datos con características similares a las diseñadas para SQL relacional
bases de datos y hojas de cálculo de Excel.
A lo largo del libro, de hecho, verá una serie de operaciones básicas para datos
análisis, que normalmente se utilizan en tablas de bases de datos y hojas de cálculo. pandas de hecho
proporciona un conjunto extendido de funciones y métodos que le permiten realizar estos
operaciones de manera eficiente.
Entonces, el propósito principal de los pandas es proporcionar todos los componentes básicos para cualquier persona.
acercarse al mundo del análisis de datos.
Instalación de pandas
La forma más sencilla y general de instalar la biblioteca de pandas es utilizar un paquete
solución, es decir, instalarlo a través de una distribución Anaconda o Enthought.
Instalación de Anaconda
Para aquellos que eligen usar la distribución de Anaconda, administrar la instalación es
muy simple. Primero tienes que ver si el módulo pandas está instalado y, de ser así, cuál
versión. Para hacer esto, escriba el siguiente comando desde la terminal:
88
Página 105
- pandas
Pandas: 0.22.0-py36h6538335_0
Continuar ([y] / n)?
Presione la tecla y en su teclado para continuar con la instalación.
Preparando transacción: hecho
Verificando transacción: hecho
Ejecutando transacción: hecho
Si desea actualizar su paquete a una versión más reciente, el comando para hacerlo es
muy simple e intuitivo:
https://translate.googleusercontent.com/translate_f 72/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
pandas de actualización conda
El sistema verificará la versión de pandas y la versión de todos los módulos en
que depende y luego sugiera actualizaciones. A continuación, le preguntará si desea continuar con
la actualización.
89
Página 106
Instalación en Linux
Si está trabajando en una distribución de Linux y elige no usar ninguno de estos
distribuciones preempaquetadas, puede instalar el módulo pandas como cualquier otro paquete.
En las distribuciones de Debian y Ubuntu, use este comando:
zypper en python-pandas
Asegúrese de haber instalado Cython en el momento de la compilación. Para obtener más información, lea
la documentación disponible en la Web, incluida la página oficial (http: // pandas.
pydata.org/pandas-docs/stable/install.html).
Por ejemplo, para los pandas, puede encontrar y descargar el siguiente paquete:
90
Página 107
https://translate.googleusercontent.com/translate_f 73/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
pandas de nosetests
La prueba tomará varios minutos y al final mostrará una lista de los problemas.
encontrado.
MÓDULO NARIZ
este módulo está diseñado para probar código Python durante las fases de desarrollo de un proyecto
o un módulo de Python en particular. este módulo amplía las capacidades de unittest
módulo. el módulo de Python involucrado en probar el código, sin embargo, hace que su codificación sea mucho
más simple y fácil.
91
Página 108
Tenga en cuenta que este capítulo asume que está familiarizado con Python y
numpy en general. si tiene alguna dificultad, lea los capítulos2 y 3 de este libro.
Primero, abra una sesión en el shell de Python y luego importe la biblioteca de pandas. los
La práctica general para importar el módulo pandas es la siguiente:
https://translate.googleusercontent.com/translate_f 74/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Por tanto, en este capítulo y en todo el libro, cada vez que vea pd y np,
hacer referencia a un objeto o método que hace referencia a estas dos bibliotecas, aunque
a menudo tendrá la tentación de importar el módulo pandas de esta manera:
Por lo tanto, ya no tiene que hacer referencia a una función, objeto o método con pd; esta
El enfoque no se considera una buena práctica por la comunidad de Python en general.
• Serie
• Marcos de datos
92
Página 109
Las series
La serie es el objeto de la biblioteca de pandas diseñada para representar datos unidimensionales.
estructuras, similares a una matriz pero con algunas características adicionales. Su estructura interna es
simple (ver figura 4-1) y se compone de dos matrices asociadas entre sí. los
la matriz principal contiene los datos (datos de cualquier tipo NumPy) a los que está asociado cada elemento
con una etiqueta, contenida dentro de la otra matriz, llamada índice .
93
https://translate.googleusercontent.com/translate_f 75/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 110
Si desea ver individualmente las dos matrices que componen esta estructura de datos, debe
Puede llamar a los dos atributos de la serie de la siguiente manera: índice y valores.
>>> s.valores
matriz ([12, -4, 7, 9], dtype = int64)
>>> en el índice
Índice ([u'a ', u'b', u'c ', u'd'], dtype = 'objeto')
94
Página 111
>>> s [2]
7
>>> s ['b']
-4
De la misma manera que selecciona varios elementos en una matriz numpy, puede especificar el
siguiendo:
>>> s [0: 2]
a 12
b -4
dtype: int64
https://translate.googleusercontent.com/translate_f 76/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
En este caso, puede utilizar las etiquetas correspondientes, pero especifique la lista de etiquetas en un
formación.
>>> s [1] = 0
>>> s
a 12
b0
c7
d9
dtype: int64
95
Página 112
>>> s ['b'] = 1
>>> s
a 12
b1
c7
d9
dtype: int64
>>> s3
01
12
23
34
https://translate.googleusercontent.com/translate_f 77/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
96
Página 113
dtype: int64
>>> arr [2] = -2
>>> s3
01
12
2-2
34
dtype: int64
Como puede ver en este ejemplo, al cambiar el tercer elemento de la matriz arr,
también modificó el elemento correspondiente en la serie s3.
Filtrar valores
Gracias a la elección de la biblioteca NumPy como base de la biblioteca pandas y, como
Como resultado, para sus estructuras de datos, muchas operaciones que son aplicables a matrices NumPy son
extendido a la serie. Uno de ellos es el filtrado de valores contenidos en la estructura de datos.
a través de las condiciones.
Por ejemplo, si necesita saber qué elementos de la serie son mayores que 8,
escribe lo siguiente:
>>> s [s> 8]
a 12
d9
dtype: int64
>>> s / 2
un 6.0
b -2,0
c 3,5
d 4.5
dtype: float64
97
Página 114
Sin embargo, con las funciones matemáticas NumPy, debe especificar la función
referenciado con np y la instancia de la serie pasada como argumento.
Evaluación de valles
A menudo hay valores duplicados en una serie. Entonces puede que necesite tener más
https://translate.googleusercontent.com/translate_f 78/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
información sobre las muestras, incluida la existencia de duplicados y si
cierto valor está presente en la serie.
En este sentido, puede declarar una serie en la que hay muchos valores duplicados.
>>> serd = pd.Series ([1,0,2,1,2,3], index = ['blanco', 'blanco', 'azul', 'verde', '
verde amarillo'])
>>> serd
blanco 1
blanco 0
azul 2
verde 1
verde 2
amarillo 3
dtype: int64
Para conocer todos los valores contenidos en la serie, excluidos los duplicados, puede utilizar
la función única (). El valor de retorno es una matriz que contiene los valores únicos en el
serie, aunque no necesariamente en orden.
>>> serd.unique ()
matriz ([1, 0, 2, 3], dtype = int64)
Una función que es similar a unique () es value_counts (), que no solo devuelve
valores únicos, pero también calcula las ocurrencias dentro de una serie.
98
Página 115
>>> serd.value_counts ()
22
12
31
01
dtype: int64
Valores NaN
Como puede ver en el caso anterior, intentamos ejecutar el logaritmo de un número negativo
y recibió NaN como resultado. Este valor específico NaN (no es un número) se usa en pandas
estructuras de datos para indicar la presencia de un campo vacío o algo que no
definible numéricamente.
Generalmente, estos valores de NaN son un problema y deben gestionarse de alguna manera,
especialmente durante el análisis de datos. Estos datos a menudo se generan al extraer datos.
de una fuente cuestionable o cuando faltan datos en la fuente. Además, como tú
acabamos de ver, los valores de NaN también se pueden generar en casos especiales, como cálculos
https://translate.googleusercontent.com/translate_f 79/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
de logaritmos de valores negativos, o excepciones durante la ejecución de algún cálculo
o función. En capítulos posteriores, verá cómo aplicar diferentes estrategias para abordar la
problema de los valores de NaN.
99
Página 116
Sin embargo, a pesar de su naturaleza problemática, los pandas le permiten definir explícitamente
NaN y agréguelos a una estructura de datos, como una serie. Dentro de la matriz que contiene el
valores, ingrese np.NaN donde quiera definir un valor faltante.
Las funciones isnull () y notnull () son muy útiles para identificar los índices
sin valor.
>>> s2.isnull ()
0 falso
1 falso
2 verdadero
3 falso
dtype: bool
>>> s2.notnull ()
0 verdadero
1 verdadero
2 falso
3 verdadero
dtype: bool
De hecho, estas funciones devuelven dos series con valores booleanos que contienen True
y Valores falsos, dependiendo de si el artículo tiene un valor NaN o menos. El isnull ()
la función devuelve True en los valores NaN de la serie; inversamente, la función notnull ()
devuelve True si no son NaN. Estas funciones a menudo se colocan dentro de filtros para hacer una
condición.
100
Página 117
dtype: float64
>>> s2 [s2.isnull ()]
2 NaN
dtype: float64
https://translate.googleusercontent.com/translate_f 80/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
La similitud también se explota durante la definición de una serie de objetos. De hecho, puede crear
una serie de un dict previamente definido.
Como puede ver en este ejemplo, la matriz del índice se llena con las claves mientras
los datos se llenan con los valores correspondientes. También puede definir los índices de la matriz
por separado. En este caso, controlar la correspondencia entre las claves del dict y
Se ejecutará una matriz de índices de etiquetas. Si hay una discrepancia, los pandas agregarán el valor de NaN.
101
Página 118
Obtiene una nueva serie de objetos en la que solo se agregan los elementos con la misma etiqueta.
Todas las demás etiquetas presentes en una de las dos series aún se agregan al resultado pero tienen un NaN
valor.
El DataFrame
El marco de datos es una estructura de datos tabular muy similar a una hoja de cálculo. Estos datos
La estructura está diseñada para extender la serie a múltiples dimensiones. De hecho, el marco de datos
consiste en una colección ordenada de columnas (ver Figura 4-2), cada uno de los cuales puede contener
https://translate.googleusercontent.com/translate_f 81/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
un valor de un tipo diferente (numérico, de cadena, booleano, etc.).
102
Página 119
A diferencia de las series, que tienen una matriz de índice que contiene etiquetas asociadas con cada
elemento, el marco de datos tiene dos matrices de índice. La primera matriz de índice, asociada con
las líneas, tiene funciones muy similares a la matriz de índice en serie. De hecho, cada etiqueta es
asociado con todos los valores de la fila. La segunda matriz contiene una serie de etiquetas,
cada uno asociado con una columna en particular.
Un marco de datos también puede entenderse como un dictado de serie, donde las claves son las
los nombres de las columnas y los valores son las series que formarán las columnas del marco de datos.
Además, todos los elementos de cada serie se asignan de acuerdo con una matriz de etiquetas,
llamado el índice .
103
Página 120
https://translate.googleusercontent.com/translate_f 82/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Si el objeto dict desde el que desea crear un marco de datos contiene más datos
de lo que le interesa, puede hacer una selección. En el constructor del marco de datos,
puede especificar una secuencia de columnas usando la opción de columnas. Las columnas serán
creados en el orden de la secuencia independientemente de cómo estén contenidos en el dict
objeto.
Incluso para objetos de marco de datos, si las etiquetas no se especifican explícitamente en la matriz de índice,
pandas asigna automáticamente una secuencia numérica a partir de 0. En su lugar, si desea
asignar etiquetas a los índices de un marco de datos, tienes que usar la opción de índice y asignarlo
una matriz que contiene las etiquetas.
>>> frame2 = pd.DataFrame (datos, índice = ['uno', 'dos', 'tres', 'cuatro', 'cinco'])
>>> marco2
precio del objeto de color
una bola azul 1.2
dos bolígrafos verdes 1.0
tres lápiz amarillo 0.6
cuatro papel rojo 0.9
cinco taza blanca 1.7
Ahora que hemos introducido las dos nuevas opciones llamadas índice y columnas, es
Es fácil imaginar una forma alternativa de definir un marco de datos. En lugar de usar un objeto dict,
puede definir tres argumentos en el constructor, en el siguiente orden: una matriz de datos,
una matriz que contiene las etiquetas asignadas a la opción de índice, y una matriz que contiene la
nombres de las columnas asignadas a la opción de columnas.
104
Página 121
En muchos ejemplos, como verá a partir de ahora en este libro, para crear una matriz de
valores de forma rápida y sencilla, puede usar np.arange (16) .reshape ((4,4)), que genera
una matriz 4x4 de números que aumentan de 0 a 15.
Seleccionar elementos
Si desea saber el nombre de todas las columnas de un marco de datos, puede especificar el
atributo de columnas en la instancia del objeto de marco de datos.
>>> frame.columns
Índice (['colores', 'objeto', 'precio'], dtype = 'objeto')
De manera similar, para obtener la lista de índices, debe especificar el atributo de índice.
>>> frame.index
RangeIndex (inicio = 0, parada = 5, paso = 1)
https://translate.googleusercontent.com/translate_f 83/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
También puede obtener el conjunto completo de datos contenidos dentro de la estructura de datos utilizando el
atributo de valores.
>>> frame.values
array ([['azul', 'bola', 1.2],
['verde', 'lápiz', 1.0],
['amarillo', 'lápiz', 0,6],
['rojo', 'papel', 0.9],
['blanco', 'taza', 1.7]], dtype = objeto)
105
Página 122
Como puede ver, el valor de retorno es un objeto de serie. Otra forma de hacer esto es usar el
nombre de columna como atributo de la instancia del marco de datos.
>>> frame.price
0 1,2
1 1.0
2 0,6
3 0,9
4 1,7
Nombre: precio, dtipo: float64
Para filas dentro de un marco de datos, es posible usar el atributo loc con el índice
valor de la fila que desea extraer.
El objeto devuelto es nuevamente una serie en la que los nombres de las columnas tienen
se convierten en la etiqueta del índice de la matriz y los valores se han convertido en los datos de la serie.
Para seleccionar varias filas, especifique una matriz con la secuencia de filas para insertar:
106
Página 123
https://translate.googleusercontent.com/translate_f 84/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Si necesita extraer una parte de un DataFrame, seleccione las líneas que desea
extracto, puede utilizar los números de referencia de los índices. De hecho, puede considerar un
fila como una parte de un marco de datos que tiene el índice de la fila como fuente (en el siguiente 0)
value y la línea encima del que queremos como segundo valor (en el siguiente).
Como puede ver, el valor de retorno es un marco de datos de objeto que contiene una sola fila. Si tu
desea más de una línea, debe ampliar el rango de selección.
Finalmente, si lo que desea lograr es un valor único dentro de un marco de datos, primero use
el nombre de la columna y luego el índice o la etiqueta de la fila.
Asignar valores
Una vez que comprenda cómo acceder a los diversos elementos que componen un marco de datos,
siga la misma lógica para agregar o cambiar los valores en él.
Por ejemplo, ya ha visto que dentro de la estructura del marco de datos, una matriz
de índices se especifica mediante el atributo de índice, y la fila que contiene el nombre del
columnas se especifica con el atributo de columnas. Bueno, también puedes asignar una etiqueta, usando
el atributo de nombre, a estas dos subestructuras para identificarlas.
107
Página 124
Una de las mejores características de las estructuras de datos de los pandas es su alta flexibilidad. En
De hecho, siempre puede intervenir en cualquier nivel para cambiar la estructura de datos internos. por
Por ejemplo, una operación muy común es agregar una nueva columna.
Puede hacer esto simplemente asignando un valor a la instancia del marco de datos y
especificando un nuevo nombre de columna.
https://translate.googleusercontent.com/translate_f 85/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
4 taza blanca 1,7 12
Como puede ver en este resultado, hay una nueva columna llamada nueva con el valor
dentro de 12 replicados para cada uno de sus elementos.
Sin embargo, si desea actualizar el contenido de una columna, debe usar una matriz.
Puede seguir un enfoque similar si desea actualizar una columna completa, por
ejemplo, usando la función np.arange () para actualizar los valores de una columna con un
secuencia predeterminada.
108
Página 125
Las columnas de un marco de datos también se pueden crear asignando una serie a una de ellas,
por ejemplo, especificando una serie que contiene una serie creciente de valores a través del
uso de np.arange ().
Finalmente, para cambiar un solo valor, simplemente seleccione el elemento y le dé el nuevo valor.
Membresía de valor
Ya ha visto la función isin () aplicada a la serie para determinar la
pertenencia a un conjunto de valores. Bueno, esta característica también es aplicable a objetos de marco de datos.
109
https://translate.googleusercontent.com/translate_f 86/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 126
Obtiene un marco de datos que contiene valores booleanos, donde True indica valores que
conocer la membresía. Si pasa el valor devuelto como condición, obtendrá una
nuevo marco de datos que contiene solo los valores que satisfacen la condición.
Filtración
Incluso cuando se trata de un marco de datos, puede aplicar el filtrado mediante la aplicación de ciertos
condiciones. Por ejemplo, digamos que desea obtener todos los valores menores que un cierto número, por
ejemplo 1.2.
110
Página 127
Obtendrá un marco de datos que contiene valores inferiores a 1.2, manteniendo su original
posición. Todos los demás serán reemplazados por NaN.
https://translate.googleusercontent.com/translate_f 87/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
... 'blanco': {2011: 13, 2012: 22, 2013: 16},
... 'azul': {2011: 17, 2012: 27, 2013: 18}}
>>> marco2 = pd.DataFrame (nestdict)
>>> marco2
azul rojo blanco
2011 17 NaN 13
2012 27 22,0 22
2013 18 33,0 16
>>> marco2.T
2011 2012 2013
azul 17,0 27,0 18,0
rojo NaN 22,0 33,0
blanco 13,0 22,0 16,0
111
Página 128
>>> ser = pd.Series ([5,0,3,8,4], index = ['rojo', 'azul', 'amarillo', 'blanco', 'verde'])
>>> índice de ser.
Índice (['rojo', 'azul', 'amarillo', 'blanco', 'verde'], dtype = 'objeto')
A diferencia de todos los demás elementos de las estructuras de datos de pandas (series y marcos de datos),
los objetos Index son inmutables. Una vez declaradas, no se pueden modificar. Esto garantiza
su intercambio seguro entre las diversas estructuras de datos.
Cada objeto de índice tiene varios métodos y propiedades que son útiles cuando
Necesito conocer los valores que contienen.
Métodos en índice
Hay algunos métodos específicos para índices disponibles para obtener información sobre
índices de una estructura de datos. Por ejemplo, idmin () e idmax () son dos funciones que
devuelve, respectivamente, el índice con el valor más bajo y el índice con el valor más alto.
>>> ser.idxmin ()
'azul'
>>> ser.idxmax ()
'blanco'
https://translate.googleusercontent.com/translate_f 88/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
112
Página 129
>>> serd = pd.Series (rango (6), índice = ['blanco', 'blanco', 'azul', 'verde',
'verde amarillo'])
>>> serd
blanco 0
blanco 1
azul 2
verde 3
verde 4
amarillo 5
dtype: int64
La misma lógica se aplica al marco de datos, con índices duplicados que devolverán el
marco de datos.
Con estructuras de datos pequeñas, es fácil identificar cualquier índice duplicado, pero si el
la estructura se hace gradualmente más grande, esto comienza a ser difícil. En este sentido, los pandas
le proporciona el atributo is_unique que pertenece a los objetos Index. Este atributo
le dirá si hay índices con etiquetas duplicadas dentro de los datos de la estructura (ambos
series y marco de datos).
>>> serd.index.is_unique
Falso
>>> frame.index.is_unique
Cierto
113
Página 130
• Reindexación
https://translate.googleusercontent.com/translate_f 89/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
• Dejar caer
• Alineación
Reindexar
Anteriormente se dijo que una vez que se declara en una estructura de datos, el objeto Index
no puede ser cambiado. Esto es cierto, pero al ejecutar una reindexación, también puede superar
este problema.
De hecho, es posible obtener una nueva estructura de datos a partir de una existente donde
Las reglas de indexación se pueden definir de nuevo.
114
Página 131
Como puede ver en el valor devuelto, el orden de las etiquetas ha sido completamente
reorganizado. Se ha eliminado el valor correspondiente a la etiqueta dos y se ha eliminado una nueva etiqueta.
llamado cinco está presente en la serie.
Sin embargo, para medir el proceso de reindexación, se puede definir la lista de etiquetas.
incómodo, especialmente con un marco de datos grande. Entonces podrías usar algún método que permita
para completar o interpolar valores automáticamente.
Para comprender mejor el funcionamiento de este modo de reindexación automática, defina
la siguiente serie.
Como puede ver en este ejemplo, la columna de índice no es una secuencia perfecta de
números; de hecho, faltan algunos valores (1, 2 y 4). Una necesidad común sería
sea realizar la interpolación para obtener la secuencia completa de números. A
Para lograr esto, utilizará la reindexación con la opción de método establecida en ffill. Además, tú
necesita establecer un rango de valores para los índices. En este caso, para especificar un conjunto de valores entre 0
y 5, puede usar range (6) como argumento.
https://translate.googleusercontent.com/translate_f 90/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> ser3.reindex (rango (6), método = 'ffill')
01
11
115
Página 132
21
35
45
56
dtype: int64
Como puede ver en el resultado, los índices que no estaban presentes en la serie original
fueron agregados. Por interpolación, aquellos con el índice más bajo de la serie original tienen
asignado como valores. De hecho, los índices 1 y 2 tienen el valor 1, que pertenece a
índice 0.
Si desea que este valor de índice se asigne durante la interpolación, debe usar
el método bfill.
>>> frame.reindex (rango (5), método = 'relleno', columnas = ['colores', 'precio', 'nuevo',
'objeto'])
colores precio nuevo objeto
0 azul 1.2 bola azul
1 bolígrafo verde 1.0 verde
2 lápices amarillos 3.3 amarillos
3 papel rojo 0,9 rojo
4 taza blanca 1.7 blanca
116
Página 133
Goteante
Otra operación que está conectada a los objetos de índice está cayendo. Eliminar una fila o un
columna se vuelve simple, debido a las etiquetas utilizadas para indicar los índices y nombres de columna.
También en este caso, pandas proporciona una función específica para esta operación, llamada
soltar(). Este método devolverá un nuevo objeto sin los elementos que desea eliminar.
Por ejemplo, tomemos el caso en el que queremos eliminar un solo elemento de una serie. A
Para ello, defina una serie genérica de cuatro elementos con cuatro etiquetas distintas.
https://translate.googleusercontent.com/translate_f 91/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> ser = pd.Series (np. rango (4.), índice = ['rojo', 'azul', 'amarillo', 'blanco'])
>>> ser
rojo 0.0
azul 1.0
amarillo 2.0
blanco 3.0
dtype: float64
Ahora diga, por ejemplo, que desea eliminar el elemento correspondiente a la etiqueta
amarillo. Simplemente especifique la etiqueta como un argumento de la función drop () para eliminarla.
Para eliminar más elementos, simplemente pase una matriz con las etiquetas correspondientes.
En cambio, con respecto al marco de datos, los valores se pueden eliminar haciendo referencia a las etiquetas
de ambos ejes. Declare el siguiente marco a modo de ejemplo.
117
Página 134
>>> marco
bolígrafo lápiz papel
rojo 0123
azul 4 5 6 7
amarillo 8 9 10 11
blanco 12 13 14 15
Para eliminar columnas, siempre debe especificar los índices de las columnas, pero
debe especificar el eje desde el cual eliminar los elementos, y esto se puede hacer usando el
opción de eje. Entonces, para hacer referencia a los nombres de las columnas, debe especificar eje = 1.
https://translate.googleusercontent.com/translate_f 92/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
pero también pueden estar presentes solo en una de las dos estructuras.
Como puede ver en los ejemplos que siguen, los pandas demuestran ser muy poderosos en
alineando índices durante estas operaciones. Por ejemplo, puede comenzar a considerar dos
serie en la que se definen, respectivamente, dos matrices de etiquetas que no coinciden perfectamente
El uno al otro.
118
Página 135
Ahora, entre las diversas operaciones aritméticas, considere la suma simple. Como puedas
ver de las dos series que acabamos de declarar, algunas etiquetas están presentes en ambas, mientras que otras etiquetas
están presentes solo en uno de los dos. Cuando las etiquetas están presentes en ambos operadores, su
Se agregarán valores, mientras que en el caso contrario, también se mostrarán en el resultado
(nueva serie), pero con el valor NaN.
>>> s1 + s2
negro NaN
azul 3.0
marrón NaN
verde NaN
blanco 4.0
amarillo 6.0
dtype: float64
En el caso del marco de datos, aunque puede parecer más complejo, la alineación
sigue el mismo principio, pero se lleva a cabo tanto para las filas como para las columnas.
119
Página 136
https://translate.googleusercontent.com/translate_f 93/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
rojo NaN NaN NaN NaN NaN
blanco 20,0 NaN NaN 20,0 NaN
amarillo 19,0 NaN NaN 19,0 NaN
• agregar ()
• sub ()
• div ()
• mul ()
120
Página 137
Como puede ver, los resultados son los mismos que obtendría con el operador de suma +.
También puede observar que si los índices y los nombres de las columnas difieren mucho de una serie a otra
otro, se encontrará con un nuevo marco de datos lleno de valores NaN. Verás más tarde en
este capítulo cómo manejar este tipo de datos.
https://translate.googleusercontent.com/translate_f 94/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
bola 0
bolígrafo 1
lápiz 2
papel 3
dtype: int64
Las dos estructuras de datos recién definidas se han creado específicamente para que
los índices de serie coinciden con los nombres de las columnas del marco de datos. De esta manera puedes
Aplicar una operación directa.
121
Página 138
122
Página 139
https://translate.googleusercontent.com/translate_f 95/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Por ejemplo, puede calcular la raíz cuadrada de cada valor en el marco de datos
utilizando NumPy np.sqrt ().
123
Página 140
Con la función apply (), puede aplicar la función que acaba de definir en el marco de datos.
https://translate.googleusercontent.com/translate_f 96/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
dtype: int64
No es obligatorio que el método apply () devuelva un valor escalar. También puede
devolver una serie. Un caso útil sería extender la aplicación a muchas funciones.
simultaneamente. En este caso, tendremos dos o más valores para cada característica aplicada.
Esto se puede hacer definiendo una función de la siguiente manera:
Luego, aplica la función como antes. Pero en este caso como un objeto te devolvió
obtener un marco de datos en lugar de una serie, en el que habrá tantas filas como valores
devuelto por la función.
124
Página 141
Funciones estadísticas
La mayoría de las funciones estadísticas para matrices siguen siendo válidas para el marco de datos, por lo que
La función apply () ya no es necesaria. Por ejemplo, funciones como sum () y
mean () puede calcular la suma y el promedio, respectivamente, de los elementos contenidos
dentro de un marco de datos.
>>> frame.sum ()
bola 24
bolígrafo 28
lápiz 32
documento 36
dtype: int64
>>> frame.mean ()
pelota 6.0
bolígrafo 7.0
lápiz 8.0
papel 9.0
dtype: float64
También hay una función llamada describe () que le permite obtener un resumen
estadísticas a la vez.
>>> frame.describe ()
pelota bolígrafo lápiz papel
recuento 4,000000 4,000000 4,000000 4,000000
media 6,000000 7,000000 8,000000 9,000000
estándar 5.163978 5.163978 5.163978 5.163978
min 0.000000 1.000000 2.000000 3.000000
25% 3.000000 4.000000 5.000000 6.000000
50% 6,000000 7,000000 8,000000 9,000000
75% 9,000000 10,000000 11,000000 12,000000
máx. 12.000000 13.000000 14.000000 15.000000
125
https://translate.googleusercontent.com/translate_f 97/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 142
Clasificación y clasificación
Otra operación fundamental que utiliza la indexación es la clasificación. Ordenar los datos es a menudo
una necesidad y es muy importante poder hacerlo fácilmente. pandas proporciona el sort_
función index (), que devuelve un nuevo objeto que es idéntico al inicio, pero en el que
los elementos están ordenados.
Comencemos viendo cómo se pueden ordenar los elementos de una serie. La operación es bastante trivial
ya que la lista de índices a ordenar es solo uno.
Como puede ver, los elementos se ordenaron en orden alfabético ascendente según su
etiquetas (de la A a la Z). Este es el comportamiento predeterminado, pero puede establecer el orden opuesto al
estableciendo la opción ascendente en Falso.
126
Página 143
Con el marco de datos, la clasificación se puede realizar de forma independiente en cada uno de sus dos
ejes. Entonces, si desea ordenar por fila siguiendo los índices, simplemente continúe usando el
función sort_index () sin argumentos como has visto antes, o si prefieres ordenar
por columnas, debe establecer las opciones del eje en 1.
https://translate.googleusercontent.com/translate_f 98/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
rojo 0123
blanco 12 13 14 15
amarillo 8 9 10 11
>>> frame.sort_index (eje = 1)
bolígrafo lápiz
rojo 0312
azul 4 7 5 6
amarillo 8 11 9 10
blanco 12 15 13 14
Hasta ahora, ha aprendido a ordenar los valores según los índices. Pero muy
a menudo, es posible que deba ordenar los valores contenidos en la estructura de datos. En este caso, usted
tienes que diferenciar dependiendo de si tienes que ordenar los valores de una serie o un
marco de datos.
Si desea ordenar la serie, debe usar la función sort_values ().
>>> ser.sort_values ()
azul 0
amarillo 3
verde 4
127
Página 144
rojo 5
blanco 8
dtype: int64
Si necesita ordenar los valores en un marco de datos, use la función sort_values () vista
anteriormente pero con la opción by. Luego tienes que especificar el nombre de la columna en
que ordenar.
Si los criterios de clasificación se basarán en dos o más columnas, puede asignar una matriz
que contiene los nombres de las columnas a la opción by.
La clasificación es una operación estrechamente relacionada con la clasificación. Consiste principalmente en asignar
un rango (es decir, un valor que comienza en 0 y luego aumenta gradualmente) a cada elemento del
serie. El rango se asignará comenzando desde el valor más bajo hasta el más alto.
>>> ser.rank ()
rojo 4.0
azul 1.0
amarillo 2.0
blanco 5.0
verde 3.0
dtype: float64
128
https://translate.googleusercontent.com/translate_f 99/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 145
El rango también se puede asignar en el orden en que los datos ya están en los datos.
estructura (sin una operación de clasificación). En este caso, simplemente agregue la opción de método con
el primer valor asignado.
De forma predeterminada, incluso la clasificación sigue un orden ascendente. Para invertir este criterio, establezca el
opción ascendente a Falso.
Correlación y covarianza
Dos cálculos estadísticos importantes son la correlación y la covarianza, expresadas en
pandas por las funciones corr () y cov (). Este tipo de cálculos normalmente implican
dos series.
129
Página 146
La covarianza y la correlación también se pueden aplicar a un solo marco de datos. En este caso,
devuelven sus matrices correspondientes en forma de dos nuevos objetos de marco de datos.
https://translate.googleusercontent.com/translate_f 100/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
bolígrafo lápiz papel
bola 1.000000 -0.276026 0.577350 -0.763763
bolígrafo -0.276026 1.000000 -0.079682 -0.361403
lápiz 0.577350 -0.079682 1.000000 -0.692935
papel -0,763763 -0,361403 -0,692935 1,000000
>>> frame2.cov ()
bolígrafo lápiz papel
bola 2.000000 -0.666667 2.000000 -2.333333
bolígrafo -0.666667 2.916667 -0.333333 -1.333333
lápiz 2.000000 -0.333333 6.000000 -3.666667
papel -2.333333 -1.333333 -3.666667 4.666667
Usando el método corrwith (), puede calcular las correlaciones por pares entre
las columnas o filas de un marco de datos con una serie u otro marco de datos ().
130
Página 147
https://translate.googleusercontent.com/translate_f 101/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
blanco NaN
verde 9.0
131
Página 148
dtype: float64
>>> ser ['blanco'] = Ninguno
>>> ser
rojo 0.0
azul 1.0
amarillo 2.0
blanco NaN
verde 9.0
dtype: float64
>>> ser.dropna ()
rojo 0.0
azul 1.0
amarillo 2.0
verde 9.0
dtype: float64
132
Página 149
>>> frame3 = pd.DataFrame ([[6, np.nan, 6], [np.nan, np.nan, np.nan], [2, np.nan, 5]],
... índice = ['azul', 'verde', 'rojo'],
... columnas = ['bola', 'taza', 'bolígrafo'])
>>> marco3
bolígrafo
azul 6.0 NaN 6.0
verde NaN NaN NaN
rojo 2,0 NaN 5,0
>>> frame3.dropna ()
https://translate.googleusercontent.com/translate_f 102/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
DataFrame vacío
Columnas: [bola, taza, bolígrafo]
Índice: []
Por lo tanto, para evitar que las filas y columnas enteras desaparezcan por completo,
debe especificar la opción cómo, asignándole un valor de todo. Esto le dice a la dropna ()
función para eliminar solo las filas o columnas en las que todos los elementos son NaN.
133
Página 150
https://translate.googleusercontent.com/translate_f 103/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
dtype: float64
>>> mser.index
Pd.MultiIndex (niveles = [['azul', 'rojo', 'blanco'], ['abajo',
'izquierda derecha arriba']],
... etiquetas = [[2, 2, 2, 0, 0, 1, 1, 1],
[3, 0, 2, 3, 0, 3, 0, 1]])
134
Página 151
O puede seleccionar valores para un valor dado del segundo índice, en el siguiente
conducta:
>>> mser.unstack ()
abajo izquierda derecha arriba
azul 0.813079 NaN NaN 0.728021
rojo 0.606161 0.996686 NaN 0.536433
blanco 0.643121 NaN 0.956163 0.461689
135
Página 152
>>> marco
bolígrafo lápiz papel
https://translate.googleusercontent.com/translate_f 104/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
rojo 0123
azul 4 5 6 7
amarillo 8 9 10 11
blanco 12 13 14 15
>>> frame.stack ()
bola roja 0
bolígrafo 1
lápiz 2
papel 3
bola azul 4
bolígrafo 5
lápiz 6
papel 7
bola amarilla 8
bolígrafo 9
lápiz 10
papel 11
bola blanca 12
bolígrafo 13
lápiz 14
papel 15
dtype: int64
Con el marco de datos, es posible definir un índice jerárquico tanto para las filas como para
las columnas. En el momento en que se declara el marco de datos, debe definir una matriz de matrices
para las opciones de índice y columnas.
136
Página 153
>>> mframe
bolígrafo papel
1 2 1 2
blanco hasta -1,964055 1,312100 -0,914750 -0,941930
abajo -1.886825 1.700858 -1.060846 -0.197669
rojo hacia arriba -1.561761 1.225509 -0.244772 0.345843
abajo 2.668155 0.528971 -1.633708 0.921735
https://translate.googleusercontent.com/translate_f 105/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
137
Página 154
Si desea crear una estadística para un nivel dado de la columna, por ejemplo, el id,
debe especificar el segundo eje como argumento a través de la opción de eje establecida en 1.
138
Página 155
https://translate.googleusercontent.com/translate_f 106/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Conclusiones
Este capítulo presentó la biblioteca de pandas. Aprendió a instalarlo y vio un
panorama general de sus características.
Aprendió sobre las dos estructuras básicas de datos, llamadas serie y marco de datos,
junto con su funcionamiento y sus principales características. Especialmente, descubriste
la importancia de la indexación dentro de estas estructuras y la mejor manera de realizar las operaciones
en ellos. Finalmente, consideró la posibilidad de ampliar la complejidad de estos
estructuras creando jerarquías de índices, distribuyendo así los datos contenidos en
en diferentes subniveles.
En el siguiente capítulo, aprenderá a capturar datos de fuentes externas como archivos,
e inversamente, cómo escribir los resultados del análisis en ellos.
139
Página 156
CAPÍTULO 5
pandas: lectura
y escritura de datos
En el capítulo anterior, se familiarizó con la biblioteca de pandas y con la
funcionalidades básicas que proporciona para el análisis de datos. Viste ese marco de datos y
series son el corazón de esta biblioteca. Estos son el material sobre el que realizar todos los datos
manipulaciones, cálculos y análisis.
En este capítulo, verá todas las herramientas proporcionadas por pandas para leer los datos almacenados
en muchos tipos de medios (como archivos y bases de datos). Paralelamente, también verá cómo
escribir estructuras de datos directamente en estos formatos, sin preocuparse demasiado por la
tecnologías utilizadas.
Este capítulo se centra en una serie de funciones de API de E / S que pandas proporciona para leer
y escribir datos directamente como objetos de marco de datos. Empezamos mirando archivos de texto, luego nos movemos
gradualmente a formatos binarios más complejos.
https://translate.googleusercontent.com/translate_f 107/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Al final del capítulo, también aprenderá cómo interactuar con todos los
bases de datos, tanto SQL como NoSQL, incluidos ejemplos que muestran cómo almacenar datos en un
marco de datos. Al mismo tiempo, aprenderá a leer los datos contenidos en una base de datos y
recuperarlos como un marco de datos.
Herramientas API de E / S
pandas es una biblioteca especializada para el análisis de datos, por lo que esperas que esté enfocada principalmente
sobre cálculo y procesamiento de datos. Los procesos de escritura y lectura de datos desde / hacia
Los archivos externos pueden considerarse parte del procesamiento de datos. De hecho, verá cómo, incluso en
En esta etapa, puede realizar algunas operaciones para preparar los datos entrantes para
manipulación.
141
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_5
Página 157
Por tanto, este paso es muy importante para el análisis de datos y, por tanto, una herramienta específica para este
El propósito debe estar presente en los pandas de la biblioteca, un conjunto de funciones llamadas API de E / S. Estas
Las funciones se dividen en dos categorías principales: lectores y escritores .
Lectores Escritores
read_csv to_csv
read_hdf to_hdf
read_sql to_sql
read_json to_json
read_html to_html
read_stata to_stata
read_clipboard to_clipboard
read_pickle to_pickle
• read_csv
• read_table
• to_csv
142
Página 158
https://translate.googleusercontent.com/translate_f 108/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Para ver cómo manejan los pandas este tipo de datos, comenzaremos creando un pequeño
Archivo CSV en el directorio de trabajo, como se muestra en Listado 5-1y guárdelo como ch05_01.csv.
Dado que este archivo está delimitado por comas, puede usar la función read_csv () para leer su
contenido y convertirlo en un objeto de marco de datos.
Como puede ver, leer los datos en un archivo CSV es bastante trivial. Los archivos CSV están tabulados
datos en los que los valores de la misma columna están separados por comas. Desde archivos CSV
se consideran archivos de texto, también puede utilizar la función read_table (), pero especifique el
delimitador.
143
Página 159
En este ejemplo, puede ver que en el archivo CSV, los encabezados que identifican todas las columnas
están en la primera fila. Pero este no es un caso general; A menudo sucede que los datos tabulados
comenzar directamente en la primera línea (ver Listado 5-2).
1,5,2,3, gato
2,7,8,5, perro
3,3,6,7, caballo
2,2,8,3, pato
https://translate.googleusercontent.com/translate_f 109/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
4,4,2,1, ratón
>>> pd.read_csv ('ch05_02.csv')
1 5 2 3 gato
0 2 7 8 5 perro
1 3 3 6 7 caballo
2 2 2 8 3 pato
3 4 4 2 1 ratón
En este caso, puede asegurarse de que sean los pandas los que asignen los nombres predeterminados a
las columnas estableciendo la opción de encabezado en Ninguno.
144
Página 160
Además, puede especificar los nombres directamente asignando una lista de etiquetas al
opción de nombres.
En casos más complejos, en los que desea crear un marco de datos con una jerarquía
estructura leyendo un archivo CSV, puede ampliar la funcionalidad de la función read_csv ()
agregando la opción index_col, asignando todas las columnas a convertir en índices.
Para comprender mejor esta posibilidad, cree un nuevo archivo CSV con dos columnas para
utilizados como índices de la jerarquía. Luego, guárdelo en el directorio de trabajo como ch05_03.csv
(ver listado 5-3 ).
145
https://translate.googleusercontent.com/translate_f 110/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 161
\re dígito
\t carácter de tabulación
Tomemos, por ejemplo, un caso extremo en el que tenemos los valores separados por tabulaciones o
espacios en un orden aleatorio (ver Listado 5-4 ).
146
Página 162
Como puede ver, el resultado es un marco de datos perfecto en el que los valores son perfectamente
ordenado.
https://translate.googleusercontent.com/translate_f 111/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Ahora verá un ejemplo que puede parecer extraño o inusual, pero no es tan raro
como pueda parecer. Este ejemplo puede ser muy útil para comprender el alto potencial de un
regexp. De hecho, normalmente podría pensar en los separadores como caracteres especiales como comas,
espacios, tabulaciones, etc., pero en realidad puede considerar caracteres separadores como alfanuméricos
caracteres o, por ejemplo, números enteros como 0.
En este ejemplo, debe extraer la parte numérica de un archivo TXT, en el que
hay una secuencia de caracteres con valores numéricos y los caracteres literales son
completamente fusionado.
Recuerde establecer la opción de encabezado en Ninguno siempre que los encabezados de columna no sean
presente en el archivo TXT (ver Listado 5-5).
000END123AAA122
001END124BBB321
002END125CCC333
>>> pd.read_table ('ch05_05.txt', sep = '\ D +', encabezado = Ninguno, motor = 'python')
012
0 0 123 122
1 1 124 321
2 2 125 333
147
Página 163
Otro evento bastante común es excluir líneas del análisis. De hecho no siempre
desea incluir encabezados o comentarios innecesarios contenidos en un archivo (consulte el Listado 5-6).
Con la opción skiprows, puede excluir todas las líneas que desee, simplemente asignando una matriz
que contiene los números de línea que no se deben considerar en el análisis.
Preste atención cuando utilice esta opción. Si desea excluir los primeros cinco
líneas, debe escribir skiprows = 5, pero si desea descartar la quinta línea, tiene
para escribir skiprows = [5].
https://translate.googleusercontent.com/translate_f 112/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
148
Página 164
Si, por ejemplo, desea leer solo una parte del archivo, puede especificar explícitamente
el número de líneas en las que analizar. Gracias a las opciones de nrows y skiprows,
puede seleccionar la línea inicial n (n = SkipRows) y las líneas que se leerán después (nrows = i).
149
Página 165
https://translate.googleusercontent.com/translate_f 113/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
columnas = ['bola', 'bolígrafo', 'lápiz', 'papel'])
Como puede ver en el ejemplo anterior, cuando escribe un marco de datos en un archivo,
los índices y columnas están marcados en el archivo de forma predeterminada. Este comportamiento predeterminado puede ser
cambiado estableciendo el índice y el encabezado de dos opciones en False (ver Listado 5-8 ).
1,2,3
5,6,7
9,10,11
13,14,15
150
Página 166
Un punto para recordar al escribir archivos es que los valores NaN presentes en un dato
La estructura se muestra como campos vacíos en el archivo (ver Listado 5-9 ).
Sin embargo, puede reemplazar este campo vacío con un valor a su gusto usando el
Opción na_rep en la función to_csv (). Los valores comunes pueden ser NULL, 0 o iguales
https://translate.googleusercontent.com/translate_f 114/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
NaN (consulte el listado 5-10 ).
>>> frame3.to_csv ('ch05_09.csv', na_rep = 'NaN')
151
Página 167
Tenga en cuenta que en los casos especificados, el marco de datos siempre ha sido objeto de
discusión ya que estas son las estructuras de datos que se escriben en el archivo. Pero todo
estas funciones y opciones también son válidas con respecto a la serie.
• read_html ()
• to_html ()
Estas dos funciones pueden resultar muy útiles. Apreciarás la posibilidad de convertir
estructuras de datos complejas como marcos de datos directamente en tablas HTML sin tener que
hackear una lista larga en HTML, especialmente si se trata de la Web.
La operación inversa puede ser muy útil, porque ahora la principal fuente de datos es
solo el mundo web. De hecho, muchos datos en Internet no siempre tienen la forma
"Listo para usar", que está empaquetado en algún archivo TXT o CSV. Muy a menudo, sin embargo, los datos son
informado como parte del texto de las páginas web. Así que también tener disponible una función para leer
podría resultar realmente útil.
Esta actividad está tan extendida que actualmente se la identifica como web scraping . Esta
proceso se está convirtiendo en parte fundamental del conjunto de procesos que se integrarán en
la primera parte del análisis de datos: extracción de datos y preparación de datos.
152
Página 168
Nota Muchos sitios web han adoptado ahora el formato htML5, para evitar problemas de
módulos faltantes y mensajes de error. te recomiendo encarecidamente que instales el módulo
html5lib. anaconda especificado:
Dado que las funciones de la API de E / S están definidas en las estructuras de datos de pandas, puede llamar
la función to_html () directamente en la instancia del marco de datos.
153
Página 169
<tr>
<th> 0 </th>
<td> 0 </td>
<td> 1 </td>
</tr>
<tr>
<th> 1 </th>
<td> 2 </td>
<td> 3 </td>
</tr>
</tbody>
</table>
Como puede ver, toda la estructura formada por las etiquetas HTML necesarias para crear un
La tabla HTML se generó correctamente para respetar la estructura interna del
marco de datos.
En el siguiente ejemplo, verá cómo la tabla aparece generada automáticamente dentro de
un archivo HTML. En este sentido, creamos un marco de datos un poco más complejo que el anterior.
uno, donde están las etiquetas de los índices y los nombres de las columnas.
https://translate.googleusercontent.com/translate_f 116/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
rojo 0.204529 0.981573 0.118329 0.761552
azul 0,628790 0,585922 0,039153 0,461598
Ahora te concentras en escribir una página HTML mediante la generación de una cadena. Esta
es un ejemplo simple y trivial, pero es muy útil para comprender y probar el
funcionalidad de pandas directamente en el navegador web.
154
Página 170
Primero que nada creamos una cadena que contiene el código de la página HTML.
>>> s = ['<HTML>']
>>> s.append ('<HEAD> <TITLE> Mi DataFrame </TITLE> </HEAD>')
>>> s.append ('<CUERPO>')
>>> s.append (frame.to_html ())
>>> s.append ('</BODY> </HTML>')
>>> html = ".unir (s)
Ahora que toda la lista de la página HTML está contenida dentro de la variable html,
puede escribir directamente en el archivo que se llamará myFrame.html:
Ahora en su directorio de trabajo habrá un nuevo archivo HTML, myFrame.html. Haga doble clic
para abrirlo directamente desde el navegador. Aparecerá una tabla HTML en la parte superior izquierda, como
como se muestra en la Figura 5-1 .
Figura 5-1. El marco de datos se muestra como una tabla HTML en la página web.
155
Página 171
Más precisamente, la función read_html () devuelve una lista de marcos de datos incluso si hay
https://translate.googleusercontent.com/translate_f 117/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
solo una mesa. La fuente que se analizará puede ser de diferentes tipos. Por ejemplo tu
puede que tenga que leer un archivo HTML en cualquier directorio. Por ejemplo, puede analizar el HTML
archivo que creó en el ejemplo anterior:
Como puede ver, todas las etiquetas que no tienen nada que ver con la tabla HTML no son
considerado absolutamente. Además, web_frames es una lista de marcos de datos, aunque en su
caso, el marco de datos que está extrayendo es solo uno. Sin embargo, puede seleccionar el elemento
en la lista que desea usar, llamándolo de la manera clásica. En este caso, el artículo es único.
y por lo tanto el índice será 0.
Sin embargo, el modo más utilizado con respecto a la función read_html () es que
de un análisis directo de una URL en la Web. De esta forma las páginas web en la red son
analizado directamente con la extracción de las tablas en ellos.
Por ejemplo, ahora llamará a una página web donde hay una tabla HTML que muestra un
lista de clasificación con algunos nombres y puntuaciones.
156
Página 172
La misma operación se puede ejecutar en cualquier página web que tenga una o más tablas.
https://translate.googleusercontent.com/translate_f 118/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
<Autor> Ross, Mark </Author>
<Title> Libro de recetas XML </Title>
<Genre> Computadora </Genre>
<Precio> 23,56 </Precio>
<PublishDate> 2014-22-01 </PublishDate>
</Book>
<ID del libro = "ISBN9872122367564">
<Author> Bracket, Barbara </Author>
<Title> XML para principiantes </Title>
<Genre> Computadora </Genre>
<Precio> 35,95 </Precio>
<PublishDate> 16/12/2014 </PublishDate>
</Book>
</Catalog>
157
Página 173
En este ejemplo, tomará la estructura de datos descrita en el archivo XML para convertir
directamente en un marco de datos. Lo primero que debe hacer es utilizar el submódulo objetivar del
lxml, importándola de la siguiente manera.
Ahora puede hacer el analizador del archivo XML con solo la función parse ().
Tienes un árbol de objetos, que es una estructura de datos interna del módulo lxml.
Mire con más detalle este tipo de objeto. Para navegar en esta estructura de árbol, para
para seleccionar elemento por elemento, primero debe definir la raíz. Puedes hacer esto con el
función getroot ().
Ahora que se ha definido la raíz de la estructura, puede acceder a los distintos nodos
del árbol, cada uno correspondiente a la etiqueta contenida en el archivo XML original. Los artículos serán
tienen el mismo nombre que las etiquetas correspondientes. Entonces, para seleccionarlos, simplemente escriba los distintos
etiquetas separadas con puntos, reflejando de cierta manera la jerarquía de nodos en el árbol.
>>> root.Book.Author
'Ross, Mark'
>>> root.Book.PublishDate
'2014-22-01'
De esta forma accede a los nodos individualmente, pero puede acceder a varios elementos en el
mismo tiempo usando getchildren (). Con esta función, obtendrá todos los nodos secundarios de la
elemento de referencia.
>>> root.getchildren ()
[<Libro de elementos en 0x9c66688>, <Libro de elementos en 0x9c66e08>]
158
Página 174
https://translate.googleusercontent.com/translate_f 119/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Mientras que con el atributo de texto obtienes el valor contenido entre los
etiquetas correspondientes.
159
Página 175
pandas proporciona funciones específicas para este tipo de formato. Has visto que la E / S
API proporciona dos funciones para este propósito:
• para sobresalir()
• read_excel ()
La función read_excel () puede leer archivos de Excel 2003 (.xls) y archivos de Excel 2007 (.xlsx).
Esto es posible gracias a la integración del módulo interno xlrd.
Primero, abra un archivo de Excel e ingrese los datos como se muestra en la Figura 5-2 . Copie los datos en
sheet1 y sheet2. Luego guárdelo como ch05_data.xlsx.
https://translate.googleusercontent.com/translate_f 120/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 5-2. Los dos conjuntos de datos en sheet1 y sheet2 de un archivo de Excel
160
Página 176
Para leer los datos contenidos en el archivo XLS y convertirlos en un marco de datos, solo
tienes que usar la función read_excel ().
Como puede ver, de forma predeterminada, el marco de datos devuelto se compone de los datos
tabulado en las primeras hojas de cálculo. Sin embargo, si necesita cargar los datos en el segundo
hoja de cálculo, debe especificar el nombre de la hoja o el número de la hoja
(índice) como el segundo argumento.
Lo mismo se aplica a la escritura. Para convertir un marco de datos en una hoja de cálculo en Excel,
tienes que escribir lo siguiente.
161
https://translate.googleusercontent.com/translate_f 121/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 177
En el directorio de trabajo, encontrará un nuevo archivo de Excel que contiene los datos, como se muestra
en la Figura 5-3 .
Datos JSON
JSON (JavaScript Object Notation) se ha convertido en uno de los estándares más comunes
formatos, especialmente para la transmisión de datos en la Web. Por eso es normal trabajar con
este formato de datos si desea utilizar datos en la Web.
La particularidad de este formato es su gran flexibilidad, aunque su estructura está lejos
de ser aquella a la que estáis bien acostumbrados, es decir, tabular.
En esta sección, verá cómo utilizar las funciones read_json () y to_json () para
permanezca dentro de las funciones de la API de E / S discutidas en este capítulo. Pero en la segunda parte tu
verá otro ejemplo en el que tendrá que lidiar con datos estructurados en JSON
formato mucho más relacionado con casos reales.
En mi opinión, una aplicación en línea útil para verificar el formato JSON es
JSONViewer, disponible en http://jsonviewer.stack.hu/. Esta aplicación web, una vez
ingresa o copia datos en formato JSON, le permite ver si el formato que ingresó
es válido. Además, muestra la estructura del árbol para que pueda comprender mejor su
estructura (ver figura 5-4 ).
162
Página 178
https://translate.googleusercontent.com/translate_f 122/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Comencemos con el caso más útil, es decir, cuando tiene un marco de datos y
Necesita convertirlo en un archivo JSON. Entonces, defina un marco de datos y luego llame a to_json ()
función en él, pasando como argumento el nombre del archivo que desea crear.
En el directorio de trabajo, encontrará un nuevo archivo JSON (ver Listado 5-12 ) que contiene
los datos del marco de datos traducidos al formato JSON.
163
Página 179
Lo contrario es posible, usando read_json () con el nombre del archivo pasado como
un argumento.
El ejemplo que ha visto es un caso bastante simple en el que los datos JSON estaban en
forma tabular (ya que el archivo frame.json proviene de un marco de datos). Sin embargo, generalmente
los archivos JSON no tienen una estructura tabular. Por lo tanto, necesitará convertir de alguna manera
el archivo dict de estructura en forma tabular. Este proceso se llama normalización .
La biblioteca pandas proporciona una función, llamada json_normalize (), que puede
convertir un dict o una lista en una tabla. Primero tienes que importar la función:
Luego escribe un archivo JSON como se describe en Listado 5-13 con cualquier editor de texto. Guárdalo en
el directorio de trabajo como books.json.
https://translate.googleusercontent.com/translate_f 123/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
164
Página 180
Como puede ver, la estructura de archivos ya no es tabular, sino más compleja. Luego
el enfoque con la función read_json () ya no es válido. Mientras aprende de esto
Por ejemplo, aún puede obtener los datos en forma tabular de esta estructura. Primero tienes que
cargue el contenido del archivo JSON y conviértalo en una cadena.
Ahora está listo para aplicar la función json_normalize (). De un vistazo rápido al
contenido de los datos dentro del archivo JSON, por ejemplo, es posible que desee extraer una tabla
que contiene todos los libros. Luego, escriba la clave de los libros como segundo argumento.
La función leerá el contenido de todos los elementos que tengan libros como clave. Todas
las propiedades se convertirán en nombres de columnas anidadas mientras que los valores correspondientes
llenará el marco de datos. Para los índices, la función asigna una secuencia de incrementos
números.
165
Página 181
Sin embargo, obtiene un marco de datos que contiene solo cierta información interna. Sería
Sería útil sumar los valores de otras claves del mismo nivel. En este caso puede agregar otros
columnas insertando una lista de claves como tercer argumento de la función.
https://translate.googleusercontent.com/translate_f 124/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
4 31,35 HTML5 Reino Unido Barbara Bracket
5 28.00 Python para tontos Reino Unido Barbara Bracket
Ahora, como resultado, obtiene un marco de datos a partir de una estructura de árbol inicial.
El formato HDF5
Hasta ahora has visto cómo escribir y leer datos en formato de texto. Cuando su análisis de datos
implica grandes cantidades de datos, es preferible utilizarlos en formato binario. Existen
Varias herramientas en Python para manejar datos binarios. Una biblioteca que está teniendo cierto éxito en
esta área es la biblioteca HDF5.
El término HDF significa formato de datos jerárquico y, de hecho, esta biblioteca es
relacionado con la lectura y escritura de archivos HDF5 que contienen una estructura con nodos y
la posibilidad de almacenar múltiples conjuntos de datos.
Esta biblioteca, completamente desarrollada en C, sin embargo, también tiene interfaces con otros tipos de
lenguajes como Python, MATLAB y Java. Es muy eficiente, especialmente cuando se usa
este formato para guardar grandes cantidades de datos. Comparado con otros formatos que funcionan más
simplemente en binario, HDF5 admite la compresión en tiempo real, aprovechando así
patrones repetitivos en la estructura de datos para comprimir el tamaño del archivo.
En la actualidad, las posibles opciones en Python son PyTables y h5py. Estas dos formas
difieren en varios aspectos y, por tanto, su elección depende mucho de las necesidades de
aquellos que lo usan.
h5py proporciona una interfaz directa con las API de alto nivel HDF5, mientras que PyTables
abstrae muchos de los detalles de HDF5 para proporcionar contenedores de datos más flexibles,
tablas indexadas, capacidades de consulta y otros medios sobre los cálculos.
166
Página 182
pandas tiene un dictado similar a una clase llamado HDFStore, que usa PyTables para almacenar objetos pandas.
Entonces, antes de trabajar con el formato HDF5, debe importar la clase HDFStore:
Ahora está listo para almacenar los datos de un marco de datos dentro de un archivo .h5. Primero, crea un
marco de datos.
Ahora cree un archivo HDF5 llamándolo mydata.h5, luego ingrese los datos dentro del
marco de datos.
Entonces, con este tipo de formato, puede almacenar múltiples estructuras de datos en un solo archivo,
representado por la variable de tienda.
>>> tienda
<clase 'pandas.io.pytables.HDFStore'>
Ruta del archivo: mydata.h5
/ obj1 cuadro (forma -> [4,4])
https://translate.googleusercontent.com/translate_f 125/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
167
Página 183
Incluso el proceso inverso es muy sencillo. Teniendo en cuenta tener un archivo HDF5
que contienen varias estructuras de datos, los objetos dentro se pueden llamar de la siguiente manera:
Luego cree un objeto lo suficientemente complejo como para tener una estructura de datos interna, para
ejemplo un objeto dict.
168
Página 184
Ahora realizará una serialización del objeto de datos a través de la función dumps ()
del módulo cPickle.
Ahora, para ver cómo serializó el objeto dict, debe mirar el contenido del
variable pickled_data.
https://translate.googleusercontent.com/translate_f 126/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Una vez que haya serializado los datos, pueden escribirse fácilmente en un archivo o enviarse a través de un
enchufe, tubería, etc.
Después de ser transmitido, es posible reconstruir el objeto serializado
(deserialización) con la función load () del módulo cPickle.
169
Página 185
Hay un nuevo archivo llamado frame.pkl en su directorio de trabajo que contiene todos los
información sobre el marco de datos del marco.
Para abrir un archivo PKL y leer el contenido, simplemente use este comando:
Como puede ver, todas las implicaciones en la operación de decapado y desencadenado son
completamente oculto para el usuario de pandas, haciendo el trabajo tan fácil y comprensible como
posible, para aquellos que deben ocuparse específicamente del análisis de datos.
Nota Cuando utilice este formato, asegúrese de que el archivo que abre sea seguro. en efecto,
El formato de pepinillo no fue diseñado para protegerse contra errores y
datos construidos maliciosamente.
170
Página 186
Para PostgreSQL:
171
Página 187
Cree un marco de datos que utilizará para crear una nueva tabla en la base de datos SQLite3.
https://translate.googleusercontent.com/translate_f 128/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> marco = pd.DataFrame (np.arange (20) .reshape (4,5),
... columnas = ['blanco', 'rojo', 'azul', 'negro', 'verde'])
>>> marco
blanco rojo azul negro verde
001234
156789
2 10 11 12 13 14
3 15 16 17 18 19
En cambio, para leer la base de datos, debe usar la función read_sql () con la
nombre de la tabla y el motor.
Como puede ver, incluso en este caso, la operación de escritura en la base de datos se ha convertido
muy simple gracias a las API de E / S disponibles en la biblioteca de pandas.
Ahora verá las mismas operaciones, pero sin usar la API de E / S. Esto puede ser
útil para tener una idea de cómo los pandas resultan ser una herramienta eficaz para leer y escribir
datos a una base de datos.
Primero, debe establecer una conexión con la base de datos y crear una tabla definiendo el
tipos de datos corregidos, para acomodar los datos que se van a cargar.
172
Página 188
Ahora que ha visto cómo cargar los datos en una tabla, es hora de ver cómo consultar
la base de datos para obtener los datos que acaba de registrar. Esto es posible usando un SELECT de SQL
declaración.
https://translate.googleusercontent.com/translate_f 129/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> cursor
<objeto sqlite3.Cursor en 0x0000000009E7D730>
>>> filas = cursor.fetchall ()
>>> filas
[(u'white ', u'up', 1.0, 3), (u'black ', u'down', 2.0, 8), (u'green ', u'up',
4.0, 4), (u'red ', 5.0, 5)]
>>> cursor.description
(('a', Ninguno, Ninguno, Ninguno, Ninguno, Ninguno, Ninguno), ('b', Ninguno, Ninguno, Ninguno, Ninguno,
Ninguno, Ninguno), ('c
173
Página 189
uno, Ninguno, Ninguno, Ninguno, Ninguno), ('d', Ninguno, Ninguno, Ninguno, Ninguno, Ninguno, Ninguno))
>>> pd.DataFrame (filas, columnas = zip (* cursor.description) [0])
aBCD
0 blanco hasta 1 3
1 negro abajo 2 8
2 verde hasta 4 4
3 rojo abajo 5 5
Para ejecutar este ejemplo, debe tener instalada en su sistema una base de datos PostgreSQL.
En mi caso creé una base de datos llamada postgres, con postgres como usuario y contraseña
como contraseña. Reemplace estos valores con los valores correspondientes a su sistema.
Lo primero que debe hacer es instalar la biblioteca psycopg2, que está diseñada para administrar y
manejar la conexión con las bases de datos.
Con Anaconda:
174
Página 190
https://translate.googleusercontent.com/translate_f 130/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Tenga en cuenta que en este ejemplo, dependiendo de cómo instaló el paquete en Windows,
a menudo aparece el siguiente mensaje de error:
Esto probablemente significa que no tiene las DLL de PostgreSQL (libpq.dll en particular)
en tu RUTA. Agregue uno de los directorios postgres \ xx \ bin a su RUTA y debería
poder conectarse desde Python a sus instalaciones de PostgreSQL.
Crea un objeto de marco de datos:
Ahora vemos con qué facilidad puede transferir estos datos a una tabla. Con to_sql () podrás
registre los datos en una tabla llamada marco de datos.
pgAdmin III es una aplicación gráfica para administrar bases de datos PostgreSQL. Es una muy
herramienta útil y está presente en Linux y Windows. Con esta aplicación, es fácil de ver
el marco de datos de la tabla que acaba de crear (consulte la Figura 5-5 ).
175
Página 191
https://translate.googleusercontent.com/translate_f 131/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 5-5. La aplicación pgAdmin III es un administrador de bases de datos gráfico perfecto para
PostgreSQL
Si conoce bien el lenguaje SQL, una forma más clásica de ver la nueva tabla creada
y su contenido usa una sesión psql.
En mi caso, estoy conectado al usuario de postgres; puede ser diferente en su caso. Una vez
está conectado a la base de datos, realice una consulta SQL en la tabla recién creada.
176
Página 192
Incluso la conversión de una tabla en un marco de datos es una operación trivial. Incluso aqui ahi
es una función read_sql_table () que lee directamente en la base de datos y devuelve un
marco de datos.
Pero cuando desea leer datos en una base de datos, la conversión de un todo y un solo
tabla en un marco de datos no es la operación más útil. De hecho, quienes trabajan con
Las bases de datos relacionales prefieren usar el lenguaje SQL para elegir qué datos y en qué
formulario para exportar los datos insertando una consulta SQL.
El texto de una consulta SQL se puede integrar en la función read_sql_query ().
>>> pd.read_sql_query ('SELECT index, apr, may FROM DATAFRAME WHERE apr>
0,5 ', motor)
índice abril mayo
0 exp1 0.979086 0.332289
1 exp3 0.905980 0.123449
2 exp4 0,958015 0,448064
177
https://translate.googleusercontent.com/translate_f 132/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 193
Ahora que el servicio está escuchando en el puerto 27017, puede conectarse a esta base de datos
usando el controlador oficial de MongoDB: pymongo.
Una sola instancia de MongoDB puede admitir varias bases de datos al mismo
hora. Entonces ahora necesita apuntar a una base de datos específica.
>>> db = client.mydatabase
>>> db
Base de datos (MongoClient ('localhost', 27017), u'mycollection ')
Para hacer referencia a este objeto, también puede utilizar
>>> cliente ['mydatabase']
Base de datos (MongoClient ('localhost', 27017), u'mydatabase ')
178
Página 194
https://translate.googleusercontent.com/translate_f 133/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> importar json
>>> registro = json.loads (frame.T.to_json ()). valores ()
>>> grabar
[{u'blue ': 7, u'green': 9, u'white ': 5, u'black': 8, u'red ': 6},
{u'blue ': 2, u'green': 4, u'blanco ':
0, u'black ': 3, u'red': 1}, {u'blue ': 17, u'green': 19, u'white ': 15,
u'black ': 18, u'red': 16}, {u
'azul': 12, u'green ': 14, u'white': 10, u'black ': 13, u'red': 11}]
Ahora finalmente está listo para insertar un documento en la colección,
y puede hacer esto con la función insert ().
>>> colección.mydocumento.insertar (registro)
[ObjectId ('54fc3afb9bfbee47f4260357'), ObjectId ('54fc3afb9bfbee47f4260358'),
ObjectId ('54fc3afb9bfbee47f4260359'), ObjectId ('54fc3afb9bfbee47f426035a')]
Como puede ver, tiene un objeto por cada línea grabada. Ahora que los datos han
cargado en el documento dentro de la base de datos MongoDB, puede ejecutar
el proceso inverso, es decir, leer datos en un documento y luego convertirlos en un
marco de datos.
179
Página 195
Ha eliminado la columna que contiene los números de identificación para la referencia interna
de MongoDB.
Conclusiones
En este capítulo, vio cómo utilizar las funciones de la API de E / S de la biblioteca pandas en
para leer y escribir datos en archivos y bases de datos conservando la estructura del
marcos de datos. En particular, varios modos de escritura y lectura de datos de acuerdo con
se ilustró el tipo de formato.
En la última parte del capítulo, vio cómo interactuar con los modelos más populares de
bases de datos para registrar y / o leer datos directamente como un marco de datos listo para ser procesado
con las herramientas de los pandas.
En el siguiente capítulo, verá las funciones más avanzadas de los pandas de la biblioteca.
Se discuten instrumentos complejos como el GroupBy y otras formas de procesamiento de datos.
en detalle.
https://translate.googleusercontent.com/translate_f 134/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
180
Página 196
CAPÍTULO 6
• Preparación de datos
• Transformación de datos
• Agregación de datos
Preparación de datos
Antes de comenzar a manipular datos, es necesario prepararlos y ensamblar
ellos en forma de estructuras de datos de modo que puedan ser manipulados más tarde con el
herramientas puestas a disposición por la biblioteca de pandas. Los diferentes procedimientos para la preparación de datos
se enumeran aquí.
• Cargando
• Montaje
181
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_6
Página 197
• Fusión
• Concatenando
• Combinando
• Remodelación (pivotante)
• Eliminando
El capítulo anterior cubrió la carga. En la fase de carga, también existe esa parte
de la preparación que se refiere a la conversión de muchos formatos diferentes en un
estructura como un marco de datos. Pero incluso después de tener los datos, probablemente de diferentes
https://translate.googleusercontent.com/translate_f 135/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
fuentes y formatos, y lo unificó en un marco de datos, deberá realizar más
operaciones de preparación. En este capítulo, y en particular en esta sección, verá cómo
para realizar todas las operaciones necesarias para obtener los datos en una estructura de datos unificada.
Los datos contenidos en los objetos pandas se pueden ensamblar de diferentes formas:
Fusión
La operación de fusión, que corresponde a la operación JOIN para aquellos que son
familiarizado con SQL, consiste en una combinación de datos a través de la conexión de filas
utilizando una o más claves.
182
Página 198
De hecho, cualquiera que trabaje con bases de datos relacionales suele utilizar la consulta JOIN con
SQL para obtener datos de diferentes tablas utilizando algunos valores de referencia (claves) compartidos entre
ellos. Sobre la base de estas claves, es posible obtener nuevos datos en forma tabular como el
resultado de la combinación de otras tablas. Esta operación con la biblioteca pandas se llama
merging y merge () es la función para realizar este tipo de operación.
Primero, debe importar la biblioteca de pandas y definir dos marcos de datos que servirán
como ejemplos para esta sección.
Realice la fusión aplicando la función merge () a los dos objetos del marco de datos.
https://translate.googleusercontent.com/translate_f 136/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
0 bola 12,33 roja
1 lápiz 11,44 blanco
2 lápices 11,44 rojo
3 bolígrafos 33.21 negro
183
Página 199
Como puede ver en el resultado, el marco de datos devuelto consta de todas las filas que tienen
una identificación en común. Además de la columna común, las columnas de la primera y
se agregan los segundos marcos de datos.
En este caso, usó la función merge () sin especificar ninguna columna explícitamente.
De hecho, en la mayoría de los casos es necesario decidir cuál es la columna en la que basar la
fusionando.
Para hacer esto, agregue la opción on con el nombre de la columna como clave para la fusión.
Ahora, en este caso, tiene dos marcos de datos que tienen columnas con el mismo nombre. Así que si
lanzas una combinación, no obtienes ningún resultado.
184
Página 200
Es necesario definir explícitamente los criterios de fusión que deben seguir los pandas,
especificando el nombre de la columna de clave en la opción on.
https://translate.googleusercontent.com/translate_f 137/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
2 lápiz rojo ABC POD
3 bolígrafo rojo ABC POD
>>> pd.merge (frame1, frame2, on = 'marca')
color de la marca id_x id_y
0 OMG lápiz bola blanca
1 bola de lápiz roja ABC
2 bolígrafo rojo ABC
Lápiz taza 3 POD negro
Bolígrafo taza 4 POD negro
5 lápiz cenicero verde POD
6 bolígrafo cenicero POD verde
Como era de esperar, los resultados varían considerablemente en función de los criterios de fusión.
Sin embargo, a menudo surge el problema opuesto, es decir, tener dos marcos de datos en los que
las columnas clave no tienen el mismo nombre. Para remediar esta situación, debe utilizar
las opciones left_on y right_on, que especifican la columna de clave para el primero y para el
segundo marco de datos. Ahora puedes ver un ejemplo.
185
Página 201
Por defecto, la función merge () realiza una unión interna; las claves en el resultado son las
resultado de una intersección.
Otras opciones posibles son la combinación izquierda , la combinación derecha y la combinación externa . El exterior
join produce la unión de todas las claves, combinando el efecto de una unión izquierda con una unión derecha. A
seleccione el tipo de unión que tiene para usar la opción cómo.
https://translate.googleusercontent.com/translate_f 138/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Taza 4 POD negra NaN
Cenicero 5 POD verde NaN
>>> pd.merge (frame1, frame2, on = 'id', how = 'right')
brand_x color id brand_y
0 OMG bola blanca ABC
1 lápiz rojo ABC OMG
2 lápiz rojo ABC POD
3 bolígrafo rojo ABC POD
186
Página 202
Para fusionar varias claves, simplemente agregue una lista a la opción de encendido.
Fusionar en un índice
En algunos casos, en lugar de considerar las columnas de un marco de datos como claves, los índices podrían
utilizarse como claves para la fusión. Luego, para decidir qué índices considerar, debe
establezca las opciones left_index o right_index en True para activarlas, con la capacidad de
activarlos a ambos.
Pero los objetos del marco de datos tienen una función join (), que es mucho más conveniente
cuando desee hacer la fusión por índices. También se puede utilizar para combinar muchos
Objetos de marco de datos que tienen los mismos índices o los mismos pero sin columnas superpuestas.
De hecho, si lanza
187
Página 203
Obtendrá un código de error porque algunas columnas en frame1 tienen el mismo nombre que
marco 2. Luego cambie el nombre de las columnas en frame2 antes de iniciar la función join () .
https://translate.googleusercontent.com/translate_f 139/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> frame2.columns = ['brand2', 'id2']
>>> frame1.join (frame2)
marca color id brand2 id2
0 OMG bola blanca OMG lápiz
1 lápiz rojo ABC lápiz POD
2 bolígrafo rojo ABC bola ABC
Bolígrafo 3 POD taza negra POD
Cenicero 4 POD verde NaN NaN
Aquí ha realizado una fusión, pero basada en los valores de los índices en lugar de
las columnas. Esta vez también está el índice 4 que estaba presente solo en el cuadro 1, pero el
los valores correspondientes a las columnas de frame2 reportan NaN como un valor.
Concatenando
Otro tipo de combinación de datos se denomina concatenación . NumPy proporciona una
función concatenar () para hacer este tipo de operación con matrices.
188
Página 204
Con la biblioteca de pandas y sus estructuras de datos como series y dataframe, teniendo
Los ejes etiquetados le permiten generalizar aún más la concatenación de matrices. El concat ()
La función es proporcionada por pandas para este tipo de operación.
https://translate.googleusercontent.com/translate_f 140/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
8 0.329173
dtype: float64
>>> pd.concat ([ser1, ser2])
1 0,636584
2 0,345030
3 0.157537
4 0.070351
5 0,411319
6 0.359946
7 0,987651
8 0.329173
dtype: float64
189
Página 205
Por defecto, la función concat ( ) trabaja en axis = 0, teniendo como objeto devuelto un
serie. Si establece el eje = 1, el resultado será un marco de datos.
El problema con este tipo de operación es que las partes concatenadas no son
identificable en el resultado. Por ejemplo, desea crear un índice jerárquico en el eje
de concatenación. Para hacer esto, debes usar la opción de claves.
En el caso de combinaciones entre series a lo largo del eje = 1 las teclas se convierten en
encabezados de columna del marco de datos.
190
Página 206
https://translate.googleusercontent.com/translate_f 141/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
CAPÍTULO 6 PANDAS EN PROFUNDIDAD: MANIPULACIÓN DE DATOS
4 0,070351 NaN
5 NaN 0,411319
6 NaN 0,359946
7 NaN 0,987651
8 NaN 0,329173
Hasta ahora ha visto la concatenación aplicada a la serie, pero la misma lógica puede
ser aplicado al marco de datos.
Combinatorio
Existe otra situación en la que hay una combinación de datos que no se pueden obtener
ya sea con fusión o concatenación. Toma el caso en el que quieres los dos
Los conjuntos de datos deben tener índices que se superpongan en su totalidad o al menos parcialmente.
191
Página 207
Una función aplicable a la serie es combine_first (), que realiza este tipo de
operación junto con la alineación de datos.
https://translate.googleusercontent.com/translate_f 142/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
1 0,942631
2 0.033523
3 0,886323
4 0.809757
5 0,800295
6 0.214882
dtype: float64
>>> ser2.combine_first (ser1)
1 0,942631
2 0,739982
3 0,886323
4 0,225647
5 0,709576
6 0.214882
dtype: float64
192
Página 208
En cambio, si desea una superposición parcial, puede especificar solo la parte de la serie
desea superponer.
Pivotante
Además de ensamblar los datos para unificar los valores recolectados de diferentes
fuentes, otra operación bastante común es pivotar . De hecho, la disposición de los valores
por fila o por columna no siempre se adapta a sus objetivos. A veces te gustaría
reorganizar los datos por valores de columna en filas o viceversa.
193
https://translate.googleusercontent.com/translate_f 143/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 209
>>> ser5.unstack ()
bolígrafo lápiz
blanco 0 1 2
negro 3 4 5
rojo 6 7 8
194
Página 210
Este modo de registro de datos tiene algunas desventajas. Uno, por ejemplo, es el
multiplicidad y repetición de algunos campos. Considerando las columnas como claves, los datos en
Este formato será difícil de leer, especialmente para comprender completamente las relaciones
entre los valores clave y el resto de columnas.
195
Página 211
En lugar del formato largo, hay otra forma de organizar los datos en una tabla que es
llamado ancho . Este modo es más fácil de leer, lo que permite una fácil conexión con otras tablas y
ocupa mucho menos espacio. Entonces, en general, es una forma más eficiente de almacenar los datos,
aunque menos práctico, especialmente si durante el llenado de los datos.
Como criterio, seleccione una columna, o un conjunto de ellas, como clave primaria; entonces, los valores
contenido en él debe ser único.
En este sentido, pandas te brinda una función que te permite hacer una transformación
de un marco de datos del tipo largo al tipo ancho. Esta función es pivot () y
acepta como argumentos la columna, o columnas, que asumirán el rol de clave.
A partir del ejemplo anterior, elige crear un marco de datos en formato ancho
eligiendo la columna de color como clave y el elemento como segunda clave, cuyos valores
formará las nuevas columnas del marco de datos.
Como puede ver ahora, en este formato, el marco de datos es mucho más compacto y el
los datos contenidos en él son mucho más legibles.
Eliminando
La última etapa de la preparación de datos es la eliminación de columnas y filas. Ya lo tienes
visto esta parte en el Capítulo 4. Sin embargo, para completar, la descripción se reitera aquí.
Defina un marco de datos a modo de ejemplo.
https://translate.googleusercontent.com/translate_f 145/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
196
Página 212
>>> marco1
bolígrafo lápiz
blanco 0 1 2
negro 3 4 5
rojo 6 7 8
En cambio, para eliminar una fila no deseada, debe usar la función drop () con la
etiqueta del índice correspondiente como argumento.
Transformación de datos
Hasta ahora, ha visto cómo preparar datos para su análisis. Este proceso en efecto representa
un reensamblaje de los datos contenidos en un marco de datos, con posibles adiciones por otros
marco de datos y eliminación de partes no deseadas.
Ahora comenzamos la segunda etapa de la manipulación de datos: la transformación de datos. Después
organiza la forma de los datos y su eliminación dentro de la estructura de datos, es importante
para transformar sus valores. De hecho, en esta sección, verá algunos problemas comunes y
los pasos necesarios para superarlos utilizando funciones de la biblioteca de pandas.
Algunas de estas operaciones implican la presencia de valores duplicados o no válidos, con
posible remoción o reemplazo. Otras operaciones se relacionan en cambio modificando el
índices. Otros pasos incluyen el manejo y procesamiento de los valores numéricos de los datos.
y cuerdas.
197
Página 213
Eliminación de duplicados
Las filas duplicadas pueden estar presentes en un marco de datos por varias razones. En marcos de datos de
enorme tamaño, la detección de estas filas puede ser muy problemática. En este caso, pandas
proporciona una serie de herramientas para analizar los datos duplicados presentes en grandes estructuras de datos.
Primero, cree un marco de datos simple con algunas filas duplicadas.
https://translate.googleusercontent.com/translate_f 146/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
0 blanco 2
1 blanco 1
2 rojo 3
3 rojo 3
4 blanco 2
La función duplicada () aplicada a un marco de datos puede detectar las filas que parecen
ser duplicado. Devuelve una serie de valores booleanos donde cada elemento corresponde a una fila,
con Verdadero si la fila está duplicada (es decir, solo las otras apariciones, no la primera), y con
Falso si no hay duplicados en los elementos anteriores.
>>> dframe.duplicated ()
0 falso
1 falso
2 falso
3 verdadero
4 verdadero
dtype: bool
Tener una serie booleana como valor de retorno puede ser útil en muchos casos, especialmente
para el filtrado. De hecho, si desea saber cuáles son las filas duplicadas, simplemente escriba el
siguiendo:
198
Página 214
Generalmente, todas las filas duplicadas deben eliminarse del marco de datos; Para hacer eso,
pandas proporciona la función drop_duplicates (), que devuelve los marcos de datos sin
filas duplicadas.
Cartografía
La biblioteca de pandas proporciona un conjunto de funciones que, como verá en esta sección,
explotar el mapeo para realizar algunas operaciones. El mapeo no es más que el
creación de una lista de coincidencias entre dos valores diferentes, con la capacidad de vincular un valor
a una etiqueta o cadena en particular.
Para definir el mapeo no hay mejor objeto que dict objects.
mapa = {
'etiqueta1': 'valor1,
'etiqueta2': 'valor2,
...
}
Las funciones que verá en esta sección realizan operaciones específicas, pero
todos aceptan un objeto dictado.
https://translate.googleusercontent.com/translate_f 147/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
tus necesidades. Por ejemplo, el texto puede estar en un idioma extranjero o puede ser un sinónimo
de otro valor, o puede que no se exprese en la forma deseada. En tales casos, un reemplazo
La operación de varios valores es a menudo un proceso necesario.
199
Página 215
Defina, como ejemplo, un marco de datos que contenga varios objetos y colores, incluidos
dos colores que no están en inglés. A menudo durante las operaciones de montaje es probable que se mantenga
mantener datos con valores en una forma indeseable.
Para poder reemplazar los valores incorrectos con nuevos valores, es necesario definir un
mapeo de correspondencias, conteniendo como clave los nuevos valores.
Ahora lo único que puede hacer es usar la función replace () con el mapeo como
argumento.
Como puede ver en el resultado, los dos colores se han reemplazado con el correcto
valores dentro del marco de datos. Un caso común, por ejemplo, es el reemplazo de NaN
valores con otro valor, por ejemplo 0. Puede usar replace (), que realiza su trabajo
muy bien.
200
Página 216
https://translate.googleusercontent.com/translate_f 148/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
5 NaN
6 3.0
dtype: float64
>>> ser.replace (np.nan, 0)
0 1,0
1 3,0
2 0,0
3 4.0
4 6.0
5 0.0
6 3.0
dtype: float64
201
Página 217
Supongamos que desea agregar una columna para indicar el precio del artículo mostrado
en el marco de datos. Antes de hacer esto, se asume que tiene una lista de precios disponible
en algún lugar, en el que se describe el precio de cada tipo de artículo. Definir entonces un dict
objeto que contiene una lista de precios para cada tipo de artículo.
>>> precios = {
... 'bola': 5.56,
... 'taza': 4.20,
... 'botella': 1,30,
... 'tijeras': 3.41,
... 'pluma': 1,30,
... 'lápiz': 0,56,
... 'cenicero': 2,75
...}
https://translate.googleusercontent.com/translate_f 149/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
202
Página 218
>>> marco
precio del artículo de color
0 bola blanca 5.56
1 taza roja 4.20
2 bolígrafos verdes 1,30
3 lápiz negro 0.56
4 cenicero amarillo 2,75
>>> reindex = {
... 0: 'primero',
... 1 segundo',
... 2: 'tercero',
... 3: 'cuarto',
... 4: 'quinto'}
>>> frame.rename (reindexar)
precio del artículo de color
primera bola blanca 5.56
segunda taza roja 4.20
tercer bolígrafo verde 1,30
cuarto lápiz negro 0.56
quinto cenicero amarillo 2.75
Como puede ver, de forma predeterminada, los índices se renombran. Si desea cambiar el nombre de las columnas
debe utilizar la opción de columnas. Esta vez asigna varias asignaciones explícitamente a la
dos opciones de índice y columna.
>>> recolumn = {
... 'item': 'objeto',
... 'valor del precio'}
>>> frame.rename (índice = reindexar, columnas = volver a columna)
valor del objeto de color
primera bola blanca 5.56
segunda taza roja 4.20
tercer bolígrafo verde 1,30
cuarto lápiz negro 0.56
quinto cenicero amarillo 2.75
203
Página 219
También aquí, para los casos más simples en los que tiene un único valor para ser reemplazado,
puede evitar tener que escribir y asignar muchas variables.
https://translate.googleusercontent.com/translate_f 150/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
>>> frame.rename (index = {1: 'first'}, columnas = {'item': 'object'})
precio del objeto de color
0 bola blanca 5.56
primera taza roja 4.20
2 bolígrafos verdes 1,30
3 lápiz negro 0.56
4 cenicero amarillo 2,75
Hasta ahora, ha visto que la función rename () devuelve un marco de datos con la
cambios, dejando sin cambios el marco de datos original. Si quieres que los cambios tomen
efecto sobre el objeto en el que llama a la función, establecerá la opción en el lugar para
Cierto.
Discretización y Binning
Un proceso de transformación más complejo que verá en esta sección es
discretización . A veces se puede utilizar, especialmente en algunos casos experimentales, para
manejar grandes cantidades de datos generados en secuencia. Realizar un análisis de la
datos, sin embargo, es necesario transformar estos datos en categorías discretas, por ejemplo,
dividiendo el rango de valores de tales lecturas en intervalos más pequeños y contando el
ocurrencia o estadísticas en ellos. Otro caso podría ser cuando tienes una gran cantidad
de muestras debido a lecturas precisas en una población. Incluso aquí, para facilitar el análisis de
los datos, es necesario dividir el rango de valores en categorías y luego analizar el
ocurrencias y estadísticas relacionadas con cada uno.
204
Página 220
En su caso, por ejemplo, puede tener una lectura de un valor experimental entre
0 y 100. Estos datos se recopilan en una lista.
Sabes que los valores experimentales tienen un rango de 0 a 100; por lo tanto tu
puede dividir uniformemente este intervalo, por ejemplo, en cuatro partes iguales, es decir, bins. El primero
contiene los valores entre 0 y 25, el segundo entre 26 y 50, el tercero entre
51 y 75, y el último entre 76 y 100.
Para hacer esta agrupación con pandas, primero debe definir una matriz que contenga el
valores de separación de bin:
Luego usa una función especial llamada cut () y la aplica a la matriz de resultados también
pasando los contenedores.
https://translate.googleusercontent.com/translate_f 151/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
(0, 25]
(0, 25]
(50, 75)
(50, 75)
(25, 50]
(75, 100]
(0, 25]
(25, 50]
(75, 100]
(75, 100]
Niveles (4): Índice (['(0, 25]', '(25, 50]', '(50, 75)', '(75, 100]'],
dtype = objeto)
205
Página 221
>>> cat.categories
IntervalIndex ([0, 25], (25, 50], (50, 75], (75, 100])
cerrado = 'derecho'
dtype = 'intervalo [int64]')
>>> códigos de gato
matriz ([0, 1, 2, 2, 1, 3, 3, 0, 0, 2, 2, 1, 3, 0, 1, 3, 3], dtype = int8)
Finalmente para conocer las ocurrencias de cada bin, es decir, cuántos resultados caen en cada
categoría, tienes que usar la función value_counts ().
Como puede ver, cada clase tiene el límite inferior con un paréntesis y el límite superior
con un paréntesis. Esta notación es consistente con la notación matemática que se usa
para indicar los intervalos. Si el corchete es cuadrado, el número pertenece al rango (límite
cerrado), y si es redondo, el número no pertenece al intervalo (límite abierto).
Puede dar nombres a varios bins llamándolos primero en una matriz de cadenas y
luego asignando a las opciones de etiquetas dentro de la función cut () que ha usado para
crea el objeto categórico.
206
Página 222
https://translate.googleusercontent.com/translate_f 152/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
CAPÍTULO 6 PANDAS EN PROFUNDIDAD: MANIPULACIÓN DE DATOS
menos probable
muy probable
muy probable
improbable
improbable
probable
probable
menos probable
muy probable
improbable
menos probable
muy probable
muy probable
Niveles (4): Índice (['improbable', 'menos probable', 'probable', 'muy probable'],
dtype = objeto)
207
Página 223
(22,2, 41,4]
(41,4; 60,6)
(79,8, 99]
(79,8, 99]
Niveles (5): Índice (['(2.904, 22.2]', '(22.2, 41.4]', '(41.4, 60.6])',
'(60.6, 79.8]', '(79.8, 99]'], dtype = objeto)
Además de cut (), pandas proporciona otro método para agrupar: qcut (). Esta
La función divide la muestra directamente en quintiles. De hecho, dependiendo de la distribución
de la muestra de datos, al usar cut (), tendrá un número diferente de ocurrencias
para cada contenedor. En su lugar, qcut () asegurará que el número de ocurrencias para cada bin sea
iguales, pero los bordes de cada contenedor varían.
https://translate.googleusercontent.com/translate_f 153/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
(87, 99]
(87, 99]
[3, 24]
[3, 24]
(46, 62,6]
(62,6, 87]
(24, 46)
(62,6, 87]
[3, 24]
(46, 62,6]
(87, 99]
(62,6, 87]
Niveles (5): Índice (['[3, 24]', '(24, 46]', '(46, 62,6]', '(62,6, 87]',
'(87, 99]'], dtype = objeto)
208
Página 224
Como puede ver, en el caso de los quintiles, los intervalos que delimitan el contenedor difieren de
los generados por la función cut (). Además, si observa las ocurrencias de cada
bin encontrará que qcut () intentó estandarizar las ocurrencias para cada bin, pero en el caso
de quintiles, los dos primeros bins tienen una ocurrencia en más porque el número de resultados
no es divisible por cinco.
>>> randframe.describe ()
0 1 2
contar 1000.000000 1000.000000 1000.000000
media 0.021609 -0.022926 -0.019577
estándar 1.045777 0.998493 1.056961
min -2,981600 -2,828229 -3,735046
25% -0,675005 -0,729834 -0,737677
50% 0,003857 -0,016940 -0,031886
75% 0,738968 0,619175 0,718702
máx. 3.104202 2.942778 3.458472
209
https://translate.googleusercontent.com/translate_f 154/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 225
Por ejemplo, puede considerar valores atípicos aquellos que tienen un valor mayor que tres
veces la desviación estándar. Tener solo la desviación estándar de cada columna de la
marco de datos, use la función std ().
>>> randframe.std ()
0 1.045777
1 0.998493
2 1.056961
dtype: float64
Ahora aplica el filtrado de todos los valores del marco de datos, aplicando el
correspondiente desviación estándar para cada columna. Gracias a la función any (),
puede aplicar el filtro en cada columna.
Permutación
Las operaciones de permutación (reordenamiento aleatorio) de una serie o las filas de una
Los marcos de datos son fáciles de hacer usando la función numpy.random.permutation ().
Para este ejemplo, cree un marco de datos que contenga números enteros en orden ascendente.
210
Página 226
Ahora cree una matriz de cinco enteros de 0 a 4 dispuestos en orden aleatorio con el
función permutation (). Este será el nuevo orden en el que establecer los valores de una fila de
el marco de datos.
Ahora aplíquelo al marco de datos en todas las líneas, usando la función take ().
https://translate.googleusercontent.com/translate_f 155/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Como puede ver, el orden de las filas ha cambiado; ahora los índices siguen lo mismo
orden como se indica en la matriz new_order.
Puede enviar incluso una parte de todo el marco de datos a una permutación. Genera
una matriz que tiene una secuencia limitada a un cierto rango, por ejemplo, en nuestro caso de 2 a
4.
Muestreo aleatorio
Acaba de ver cómo extraer una parte del marco de datos determinado sometiéndolo
a la permutación. A veces, cuando tienes un marco de datos enorme, es posible que debas muestrear
de forma aleatoria, y la forma más rápida de hacerlo es utilizando np.random.randint ()
función.
211
Página 227
Como puede ver en este muestreo aleatorio, puede obtener la misma muestra aún más
a menudo.
Manipulación de cuerdas
Python es un lenguaje popular gracias a su facilidad de uso en el procesamiento de cadenas y
texto. La mayoría de las operaciones se pueden realizar fácilmente mediante el uso de funciones integradas proporcionadas por Python.
Para casos más complejos de coincidencia y manipulación, es necesario utilizar
Expresiones
Como puede ver en el primer elemento, tiene una cadena con un carácter de espacio en el
final. Para superar este problema común, debe usar la función split () junto
con la función strip () , que recorta el espacio en blanco (incluidas las nuevas líneas).
https://translate.googleusercontent.com/translate_f 156/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
212
Página 228
Hasta ahora, ha visto cómo dividir el texto en partes, pero a menudo también necesita lo contrario,
es decir, concatenar varias cadenas entre ellas para formar un texto más extenso.
La forma más intuitiva y sencilla es concatenar las distintas partes del texto con
el operador +.
Esto puede ser útil cuando solo tiene dos o tres cadenas para concatenar. Si
tiene muchas partes para concatenar, un enfoque más práctico en este caso es usar
la función join () asignada al carácter separador, con la que desea unir el
Varias cuerdas.
>>> cadenas = ['A +', 'A', 'A -', 'B', 'BB', 'BBB', 'C +']
>>> ';'. join (cadenas)
'A +; A; A-; B; BB; BBB; C +'
Sin embargo, existen dos funciones que podrían servir para este propósito: index () y
encontrar().
213
Página 229
https://translate.googleusercontent.com/translate_f 157/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
no se encuentra la subcadena. En la misma zona, puedes saber cuántas veces un personaje
o una combinación de caracteres (subcadena) ocurre dentro del texto. La función count ()
le proporciona este número.
Expresiones regulares
Las expresiones regulares proporcionan una forma muy flexible de buscar y hacer coincidir patrones de cadenas
dentro del texto. Una sola expresión, genéricamente llamada regex , es una cadena formada según
el lenguaje de expresiones regulares. Hay un módulo de Python incorporado llamado re, que es
responsable del funcionamiento de la expresión regular.
214
Página 230
>>> importar re
• La coincidencia de patrones
• Sustitución
• División
Ahora empieza con algunos ejemplos. Por ejemplo, la expresión regular para expresar una secuencia
de uno o más espacios en blanco es \ s +. Como vio en la sección anterior, para dividir
texto en partes a través de un carácter separador, usó split (). Hay una división ()
función incluso para el módulo re que realiza las mismas operaciones, solo que puede aceptar un
patrón de expresiones regulares como criterio de separación, lo que lo hace considerablemente más flexible.
Entonces, si crea un objeto regex con la función compile (), puede aplicar split ()
directamente a él de la siguiente manera.
https://translate.googleusercontent.com/translate_f 158/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Para hacer coincidir un patrón de expresiones regulares con cualquier otra subcadena empresarial en el texto, puede utilizar
la función findall (). Devuelve una lista de todas las subcadenas del texto que cumplen con
requisitos de la expresión regular.
215
Página 231
Por ejemplo, si desea buscar en una cadena todas las palabras que comienzan con "A" en mayúscula,
o, por ejemplo, con "a" independientemente de si está en mayúscula o minúscula, debe ingresar thr
siguiendo:
Hay otras dos funciones relacionadas con la función findall (): match () y
buscar(). Mientras que findall () devuelve todas las coincidencias dentro de una lista, la función de búsqueda ()
devuelve solo la primera coincidencia. Además, el objeto devuelto por esta función es un
objeto particular:
216
Página 232
Si match () tiene una respuesta, devuelve un objeto idéntico al que viste para el
buscando función.
https://translate.googleusercontent.com/translate_f 159/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Agregación de datos
La última etapa de la manipulación de datos es la agregación de datos. La agregación de datos implica una
transformación que produce un único entero a partir de una matriz. De hecho, ya has
realizó muchas operaciones de agregación de datos, por ejemplo, cuando calculó la suma (),
mean () y count (). De hecho, estas funciones operan sobre un conjunto de datos y realizan una
cálculo con un resultado coherente que consta de un solo valor. Sin embargo, una ms formal
manera y el que tiene más control en la agregación de datos es el que incluye el
categorización de un conjunto.
La categorización de un conjunto de datos llevada a cabo para agrupar es a menudo una etapa crítica
en el proceso de análisis de datos. Es un proceso de transformación ya que, tras la división
en diferentes grupos, aplica una función que convierte o transforma los datos en algunos
manera dependiendo del grupo al que pertenezcan. Muy a menudo, las dos fases de agrupación y
La aplicación de una función se realiza en un solo paso.
También para esta parte del análisis de datos, pandas proporciona una herramienta que es muy flexible y
alto rendimiento: GroupBy.
De nuevo, como en el caso de join, aquellos familiarizados con bases de datos relacionales y SQL
el lenguaje puede encontrar similitudes. Sin embargo, lenguajes como SQL son bastante limitados
cuando se aplica a operaciones en grupos. De hecho, dada la flexibilidad de una programación
lenguaje como Python, con todas las bibliotecas disponibles, especialmente pandas, puede realizar
operaciones muy complejas en grupos.
217
Página 233
Agrupar por
Ahora analizarás en detalle el proceso de GroupBy y cómo funciona. Generalmente, es
se refiere a su mecanismo interno como un proceso llamado dividir-aplicar-combinar . En su patrón de
operación puede concebir este proceso como dividido en tres fases expresadas por tres
operaciones:
Analice las tres fases diferentes (ver Figura 6-1). En la primera fase, la de la escisión,
los datos contenidos dentro de una estructura de datos, como una serie o un marco de datos, se dividen
en varios grupos, de acuerdo con criterios dados, que a menudo está vinculado a índices o
ciertos valores en una columna. En la jerga de SQL, los valores contenidos en esta columna son
informado como claves. Además, si está trabajando con objetos bidimensionales como
un marco de datos, el criterio de agrupación se puede aplicar tanto a la línea (eje = 0) para que
columna (eje = 1).
https://translate.googleusercontent.com/translate_f 160/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
218
Página 234
Un ejemplo practico
Acaba de ver que el proceso de agregación de datos en pandas se divide en varios
fases llamadas dividir-aplicar-combinar. Con estos pandas no se expresan explícitamente
con las funciones como era de esperar, pero mediante una función groupby () que genera una
El objeto GroupBy, entonces, es el núcleo de todo el proceso.
Para comprender mejor este mecanismo, pasemos a un ejemplo práctico. Primero defina
un marco de datos que contiene valores numéricos y de cadena.
Suponga que desea calcular el promedio de la columna price1 usando etiquetas de grupo
enumerados en la columna de color. Hay varias formas de hacer esto. Por ejemplo, puede acceder
la columna precio1 y llame a la función groupby () con la columna de color.
219
Página 235
https://translate.googleusercontent.com/translate_f 161/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
el valor del color se agrupan en un solo elemento.
Para analizar en detalle cómo se dividió el marco de datos en grupos de filas, llame al
objeto GroupBy de los grupos de atributos.
>>> grupo.grupos
{'verde': Int64Index ([2, 4], dtype = 'int64'),
'rojo': Int64Index ([1, 3], dtype = 'int64'),
'blanco': Int64Index ([0], dtype = 'int64')}
Como puede ver, cada grupo se enumera y especifica explícitamente las filas del marco de datos
asignado a cada uno de ellos. Ahora basta con aplicar la operación en el grupo para
obtener los resultados para cada grupo individual.
>>> grupo.mean ()
color
verde 2.025
rojo 2.380
blanco 5.560
Nombre: price1, dtype: float64
>>> grupo.sum ()
color
verde 4.05
rojo 4.76
blanco 5.56
Nombre: price1, dtype: float64
Agrupación jerárquica
Ha visto cómo agrupar los datos según los valores de una columna como opción clave.
Lo mismo se puede extender a múltiples columnas, es decir, hacer una agrupación de múltiples
claves jerárquicas.
220
Página 236
>>> ggroup.sum ()
objeto de color
bolígrafo verde 2,75
lápiz 1,30
cenicero rojo 0.56
lápiz 4.20
bolígrafo blanco 5.56
Nombre: price1, dtype: float64
Hasta ahora ha aplicado la agrupación a una sola columna de datos, pero en realidad puede
extenderse a varias columnas oa todo el marco de datos. También si no es necesario
reutilizar el objeto GroupBy varias veces, es conveniente combinar en una sola pasada todos
de la agrupación y cálculo a realizar, sin definir ninguna variable intermedia.
https://translate.googleusercontent.com/translate_f 162/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
verde 2.025 2.375
rojo 2.380 2.435
blanco 5.560 4.750
>>> frame.groupby (frame ['color']). mean ()
precio1 precio2
color
verde 2.025 2.375
rojo 2.380 2.435
blanco 5.560 4.750
221
Página 237
Iteración de grupo
El objeto GroupBy admite la operación de una iteración para generar una secuencia de dos
tuplas que contienen el nombre del grupo junto con la parte de datos.
En el ejemplo que acaba de ver, solo aplicó la variable de impresión como ilustración. En
De hecho, reemplaza la operación de impresión de una variable con la función que se le aplicará.
Cadena de transformaciones
A partir de estos ejemplos, ha visto que para cada agrupación, cuando se somete a
cálculo de funciones u otras operaciones en general, independientemente de cómo se haya obtenido y
los criterios de selección, el resultado será una serie de estructura de datos (si seleccionamos una sola columna
data) o un marco de datos, que luego conserva el sistema de índice y el nombre de las columnas.
222
Página 238
https://translate.googleusercontent.com/translate_f 163/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Por tanto, es posible seleccionar una sola columna en cualquier punto de las distintas fases.
de este proceso. Aquí hay tres casos en los que la selección de una sola columna en tres
se aplica a diferentes etapas del proceso. Este ejemplo ilustra la gran flexibilidad de este
sistema de agrupación proporcionado por pandas.
Además, después de una operación de agregación, los nombres de algunas columnas pueden
no ser muy significativo. De hecho, a menudo es útil agregar un prefijo al nombre de la columna.
que describe el tipo de combinación de negocios. Agregar un prefijo, en lugar de completamente
reemplazar el nombre, es muy útil para realizar un seguimiento de los datos de origen de los que
derivar valores agregados. Esto es importante si aplicas un proceso de cadena de transformación
(una serie o marco de datos se genera entre sí) en el que es importante mantener
alguna referencia con los datos de origen.
223
Página 239
color
verde 2.025 2.375
rojo 2.380 2.435
blanco 5.560 4.750
Funciones en grupos
Aunque muchos métodos no se han implementado específicamente para su uso con GroupBy,
en realidad, funcionan correctamente con estructuras de datos como serie. Que viste en la anterior
sección lo fácil que es obtener la serie por un objeto GroupBy, especificando el nombre del
columna y luego aplicando el método para realizar el cálculo. Por ejemplo, puedes
utilice el cálculo de cuantiles con la función cuantiles ().
https://translate.googleusercontent.com/translate_f 164/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Nombre: price1, dtype: float64
También puede definir sus propias funciones de agregación. Definir la función por separado
y luego pasa como argumento a la función mark (). Por ejemplo, podrías
calcular el rango de los valores de cada grupo.
224
Página 240
También puede usar más funciones agregadas al mismo tiempo, con la marca ()
función pasando una matriz que contiene la lista de operaciones a realizar, que se convertirá en
las nuevas columnas.
225
https://translate.googleusercontent.com/translate_f 165/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 241
Gracias a merge (), se pueden agregar los resultados de la agregación en cada línea del
marco de datos para comenzar. Pero hay otra forma de hacer este tipo de operación. Eso es por
usando transform (). Esta función realiza la agregación como ha visto antes, pero en
al mismo tiempo, muestra los valores calculados en función del valor clave en cada línea del
marco de datos para comenzar.
Como puede ver, el método transform () es una función más especializada que tiene muy
requisitos específicos: la función pasada como argumento debe producir un solo escalar
valor (agregación) que se transmitirá.
El método para cubrir GroupBy más general es aplicable a apply (). Este método
aplica en su totalidad el esquema dividir-aplicar-combinar. De hecho, esta función divide el
objeto en partes para ser manipulado, invoca el paso de funciones en cada
pieza, y luego trata de encadenar las distintas partes.
226
Página 242
>>> frame = pd.DataFrame ({'color': ['blanco', 'negro', 'blanco', 'blanco', 'negro', 'negro'],
... 'status': ['arriba', 'arriba', 'abajo', 'abajo', 'abajo', 'arriba'],
... 'valor1': [12.33,14.55,22.34,27.84,23.40,18.33],
... 'valor2': [11.23,31.80,29.99,31.18,18.25,22.44]})
>>> marco
color estado valor1 valor2
0 blanco hasta 12,33 11,23
1 negro hasta 14,55 31,80
2 plumón blanco 22,34 29,99
3 blanco abajo 27,84 31,18
4 plumón negro 23,40 18,25
https://translate.googleusercontent.com/translate_f 166/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
hasta negro hasta 18,33 31,80
blanco abajo blanco abajo 27,84 31,18
hasta blanco hasta 12,33 11,23
5 negro hasta 18,33 22,44
227
Página 243
Luego, agrega al marco de datos que precede a una columna que representa un conjunto de valores de texto
que utilizará como valores clave.
>>> horario ['gato'] = ['arriba', 'abajo', 'izquierda', 'izquierda', 'arriba', 'arriba', 'abajo', 'derecha',
'hasta']
https://translate.googleusercontent.com/translate_f 167/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
228
Página 244
>>> horario
fecha valor1 valor2 gato
0 2015-01-01 00:00:00 0.545737 0.772712 hasta
1 2015-01-01 01:00:00 0.236035 0.082847 abajo
2 2015-01-01 02:00:00 0.248293 0.938431 izquierda
3 2015-01-01 03:00:00 0.888109 0.605302 izquierda
4 2015-01-01 04:00:00 0,632222 0,080418 hasta
5 2015-01-01 05:00:00 0.249867 0.235366 arriba
6 2015-01-01 06:00:00 0.993940 0.125965 abajo
7 2015-01-01 07:00:00 0.154491 0.641867 derecha
8 2015-01-01 08:00:00 0.856238 0.521911 derecha
9 2015-01-01 09:00:00 0.307773 0.332822 arriba
Sin embargo, el ejemplo que se muestra aquí tiene valores clave duplicados.
Conclusiones
En este capítulo, vio las tres partes básicas que dividen la manipulación de datos:
preparación, procesamiento y agregación de datos. Gracias a una serie de ejemplos,
aprendí sobre un conjunto de funciones de biblioteca que permiten a los pandas realizar estas operaciones.
Viste cómo aplicar estas funciones en estructuras de datos simples para que puedas
familiarizarse con su funcionamiento y comprender su aplicabilidad a más
casos complejos.
Eventualmente, ahora tiene el conocimiento que necesita para preparar un conjunto de datos para el próximo
fase de análisis de datos: visualización de datos.
En el siguiente capítulo, se le presentará la biblioteca de Python matplotlib, que
puede convertir estructuras de datos en cualquier gráfico.
229
Página 245
CAPÍTULO 7
Visualización de datos
con matplotlib
Después de discutir en los capítulos anteriores las bibliotecas de Python que eran responsables de los datos
https://translate.googleusercontent.com/translate_f 168/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
procesamiento, ahora es el momento de que vea una biblioteca que se encarga de la visualización. Esta
la biblioteca es matplotlib.
La visualización de datos a menudo se subestima en el análisis de datos, pero en realidad es un
factor muy importante porque la representación de datos incorrecta o ineficaz puede arruinar un
por lo demás excelente análisis. En este capítulo, descubrirá los diversos aspectos de la
biblioteca matplotlib, incluyendo cómo está estructurada y cómo maximizar el potencial que
Ofrece.
La biblioteca matplotlib
matplotlib es una biblioteca de Python especializada en el desarrollo de bidimensionales
gráficos (incluidos gráficos 3D). En los últimos años, se ha generalizado en el ámbito científico y
círculos de ingenieríahttp://matplolib.org ).
Entre todas las características que la han convertido en la herramienta más utilizada en la gráfica
representación de datos, hay algunos que se destacan:
231
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_7
Página 246
matplotlib está diseñado para reproducir tanto como sea posible un entorno similar a
MATLAB en términos de vista gráfica y forma sintáctica. Este enfoque ha demostrado
exitoso, ya que ha sido capaz de explotar la experiencia del software (MATLAB) que ha
estado en el mercado durante varios años y ahora está muy extendido en todos los
círculos científicos. Matplotlib no solo se basa en un esquema conocido y bastante familiar
para la mayoría de los expertos en el campo, pero también aprovecha las optimizaciones que durante
años han llevado a una deducibilidad y simplicidad en su uso, lo que hace que esta biblioteca también
una excelente opción para quienes se acercan a la visualización de datos por primera vez, especialmente
aquellos sin experiencia con aplicaciones como MATLAB o similares.
Además de la simplicidad y la deducibilidad, la biblioteca matplotlib heredó
interactividad de MATLAB también. Es decir, el analista puede insertar un comando después
comando para controlar el desarrollo gradual de una representación gráfica de datos.
Este modo se adapta bien a los enfoques más interactivos de Python como IPython
QtConsole e IPython Notebook (consulte el Capítulo 2 ), proporcionando así un entorno
para el análisis de datos que tiene poco que envidiar a otras herramientas como Mathematica, IDL o
MATLAB.
La genialidad de quienes desarrollaron esta hermosa biblioteca fue utilizar e incorporar
las cosas buenas actualmente disponibles y en uso en la ciencia. Esto no es solo limitado, ya que
hemos visto, al modo de funcionamiento de MATLAB y similares, pero también a modelos de textual
formato de expresiones científicas y símbolos representados por LaTeX. Debido a su
gran capacidad de visualización y presentación de expresiones científicas, LaTeX ha sido un
elemento insustituible en cualquier publicación o documentación científica, donde la necesidad de
Representar visualmente expresiones como integrales, sumas y derivadas es obligatorio.
Por lo tanto, matplotlib integra este notable instrumento para mejorar la
capacidad representativa de cartas.
Además, no debes olvidar que matplotlib no es una aplicación separada sino
una biblioteca de un lenguaje de programación como Python. Así que también aprovecha al máximo las
potencial que ofrecen los lenguajes de programación. matplotlib parece una biblioteca de gráficos
que le permite administrar mediante programación los elementos gráficos que componen un gráfico
para que la pantalla gráfica se pueda controlar en su totalidad. La capacidad de programar
la representación gráfica permite gestionar la reproducibilidad de los datos
representación en múltiples entornos y especialmente cuando realiza cambios o
https://translate.googleusercontent.com/translate_f 169/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
cuando se actualizan los datos.
232
Página 247
Instalación
Hay muchas opciones para instalar la biblioteca matplotlib. Si elige utilizar un
distribución de paquetes como Anaconda o Enthought Canopy, instalando el matplotlib
el paquete es muy simple. Por ejemplo, con el administrador de paquetes conda, debe ingresar
el seguimiento:
Si desea instalar directamente este paquete, los comandos para insertar varían según
en el sistema operativo.
En los sistemas Linux Debian-Ubuntu, use esto:
233
Página 248
ipython
Python 3.6.3 (predeterminado, 15 de octubre de 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)]
Escriba "derechos de autor", "créditos" o "licencia" para obtener más información.
En 1]:
https://translate.googleusercontent.com/translate_f 170/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Mientras que si desea ejecutar Jupyter QtConsole con la capacidad de mostrar gráficos
dentro de los comandos de línea de la sesión, usa:
jupyter qtconsole
Una ventana con una nueva sesión de IPython abierta aparecerá inmediatamente en la pantalla,
como se muestra en la Figura 7-1.
234
Página 249
Sin embargo, si desea continuar usando una sesión estándar de Python, puede hacerlo
entonces. Si no le gusta trabajar con IPython y desea continuar usando Python desde el
terminal, todos los ejemplos de este capítulo seguirán siendo válidos.
La arquitectura matplotlib
Una de las tareas clave que debe asumir matplotlib es proporcionar un conjunto de funciones y herramientas
que permiten la representación y manipulación de una Figura (el objeto principal), junto con
todos los objetos internos que lo componen. Sin embargo, matplotlib no solo se ocupa de
gráficos, pero también proporciona todas las herramientas para el manejo de eventos y la capacidad de animar
gráficos. Entonces, gracias a estas características adicionales, matplotlib demuestra ser capaz de
Producir gráficos interactivos basados en los eventos desencadenados al presionar una tecla en el
teclado o en el movimiento del mouse.
La arquitectura de matplotlib está estructurada lógicamente en tres capas, que son
colocados en tres niveles diferentes (ver Figura 7-2). La comunicación es unidireccional,
es decir, cada capa puede comunicarse con la capa subyacente, mientras que las capas inferiores
no se puede comunicar con los de arriba.
https://translate.googleusercontent.com/translate_f 171/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
• Scripting
• Artista
• Backend
235
Página 250
Capa de backend
En el diagrama de la arquitectura matplotlib, la capa que funciona en el nivel más bajo es
la capa Backend . Esta capa contiene las API de matplotlib, un conjunto de clases que juegan
papel de la implementación de los elementos gráficos a bajo nivel.
Capa de artista
Como capa intermedia, tenemos una capa llamada Artista . Todos los elementos que componen un
gráfico, como el título, las etiquetas de los ejes, los marcadores, etc., son instancias del objeto Artista. Cada uno de
Estas instancias desempeñan su papel dentro de una estructura jerárquica (como se muestra en la Figura 7-3).
Figura 7-3. Cada elemento de un gráfico corresponde a una instancia de Artista estructurada
en una jerarquía
236
Página 251
https://translate.googleusercontent.com/translate_f 172/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Line2D, o como una figura geométrica como un rectángulo o un círculo, o incluso
fragmentos de texto.
Por lo general, al trabajar en este nivel, tendrá que lidiar con frecuencia con objetos en niveles más altos.
jerarquía como figura, ejes y eje. Por lo tanto, es importante comprender completamente qué
Los objetos son y qué papel juegan dentro de la representación gráfica. Figura 7-4
muestra los tres objetos de artista principales (artistas compuestos) que se utilizan generalmente en todos
implementaciones realizadas a este nivel.
Figura 7-4. Los tres objetos de artista principales en la jerarquía de la capa Artista
237
Página 252
• Ejes es generalmente lo que usted quiere decir como diagrama o gráfico. Cada objeto Axis
pertenece a una sola figura, y se caracteriza por dos ejes de artista
(tres en el caso tridimensional). Otros objetos, como el título,
la etiqueta xy la etiqueta y pertenecen a este artista compuesto.
pylab y pyplot
En general se habla de pylab y pyplot . Pero, ¿cuál es la diferencia entre estos
dos paquetes? Pylab es un módulo que se instala junto con matplotlib, mientras que pyplot
es un módulo interno de matplotlib. A menudo encontrará referencias a uno u otro
Acercarse.
https://translate.googleusercontent.com/translate_f 173/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
238
Página 253
trama (x, y)
matriz ([1,2,3,4])
En vez de
plt.plot ()
np.array ([1,2,3,4]
pyplot
El módulo pyplot es una colección de funciones de estilo de comando que le permiten usar
matplotlib muy parecido a MATLAB. Cada función de pyplot funcionará o realizará algunos cambios
al objeto Figura, por ejemplo, la creación de la Figura misma, la creación de un
área de trazado, representación de una línea, decoración de la parcela con una etiqueta, etc.
Pyplot también tiene estado , ya que rastrea el estado de la figura actual y su trazado
zona. Las funciones llamadas actúan sobre la figura actual.
239
Página 254
https://translate.googleusercontent.com/translate_f 174/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Por lo tanto, simplemente puede pasar los valores que desea representar como una secuencia de
enteros.
Como puede ver, se ha generado un objeto Line2D. El objeto es una línea que
representa la tendencia lineal de los puntos incluidos en el gráfico.
Ahora está todo listo. Solo tienes que dar el comando para mostrar la trama usando show ()
función.
En [3]: plt.show ()
El resultado será el que se muestra en la Figura 7-5. Parece solo una ventana, llamada
ventana de trazado, con una barra de herramientas y la trama representada dentro de ella, al igual que con MATLAB.
240
Página 255
La ventana de trazado
La ventana de trazado se caracteriza por una barra de herramientas en la parte superior en la que hay una serie de
botones.
• Se acerca al rectángulo
• Configura subtramas
https://translate.googleusercontent.com/translate_f 175/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
siguiente serie de comandos:
>>> importar matplotlib.pyplot como plt
>>> plt.plot ([1,2,3,4])
[<matplotlib.lines.Line2D en 0x0000000007DABFD0>]
>>> plt.show ()
Si está utilizando IPython QtConsole, es posible que haya notado que después de llamar al
función plot () el gráfico se muestra directamente sin invocar explícitamente la función show ()
función (consulte la Figura 7-6 ).
241
Página 256
Si pasa solo una lista de números o una matriz a la función plt.plot (), matplotlib
asume que es la secuencia de valores y del gráfico, y los asocia al valor natural
secuencia de valores x: 0,1,2,3, ....
Generalmente, un gráfico representa pares de valores (x, y), por lo que si desea definir un gráfico
correctamente, debe definir dos matrices, la primera que contiene los valores en el eje xy
el segundo contiene los valores en el eje y. Además, la función plot () puede
Acepte un tercer argumento, que describe los detalles de cómo desea que sea el punto.
representado en el gráfico.
242
https://translate.googleusercontent.com/translate_f 176/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 257
• El tamaño de los ejes coincide perfectamente con el rango de los datos de entrada
• No hay leyenda
Por lo tanto, debe cambiar esta representación para tener una trama real en la que cada
par de valores (x, y) está representado por un punto rojo (ver Figura 7-7).
Si está trabajando en IPython, cierre la ventana para volver al indicador activo de
ingresando nuevos comandos. Luego debe volver a llamar a la función show () para observar el
cambios realizados en la trama.
En [5]: plt.show ()
En cambio, si está trabajando en Jupyter QtConsole, verá un gráfico diferente para cada nuevo
comando que ingresa.
243
Página 258
https://translate.googleusercontent.com/translate_f 177/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-7. Los pares de valores (x, y) se representan en la gráfica mediante círculos rojos
Nota En este punto del libro, ya tiene una idea muy clara sobre el
diferencia entre los distintos entornos. Para evitar confusiones desde este punto,
Consideraré IPython QtConsole como el único entorno de desarrollo.
244
Página 259
Puede definir el rango tanto en el eje x como en el eje y definiendo los detalles
de una lista [ xmin, xmax, ymin, ymax ] y luego pasarla como argumento al eje ()
función.
Tenga en cuenta que en ipython QtConsole, para generar un gráfico a veces es necesario
ingrese más filas de comandos. para evitar generar un gráfico cada vez que presione
ingrese (comience una nueva línea) junto con la pérdida de la configuración especificada anteriormente, debe
presione Ctrl + enter. cuando desee generar finalmente el gráfico, simplemente presione enter dos veces.
Puede establecer varias propiedades, una de las cuales es el título que se puede ingresar usando el
función title ().
En figura 7-8 puede ver cómo la nueva configuración hizo que la trama fuera más legible. En
De hecho, los puntos finales del conjunto de datos ahora se representan dentro de la gráfica en lugar de en el
bordes. Además, el título de la trama ahora es visible en la parte superior.
https://translate.googleusercontent.com/translate_f 178/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
245
Página 260
matplotlib y NumPy
Incluso la biblioteca matplot, a pesar de ser una biblioteca completamente gráfica, tiene su base como
la biblioteca NumPy. De hecho, ha visto hasta ahora cómo pasar listas como argumentos, tanto para
representar los datos y establecer los extremos de los ejes. En realidad, estas listas han sido
convertido internamente en matrices NumPy.
Por lo tanto, puede ingresar directamente matrices NumPy como datos de entrada. Esta matriz de datos,
que han sido procesados por pandas, se pueden usar directamente con matplotlib sin
su posterior procesamiento.
Como ejemplo, ve cómo es posible trazar tres tendencias diferentes en el mismo
trama (vea la Figura 7-9 ). Puede elegir para este ejemplo la función sin () perteneciente a
el módulo de matemáticas. Entonces necesitarás importarlo. Para generar puntos siguiendo una sinusoidal
tendencia, utilizará la biblioteca NumPy. Genere una serie de puntos en el eje x usando el
función arange (), mientras que para los valores en el eje y usará la función map () para
aplique la función sin () en todos los elementos de la matriz (sin usar un bucle for).
246
Página 261
https://translate.googleusercontent.com/translate_f 179/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-9. Tres tendencias sinusoidales desfasadas por π / 4 representadas por marcadores
Tenga en cuenta si no está utilizando el conjunto ipython QtConsole con matplotlib en línea o si
están implementando este código en una sesión simple de Python, inserte el plt.show ()
comando al final del código para obtener el gráfico que se muestra en la Figura 7-10 .
Como puede ver en la Figura 7-9, la trama representa las tres tendencias temporales diferentes
con tres colores y marcadores diferentes. En estos casos, cuando la tendencia de una función es
tan obvio, la trama tal vez no sea la representación más apropiada, pero es mejor
para usar las líneas (vea la Figura 7-10 ). Diferenciar las tres tendencias con algo diferente
que el color, puede utilizar el patrón compuesto por diferentes combinaciones de puntos y
guiones (- y.).
En [9]: plt.plot (t, y1, 'b -', t, y2, 'g', t, y3, 'r-.')
Fuera [9]:
[<matplotlib.lines.Line2D en 0xd1eb550>,
<matplotlib.lines.Line2D en 0xd1eb780>,
<matplotlib.lines.Line2D en 0xd1ebd68>]
Tenga en cuenta si no está utilizando el conjunto ipython QtConsole con matplotlib en línea o si
están implementando este código en una sesión simple de Python, inserte el plt.show ()
comando al final del código para obtener el gráfico que se muestra en la Figura 7-10 .
247
Página 262
Figura 7-10. Este gráfico representa los tres patrones sinusoidales con líneas de colores.
https://translate.googleusercontent.com/translate_f 180/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
248
Página 263
Figura 7-11. El grosor de una línea se puede configurar directamente desde la función plot ()
249
Página 264
https://translate.googleusercontent.com/translate_f 181/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
250
Página 265
Agregar texto
Ya ha visto cómo puede agregar el título a un gráfico con la función title (). Dos
otras indicaciones textuales puede agregar las etiquetas de los ejes. Esto es posible mediante el uso de
otras dos funciones específicas, llamadas xlabel () y ylabel (). Estas funciones toman como
https://translate.googleusercontent.com/translate_f 182/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
argumento una cadena, que será el texto mostrado.
Nota Las líneas de comando que forman el código para representar su gráfico están creciendo en
número. No es necesario que vuelva a escribir todos los comandos cada vez, pero utilice el
teclas de flecha en el teclado, puede abrir la lista de comandos previamente
pasados y edítelos agregando nuevas filas (en el texto se indican en negrita).
251
Página 266
Ahora agregue dos etiquetas de eje al gráfico. Describirán qué tipo de valor es
asignado a cada eje (como se muestra en la Figura 7-14).
Gracias a las palabras clave, puedes cambiar las características del texto. Por ejemplo,
puede modificar el título cambiando la fuente y aumentando el tamaño de los caracteres.
También puede modificar el color de las etiquetas de los ejes para acentuar el título del gráfico.
(como se muestra en la Figura 7-15).
252
Página 267
https://translate.googleusercontent.com/translate_f 183/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Pero matplotlib no se limita a esto: pyplot le permite agregar texto a cualquier posición
dentro de un gráfico. Esta característica es realizada por una función específica llamada text ().
Los dos primeros argumentos son las coordenadas de la ubicación donde desea colocar
el texto. s es la cadena de texto que se agregará y fontdict (opcional) es la fuente que
quiere usar. Finalmente, puede agregar las palabras clave.
Agrega la etiqueta a cada punto de la trama. Porque los dos primeros argumentos del texto ()
función son las coordenadas del gráfico, tienes que usar las coordenadas de los cuatro
los puntos del gráfico se desplazaron ligeramente en el eje y.
253
Página 268
Como puede ver en la Figura 7-16, ahora cada punto de la trama tiene una etiqueta.
Dado que matplotlib es una biblioteca de gráficos diseñada para ser utilizada en círculos científicos,
debe ser capaz de explotar todo el potencial del lenguaje científico, incluidas las matemáticas
Expresiones matplotlib ofrece la posibilidad de integrar expresiones LaTeX, por lo tanto
permitiéndole insertar expresiones matemáticas dentro del gráfico.
Para hacer esto, puede agregar una expresión LaTeX al texto, encerrándola entre dos $
caracteres. El intérprete las reconocerá como expresiones LaTeX y las convertirá
al gráfico correspondiente, que puede ser una expresión matemática, una fórmula,
https://translate.googleusercontent.com/translate_f 184/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
caracteres matemáticos, o simplemente letras griegas. Generalmente tienes que preceder a la cadena
que contiene expresiones LaTeX con una r, que indica texto sin formato, para evitar
secuencias de escape no deseadas.
Aquí, también puede utilizar las palabras clave para enriquecer aún más el texto que se mostrará en el
trama. Por lo tanto, como ejemplo, puede agregar la fórmula que describe la tendencia seguida de
el punto del gráfico y enciérrelo en un cuadro delimitador de color (consulte la Figura 7-17).
254
Página 269
Para obtener una visión completa del potencial que ofrece LaTeX, consulte el Apéndice A de
este libro.
255
Página 270
https://translate.googleusercontent.com/translate_f 185/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-18. Una cuadrícula facilita la lectura de los valores de los puntos de datos
representado en un gráfico
256
Página 271
https://translate.googleusercontent.com/translate_f 186/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-19. Se agrega una leyenda en la esquina superior derecha de forma predeterminada
257
Página 272
Como puede ver en la Figura 7-19, la leyenda se agrega en la esquina superior derecha por
defecto. Nuevamente, si desea cambiar este comportamiento, deberá agregar algunos kwargs. por
ejemplo, la posición ocupada por la leyenda se establece asignando números del 0 al 10 para
el loc kwarg. Cada uno de estos números caracteriza una de las esquinas del gráfico.
(ver Tabla 7-1). El valor predeterminado es 1, es decir, la esquina superior derecha. En el proximo
Por ejemplo, moverá la leyenda en la esquina superior izquierda para que no se superponga con la
puntos representados en la trama.
0 mejor
1 superior derecha
2 arriba a la izquierda
3 inferior derecha
4 abajo a la izquierda
5 Derecha
6 centro-izquierda
7 centro-derecha
8 centro inferior
9 centro superior
10 centrar
Antes de que comience a modificar el código para mover la leyenda, quiero agregar un pequeño aviso.
Generalmente, las leyendas se utilizan para indicar la definición de una serie al lector a través de
una etiqueta asociada a un color y / o un marcador que lo distingue en la trama. Hasta aquí
en los ejemplos, ha utilizado una sola serie que se expresó mediante un solo gráfico ()
función. Ahora, debe centrarse en un caso más general en el que la misma trama muestra
más series simultáneamente. Cada serie del gráfico se caracterizará por una
color y un marcador específico (ver Figura 7-20). En términos de código, en cambio, cada serie será
caracterizado por una llamada a la función plot () y el orden en el que se definen será
corresponden al orden de las etiquetas de texto pasadas como argumento a la función legend ().
258
https://translate.googleusercontent.com/translate_f 187/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 273
259
Página 274
Guardar el código
Como puede ver en los ejemplos de las secciones anteriores, el código relativo al
La representación de un solo gráfico está creciendo en un buen número de filas. Una vez que piensas
ha llegado a un buen punto en su proceso de desarrollo, puede optar por guardar todos
filas de código en un archivo .py que puede recuperar en cualquier momento.
Puede usar el comando mágico save% seguido del nombre del archivo que desea
guardar seguido del número de solicitudes de entrada que contienen la fila de código que desea
https://translate.googleusercontent.com/translate_f 188/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
ahorrar. Si todo el código está escrito en un solo mensaje, como su caso, debe agregar solo
su número; de lo contrario, si desea guardar el código escrito en muchas solicitudes, por ejemplo
del 10 al 20, hay que indicar este rango con los dos números separados por un -, que
es, 10-20.
En su caso, guardaría el código Python subyacente a la representación de su
primer gráfico contenido en el indicador de entrada con el número 171.
Debe insertar el siguiente comando para guardar el código en un nuevo archivo .py.
260
Página 275
# codificación: utf-8
importar matplotlib.pyplot como plt
eje plt. ([0,5,0,20])
plt.title ('Mi primera trama', tamaño de fuente = 20, nombre de fuente = 'Times New Roman')
plt.xlabel ('Contando', color = 'gris')
plt.ylabel ('Valores cuadrados', color = 'gris')
plt.text (1,1.5, 'Primero')
plt.text (2,4.5, 'Segundo')
plt.text (3,9.5, 'Tercero')
plt.text (4,16.5, 'Cuarto')
plt.text (1.1,12, '$ y = x ^ 2 $', tamaño de fuente = 20, bbox = {'facecolor': 'amarillo',
'alfa': 0.2})
plt.grid (verdadero)
plt.plot ([1,2,3,4], [1,4,9,16], 'ro')
plt.plot ([1,2,3,4], [0.8,3.5,8,15], 'g ^')
plt.plot ([1,2,3,4], [0.5,2.5,4,12], 'b *')
plt.legend (['Primera serie', 'Segunda serie', 'Tercera serie'], loc = 2)
Más tarde, cuando abra una nueva sesión de IPython, tendrá su gráfico y comenzará a
cambie el código en el punto donde lo había guardado ingresando el siguiente comando:
% load my_first_chart.py
% ejecutar my_first_chart.py
Nota en mi sistema, este comando funciona solo después de iniciar los dos anteriores
comandos.
261
https://translate.googleusercontent.com/translate_f 189/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 276
Figura 7-21. Puede guardar su sesión actual como una página web
262
Página 277
En este ejemplo, guarde su sesión como un archivo HTML y asígnele el nombre my_session.html, como
se muestra en la Figura 7-22.
https://translate.googleusercontent.com/translate_f 190/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-23. Puede elegir entre crear archivos de imagen externos e incrustar
el formato PNG directamente en la página HTML
263
Página 278
https://translate.googleusercontent.com/translate_f 191/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
264
Página 279
Tomemos, por ejemplo, la visualización de un gráfico lineal con un conjunto de datos de ocho puntos en el que
tiene que representar los valores de fecha en el eje x con el siguiente formato: día-mes-año.
Figura 7-24. Si no se maneja, mostrar los valores de fecha y hora puede ser problemático
265
Página 280
Por tanto, para gestionar las fechas es aconsejable definir una escala de tiempo con
objetos. Primero necesita importar matplotlib.dates, un módulo especializado para este tipo
de datos. Luego define las escalas de los tiempos, como en este caso, una escala de días y una de
los meses, a través de las funciones MonthLocator () y DayLocator (). En estos casos,
el formato también es muy importante, y para evitar superposiciones o referencias innecesarias,
hay que limitar las etiquetas de tick a lo esencial, que en este caso es año-mes. Esta
El formato se puede pasar como argumento a la función DateFormatter ().
Después de definir las dos escalas, una para los días y otra para los meses, puede
establecer dos tipos diferentes de ticks en el eje x, usando set_major_locator () y set_
https://translate.googleusercontent.com/translate_f 192/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
minor_locator () funciona en el objeto xaxis. En su lugar, para establecer el formato de texto de la marca
etiquetas referidas a los meses en los que tienes que usar la función set_major_formatter ().
Al cambiar todas estas configuraciones, finalmente obtiene el gráfico como se muestra en la Figura 7-25.
266
Página 281
Figura 7-25. Ahora, las etiquetas de marca del eje x se refieren solo a los meses, lo que hace que
trama más legible
Tipología de gráficos
En las secciones anteriores vio una serie de ejemplos relacionados con la arquitectura del
biblioteca matplotlib. Ahora que está familiarizado con el uso de los principales elementos gráficos
en un gráfico, es hora de ver una serie de ejemplos que tratan diferentes tipos de gráficos, comenzando
desde los más comunes, como gráficos lineales, gráficos de barras y gráficos circulares, hasta un
discusión sobre algunos que son más sofisticados pero de uso común, no obstante.
Esta parte del capítulo es muy importante ya que el propósito de esta biblioteca es la
visualización de los resultados producidos por el análisis de datos. Así, saber elegir el
el tipo de gráfico adecuado es una elección fundamental. Recuerde que un excelente análisis de datos
representado incorrectamente puede conducir a una interpretación incorrecta de los resultados experimentales.
Gráficos de líneas
https://translate.googleusercontent.com/translate_f 193/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Entre todos los tipos de gráficos, el gráfico lineal es el más simple. Un gráfico de líneas es una secuencia de
puntos de datos conectados por una línea. Cada punto de datos consta de un par de valores (x, y), que
se informará en el gráfico según la escala de valores de los dos ejes (xey).
267
Página 282
A modo de ejemplo, puede comenzar a graficar los puntos generados por una
función. Entonces, puede considerar una función matemática genérica como esta:
y = sin (3 * x) / x
Por lo tanto, si desea crear una secuencia de puntos de datos, debe crear dos
Matrices NumPy. Primero crea una matriz que contiene los valores x que se referirán a la
eje x. Para definir una secuencia de valores crecientes, utilizará np.arange ()
función. Dado que la función es sinusoidal, debe referirse a valores que son múltiplos
y submúltiplos del griego pi ( np.pi ). Luego, usando esta secuencia de valores, puede
obtener los valores de y aplicando la función np.sin () directamente a estos valores (gracias a
¡NumPy!).
Después de todo esto, solo tiene que trazarlos llamando a la función plot (). Vas a
obtener un gráfico de líneas, como se muestra en la Figura 7-26.
268
Página 283
Ahora puede ampliar el caso en el que desee mostrar una familia de funciones, como
como este:
y = sin (n * x) / x
variando el parámetro n.
https://translate.googleusercontent.com/translate_f 194/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Como puede ver en la Figura 7-27, se asigna automáticamente un color diferente a cada línea.
Todas las parcelas están representadas en la misma escala; es decir, los puntos de datos de cada serie se refieren
al mismo eje xy eje y. Esto se debe a que cada llamada de la función plot () toma en
cuenta las llamadas anteriores a la misma función, por lo que la Figura aplica los cambios manteniendo
memoria de los comandos anteriores hasta que no se muestre la Figura (usando show () con
Python y Enter con IPython QtConsole).
Figura 7-27. Se dibujan tres series diferentes con diferentes colores en el mismo gráfico
269
Página 284
Como vio en las secciones anteriores, independientemente de la configuración predeterminada, puede seleccionar
el tipo de trazo, color, etc. Como tercer argumento de la función plot () puedes
especificar algunos códigos que corresponden al color (ver Tabla 7-2 ) y otros códigos que
corresponden a estilos de línea, todos incluidos en la misma cadena. Otra posibilidad es utilizar
dos kwargs por separado, color para definir el color y estilo de línea para definir el trazo
(ver figura 7-28 ).
https://translate.googleusercontent.com/translate_f 195/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-28. Puede definir colores y estilos de línea utilizando códigos de caracteres
270
Página 285
si azul
gramo verde
r rojo
C cian
metro magenta
y amarillo
k negro
w blanco
Acaba de definir un rango de -2π a 2π en el eje x, pero de forma predeterminada, los valores en
las garrapatas se muestran en forma numérica. Por lo tanto, debe reemplazar los valores numéricos
con múltiplo de π. También puede reemplazar las marcas en el eje y. Para hacer todo esto, tienes que
utilice las funciones xticks () y yticks (), pasando a cada una de ellas dos listas de valores. los
La primera lista contiene valores correspondientes a las posiciones donde se colocarán los ticks,
y el segundo contiene las etiquetas de marca. En este caso particular, tienes que usar cadenas
que contiene formato LaTeX para mostrar correctamente el símbolo π. Recuerda definir
ellos dentro de dos caracteres $ y agregar ar como prefijo.
271
Página 286
https://translate.googleusercontent.com/translate_f 196/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
[r '$ - 1 $', r '$ 0 $', r '$ + 1 $', r '$ + 2 $', r '$ + 3 $'])
Fuera [423]:
([<matplotlib.axis.YTick en 0x26877ac8>,
<matplotlib.axis.YTick en 0x271d26d8>,
<matplotlib.axis.YTick en 0x273c7f98>,
<matplotlib.axis.YTick en 0x273cc470>,
<matplotlib.axis.YTick en 0x273cc9e8>],
<a lista de 5 objetos Text yticklabel>)
Al final, obtendrá un gráfico de líneas limpio y agradable que muestra caracteres griegos, como
en la Figura 7-29 .
Figura 7-29. La etiqueta de marca se puede mejorar agregando texto con formato LaTeX
En todos los gráficos lineales que ha visto hasta ahora, siempre tiene el eje xy el eje y
colocado en el borde de la figura (correspondiente a los lados del cuadro de borde delimitador).
Otra forma de mostrar los ejes es hacer que los dos ejes pasen por el origen (0, 0),
es decir, los dos ejes cartesianos.
272
Página 287
Para hacer esto, primero debe capturar el objeto Axes a través de la función gca (). Luego
a través de este objeto, puede seleccionar cada uno de los cuatro lados que componen el cuadro delimitador,
especificando para cada uno su posición: derecha, izquierda, abajo y arriba. Recorta los lados que no
coincidir con cualquier eje (derecho e inferior) usando la función set_color () e indicando ninguno
por el color. Luego, los lados correspondientes a los ejes xey se mueven para pasar
el origen (0,0) con la función set_position ().
https://translate.googleusercontent.com/translate_f 197/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: ax.spines ['top']. set_color ('ninguno')
...: ax.xaxis.set_ticks_position ('abajo')
...: ax.spines ['bottom']. set_position (('datos', 0))
...: ax.yaxis.set_ticks_position ('izquierda')
...: ax.spines ['left']. set_position (('data', 0))
Ahora el gráfico mostrará los dos ejes que se cruzan en el medio de la figura, es decir, el
origen de los ejes cartesianos, como se muestra en la Figura 7-30 .
273
Página 288
274
Página 289
https://translate.googleusercontent.com/translate_f 198/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Al ejecutar este código, obtendrá el gráfico con la notación matemática del límite,
que es el punto que muestra la flecha en la Figura 7-31.
275
Página 290
https://translate.googleusercontent.com/translate_f 199/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: plt.legend (datos, loc = 2)
Figura 7-32. El gráfico de líneas de varias series muestra los datos dentro de un pandas
marco de datos
276
Página 291
Histogramas
Un histograma consta de rectángulos adyacentes erigidos en el eje x, divididos en discretos
intervalos llamados bins , y con un área proporcional a la frecuencia de las ocurrencias
para ese contenedor. Este tipo de visualización se usa comúnmente en estudios estadísticos sobre
distribución de muestras.
Para representar un histograma, pyplot proporciona una función especial llamada hist ().
Esta función gráfica también tiene una característica que otras funciones que producen gráficos no tienen.
La función hist (), además de dibujar el histograma, devuelve una tupla de valores que
son los resultados del cálculo del histograma. De hecho, la función hist () también puede
implementar el cálculo del histograma, es decir, es suficiente con proporcionar una serie de
muestras de valores como argumento y el número de bins en los que se dividirán, y
se encargará de dividir el rango de muestras en muchos intervalos (contenedores) y luego calculará
las ocurrencias de cada contenedor. El resultado de esta operación, además de mostrarse en
forma gráfica (ver Figura 7-33), se devolverá en forma de tupla.
(n, contenedores, parches)
Para comprender esta operación, lo mejor es un ejemplo práctico. Entonces puedes generar un
población de 100 valores aleatorios de 0 a 100 utilizando la función random.randint ().
277
https://translate.googleusercontent.com/translate_f 200/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 292
Gráfica de barras
Otro tipo de gráfico muy común es el gráfico de barras. Es muy similar a un histograma.
pero en este caso el eje x no se utiliza para hacer referencia a valores numéricos sino a categorías. los
La realización del gráfico de barras es muy simple con matplotlib, usando la función bar ().
Con estas pocas filas de código, obtendrá un gráfico de barras como se muestra en la Figura 7-34.
278
Página 293
https://translate.googleusercontent.com/translate_f 201/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-34. El gráfico de barras más simple con matplotlib
Si observa la Figura 7-34 , puede ver que los índices se dibujan en el eje x en la
comienzo de cada barra. En realidad, dado que cada barra corresponde a una categoría, sería
será mejor si especifica las categorías a través de la etiqueta de marca, definida por una lista de cadenas
pasado a la función xticks (). En cuanto a la ubicación de estas etiquetas de marca, debe
pasar una lista que contiene los valores correspondientes a sus posiciones en el eje x como el
primer argumento de la función xticks (). Al final obtendrá un gráfico de barras, como se muestra en
Figura 7-35.
279
Página 294
En realidad, hay muchos otros pasos que puede seguir para refinar aún más el gráfico de barras.
Cada uno de estos acabados se establece agregando un kwarg específico como argumento en la barra ()
función. Por ejemplo, puede agregar los valores de desviación estándar de la barra a través del
yerr kwarg junto con una lista que contiene las desviaciones estándar. Este kwarg suele ser
combinado con otro kwarg llamado error_kw, que, a su vez, acepta otros kwargs
especializado en representar barras de error. Dos kwargs muy específicos utilizados en este caso son
eColor, que especifica el color de las barras de error, y volcar, que define el ancho
de las líneas transversales que marcan los extremos de las barras de error.
Otro kwarg que puedes usar es alpha, que indica el grado de transparencia
de la barra de color. Alfa es un valor que va de 0 a 1. Cuando este valor es 0, el objeto
es completamente transparente para volverse gradualmente más significativo con el aumento de la
valor, hasta llegar a 1, en el que el color está completamente representado.
Como es habitual, se recomienda el uso de una leyenda, por lo que en este caso conviene utilizar un kwarg
llamada etiqueta para identificar la serie que estás representando.
Al final obtendrá un gráfico de barras con barras de error, como se muestra en la Figura 7-36..
https://translate.googleusercontent.com/translate_f 202/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: std1 = [0.8,1,0.4,0.9,1.3]
...: plt.title ('Un gráfico de barras')
280
Página 295
281
Página 296
https://translate.googleusercontent.com/translate_f 203/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
282
Página 297
Figura 7-38. Un gráfico de barras de varias series que muestra tres series
https://translate.googleusercontent.com/translate_f 204/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
283
Página 298
Con respecto al gráfico de barras horizontales de varias series (consulte la Figura 7-39 ), las cosas están muy
similar. Tienes que reemplazar la función bar () con la función barh () correspondiente
y recuerde reemplazar la función xticks () con la función yticks (). Necesitas
invertir el rango de valores cubiertos por los ejes en la función axis ().
284
Página 299
https://translate.googleusercontent.com/translate_f 205/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
lo que hay que hacer es usar la función plot () aplicada al objeto del marco de datos y especificar dentro
un kwarg llamado kind al que tienes que asignar el tipo de gráfico que quieres representar,
que en este caso es bar. Por lo tanto, sin especificar ninguna otra configuración, obtendrá la barra
cuadro que se muestra en la Figura 7-40.
Figura 7-40. Los valores en un marco de datos se pueden mostrar directamente como un gráfico de barras
285
Página 300
Sin embargo, si desea tener más control, o si su caso lo requiere, aún puede
extraer porciones del marco de datos como matrices NumPy y utilizarlas como se ilustra en la
ejemplos anteriores en esta sección. Es decir, pasándolos por separado como argumentos a
las funciones matplotlib.
Además, con respecto al gráfico de barras horizontales, se pueden aplicar las mismas reglas, pero
recuerde establecer barh como el valor del tipo kwarg. Obtendrás una multiserie horizontal
gráfico de barras, como se muestra en la Figura 7-41.
Figura 7-41. Un gráfico de barras horizontales podría ser una alternativa válida para visualizar su
valores de marco de datos
286
Página 301
Aquí también, para crear el gráfico de barras apiladas horizontales equivalente, necesita
para reemplazar la función bar () con la función barh (), teniendo cuidado de cambiar la otra
parámetros también. De hecho, la función xticks () debería reemplazarse por yticks ()
función porque las etiquetas de las categorías ahora deben informarse en el eje y. Después
haciendo todos estos cambios, obtendrá el gráfico de barras apiladas horizontales como se muestra en
Figura 7-43.
287
Página 302
https://translate.googleusercontent.com/translate_f 207/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: importar numpy como np
...: índice = np. rango (4)
...: series1 = np.array ([3,4,5,3])
...: series2 = np.array ([1,2,2,5])
...: series3 = np.array ([2,3,3,4])
...: eje plt. ([0,15, -0.5,3.5])
...: plt.title ('Un gráfico de barras apiladas horizontales de varias series')
...: plt.barh (índice, serie1, color = 'r')
...: plt.barh (índice, serie2, color = 'g', izquierda = serie1)
...: plt.barh (índice, serie3, color = 'b', izquierda = (serie1 + serie2))
...: plt.yticks (índice + 0.4, ['Jan18', 'Feb18', 'Mar18', 'Abr18'])
288
Página 303
Hasta ahora, las distintas series se han distinguido por el uso de diferentes colores. Otro
El modo de distinción entre las diversas series es utilizar tramas que le permitan rellenar
las distintas barras con trazos dibujados de forma diferente. Para hacer esto, primero debe configurar
el color de la barra como blanco y luego tienes que usar el hatch kwarg para definir cómo
la trampilla se va a poner. Las distintas trampillas tienen códigos distinguibles entre estos
caracteres (|, /, -, \, *, -) correspondientes al estilo de línea que llena la barra. Cuanto más un símbolo
se replica, más densas serán las líneas que forman la trama. Por ejemplo, /// es más
denso que //, que es más denso que / (ver Figura 7-44 ).
https://translate.googleusercontent.com/translate_f 208/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
([<matplotlib.axis.YTick en 0x2a9f0748>,
<matplotlib.axis.YTick en 0x2a9e1f98>,
<matplotlib.axis.YTick en 0x2ac06518>,
<matplotlib.axis.YTick en 0x2ac52128>],
<a lista de 4 objetos Text yticklabel>)
289
Página 304
290
Página 305
https://translate.googleusercontent.com/translate_f 209/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-45. Los valores de un marco de datos se pueden mostrar directamente como una pila
gráfico de barras
291
Página 306
https://translate.googleusercontent.com/translate_f 210/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-46. Se pueden comparar dos series usando este tipo de gráfico de barras
Gráficos circulares
Una forma alternativa de mostrar datos en los gráficos de barras es el gráfico circular, que se puede obtener fácilmente.
usando la función pie ().
Incluso para este tipo de función, pasa como argumento principal una lista que contiene el
valores que se mostrarán. Elegí los porcentajes (su suma es 100), pero puedes usar cualquier
tipo de valor. Dependerá de la función pie () calcular inherentemente el porcentaje
ocupado por cada valor.
292
Página 307
Además, con este tipo de representación, es necesario definir algunas características clave que hacen
uso de los kwargs. Por ejemplo, si desea definir la secuencia de colores, que
se asignará a la secuencia de valores de entrada correspondientemente, debe utilizar el
colores kwarg. Por lo tanto, debe asignar una lista de cadenas, cada una con el nombre de
el color deseado. Otra característica importante es agregar etiquetas a cada porción del pastel. Que hacer
esto, debes usar las etiquetas kwarg a las que asignarás una lista de cadenas que contienen
las etiquetas que se mostrarán en secuencia.
Además, para dibujar el gráfico circular de forma perfectamente esférica, debes
agregue la función axis () al final, especificando la cadena 'igual' como argumento. Tú
obtendrá un gráfico circular como se muestra en la Figura 7-47.
293
https://translate.googleusercontent.com/translate_f 211/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 308
Para agregar complejidad al gráfico circular, puede dibujarlo con un sector extraído del
tarta. Esto generalmente se hace cuando desea enfocarse en un segmento específico. En este caso, para
Por ejemplo, destacaría el segmento que se refiere a Nokia. Para hacer esto, hay
un kwarg especial llamado explotar. No es más que una secuencia de valores flotantes de 0 o 1,
donde 1 corresponde al corte completamente extendido y 0 corresponde a cortes completamente
en el pastel. Todos los valores intermedios corresponden a un grado intermedio de extracción
(ver figura 7- 48).
También puede agregar un título al gráfico circular con la función title (). Tú también puedes
ajustar el ángulo de rotación del pastel agregando el ángulo de inicio kwarg, que toma un
valor entero entre 0 y 360, que son los grados de rotación con precisión (0 es el
valor por defecto).
El gráfico modificado debería aparecer como se muestra en la Figura 7-48.
294
Página 309
Pero las posibles adiciones que puede insertar en un gráfico circular no terminan aquí. Por ejemplo,
un gráfico circular no tiene ejes con ticks, por lo que es difícil imaginar el perfecto
porcentaje representado por cada rebanada. Para superar esto, puede utilizar el autopct kwarg,
que agrega al centro de cada rebanada una etiqueta de texto que muestra el valor correspondiente.
Si desea que sea una imagen aún más atractiva, puede agregar una sombra
con el kwarg de sombra configurándolo en Verdadero. Al final obtendrá un gráfico circular como se muestra
en la Figura 7-49 .
https://translate.googleusercontent.com/translate_f 212/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: plt.pie (valores, etiquetas = etiquetas, colores = colores, explotar = explotar,
shadow = True, autopct = '% 1.1f %%', startangle = 180)
...: plt.axis ('igual')
295
Página 310
https://translate.googleusercontent.com/translate_f 213/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-50. Los valores en un marco de datos de pandas se pueden dibujar directamente como un gráfico circular
296
Página 311
Gráficos avanzados
Además de los gráficos más clásicos, como los gráficos de barras o los gráficos circulares, puede
quiere representar sus resultados de forma alternativa. En Internet y en varios
publicaciones hay muchos ejemplos en los que muchas soluciones gráficas alternativas son
discutidos y propuestos, algunos realmente brillantes y cautivadores. Esta sección solo muestra
algunas representaciones gráficas; una discusión más detallada sobre este tema está más allá
el propósito de este libro. Puede utilizar esta sección como una introducción a un mundo que
en constante expansión: visualización de datos.
Gráficos de contorno
Un tipo de gráfico bastante común en el mundo científico es el gráfico de contorno o mapa de contorno .
De hecho, esta visualización es adecuada para mostrar superficies tridimensionales a través de
un mapa de curvas de nivel compuesto por curvas cerradas que muestra los puntos de la superficie que
ubicadas en el mismo nivel, o que tengan el mismo valor z.
Aunque visualmente la gráfica de contorno es una estructura muy compleja, su implementación es
no tan difícil, gracias a la biblioteca matplotlib. Primero, necesitas la función z = f (x, y) para
generando una superficie tridimensional. Luego, una vez que haya definido un rango de valores
x, y que definirá el área del mapa que se mostrará, puede calcular los valores z
para cada par (x, y), aplicando la función f (x, y) recién definida para obtener una matriz
de valores z. Finalmente, gracias a la función contour (), puede generar el mapa de contorno
de la superficie. A menudo es deseable agregar también un mapa de color junto con un mapa de contorno.
Es decir, las áreas delimitadas por las curvas de nivel se rellenan con un degradado de color, definido
por un mapa de color. Por ejemplo, como en la Figura 7-51 , puede indicar valores negativos con
tonos cada vez más oscuros de azul, y se mueven al amarillo y luego al rojo con el aumento de
valores positivos.
297
Página 312
https://translate.googleusercontent.com/translate_f 214/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-51. Un mapa de contorno puede describir los valores z de una superficie
298
Página 313
Figura 7-52. El degradado del mapa de color "caliente" le da un aspecto atractivo al mapa de contorno
Gráficos polares
Otro tipo de gráfico avanzado que es popular es el gráfico polar. Este tipo de gráfico
se caracteriza por una serie de sectores que se extienden radialmente; cada una de estas áreas
ocupar un cierto ángulo. Por tanto, puede visualizar dos valores diferentes asignándolos a la
magnitudes que caracterizan la carta polar: la extensión del radio ry el ángulo
θ ocupado por el sector. De hecho, estas son las coordenadas polares (r, θ), una forma alternativa
de representar funciones en los ejes de coordenadas. Desde el punto de vista gráfico,
Podría imaginarlo como una especie de gráfico que tiene características tanto del gráfico circular como del
gráfico de barras. De hecho, como el gráfico circular, el ángulo de cada sector da información porcentual
https://translate.googleusercontent.com/translate_f 215/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
representada por esa categoría con respecto al total. En cuanto al gráfico de barras, el radial
extensión es el valor numérico de esa categoría.
Hasta ahora hemos utilizado el conjunto estándar de colores utilizando caracteres individuales como color
código (por ejemplo, r para indicar rojo). De hecho, puede utilizar cualquier secuencia de colores que desee. Tú
tiene que definir una lista de valores de cadena que contienen códigos RGB en el formato #rrggbb
correspondiente a los colores que desee.
299
Página 314
Curiosamente, para obtener un gráfico polar tienes que usar la función bar () y pasar la lista
que contiene los ángulos θ y una lista de la extensión radial de cada sector. El resultado sera
un gráfico polar, como se muestra en la Figura 7-53 .
300
Página 315
https://translate.googleusercontent.com/translate_f 216/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: N = 8
...: theta = np.arange (0., 2 * np.pi, 2 * np.pi / N)
...: radii = np.array ([4,7,5,3,1,5,6,7])
...: plt.axes ([0.025, 0.025, 0.95, 0.95], polar = True)
...: colors = np.array (['verde claro', 'rojo oscuro', 'azul marino', 'marrón',
'violeta', 'ciruela', 'amarillo', 'verde oscuro'])
...: bars = plt.bar (theta, radii, width = (2 * np.pi / N), bottom = 0.0,
color = colores)
301
Página 316
Superficies 3D
En una sección anterior, usó la gráfica de contorno para representar la
superficies a través de las líneas de nivel. Con el paquete mplot3D, se pueden dibujar superficies
directamente en 3D. En este ejemplo, usará la misma función z = f (x, y) que usó en
el mapa de contorno.
Una vez que haya calculado la cuadrícula de malla, puede ver la superficie con plot_
función de superficie (). Aparecerá una superficie azul tridimensional, como en la Figura 7-55..
https://translate.googleusercontent.com/translate_f 217/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: X, Y = np.meshgrid (X, Y)
...: def f (x, y):
...: return (1 - y ** 5 + x ** 5) * np.exp (-x ** 2-y ** 2)
...: ax.plot_surface (X, Y, f (X, Y), rstride = 1, cstride = 1)
302
Página 317
Figura 7-55. Se puede representar una superficie 3D con el kit de herramientas mplot3d
Una superficie 3D se destaca más al cambiar el mapa de color, por ejemplo, al configurar el
cmap kwarg. También puede rotar la superficie usando la función view_init (). De hecho, este
La función ajusta el punto de vista desde el que se ve la superficie, cambiando los dos kwargs
llamado elev y azim. A través de su combinación, puede obtener la superficie mostrada desde
cualquier ángulo. El primer kwarg ajusta la altura a la que se ve la superficie, mientras que azim
ajusta el ángulo de rotación de la superficie.
Por ejemplo, puede cambiar el mapa de color usando plt.cm.hot y moviendo la vista
apunta a elev = 30 y azim = 125. El resultado se muestra en la Figura 7-56 .
303
Página 318
https://translate.googleusercontent.com/translate_f 218/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-56. La superficie 3D se puede girar y observar desde un punto de vista más alto.
Gráficos de dispersión en 3D
El modo más utilizado entre todas las vistas 3D sigue siendo el gráfico de dispersión 3D. Con este tipo de
visualización, puede identificar si los puntos siguen tendencias particulares, pero sobre todo si
tienden a agruparse.
En este caso, usará la función scatter () como el caso 2D pero aplicada en el
Objeto Axes3D. Al hacer esto, puede visualizar diferentes series, expresadas por las llamadas a
la función scatter (), todos juntos en la misma representación 3D (ver Figura 7-57 ).
304
Página 319
https://translate.googleusercontent.com/translate_f 219/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
305
Página 320
Gráficos de barras en 3D
Otro tipo de gráfico 3D muy utilizado en el análisis de datos es el gráfico de barras 3D. También en este caso,
utiliza la función bar () aplicada al objeto Axes3D. Si define varias series,
puede acumular varias llamadas a la función bar () en la misma visualización 3D
(ver figura 7-58 ).
306
Página 321
https://translate.googleusercontent.com/translate_f 220/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
307
Página 322
Para comprender mejor el efecto de este modo de visualización, puede completar los ejes anteriores
con datos reales, como se muestra en la Figura 7-60.
https://translate.googleusercontent.com/translate_f 221/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: importar numpy como np
...: fig = plt.figure ()
...: ax = fig.add_axes ([0.1,0.1,0.8,0.8])
...: inner_ax = fig.add_axes ([0.6,0.6,0.25,0.25])
...: x1 = np. rango (10)
...: y1 = np.array ([1,2,7,1,5,2,4,2,3,1])
...: x2 = np. rango (10)
...: y2 = np.array ([1,3,4,5,4,5,2,6,4,3])
...: ax.plot (x1, y1)
...: inner_ax.plot (x2, y2)
Fuera [95]: [<matplotlib.lines.Line2D en 0x14acf6d8>]
308
Página 323
Figura 7-60. Una visualización más realista de una subtrama dentro de otra trama.
Cuadrículas de subparcelas
Ya has visto la creación de subtramas. Es bastante simple agregar subtramas usando
la función subplots () y dividiendo una parcela en sectores. matplotlib te permite
administre casos aún más complejos usando otra función llamada GridSpec (). Esta
La subdivisión permite dividir el área de dibujo en una cuadrícula de subáreas, a las que puede
Asignar uno o más de ellos a cada subparcela, para que al final puedas obtener subtramas
con diferentes tamaños y orientaciones, como se puede ver en la Figura 7-61.
309
https://translate.googleusercontent.com/translate_f 222/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 324
Figura 7-61. Se pueden definir subparcelas con diferentes tamaños en una cuadrícula de subáreas
Ahora que tiene claro cómo administrar la cuadrícula asignando los distintos sectores
para la subtrama, es hora de ver cómo usar estas subtramas. De hecho, puedes usar los ejes
objeto devuelto por cada función add_subplot () para llamar a la función plot () para dibujar el
parcela correspondiente (ver Figura 7-62).
310
Página 325
https://translate.googleusercontent.com/translate_f 223/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 7-62. Una cuadrícula de subparcelas puede mostrar muchas parcelas al mismo tiempo
311
Página 326
Conclusiones
En este capítulo, recibió todos los aspectos fundamentales de la biblioteca matplotlib,
y a través de una serie de ejemplos, ha aprendido sobre las herramientas básicas para manejar
Visualización de datos. Se ha familiarizado con varios ejemplos de cómo desarrollar
diferentes tipos de gráficos con unas pocas líneas de código.
Con este capítulo, concluimos la parte sobre las bibliotecas que proporciona los
herramientas para realizar análisis de datos. En el próximo capítulo, comenzará a tratar los temas más
estrechamente relacionado con el análisis de datos.
https://translate.googleusercontent.com/translate_f 224/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
312
Página 327
CAPÍTULO 8
Aprendizaje automático
con scikit-learn
En la cadena de procesos que componen el análisis de datos, la fase de construcción del predictivo
Los modelos y su validación se realizan mediante una potente biblioteca llamada scikit-learn. En
este capítulo, verá algunos ejemplos que ilustran la construcción básica de predicciones
modelos con algunos métodos diferentes.
La biblioteca scikit-learn
scikit-learn es un módulo de Python que integra muchos de los algoritmos de aprendizaje automático.
Esta biblioteca fue desarrollada inicialmente por Cournapeu en 2007, pero la primera versión real
fue en 2010.
Esta biblioteca es parte del grupo SciPy (Scientific Python), un conjunto de bibliotecas creadas para
informática científica y especialmente para el análisis de datos, muchos de los cuales se discuten en este
libro. Generalmente estas bibliotecas se definen como SciKits , de ahí la primera parte del nombre de
esta biblioteca. La segunda parte del nombre de la biblioteca se deriva del aprendizaje automático , el
disciplina perteneciente a esta biblioteca.
Aprendizaje automático
El aprendizaje automático es una disciplina que se ocupa del estudio de métodos para patrones
reconocimiento en conjuntos de datos sometidos a análisis de datos. En particular, se ocupa de la
desarrollo de algoritmos que aprenden de los datos y hacen predicciones. Cada
La metodología se basa en la construcción de un modelo específico.
313
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_8
Página 328
Hay muchos métodos que pertenecen a la máquina de aprendizaje, cada uno con su
características únicas, que son específicas de la naturaleza de los datos y el predictivo
modelo que desea construir. La elección de qué método se aplicará se denomina
problema de aprendizaje .
Los datos a someter a un patrón en la fase de aprendizaje pueden ser arreglos compuestos
por un solo valor por elemento, o por un valor multivariado. Estos valores se refieren a menudo
a como características o atributos .
https://translate.googleusercontent.com/translate_f 225/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Dependiendo del tipo de datos y del modelo a construir, puede separar los
problemas de aprendizaje en dos categorías amplias:
Aprendizaje supervisado
Son los métodos en los que el conjunto de entrenamiento contiene atributos adicionales que
quieres predecir (el objetivo ). Gracias a estos valores, puede indicar al modelo que
proporcione valores similares cuando tenga que enviar nuevos valores (el conjunto de prueba ).
314
Página 329
Además de estas dos categorías principales, existe un grupo adicional de métodos que
tienen como finalidad la validación y evaluación de los modelos.
• Regresión lineal
https://translate.googleusercontent.com/translate_f 226/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
estimadores supervisados, utilizando la función de ajuste (x, y) que realiza su entrenamiento.
x comprende las características observadas, mientras que y indica el objetivo. Una vez que el estimador ha
llevado a cabo el entrenamiento, podrá predecir el valor de y para cualquier nueva observación x no
etiquetado. Esta operación lo hará a través de la función de predicción (x).
315
Página 330
Este conjunto de datos se utiliza actualmente como un buen ejemplo para muchos tipos de análisis,
en particular para los problemas de clasificación, que se pueden abordar mediante
metodologías de aprendizaje automático. Entonces no es una coincidencia que este conjunto de datos se proporcione
junto con la biblioteca scikit-learn como una matriz NumPy 150x4.
Ahora estudiará este conjunto de datos en detalle importándolo en IPython QtConsole o en un
sesión normal de Python.
316
Página 331
De esta manera, cargó todos los datos y metadatos relacionados con el conjunto de datos Iris en el
variable de iris. Para ver los valores de los datos recogidos en él, basta con llamar
los datos de atributo de la variable iris.
https://translate.googleusercontent.com/translate_f 227/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
En []: iris.data
Fuera[ ]:
matriz ([[5.1, 3.5, 1.4, 0.2],
[4.9, 3., 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
...
Como puede ver, obtendrá una matriz de 150 elementos, cada uno con cuatro números
valores: el tamaño de los sépalos y pétalos respectivamente.
Para saber en cambio a qué tipo de flor pertenece cada elemento, se referirá al objetivo
atributo.
En []: iris.target
Fuera[ ]:
matriz ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
Obtienes 150 elementos con tres posibles valores enteros (0, 1 y 2), que
corresponden a las tres especies de iris. Conocer la correspondencia entre las especies.
y número, debe llamar al atributo target_names.
En []: iris.target_names
Fuera[ ]:
array (['setosa', 'versicolor', 'virginica'],
dtype = '| S10')
317
Página 332
Para comprender mejor este conjunto de datos, puede usar la biblioteca matplotlib, usando el
técnicas que aprendiste en el capítulo 7. Por lo tanto, cree un diagrama de dispersión que muestre
tres especies diferentes en tres colores diferentes. El eje x representará la longitud del
sépalo mientras que el eje y representará el ancho del sépalo.
https://translate.googleusercontent.com/translate_f 228/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: plt.show ()
Como resultado, obtiene el diagrama de dispersión que se muestra en la Figura 8-2 . Los azules son los Iris
setosa, las flores, las verdes son el Iris versicolor, y las rojas son el Iris virginica.
En la Figura 8-2 puede ver cómo las características de Iris setosa difieren de las otras dos,
formando un grupo de puntos azules separados de los demás.
318
Página 333
Figura 8-2. Las diferentes especies de iris se muestran con diferentes colores.
Intente seguir el mismo procedimiento, pero esta vez utilizando las otras dos variables, es decir
la medida del largo y ancho del pétalo. Puedes usar el mismo código y cambiar
solo algunos valores.
319
Página 334
https://translate.googleusercontent.com/translate_f 229/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: plt.xticks (())
...: plt.yticks (())
El resultado es el diagrama de dispersión que se muestra en la Figura 8-3 . En este caso la división entre el
tres especies es mucho más evidente. Como puede ver, tiene tres grupos diferentes.
Figura 8-3. Las diferentes especies de iris se muestran con diferentes colores.
La descomposición de PCA
Has visto cómo se podrían caracterizar las tres especies, teniendo en cuenta cuatro
Medidas del tamaño de los pétalos y sépalos. Representamos dos diagramas de dispersión, uno para el
pétalos y uno para los sépalos, pero ¿cómo se puede unificar todo? Cuatro dimensiones
son un problema que ni siquiera un Scatterplot 3D es capaz de resolver.
En este sentido, una técnica especial llamada Análisis de componentes principales (PCA) ha
ha sido desarrollado. Esta técnica le permite reducir el número de dimensiones de
un sistema que mantiene toda la información para la caracterización de los distintos puntos,
las nuevas dimensiones generadas se denominan componentes principales . En nuestro caso, entonces tu
puede reducir el sistema de cuatro a tres dimensiones y luego trazar los resultados dentro
un diagrama de dispersión 3D. De esta forma se pueden utilizar medidas tanto de sépalos como de pétalos para
caracterizar las diversas especies de iris de los elementos de prueba en el conjunto de datos.
320
Página 335
Además, para visualizar los nuevos valores utilizará un diagrama de dispersión 3D usando
el módulo mpl_toolkits.mplot3d de matplotlib. Si no recuerda cómo hacerlo,
consulte la sección Scatterplot 3D en el Capítulo 7.
iris = datasets.load_iris ()
especies = iris.target #Especies
x_reduced = PCA (n_components = 3) .fit_transform (iris.data)
#SCATTERPLOT 3D
https://translate.googleusercontent.com/translate_f 230/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
fig = plt.figure ()
ax = Axes3D (fig)
ax.set_title ('Conjunto de datos de iris por PCA', tamaño = 14)
ax.scatter (x_reduced [:, 0], x_reduced [:, 1], x_reduced [:, 2], c = especie)
ax.set_xlabel ('Primer vector propio')
ax.set_ylabel ('Segundo vector propio')
ax.set_zlabel ('Tercer vector propio')
ax.w_xaxis.set_ticklabels (())
ax.w_yaxis.set_ticklabels (())
ax.w_zaxis.set_ticklabels (())
321
Página 336
El resultado será el diagrama de dispersión que se muestra en la Figura 8-4 . Las tres especies de iris son
bien caracterizados unos con respecto a otros para formar un racimo.
Figura 8-4. Diagrama de dispersión 3D con tres grupos representativos de cada especie de iris
322
Página 337
https://translate.googleusercontent.com/translate_f 231/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
CAPÍTULO 8 APRENDIZAJE MÁQUINA CON SCIKIT-LEARN
Por lo tanto, antes de continuar, debe dividir su conjunto de datos Iris en dos partes.
Sin embargo, es aconsejable mezclar aleatoriamente los elementos de la matriz y luego hacer la división. En
De hecho, a menudo los datos pueden haber sido recopilados en un orden particular y, en su caso,
El conjunto de datos de Iris contiene elementos clasificados por especies. Entonces, para hacer una combinación de elementos del
conjunto de datos utilizará una función NumPy llamada random.permutation (). El conjunto de datos mixto
consta de 150 observaciones diferentes; los primeros 140 se utilizarán como conjunto de entrenamiento,
restantes 10 como el equipo de prueba.
Ahora que tiene un modelo predictivo que consta del clasificador knn, entrenado por
140 observaciones, descubrirás cómo es válido. El clasificador debe predecir correctamente
la especie de iris de las 10 observaciones del conjunto de prueba. Para obtener la predicción
tienes que usar la función predict (), que se aplicará directamente al predictivo
modelo, knn. Finalmente, comparará los resultados predichos con los observados reales.
contenido en y_test.
323
Página 338
knn.predict (prueba_x)
Fuera [100]: matriz ([1, 2, 1, 0, 0, 0, 2, 1, 2, 0])
y_test
Salida [101]: matriz ([1, 1, 1, 0, 0, 0, 2, 1, 2, 0])
Puede ver que obtuvo un error del 10%. Ahora puedes visualizar todo esto usando
límites de decisión en un espacio representado por el diagrama de dispersión 2D de sépalos.
#MALLA
https://translate.googleusercontent.com/translate_f 232/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
cmap_light = ListedColormap (['# AAAAFF', '# AAFFAA', '# FFAAAA'])
h = .02
xx, yy = np.meshgrid (np.arange (x_min, x_max, h), np.arange (y_min, y_max, h))
knn = KNeighborsClassifier ()
knn.fit (x, y)
Z = knn.predict (np.c_ [xx.ravel (), yy.ravel ()])
Z = Z.reforma (forma xx)
plt.figure ()
plt.pcolormesh (xx, yy, Z, cmap = cmap_light)
324
Página 339
Obtiene una subdivisión del diagrama de dispersión en los límites de decisión, como se muestra
En figura 8-5 .
Figura 8-5. Los tres límites de decisión están representados por tres colores diferentes.
#MALLA
cmap_light = ListedColormap (['# AAAAFF', '# AAFFAA', '# FFAAAA'])
h = .02
xx, yy = np.meshgrid (np.arange (x_min, x_max, h), np.arange (y_min, y_max, h))
knn = KNeighborsClassifier ()
325
https://translate.googleusercontent.com/translate_f 233/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 340
knn.fit (x, y)
Z = knn.predict (np.c_ [xx.ravel (), yy.ravel ()])
Z = Z.reforma (forma xx)
plt.figure ()
plt.pcolormesh (xx, yy, Z, cmap = cmap_light)
Figura 8-6. Los límites de decisión en un diagrama de dispersión 2D que describe los tamaños de los pétalos
326
Página 341
Este conjunto de datos contiene datos fisiológicos recopilados en 442 pacientes y como un
apuntar a un indicador de la progresión de la enfermedad después de un año. Los datos fisiológicos ocupan
las primeras 10 columnas con valores que indican respectivamente lo siguiente:
https://translate.googleusercontent.com/translate_f 234/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
• Años
• Sexo
• Presión arterial
diabetes.data [0]
Fuera[ ]:
matriz ([0.03807591, 0.05068012, 0.06169621, 0.02187235, -0.0442235,
-0.03482076, -0.04340085, -0.00259226, 0.01990842, -0.01764613])
Estos valores son de hecho el resultado de un procesamiento. Cada uno de los 10 valores fue la media
centrado y posteriormente escalado por la desviación estándar multiplicada por el número de
muestras. La verificación revelará que la suma de los cuadrados de cada columna es igual a 1. Intente
haciendo este cálculo con las medidas de edad; obtendrás un valor muy cercano a 1.
327
Página 342
Aunque estos valores están normalizados y, por tanto, son difíciles de leer,
continúan expresando las 10 características fisiológicas y por lo tanto no han perdido su
valor o información estadística.
En cuanto a los indicadores del avance de la enfermedad, es decir, los valores que deben
corresponden a los resultados de sus predicciones, estos se pueden obtener mediante el
atributo de destino.
diabetes.target
Fuera [146]:
matriz ([151., 75., 141., 206., 135., 97., 138., 63., 110.,
310., 101., 69., 179., 185., 118., 171., 166., 144.,
97., 168., 68., 49., 68., 245., 184., 202., 137
...
y=a*x+c
Para practicar con un ejemplo de regresión lineal, puede utilizar el conjunto de datos de diabetes
descrito anteriormente. Primero deberá dividir a los 442 pacientes en un conjunto de entrenamiento
(compuesto por los primeros 422 pacientes) y un conjunto de prueba (los últimos 20 pacientes).
https://translate.googleusercontent.com/translate_f 235/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
328
Página 343
Ahora aplique el conjunto de entrenamiento al modelo predictivo mediante el uso de la función fit ().
Una vez entrenado el modelo, puede obtener los coeficientes de 10 b calculados para cada
variable fisiológica, utilizando el atributo coef_ del modelo predictivo.
linreg.coef_
Fuera [164]:
matriz ([3.03499549e-01, -2.37639315e + 02, 5.10530605e + 02,
3.27736980e + 02, -8.14131709e + 02, 4.92814588e + 02,
1.02848452e + 02, 1.84606489e + 02, 7.43519617e + 02,
7.60951722e + 01])
Si aplica el conjunto de prueba al modelo de predicción linreg, obtendrá una serie de objetivos
comparar con los valores realmente observados.
linreg.predict (prueba_x)
Fuera[ ]:
matriz ([197.61846908, 155.43979328, 172.88665147, 111.53537279,
164.80054784, 131.06954875, 259.12237761, 100.47935157,
117.0601052, 124.30503555, 218.36632793, 61.19831284,
132.25046751, 120.3332925, 52.54458691, 194.03798088,
102.57139702, 123.56604987, 211.0346317, 52.60335674])
y_test
Fuera[ ]:
matriz ([233., 91., 111., 152., 120., 67., 310., 94., 183.,
66., 173., 72., 49., 64., 48., 178., 104., 132.,
220., 57.])
329
Página 344
Sin embargo, un buen indicador de qué predicción debería ser perfecta es la varianza . los
cuanto más cerca esté la varianza de 1, más perfecta será la predicción.
https://translate.googleusercontent.com/translate_f 236/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
desde sklearn importar conjuntos de datos
diabetes = datasets.load_diabetes ()
x_train = diabetes.data [: - 20]
y_train = diabetes.target [: - 20]
x_test = diabetes.data [-20:]
y_test = diabetes.target [-20:]
Figura 8-7 muestra la línea azul que representa la correlación lineal entre las edades
de los pacientes y la progresión de la enfermedad.
330
Página 345
Figura 8-7. Una regresión lineal representa una correlación lineal entre una característica
y los objetivos
En realidad, tiene 10 factores fisiológicos dentro del conjunto de datos de diabetes. Por lo tanto,
para tener una imagen más completa de todo el conjunto de entrenamiento, puede hacer una regresión lineal
para cada característica fisiológica, creando 10 modelos y viendo el resultado de cada uno de ellos
a través de un gráfico lineal.
https://translate.googleusercontent.com/translate_f 237/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
xi_test = x_test [:, f]
xi_train = x_train [:, f]
xi_test = xi_test [:, np.newaxis]
331
Página 346
Figura 8-8 muestra 10 gráficos lineales, cada uno de los cuales representa la correlación entre un
factor fisiológico y progresión de la diabetes.
332
Página 347
https://translate.googleusercontent.com/translate_f 238/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 8-8. Diez gráficos lineales que muestran las correlaciones entre fisiológicas
factores y la progresión de la diabetes
333
Página 348
https://translate.googleusercontent.com/translate_f 239/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
definido como un espacio de decisión (ver Figura 8-9).
334
Página 349
y = [0] * 6 + [1] * 5
plt.scatter (x [:, 0], x [:, 1], c = y, s = 50, alpha = 0.9)
Fuera [360]: <matplotlib.collections.PathCollection at 0x545634a8>
Figura 8-9. La gráfica de dispersión del conjunto de entrenamiento muestra el espacio de decisión
Ahora que ha definido el conjunto de entrenamiento, puede aplicar el SVC (Vector de soporte
Algoritmo de clasificación). Este algoritmo creará una línea (límite de decisión) en orden
para dividir el área de decisión en dos partes (ver Figura 8-10), y esta línea recta será
colocado para maximizar su distancia de las observaciones más cercanas contenidas en el entrenamiento
conjunto. Esta condición debe producir dos porciones diferentes en las que todos los puntos de un mismo
la clase debe estar contenida.
Luego aplica el algoritmo SVC al conjunto de entrenamiento y para hacerlo, primero define
el modelo con el constructor SVC ( ) definiendo el kernel como lineal. (Un kernel es una clase de
algoritmos para el análisis de patrones). Luego, usará la función fit () con el entrenamiento
establecido como argumento. Una vez que el modelo está entrenado, puede trazar el límite de decisión
con la función decision_function (). Luego dibuja el diagrama de dispersión y proporciona un
color diferente a las dos porciones del espacio de decisión.
335
Página 350
y = [0] * 6 + [1] * 5
svc = svm.SVC (kernel = 'lineal'). fit (x, y)
X, Y = np.mgrid [0: 4: 200j, 0: 4: 200j]
https://translate.googleusercontent.com/translate_f 240/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Z = svc.decision_function (np.c_ [X.ravel (), Y.ravel ()])
Z = Z.rehape (X.shape)
plt.contourf (X, Y, Z> 0, alpha = 0.4)
plt.contour (X, Y, Z, colores = ['k'], estilos de línea = ['-'], niveles = [0])
plt.scatter (x [:, 0], x [:, 1], c = y, s = 50, alpha = 0.9)
En figura 8-10 , puede ver las dos partes que contienen las dos clases. Puede decirse
que la división es exitosa excepto por un punto azul en la parte roja.
Entonces, una vez que se ha entrenado el modelo, es sencillo comprender cómo las predicciones
funcionar. Gráficamente, dependiendo de la posición ocupada por la nueva observación,
conocerá su pertenencia correspondiente en una de las dos clases.
En cambio, desde un punto de vista más programático, la función predecir () devolverá el
número de la clase de pertenencia correspondiente (0 para la clase en azul, 1 para la clase en rojo).
336
Página 351
svc.predict ([[1.5,2.5]])
Fuera [56]: matriz ([0])
svc.predict ([[2.5,1]])
Fuera [57]: matriz ([1])
https://translate.googleusercontent.com/translate_f 241/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
plt.contour (X, Y, Z, colors = ['k', 'k', 'k'], linestyles = ['-', '-', '-'],
niveles = [- 1,0,1])
plt.scatter (svc.support_vectors _ [:, 0], svc.support_vectors _ [:, 1], s = 120,
facecolors = 'r')
plt.scatter (x [:, 0], x [:, 1], c = y, s = 50, alpha = 0.9)
Estos puntos están representados por círculos con borde en el diagrama de dispersión. Además, ellos
estará dentro de un área de evaluación en las proximidades de la línea de separación (ver el
líneas en la figura 8-11 ).
337
Página 352
Para ver el efecto en el límite de decisión, puede restringir el valor a C = 0,1. Vamos
vea cuántos puntos se tendrán en cuenta.
338
Página 353
https://translate.googleusercontent.com/translate_f 242/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
CAPÍTULO 8 APRENDIZAJE MÁQUINA CON SCIKIT-LEARN
SVC no lineal
Hasta ahora, ha visto el algoritmo lineal SVC que define una línea de separación que era
destinado a dividir las dos clases. También hay algoritmos SVC más complejos que
puede establecer curvas (2D) o superficies curvas (3D) basándose en los mismos principios de
maximizando las distancias entre los puntos más cercanos a la superficie. Veamos el sistema
utilizando un núcleo polinomial.
Como su nombre lo indica, puede definir una curva polinomial que separe el área
decisión en dos partes. El grado del polinomio se puede definir por el grado
opción. Incluso en este caso C es el coeficiente de regularización. Así que intenta aplicar un SVC
algoritmo con un núcleo polinomial de tercer grado y con un coeficiente C igual a 1.
339
Página 354
https://translate.googleusercontent.com/translate_f 243/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Otro tipo de kernel no lineal es la función de base radial (RBF) . En este caso el
Las curvas de separación tienden a definir las zonas radialmente con respecto a los puntos de observación.
del conjunto de entrenamiento.
340
Página 355
En figura 8-14 , puede ver las dos partes de la decisión con todos los puntos del
conjunto de entrenamiento colocado correctamente.
341
https://translate.googleusercontent.com/translate_f 244/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 356
iris = datasets.load_iris ()
x = iris.data [:,: 2]
y = iris.target
h = .05
svc = svm.SVC (kernel = 'lineal', C = 1.0) .fit (x, y)
x_min, x_max = x [:, 0] .min () - .5, x [:, 0] .max () + .5
y_min, y_max = x [:, 1] .min () - .5, x [:, 1] .max () + .5
h = .02
X, Y = np.meshgrid (np.arange (x_min, x_max, h), np.arange (y_min, y_max, h))
342
Página 357
https://translate.googleusercontent.com/translate_f 245/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 8-15. Los límites decisorios dividen el área decisional en tres
diferentes porciones
iris = datasets.load_iris ()
x = iris.data [:,: 2]
y = iris.target
h = .05
svc = svm.SVC (kernel = 'poli', C = 1.0, grado = 3) .fit (x, y)
x_min, x_max = x [:, 0] .min () - .5, x [:, 0] .max () + .5
y_min, y_max = x [:, 1] .min () - .5, x [:, 1] .max () + .5
h = .02
X, Y = np.meshgrid (np.arange (x_min, x_max, h), np.arange (y_min, y_max, h))
343
Página 358
Figura 8-16 muestra cómo los límites de decisión polinomial dividen el área de una manera muy
forma diferente en comparación con el caso lineal.
Figura 8-16. En el caso del polinomio, la parte azul no está conectada directamente con
la porción roja
Ahora puede aplicar el kernel RBF para ver la diferencia en la distribución de áreas.
https://translate.googleusercontent.com/translate_f 246/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
344
Página 359
345
Página 360
https://translate.googleusercontent.com/translate_f 247/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
x0_test = x0_test [:, np.newaxis]
x0_train = x0_train [:, np.newaxis]
x0_test.sort (eje = 0)
x0_test = x0_test * 100
x0_train = x0_train * 100
346
Página 361
Figura 8-18. Las tres curvas de regresión producen tendencias muy diferentes a partir de
del set de entrenamiento
Conclusiones
En este capítulo, vio los casos más simples de problemas de regresión y clasificación.
resuelto usando la biblioteca scikit-learn. Muchos conceptos de la fase de validación de un
El modelo predictivo se presentó de forma práctica a través de algunos ejemplos prácticos.
En el siguiente capítulo verá un caso completo en el que todos los pasos del análisis de datos
se discuten a modo de un solo ejemplo práctico. Todo se implementará en
IPython Notebook, un entorno interactivo e innovador muy adecuado para compartir
cada paso del análisis de datos con la forma de una documentación interactiva útil como
informe o como presentación web.
https://translate.googleusercontent.com/translate_f 248/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
347
Página 362
CAPÍTULO 9
349
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_9
Página 363
aprendizaje automático. Entonces descubrirás cómo, gracias a las nuevas innovaciones tecnológicas,
y en particular a la potencia informática alcanzada por la GPU, aprendizaje profundo
Se han desarrollado técnicas basadas en redes neuronales.
Inteligencia artificial
El término inteligencia artificial fue utilizado por primera vez por John McCarthy en 1956, en un momento
https://translate.googleusercontent.com/translate_f 249/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
lleno de grandes esperanzas y entusiasmo por el mundo de la tecnología. Estaban al amanecer
de electrónica y computadoras tan grandes como habitaciones enteras que podrían hacer algunos
cálculos, pero lo hicieron de manera tan eficiente y rápida en comparación con los humanos que
Ya vislumbraba posibles desarrollos futuros de la inteligencia electrónica.
Pero sin entrar en el mundo de la ciencia ficción, la definición actual más adecuada
a la inteligencia artificial, a menudo referida como IA, podría resumirse brevemente con el
la siguiente frase:
De ahí que el concepto de inteligencia artificial sea un concepto variable que varía con
el progreso de las propias máquinas y con el concepto de "exclusividad humana
Relevancia". Mientras que en los años 60 y 70 veíamos la inteligencia artificial como la capacidad de
computadoras para realizar cálculos y encontrar soluciones matemáticas de complejos
problemas "de relevancia exclusiva de grandes científicos", en los años 80 y 90 maduró en
la capacidad de evaluar riesgos, recursos y tomar decisiones. En el año 2000, con el
crecimiento continuo del potencial informático, la posibilidad de estos sistemas para
aprender con aprendizaje automático se agregó a la definición.
Finalmente, en los últimos años, el concepto de inteligencia artificial se ha centrado en
operaciones de reconocimiento visual y auditivo, que hasta hace poco se pensaba
“Relevancia humana exclusiva”.
Estas operaciones incluyen:
• Reconocimiento de imagen
• Detección de objetos
• Segmentación de objetos
• Traducción de idiomas
350
Página 364
• Reconocimiento de voz
Estos son los problemas aún en estudio gracias a las técnicas de deep learning.
351
Página 365
Aprendizaje profundo
En esta sección, aprenderá sobre algunos factores importantes que llevaron al desarrollo de
aprendizaje profundo y leer por qué solo en estos últimos años se han dado tantos pasos hacia adelante.
352
Página 366
https://translate.googleusercontent.com/translate_f 251/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Incluso hoy en día el cálculo con las CPU, aunque mejorado considerablemente, requiere
largos tiempos de procesamiento. Esta ineficiencia se debe a la arquitectura particular de las CPU,
que han sido diseñados para realizar eficientemente operaciones matemáticas que no son
los requeridos por las redes neuronales.
Pero en las últimas décadas se ha desarrollado un nuevo tipo de hardware, el procesamiento de gráficos
Unit (GPU), gracias al enorme impulso comercial del mercado de los videojuegos. En
De hecho, este tipo de procesador ha sido diseñado para gestionar vectores cada vez más eficientes.
cálculos, como multiplicaciones entre matrices, que es necesario para la realidad 3D
simulaciones y renderizado.
Gracias a esta innovación tecnológica, muchas técnicas de aprendizaje profundo han
se ha realizado. De hecho, para darse cuenta de las redes neuronales y su aprendizaje, los tensores
(matrices multidimensionales), realizando muchas operaciones matemáticas. Eso
Es precisamente este tipo de trabajo el que las GPU pueden realizar de forma más eficiente. Gracias a su
contribución, la velocidad de procesamiento del aprendizaje profundo se incrementa en varios órdenes de
magnitud (días en lugar de meses).
353
Página 367
Pitón
Otro factor que contribuyó al gran éxito y difusión del aprendizaje profundo
técnicas fue el lenguaje de programación Python.
En el pasado, la planificación de sistemas de redes neuronales era muy compleja. El único idioma
capaz de llevar a cabo esta tarea era C ++, un lenguaje muy complejo, difícil de usar y conocido
solo a unos pocos especialistas. Además, para trabajar con la GPU (necesaria para este tipo
de cálculo), era necesario conocer CUDA (Compute Unified Device Architecture),
la arquitectura de desarrollo de hardware de las tarjetas gráficas NVIDIA con todas sus características técnicas
especificaciones.
Hoy, gracias a Python, la programación de redes neuronales y el aprendizaje profundo
Las técnicas se han vuelto de alto nivel. De hecho, los programadores ya no tienen que pensar en
la arquitectura y las especificaciones técnicas de la tarjeta gráfica (GPU), pero puede
centrarse exclusivamente en la parte relacionada con el aprendizaje profundo. Además, las características del
El lenguaje Python permite a los programadores desarrollar código simple e intuitivo. Tienes
ya probé esto con el aprendizaje automático en el capítulo anterior, y lo mismo se aplica a
aprendizaje profundo.
https://translate.googleusercontent.com/translate_f 252/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
basado en diferentes mecanismos internos. Veremos cuáles en los próximos años serán
más exitoso o no.
Entre estos frameworks disponibles hoy en día de forma gratuita, cabe mencionar algunos que
están obteniendo cierto éxito.
354
Página 368
355
Página 369
https://translate.googleusercontent.com/translate_f 253/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 9-2. Una esquematización de cómo es una red neuronal artificial genérica
estructurado
Las unidades básicas se denominan nodos (los círculos de colores que se muestran en la Figura 9-2 ), que
en el modelo biológico simulan el funcionamiento de una neurona dentro de una red neuronal.
Estas neuronas artificiales realizan operaciones muy simples, similares a las biológicas.
contrapartes. Se activan cuando la suma total de las señales de entrada que reciben
supera un umbral de activación.
Estos nodos pueden transmitir señales entre ellos mediante conexiones, denominadas
bordes , que simulan el funcionamiento de las sinapsis biológicas (las flechas azules que se muestran
en la Figura 9-2 ). A través de estos bordes, las señales enviadas por una neurona pasan a la siguiente,
comportándose como un filtro. Es decir, un borde convierte el mensaje de salida de una neurona en un
señal inhibitoria o excitante, disminuyendo o aumentando su intensidad, según
reglas preestablecidas ( generalmente se aplica un peso diferente para cada borde).
La red neuronal tiene una cierta cantidad de nodos que se utilizan para recibir la señal de entrada.
desde el exterior (ver Figura 9-2). Este primer grupo de nodos generalmente se representa en un
columna en el extremo izquierdo del esquema de red neuronal. Este grupo de nodos representa
la primera capa de la red neuronal ( capa de entrada ). Dependiendo de las señales de entrada
recibido, algunas (o todas) de estas neuronas se activarán procesando el recibido
señal y transmitir el resultado como salida a otro grupo de neuronas, a través de bordes.
356
Página 370
Este segundo grupo se encuentra en una posición intermedia en la red neuronal y se denomina
la capa oculta . Esto se debe a que las neuronas de este grupo no se comunican con
el exterior ni en la entrada ni en la salida y, por tanto, están ocultos. Como puedes ver en
Figura 9-2, cada una de estas neuronas tiene muchos bordes entrantes, a menudo con todas las neuronas
de la capa anterior. Incluso estas neuronas ocultas se activarán si el total
la señal entrante excederá un cierto umbral. Si es afirmativo, procesarán la señal.
y transmitirlo a otro grupo de neuronas (en la dirección correcta del esquema que se muestra
en la Figura 9-2 ). Este grupo puede ser otra capa oculta o la capa de salida, es decir, la última
capa que enviará los resultados directamente al exterior.
Entonces en general tendremos un flujo de datos que ingresará a la red neuronal (de izquierda a derecha
a la derecha), y que se tramitará de forma más o menos compleja en función de la
estructura, y producirá un resultado de salida.
El comportamiento, las capacidades y la eficiencia de una red neuronal dependerán exclusivamente
sobre cómo están conectados los nodos y el número total de capas y neuronas asignadas a
cada uno de ellos. Todos estos factores definen la arquitectura de la red neuronal.
https://translate.googleusercontent.com/translate_f 254/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
La estructura del perceptrón de capa única (SLP) es muy simple; es un neural de dos capas
red, sin capas ocultas, en la que una serie de neuronas de entrada envían señales a un
neurona de salida a través de diferentes conexiones, cada una con su propio peso. La figura 9-4 muestra
con más detalle el funcionamiento interno de este tipo de red neuronal.
357
Página 371
Figura 9-4. Una representación más detallada del perceptrón de capa única (SLP) con la
operación interna expresada matemáticamente
Los bordes de esta estructura se representan en este modelo matemático por medio de un
vector de peso que consiste en la memoria local de la neurona.
La neurona de salida recibe señales de un vector de entrada xi, cada una procedente de un
neurona.
una
wx i yo = w 1 x 1 + w 2 x 2 +… + w n x n = s
yo= 0
yo1 , si s > 0
Salida = yo
-
yo 1 , de otra manera
Esta es la función de activación más simple (consulte la función A que se muestra en la Figura 9-5), pero tu
También puede utilizar otros más complejos, como el sigmoide (ver la función D que se muestra en
Figura 9-5).
358
https://translate.googleusercontent.com/translate_f 255/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 372
Ahora que ha visto la estructura de la red neuronal SLP, puede cambiar para ver
cómo pueden aprender.
El procedimiento de aprendizaje de una red neuronal, llamado fase de aprendizaje, funciona
iterativamente. Es decir, un número predeterminado de ciclos de funcionamiento de la red neuronal
se llevan a cabo, en cada uno de los cuales los pesos de las sinapsis wi se modifican ligeramente.
Cada ciclo de aprendizaje se llama época . Para llevar a cabo el aprendizaje deberás
usar datos de entrada apropiados, llamados conjuntos de entrenamiento (ya los ha usado en profundidad
en el Capítulo 8 ).
En los conjuntos de entrenamiento, para cada valor de entrada, se obtiene el valor de salida esperado. Por
comparar los valores de salida producidos por la red neuronal con los esperados
puede analizar las diferencias y modificar los valores de peso, y también puede reducir
ellos. En la práctica, esto se hace minimizando una función de costo (pérdida) que es específica de
el problema del aprendizaje profundo. De hecho, los pesos de las diferentes conexiones serán
modificado para cada época con el fin de minimizar el costo ( pérdida ).
En conclusión, el aprendizaje supervisado se aplica a las redes neuronales.
Al final de la fase de aprendizaje, pasará a la fase de evaluación , en la que
el perceptrón SLP aprendido debe analizar otro conjunto de entradas (conjunto de prueba) cuyos resultados
también se conocen aquí. Evaluando las diferencias entre los valores obtenidos y
los esperados, el grado de capacidad de la red neuronal para resolver el problema de
Se conocerá el aprendizaje. A menudo, el porcentaje de casos adivinados con los incorrectos es
utilizado para indicar este valor, y se llama precisión .
359
Página 373
https://translate.googleusercontent.com/translate_f 256/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
360
Página 374
Por otro lado, desde un punto de vista práctico, la mayor complejidad de este
El sistema requiere algoritmos más complejos tanto para la fase de aprendizaje como para la
fase de evaluación. Uno de ellos es el algoritmo de retropropagación , que se utiliza para
modificar los pesos de las diversas conexiones para minimizar la función de costo, con el fin de
converger rápida y progresivamente los valores de salida con los esperados.
Otros algoritmos se utilizan específicamente para la fase de minimización del costo (o
error) y se conocen generalmente como técnicas de descenso de gradiente .
El estudio y análisis detallado de estos algoritmos está fuera del alcance de este texto,
que tiene sólo una función introductoria del argumento, con el objetivo de tratar de mantener
el tema del aprendizaje profundo lo más simple y claro posible. Si lo desea, sugiero
se profundiza en el tema tanto en varios libros como en Internet.
https://translate.googleusercontent.com/translate_f 257/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
361
Página 375
TensorFlow
En una sección anterior de este capítulo, vio que hay varios marcos en Python
que te permiten desarrollar proyectos de deep learning. Uno de ellos es TensorFlow . En esto
sección que aprenderá a conocer en detalle este marco, incluido cómo funciona y cómo
se utiliza para realizar redes neuronales para el aprendizaje profundo.
362
Página 376
https://translate.googleusercontent.com/translate_f 258/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Redes neuronales. Se pueden implementar muchos otros métodos de cálculo y análisis
con esta biblioteca, ya que cualquier sistema físico se puede representar con una matemática
modelo. De hecho, esta biblioteca también se puede utilizar para implementar otro aprendizaje automático
técnicas, y para el estudio de sistemas físicos complejos mediante el cálculo de
diferenciales parciales, etc.
Los nodos del gráfico de flujo de datos representan operaciones matemáticas, mientras que
los bordes del gráfico representan tensores (matrices de datos multidimensionales). El nombre
TensorFlow se deriva del hecho de que estos tensores representan el flujo de datos a través
gráficos, que se pueden utilizar para modelar redes neuronales artificiales.
Instalación de TensorFlow
Antes de comenzar a trabajar, debe instalar esta biblioteca en su computadora.
En el sistema Ubuntu Linux (versión 16 o más reciente), puede usar pip para instalar el
paquete:
363
Página 377
jupyter qtconsole
Nota Recuerde que para ingresar varios comandos en diferentes líneas, debe
use Ctrl + Enter. Para ejecutar los comandos, presione Entrar solamente.
364
Página 378
Una vez que haya definido todas las variables involucradas, es decir, haya definido el
modelo matemático en la base del sistema, debe realizar el
procesar e inicializar todo el modelo con tf.global_variables_
función initializer ().
365
Página 379
https://translate.googleusercontent.com/translate_f 260/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Ya has visto que el funcionamiento de TensorFlow se basa en la creación de
una estructura gráfica interna, en la que los nodos pueden realizar el procesamiento en el
flujo de datos dentro de tensores que siguen las conexiones del gráfico.
Por tanto, cuando inicia una sesión, en la práctica no hace más que crear una instancia de este gráfico.
Una sesión tiene dos métodos principales:
Dado que se realizan varias operaciones dentro de la misma sesión, se prefiere utilizar
la construcción con: con todas las llamadas a métodos inherentes a él.
En este caso simple, simplemente desea ver los valores de las variables definidas en el
modelo e imprimirlos en el terminal.
Como puede ver dentro de la sesión, puede acceder a los valores del Gráfico de flujo de datos,
incluyendo la variable y que definió previamente.
Tensores
El elemento básico de la biblioteca de TensorFlow es el tensor . De hecho, los datos que siguen al
flujo dentro del gráfico de flujo de datos son tensores (ver Figura 9-7 ).
366
Página 380
• rango: dimensión del tensor (una matriz tiene rango 2, un vector tiene
rango 1)
• forma: número de filas y columnas (por ejemplo, (3.3) es una matriz de 3x3)
tipo de elementos tensores y columnas (por ejemplo, (3.3) es una matriz de 3x3) tiene rango 2, un
https://translate.googleusercontent.com/translate_f 261/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
vector tiene rango 1) s ic
367
Página 381
Como puede ver, tiene un tensor que contiene los mismos valores y los mismos
dimensiones como la matriz multidimensional definida con NumPy. Este enfoque es muy
útil para calcular el aprendizaje profundo, ya que muchos valores de entrada están en forma de NumPy
matrices.
Pero los tensores se pueden construir directamente desde TensorFlow, sin usar la biblioteca NumPy.
Hay una serie de funciones que permiten mejorar los tensores de forma rápida y
fácilmente.
Por ejemplo, si desea inicializar un tensor con todos los valores cero, puede usar el
Método tf.zeros ().
368
Página 382
[0. 0. 0.]
[0. 0. 0.]]
Del mismo modo, si desea un tensor con todos los valores de 1, use el método tf.ones ().
https://translate.googleusercontent.com/translate_f 262/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
En [12]: t1 = tf.ones ((3,3), 'float64')
Finalmente, también es posible crear un tensor que contenga valores aleatorios, que siguen un
distribución uniforme (todos los valores dentro de un rango tienen la misma probabilidad de salir), gracias a la
Función tf.random_uniform ().
Por ejemplo, si desea un tensor de 3x3 con valores flotantes entre 0 y 1, puede escribir:
Pero a menudo puede ser útil crear un tensor que contenga valores que sigan una
distribución con una elección de desviación estándar y media. Puede hacer esto con tf.
función random_normal ().
Por ejemplo, si desea crear un tensor de tamaño 3x3 con media 0 y estándar
desviación de 3, escribirás:
369
Página 383
...:
[[-1.51012492 2.52284908 1.10865617]
[-5.08502769 1.92598009 -4.25456524]
[4.85962772 -6.69154644 5.32387066]]
Operación en tensores
Una vez definidos los tensores, será necesario realizar operaciones sobre ellos.
La mayoría de los cálculos matemáticos sobre tensores se basan en la suma y la multiplicación
entre tensores.
Defina dos tensores, t1 y t2, que utilizará para realizar las operaciones entre
tensores.
https://translate.googleusercontent.com/translate_f 263/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
[0.58318019 0,3019532 0,04094303]]
t2 = [[0.16032183 0.32963789 0.30250323]
[0.02322233 0,79547286 0,01091838]
[0.63182664 0,64371264 0,06646919]]
Ahora, para sumar estos dos tensores, puede usar la función tf.add (). Actuar
multiplicación, usa la función tf.matmul ().
370
Página 384
371
Página 385
https://translate.googleusercontent.com/translate_f 264/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Antes de empezar
Antes de comenzar, vuelva a abrir una sesión con IPython iniciando un nuevo kernel. Una vez que la sesión
está abierto importa todos los módulos necesarios:
Datos a analizar
Para los ejemplos que considerará en este capítulo, utilizará una serie de datos que
que utilizó en el capítulo de aprendizaje automático, en particular en la sección sobre el soporte
Técnica de máquinas vectoriales (SVM).
El conjunto de datos que estudiarás es un conjunto de 11 puntos distribuidos en un eje cartesiano
dividido en dos clases de miembros. Los primeros seis pertenecen a la primera clase, los otros
cinco al segundo. Las coordenadas (x, y) de los puntos están contenidas dentro de un numpy
inputX, mientras que la clase a la que pertenecen se indica en inputY. Esta es una lista de
matrices de dos elementos, con un elemento para cada clase a la que pertenecen. El valor 1 en el primero
o el segundo elemento indica la clase a la que pertenece.
Si el elemento tiene valor [1.0], pertenecerá a la primera clase. Si tiene valor [0,1],
pertenece a la segunda clase. El hecho de que sean valores flotantes se debe a la optimización
cálculo de deep learning. Verá más adelante que los resultados de las pruebas de las redes neuronales
serán números flotantes, lo que indica la probabilidad de que un elemento pertenezca al primero o
segunda clase.
Suponga, por ejemplo, que la red neuronal le dará el resultado de un elemento
que tendrá los siguientes valores:
[0,910, 0,090]
Este resultado significará que la red neuronal considera que el elemento bajo
el análisis pertenece al 91% a la primera clase y al 9% a la segunda clase. Verás esto
en la práctica al final de la sección, pero era importante explicar el concepto para mejorar
comprender el propósito de algunos valores.
Entonces, según los valores tomados del ejemplo de SVM en el aprendizaje automático
capítulo, puede definir los siguientes valores.
372
Página 386
https://translate.googleusercontent.com/translate_f 265/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
[1.0, 0.0], [0.0, 1.0], [0.0, 1.0], [0.0, 1.0], [0.0, 1.0], [0.0, 1.0]]
Para ver mejor cómo estos puntos están organizados espacialmente y a qué clases pertenecen
a, no hay mejor enfoque que trazar todo con matplotlib.
373
Página 387
Figura 9-8. El conjunto de entrenamiento es un conjunto de puntos cartesianos divididos en dos clases de
membresía (amarillo y azul oscuro)
Para ayudar en la representación gráfica (como se muestra en la Figura 9-8 ) del color
asignación, la matriz inputY ha sido reemplazada por la matriz yc.
Como puede ver, las dos clases son fácilmente identificables en dos regiones opuestas. los
la primera región cubre la parte superior izquierda, la segunda región cubre la parte inferior derecha. Todas
esto parecería estar simplemente subdividido por una línea diagonal imaginaria, pero para hacer
sistema más complejo, hay una excepción con el punto número 6 que es interno a
los otros puntos.
Será interesante ver cómo y si las redes neuronales que implementamos serán
capaz de asignar correctamente la clase a puntos de este tipo.
374
https://translate.googleusercontent.com/translate_f 266/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 388
Siguiendo la práctica de TensorFlow, puede comenzar por definir una serie de parámetros
necesario para caracterizar la ejecución de los cálculos durante la fase de aprendizaje. los
La tasa de aprendizaje es un parámetro que regula la velocidad de aprendizaje de cada neurona. Este parámetro
es muy importante y juega un papel muy importante en la regulación de la eficiencia de un sistema neuronal
red durante la fase de aprendizaje. Establecer el valor óptimo a priori del aprendizaje
tasa es imposible, porque depende mucho de la estructura de la red neuronal y
sobre el tipo particular de datos a analizar. Por tanto, es necesario ajustar este valor
a través de diferentes pruebas de aprendizaje, eligiendo el valor que garantice la mayor precisión.
Puede comenzar con un valor genérico de 0.01, asignando este valor a learning_rate
parámetro.
Durante la ejecución del programa, será necesario de alguna manera monitorear el progreso
de aprendizaje y esto se puede hacer imprimiendo valores en el terminal. Puedes decidir como
muchas épocas, tendrá que mostrar una impresión con los resultados e insertarlos en el
parámetro display_step. Un valor razonable es cada 50 o 100 pasos.
En []: display_step = 50
Para que el código implementado sea reutilizable, es necesario agregar parámetros que
especificar la cantidad de elementos que componen el conjunto de entrenamiento y cuántos lotes
debe dividirse. En este caso, tiene un pequeño conjunto de entrenamiento de solo 11 elementos. Así que puedes
Úselos todos en un solo lote.
En []: n_samples = 11
...: tamaño_lote = 11
...: total_batch = int (n_samples / batch_size)
...:
Finalmente, puede agregar dos parámetros más que describen el tamaño y el número de
clases a las que pertenecen los datos entrantes.
Página 389
Entonces acaba de definir implícitamente una red neuronal SLP con dos neuronas en
la capa de entrada y dos neuronas en la capa de salida (ver Figura 9-9 ), definiendo una entrada
marcador de posición x con dos valores y un marcador de posición de salida y con dos valores. de manera explícita ,
en cambio, ha definido dos tensores, el tensor x que contendrá los valores de la
coordenadas de entrada, y un tensor y que contendrá las probabilidades de pertenecer a la
dos clases de cada elemento.
https://translate.googleusercontent.com/translate_f 267/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Pero esto será mucho más visible en el siguiente ejemplo, cuando se trate de
Redes neuronales MLP. Ahora que ha definido los marcadores de posición, ocupado con el
pesos y el sesgo, que, como viste, se utilizan para definir las conexiones de la neural
red. Estos tensores W yb están definidos como variables por el constructor Variable ()
e inicializado a todos los valores cero con tf.zeros ().
Página 390
Las variables ponderación y sesgo que acaba de definir se utilizarán para definir la
evidencia x * W + b, que caracteriza la red neuronal en forma matemática. los
La función tf.matmul () realiza una multiplicación entre los tensores x * W, mientras que tf.
La función add () agrega al resultado el valor del sesgo b.
Pero puede utilizar cualquier otra función que considere más conveniente. Una vez el
Se ha definido la función de costo (o pérdida), se debe establecer un algoritmo para realizar
la minimización en cada ciclo de aprendizaje (optimización). Puede utilizar tf.train.
GradientDescentOptimizer () funciona como un optimizador que basa su funcionamiento en la
Algoritmo de Gradient Descent.
https://translate.googleusercontent.com/translate_f 268/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
377
Página 391
Fase de aprendizaje
Antes de comenzar, defina dos listas que servirán de contenedor para los resultados obtenidos
durante la fase de aprendizaje. En avg_set ingresará todos los valores de costo para cada época
(ciclo de aprendizaje), mientras que en epoch_set ingresará el número de época relativo. Estas
Los datos serán útiles al final para visualizar la tendencia de costos durante la fase de aprendizaje del
red neuronal, que será muy útil para comprender la eficiencia del elegido
método de aprendizaje para la red neuronal.
En []: avg_set = []
...: epoch_set = []
...:
Luego, antes de comenzar la sesión, debe inicializar todas las variables con el
función que ha visto antes, tf.global_variables_initializer ().
Ahora está listo para iniciar la sesión (no presione Enter al final; debe ingresar
otros comandos dentro de la sesión).
Ya has visto que cada paso del aprendizaje se llama época. Es posible
intervenir dentro de cada época, gracias a un bucle for que escanea todos los valores de entrenamiento_
épocas.
Dentro de este ciclo para cada época, optimizará utilizando sess.run (optimizador)
mando. Además, cada 50 épocas, la condición si% display_step == 0 será
estar satisfecho. Luego, extraerá el valor del costo a través de sess.run (costo) y lo insertará en el
c variable que usará para imprimir en el terminal como el argumento print () que
almacena la lista avg_set, usando la función append (). Al final, cuando el bucle for tiene
completado, imprimirá un mensaje en el terminal informándole del final de
la fase de aprendizaje. (No presione Enter, ya que aún tiene que agregar otros comandos ...)
Página 392
Ahora que la fase de aprendizaje ha terminado, es útil imprimir una tabla de resumen en el
terminal que le muestra la tendencia del costo durante el mismo. Puedes hacerlo gracias a los valores
contenido en las listas avg_set y epoch_set que llenó durante el proceso de aprendizaje.
https://translate.googleusercontent.com/translate_f 269/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Siempre en la sesión agregue estas últimas líneas de código, al final de las cuales finalmente podrá
presione Enter e inicie la sesión ejecutando la fase de aprendizaje.
379
Página 393
https://translate.googleusercontent.com/translate_f 270/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Época: 1500 costo = 0.096120209
Época: 1550 costo = 0.095487759
Época: 1600 costo = 0.094888613
380
Página 394
Como puede ver, el costo está mejorando gradualmente durante la época, hasta un valor de
0,168. Entonces es interesante ver los valores de los pesos W y el sesgo de la neural
red. Estos valores representan los parámetros del modelo, es decir, la red neuronal
instruido para analizar este tipo de datos y realizar este tipo de clasificación.
Estos parámetros son muy importantes, porque una vez obtenidos y conociendo
la estructura de la red neuronal utilizada, será posible reutilizarlos en cualquier lugar
sin repetir la fase de aprendizaje. No considere este ejemplo que solo toma
un minuto para hacer el cálculo; en casos reales, puede llevar días hacerlo y, a menudo,
tener que hacer muchos intentos y ajustar y calibrar los diferentes parámetros antes
desarrollar una red neuronal eficiente que sea muy precisa en el reconocimiento de clase, o en
realizar cualquier otra tarea.
381
Página 395
Si ve los resultados desde un punto de vista gráfico, puede ser más fácil y rápido
entender. Puede usar matplotlib para hacer esto.
https://translate.googleusercontent.com/translate_f 271/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 9-10. El valor del costo disminuye durante la fase de aprendizaje (costo
mejoramiento)
Ahora puede pasar a ver los resultados de la clasificación durante el último paso de la
fase de aprendizaje.
382
Página 396
Figura 9-11. La estimación de la clase a la que pertenecen los puntos en la última época.
de la fase de aprendizaje
El gráfico representa los puntos en el plano cartesiano (consulte la Figura 9-11), con un
color que va desde el azul (perteneciente al 100% al primer grupo) al amarillo (perteneciente al
100% al segundo grupo). Como puede ver, la división en las dos clases de puntos
del conjunto de entrenamiento es bastante óptimo, con una incertidumbre para los cuatro puntos en el centro
diagonal (verde).
Este gráfico muestra de alguna manera la capacidad de aprendizaje de la red neuronal utilizada. Como tu
puede ver, a pesar de las épocas de aprendizaje con el conjunto de entrenamiento utilizado, la red neuronal falló
para aprender que el punto 6 (x = 2.5, y = 1.5) pertenece a la primera clase. Este es un resultado que podrías
esperar, ya que representa una excepción y agrega un efecto de incertidumbre a otros puntos en
la segunda clase (los puntos verdes).
https://translate.googleusercontent.com/translate_f 272/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
383
Página 397
Para comprender mejor los datos del conjunto de prueba y sus clases de membresía, muestre los puntos
en un gráfico usando matplotlib.
384
Página 398
https://translate.googleusercontent.com/translate_f 273/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Ahora utilizará este conjunto de pruebas para evaluar la red neuronal SLP y calcular la
exactitud.
385
Página 399
Figura 9-13. La estimación de la clase a la que pertenecen los puntos de ajuste de prueba.
https://translate.googleusercontent.com/translate_f 274/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Los resultados pueden considerarse óptimos, dada la sencillez del modelo utilizado y
la pequeña cantidad de datos utilizados en el conjunto de entrenamiento. Ahora te enfrentarás al mismo problema
con una red neuronal más compleja, el Perceptron Multi Layer.
386
Página 400
Inicie una nueva sesión de IPython, reiniciando el kernel. En cuanto a la primera parte del código,
sigue siendo el mismo que el ejemplo anterior.
387
Página 401
https://translate.googleusercontent.com/translate_f 275/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
En [2]: # parámetros de red
...: n_hidden_1 = 2 # 1a capa número de neuronas
...: # n_hidden_2 = 0 # 2da capa número de neuronas
...: n_input = 2 # entrada de datos de tamaño
...: n_classes = 2 # clases
...:
Ahora tiene que lidiar con la definición de los diversos pesos W y sesgo b para el
diferentes conexiones. La red neuronal es ahora mucho más compleja, con varios
capas a tener en cuenta. Una forma eficaz de parametrizarlos es definirlos como
sigue, comentando los parámetros de peso y sesgo para la segunda capa oculta
(solo para MLP con una capa oculta como este ejemplo).
Para crear un modelo de red neuronal que tenga en cuenta todos los parámetros que ha
especificado dinámicamente, necesita definir una función conveniente, que llamará
multilayer_perceptron ().
388
Página 402
https://translate.googleusercontent.com/translate_f 276/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
minimizar (costo)
...:
Con estas dos últimas líneas has completado la definición del modelo del MLP
red neuronal. Ahora puede pasar a crear una sesión para implementar el aprendizaje
fase.
Fase de aprendizaje
Como en el ejemplo anterior, ahora definirá dos listas que contendrán el número
de épocas y los valores de coste medidos para cada una de ellas. También inicializará todos los
variables antes de iniciar la sesión.
389
Página 403
En [8]: avg_set = []
...: epoch_set = []
...: init = tf.global_variables_initializer ()
...:
Ahora está listo para comenzar a implementar la sesión de aprendizaje. Abra la sesión con
las siguientes instrucciones (recuerde no presionar Enter, sino Enter + Ctrl para insertar otro
comandos más tarde):
Ahora implementa el código a ejecutar para cada época, y dentro de él un escaneo para cada
lote perteneciente al conjunto de entrenamiento. En este caso, tiene un conjunto de entrenamiento que consta de un
un solo lote, por lo que solo tendrá una iteración en la que asignará directamente inputX
y inputY a batch_x y batch_y. En otros casos, necesitará implementar una función,
como next_batch (batch_size), que subdivide todo el conjunto de entrenamiento (por ejemplo,
inputdata) en diferentes lotes, devolviéndolos progresivamente como valor de retorno.
En cada ciclo de lote, la función de costo se minimizará con sess.run ([optimizer,
costo]), que corresponderá a un costo parcial. Todos los lotes contribuirán al
cálculo del costo promedio de todos los lotes avg_cost. Sin embargo, en este caso, dado que
solo tiene un lote, avg_cost es equivalente al costo de todo el conjunto de capacitación.
390
https://translate.googleusercontent.com/translate_f 277/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 404
Antes de ejecutar la sesión, agregue algunas líneas de instrucciones para ver los resultados de la
fase de aprendizaje.
391
Página 405
https://translate.googleusercontent.com/translate_f 278/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: last_result = sess.run (y_, feed_dict = {X: inputX})
...: training_cost = sess.run (cost, feed_dict = {X:
inputX, Y: inputY})
...: print ("Training cost =", training_cost)
...: print ("Último resultado =", last_result)
...:
Finalmente, puedes ejecutar la sesión y obtener los siguientes resultados del aprendizaje
fase.
392
Página 406
393
https://translate.googleusercontent.com/translate_f 279/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 407
[0.93176246 0.06823757]
[0.27190316 0.7280969]
[0.40035316 0.59964687]
[0.04414944 0.9558506]
[0.17278962 0.82721037]
[0.01200284 0.98799717]
[0.19901533 0.80098462]]
Ahora puede ver los datos recopilados en las listas avg_set y epoch_set para analizar
el progreso de la fase de aprendizaje.
Figura 9-14. El valor del costo disminuye durante la fase de aprendizaje (costo
mejoramiento)
394
Página 408
En figura 9-14 , puede ver que durante las épocas de aprendizaje hay una gran
mejora en cuanto a la optimización de costes, luego en la parte final, la
las mejoras de época se hacen más pequeñas y luego convergen a cero.
Sin embargo, del análisis del gráfico se puede determinar que el ciclo de aprendizaje
de la red neuronal se ha completado en los ciclos de época asignados. Así que puedes
considere la red neuronal como aprendida. Ahora puede pasar a la fase de evaluación.
https://translate.googleusercontent.com/translate_f 280/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
generado.
Para probar este modelo de red neuronal MLP, utilizará el mismo conjunto de pruebas utilizado en el
Ejemplo de red neuronal SLP.
395
Página 409
Precisión: 1.0
Resultado = [[0.98507893 0.0149211]
[0.99064976 0.00935023]
[0.86788082 0.13211915]
[0.83086801 0.16913196]
[0,78604239 0,21395761]
[0.36329603 0.63670397]
[0.19036612 0.80963391]
[0.06203776 0.93796223]
[0.0883315 0.91166848]
[0.05140254 0.94859749]
[0.10417036 0.89582968]]
https://translate.googleusercontent.com/translate_f 281/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: plt.show ()
...:
396
Página 410
Obtendrá una tabla (vea la Figura 9-15) de los puntos distribuidos en el plano cartesiano
con el color que va del azul al amarillo, lo que indica la probabilidad de pertenecer a
una de las dos clases.
Figura 9-15. La estimación de la clase a la que pertenecen los puntos de ajuste de prueba.
397
Página 411
https://translate.googleusercontent.com/translate_f 282/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: n_muestras = 11
...: tamaño_lote = 11
...: total_batch = int (n_samples / batch_size)
...:
...: # Parámetros de red
...: n_hidden_1 = 4 # 1a capa número de neuronas
...: n_hidden_2 = 2 # 2da capa número de neuronas
...: n_input = 2 # entrada de datos de tamaño
...: n_classes = 2 # clases
...:
...: # tf Entrada de gráfico
...: X = tf.placeholder ("float", [None, n_input])
...: Y = tf.placeholder ("float", [None, n_classes])
...:
...: # Almacenar el peso y el sesgo de las capas
...: pesos = {
...: 'h1': tf.Variable (tf.random_normal ([n_input, n_hidden_1])),
...: 'h2': tf.Variable (tf.random_normal ([n_hidden_1, n_hidden_2])),
...: 'fuera': tf.Variable (tf.random_normal ([n_hidden_2, n_classes]))
...:}
...: sesgos = {
...: 'b1': tf.Variable (tf.random_normal ([n_hidden_1])),
...: 'b2': tf.Variable (tf.random_normal ([n_hidden_2])),
...: 'fuera': tf.Variable (tf.random_normal ([n_classes]))
...:}
...:
...: # Crear modelo
398
Página 412
https://translate.googleusercontent.com/translate_f 283/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: #batch_x, batch_y = inputdata.next_batch (batch_size)
A SER IMPLEMENTADO
...: batch_x = inputX
...: batch_y = inputY
...: _, c = sess.run ([optimizador, coste],
feed_dict = {X: batch_x, Y: batch_y})
...: # Calcular la pérdida promedio
399
Página 413
400
Página 414
https://translate.googleusercontent.com/translate_f 284/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Época: 1201 costo = 0.070393734
Época: 1251 costo = 0.070388250
Época: 1301 costo = 0.070384577
Época: 1351 costo = 0.070382126
Época: 1401 costo = 0.070380524
Época: 1451 costo = 0.070379473
Época: 1501 costo = 0.070378840
Época: 1551 costo = 0.070378408
Época: 1601 costo = 0.070378155
Época: 1651 costo = 0.070378013
Época: 1701 costo = 0.070377886
Época: 1751 costo = 0.070377827
Época: 1801 costo = 0.070377797
Época: 1851 costo = 0.070377767
Época: 1901 costo = 0.070377775
Época: costo de 1951 = 0.070377789
Fase de formación finalizada
Costo de formación = 0,0703778
Último resultado = [[0,99683338 0,00316658]
[0.98408335 0.01591668]
[0.96478891 0.0352111]
[0.93620235 0.06379762]
[0.94662082 0.05337923]
[0.26812935 0.73187065]
[0.40619871 0.59380126]
[0.03710628 0.96289372]
[0.16402677 0.83597326]
[0.0090636 0.99093646]
[0.19166829 0.80833173]]
401
Página 415
Figura 9-16. La tendencia del costo durante la fase de aprendizaje para un MLP con dos
capas ocultas
https://translate.googleusercontent.com/translate_f 285/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Por lo que puede ver en la Figura 9-16, el aprendizaje en este caso es mucho más rápido que el
caso anterior (en 1000 épocas, estaría bien). El costo optimizado es casi el mismo
como en la red neuronal anterior (0.0703778 versus 0.0705207 en el caso anterior).
402
Página 416
Precisión: 1.0
Resultado = [[0.98924851 0.01075149]
[0,99344641 0,00655352]
[0.88655776 0.11344216]
[0.85117978 0.14882027]
[0,8071683 0,19283174]
[0.36805421 0.63194579]
[0.18399802 0.81600195]
[0.05498539 0.9450146]
[0.08029026 0.91970974]
[0.04467025 0.95532972]
[0.09523712 0.90476292]]
403
Página 417
Aquí, también, tiene una precisión del 100% y con matplotlib mostrando los puntos de ajuste de prueba
https://translate.googleusercontent.com/translate_f 286/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
en el plano cartesiano con el sistema de degradado de color habitual, obtendrá muy similar
resultados a los ejemplos anteriores (ver Figura 9-17 ).
Figura 9-17. La estimación de la clase a la que pertenecen los puntos de ajuste de prueba.
404
Página 418
Luego envíe estos puntos a la red neuronal para determinar la clase de membresía.
https://translate.googleusercontent.com/translate_f 287/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
...: pred = tf.nn.softmax (evidencia)
...: result = sess.run (pred, feed_dict = {X: test})
...:
405
Página 419
Como puede ver según las tonalidades, se delimitan dos áreas de clasificación en
el plano, con las partes alrededor del verde que indican las zonas de incertidumbre.
Los resultados de la clasificación se pueden hacer más comprensibles y claros al decidir
establecer con base en la probabilidad si el punto pertenece a una u otra clase. Si el
La probabilidad de que un punto pertenezca a una clase sea mayor que 0.5, entonces pertenecerá a ella.
406
Página 420
https://translate.googleusercontent.com/translate_f 288/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 9-19. Los puntos delimitan las dos regiones correspondientes a las dos
clases de pertenencia
En el gráfico que se muestra en la Figura 9-19 , puede ver claramente las dos regiones del
Plano cartesiano que caracteriza a las dos clases de pertenencia.
Conclusiones
En este capítulo, aprendió sobre la rama del aprendizaje automático que usa
redes como una estructura informática, llamado aprendizaje profundo. Ha leído una descripción general de la
conceptos básicos de aprendizaje profundo, que involucra redes neuronales y su estructura.
Finalmente, gracias a la biblioteca de TensorFlow, implementó diferentes tipos de
redes, como Perceptron Single Layer y Perceptron Multi Layer.
El aprendizaje profundo, con todas sus técnicas y algoritmos, es un tema muy complejo, y
es prácticamente imposible tratarlo adecuadamente en un capítulo. Sin embargo, ahora tienes
familiarizarse con el aprendizaje profundo y puede comenzar a implementar sistemas neuronales más complejos
redes.
407
Página 421
CAPÍTULO 10
Un ejemplo-
Datos meteorológicos
Un tipo de datos que es más fácil de encontrar en la red son los datos meteorológicos. Muchos sitios
proporcionar datos históricos sobre muchos parámetros meteorológicos como la presión,
temperatura, humedad, lluvia, etc. Solo necesita especificar la ubicación y la fecha para
Obtenga un archivo con conjuntos de datos de mediciones recopilados por estaciones meteorológicas. Estos datos son una
fuente de una amplia gama de información. Como leyó en el primer capítulo de este libro, la
El propósito del análisis de datos es transformar los datos sin procesar en información y luego convertirlos
en conocimiento.
https://translate.googleusercontent.com/translate_f 289/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
En este capítulo, verá un ejemplo sencillo de cómo utilizar los datos meteorológicos. Esta
Este ejemplo será útil para tener una idea general de cómo aplicar muchas de las técnicas vistas
en los capítulos anteriores.
409
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_10
Página 422
410
https://translate.googleusercontent.com/translate_f 290/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 423
Figura 10-1. Una imagen del valle del Po y el mar Adriático (Google Maps)
411
Página 424
El primer paso es elegir un conjunto de 10 ciudades que servirán como estándares de referencia.
Estas ciudades se seleccionan para cubrir todo el rango de la llanura (ver Figura 10-2 ).
https://translate.googleusercontent.com/translate_f 291/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 10-2. Las 10 ciudades elegidas como muestra (hay otra que se utiliza como
referencia para tomar distancias del mar)
En figura 10-2 puede ver las 10 ciudades que se eligieron para analizar los datos meteorológicos: cinco
ciudades dentro de los primeros 100 km y las otras cinco distribuidas en los 300 km restantes.
Aquí están las ciudades elegidas:
• Ferrara
• Turín
• Mantua
• Milán
• Ravenna
• Asti
• Bolonia
• Piacenza
• Cesena
• Faenza
412
Página 425
Ahora tenemos que determinar las distancias de estas ciudades al mar. Puedes seguir
muchos procedimientos para obtener estos valores. En este caso, puede utilizar el servicio proporcionado por
el sitio TheTimeNow (http://www.thetimenow.com/distance-calculator.php), cual
está disponible en muchos idiomas (ver Figura 10-3).
https://translate.googleusercontent.com/translate_f 292/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
asti 315 Distancia asti-Comacchio
torino 357 Distancia torino-Comacchio
413
Página 426
Una vez que se haya registrado para obtener una cuenta y haya recibido un código de identificación de la aplicación, este sitio habilita
Usted puede capturar datos especificando la ciudad a través de una solicitud a través de URL.
http://api.openweathermap.org/data/2.5/weather?q=Atlanta,US&appid=5807ad2a4
5eb6bf4e81d137dafe74e15
Esta solicitud devolverá un archivo JSON que contiene toda la información sobre el
situación meteorológica actual en la ciudad en cuestión (ver Figura 10-5 ). Este archivo JSON será
enviado para el análisis de datos utilizando la biblioteca Python pandas.
414
Página 427
Figura 10-5. El archivo JSON que contiene los datos meteorológicos de la ciudad.
pedido
https://translate.googleusercontent.com/translate_f 293/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
cuaderno jupyter
El primer paso es estudiar la estructura de los datos recibidos del sitio a través de un
solicitud específica.
Elija una ciudad de las elegidas para nuestro estudio, por ejemplo Ferrara, y haga una
solicitud de sus datos meteorológicos actuales, utilizando la URL especificada. Sin navegador
puede obtener el contenido de texto de una página utilizando la función de texto request.get (). Desde el
El contenido obtenido está en formato JSON podemos leer directamente el texto recibido siguiendo este
formatear con la función json.load ().
importar json
solicitudes de importación
ferrara = json.loads (request.get ('http://api.openweathermap.org/data/2.5/
weather? q = Ferrara, IT & appid = 5807ad2a45eb6bf4e81d137dafe74e15 '). texto)
415
Página 428
Ahora puede ver el contenido del archivo JSON con los datos meteorológicos relacionados
a la ciudad de Ferrara.
ferrara
{'base': 'estaciones',
'nubes': {'todo': 40},
'bacalao': 200,
'coord': {'lat': 44.84, 'lon': 11.62},
'dt': 1525960500,
'id': 3177090,
'principal': {'humedad': 64,
'presión': 1010,
'temp': 296.58,
'temp_max': 297,15,
'temp_min': 296.15},
'nombre': 'Ferrara',
'sys': {'país': 'IT',
'id': 5816,
'mensaje': 0.0051,
'amanecer': 1525924226,
'atardecer': 1525977007,
'tipo 1},
'visibilidad': 10000,
'weather': [{'description': 'nubes dispersas',
'icono': '03d',
'id': 802,
'main': 'Nubes'}],
'viento': {'deg': 240, 'velocidad': 3.1}}
Cuando desee analizar la estructura de un archivo JSON, un comando útil puede ser el
https://translate.googleusercontent.com/translate_f 294/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
siguiendo:
lista (ferrara.keys ())
['coord',
'clima',
'base',
416
Página 429
'principal',
'visibilidad',
'viento',
'nubes',
'dt',
'sys',
'carné de identidad',
'nombre',
'bacalao']
De esta forma, puede tener una lista de todas las claves que componen la estructura interna del
JSON. Una vez que sepa el nombre de estas claves, podrá acceder fácilmente a los datos internos.
417
Página 430
https://translate.googleusercontent.com/translate_f 295/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Ahora elegirás los valores que consideres más interesantes o útiles para este
tipo de análisis. Por ejemplo, un valor importante es la temperatura:
El propósito de este análisis de la estructura inicial es identificar los datos que podrían ser
más importante en la estructura JSON. Estos datos deben procesarse para su análisis. Ese
es decir, los datos deben extraerse de la estructura, limpiarse o modificarse de acuerdo con nuestro
necesidades y ordenado dentro de un marco de datos. De esta manera, luego puede aplicar todo el análisis de datos
técnicas presentadas en este libro.
Una forma conveniente de evitar repetir el mismo código es insertar alguna extracción
procedimientos en una función, como la siguiente.
418
Página 431
Esta función no hace más que tomar los datos meteorológicos que estás
interesado en la estructura JSON, y una vez limpiado o modificado (por ejemplo, fechas
y tiempos), esos datos se recopilan en una fila de un marco de datos (como se muestra en la Figura 10-6 ).
Figura 10-6. El marco de datos obtenido con los datos procesados a partir de la extracción JSON
Entre todos los parámetros descritos en la estructura JSON dentro de la columna de la lista,
aquí están los más apropiados para el estudio.
• Temperatura
• Humedad
• Presión
• Descripción
https://translate.googleusercontent.com/translate_f 296/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
• Velocidad del viento
• Grado de viento
Todas estas propiedades estarán relacionadas con el tiempo de adquisición expresado a partir del dt
columna, que contiene una marca de tiempo como tipo de datos. Este valor es difícil de leer, por lo que
lo convertirá en un formato de fecha y hora que le permite expresar la fecha y la hora en un
manera más familiar para ti. La nueva columna se llamará día.
419
Página 432
La temperatura se expresa en grados Kelvin, por lo que deberá convertir estos valores
a Celsius restando 273.15 de cada valor.
Finalmente, agrega el nombre de la ciudad pasada como segundo argumento a prepare ()
función.
La recopilación de datos se realiza a intervalos regulares para recopilar datos durante diferentes momentos
del día. Por ejemplo, puede utilizar un programa que ejecute estas solicitudes cada
hora. Cada adquisición tendrá una fila de la estructura del marco de datos que se agregará a
un marco de datos general relacionado con la ciudad, llamado por ejemplo, df_ferrara (como se muestra en
Figura 10-7).
df_ferrara = t1
t2 = preparar (ferrara, 'ferrara')
df_ferrara = df_ferrara.append (t2)
df_ferrara
A menudo sucede que algunos datos útiles para nuestro análisis pueden no estar presentes en el
Fuente JSON. En este caso, debe recurrir a otras fuentes de datos e importar el
datos faltantes en la estructura. Dentro de este ejemplo de análisis, las distancias de las ciudades
del mar son indispensables.
.
df_ravenna ['dist'] = 8
df_cesena ['dist'] = 14
df_faenza ['dist'] = 37
df_ferrara ['dist'] = 47
df_bologna ['dist'] = 71
df_mantova ['dist'] = 121
df_piacenza ['dist'] = 200
df_milano ['dist'] = 250
df_asti ['dist'] = 315
df_torino ['dist'] = 357
.
420
Página 433
df_cesena
Como puede ver en la Figura 10-8, Jupyter Notebook hace que sea mucho más fácil de leer
marcos de datos con la generación de tablas gráficas. Además, puede ver que cada
La fila muestra los valores medidos para cada hora del día, cubriendo una línea de tiempo de aproximadamente 20
horas en el pasado.
421
Página 434
En el caso que se muestra en la Figura 10-8 , tenga en cuenta que solo hay 19 filas. De hecho, observando
otras ciudades, es posible que los sistemas de medición meteorológica a veces fallaran
durante el proceso de medición, dejando huecos durante la adquisición. Sin embargo, si los datos
https://translate.googleusercontent.com/translate_f 298/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
recolectados son 19, como en este caso, son suficientes para describir la tendencia de la meteorología
propiedades durante el día. Sin embargo, es una buena práctica comprobar el tamaño de los 10
marcos de datos. Si una ciudad proporciona datos insuficientes para describir la tendencia diaria, necesitará
para reemplazarlo con otra ciudad.
Existe una forma sencilla de comprobar el tamaño, sin tener que poner una mesa tras otra.
Gracias a la función shape () puedes determinar el número de datos adquiridos (líneas)
para cada ciudad.
imprimir (df_ferrara.shape)
imprimir (df_milano.shape)
imprimir (df_mantova.shape)
imprimir (df_ravenna.shape)
imprimir (df_torino.shape)
imprimir (df_asti.shape)
422
Página 435
imprimir (df_bologna.shape)
imprimir (df_piacenza.shape)
imprimir (df_cesena.shape)
imprimir (df_faenza.shape)
(20, 9)
(18, 9)
(20, 9)
(18, 9)
(20, 9)
(20, 9)
(20, 9)
(20, 9)
(20, 9)
(19, 9)
Como puede ver, la elección de 10 ciudades ha resultado ser óptima, ya que el control
las unidades han proporcionado datos suficientes para continuar en el análisis de datos.
Una forma normal de abordar el análisis de los datos que acaba de recopilar es utilizar
Visualización de datos. Viste que la biblioteca matplotlib incluye un conjunto de herramientas para generar
gráficos en los que mostrar datos. De hecho, la visualización de datos le ayuda mucho durante la
análisis para descubrir algunas características del sistema que está estudiando.
Luego activa las bibliotecas necesarias:
% matplotlib en línea
importar matplotlib.pyplot como plt
importar matplotlib.dates como mdates
y1 = df_milano ['temp']
x1 = df_milano ['día']
fig, ax = plt.subplots ()
plt.xticks (rotación = 70)
423
Página 436
https://translate.googleusercontent.com/translate_f 299/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Al ejecutar este código, obtendrá el gráfico que se muestra en la Figura 10-9 . Como puede ver, el
La tendencia de temperatura sigue un patrón casi sinusoidal caracterizado por una temperatura
que sube por la mañana, para alcanzar el valor máximo durante el calor de la tarde
(entre las 2:00 y las 6:00 pm). Entonces la temperatura desciende a un valor mínimo
correspondiente a poco antes del amanecer, es decir, a las 6:00 am.
y1 = df_ravenna ['temp']
x1 = df_ravenna ['día']
y2 = df_faenza ['temp']
x2 = df_faenza ['día']
424
Página 437
y3 = df_cesena ['temp']
x3 = df_cesena ['día']
y4 = df_milano ['temp']
x4 = df_milano ['día']
y5 = df_asti ['temp']
x5 = df_asti ['día']
y6 = df_torino ['temp']
x6 = df_torino ['día']
fig, ax = plt.subplots ()
plt.xticks (rotación = 70)
horas = mdates.DateFormatter ('% H:% M')
ax.xaxis.set_major_formatter (horas)
plt.plot (x1, y1, 'r', x2, y2, 'r', x3, y3, 'r')
plt.plot (x4, y4, 'g', x5, y5, 'g', x6, y6, 'g')
Este código producirá el gráfico que se muestra en la Figura 10-10. La temperatura de los tres
ciudades más cercanas al mar se muestra en rojo, mientras que la temperatura de las tres ciudades más alejadas
de distancia está en verde.
https://translate.googleusercontent.com/translate_f 300/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 10-10. La tendencia de las temperaturas de seis ciudades diferentes (el rojo es el más cercano
al mar; el verde es el más lejano)
425
Página 438
Mirando la Figura 10-10, los resultados parecen prometedores. De hecho, las tres ciudades más cercanas
tienen temperaturas máximas mucho más bajas que las más lejanas, mientras que parece
ser poca diferencia en las temperaturas mínimas.
Para profundizar en este aspecto, puede recoger el máximo y el mínimo
temperaturas de las 10 ciudades y mostrar un gráfico de líneas que muestra estas temperaturas
en comparación con la distancia del mar.
426
https://translate.googleusercontent.com/translate_f 301/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 439
427
Página 440
Como se muestra en la figura 10-11, se puede afirmar que la hipótesis de que la presencia del
el mar de alguna manera influye en los parámetros meteorológicos es cierto (al menos en el día de hoy ☺).
Además, puede ver que el efecto del mar disminuye rápidamente, y después de aproximadamente
60-70 km, las temperaturas máximas alcanzan una meseta.
Algo interesante sería representar las dos tendencias diferentes con dos
líneas obtenidas por regresión lineal. Para hacer esto, puede utilizar el método SVR proporcionado por
la biblioteca scikit-learn.
x = np.array (dist)
y = np.array (temp_max)
x1 = x [x <100]
x1 = x1.reshape ((x1.size, 1))
y1 = y [x <100]
x2 = x [x> 50]
https://translate.googleusercontent.com/translate_f 302/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
x2 = x2.reforma ((x2.tamaño, 1))
y2 = y [x> 50]
desde sklearn.svm importar SVR
svr_lin1 = SVR (kernel = 'lineal', C = 1e3)
svr_lin2 = SVR (kernel = 'lineal', C = 1e3)
svr_lin1.fit (x1, y1)
svr_lin2.fit (x2, y2)
xp1 = np. rango (10,100,10) .reshape ((9,1))
xp2 = np. rango (50,400,50) .reshape ((7,1))
yp1 = svr_lin1.predict (xp1)
yp2 = svr_lin2.predict (xp2)
plt.plot (xp1, yp1, c = 'r', label = 'Fuerte efecto de mar')
plt.plot (xp2, yp2, c = 'b', label = 'Efecto mar de luz')
eje plt. ((0,400,27,32))
plt.scatter (x, y, c = 'k', etiqueta = 'datos')
428
Página 441
Figura 10-12. Las dos tendencias descritas por las temperaturas máximas en relación
a distancia
Como puede ver, el aumento de temperatura en los primeros 60 km es muy rápido, pasando de 28 a
31 grados. Luego aumenta muy levemente (si es que lo hace) en distancias más largas. Las dos tendencias
se describen mediante dos líneas rectas que tienen la siguiente expresión
x = ax + b
imprimir (svr_lin1.coef_)
imprimir (svr_lin1.intercept_)
imprimir (svr_lin2.coef_)
imprimir (svr_lin2.intercept_)
[[-0.04794118]]
[27.65617647]
[[-0.00317797]]
[30.2854661]
https://translate.googleusercontent.com/translate_f 303/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
429
Página 442
Puede considerar el punto de intersección de las dos líneas como el punto entre
área donde el mar ejerce su influencia y área donde no, o al menos no como
fuertemente.
430
Página 443
https://translate.googleusercontent.com/translate_f 304/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 10-13. El punto de intersección entre dos líneas rectas obtenido por
regresión lineal
Entonces se puede decir que la distancia promedio en la que se desvanecen los efectos del mar es
58 km.
Ahora puedes analizar las temperaturas mínimas.
431
Página 444
En este caso parece muy claro que el mar no influye en las temperaturas mínimas
grabado durante la noche, o mejor dicho, alrededor de las seis de la mañana. Si recuerdo bien
cuando era niño me enseñaron que el mar mitigaba las frías temperaturas, o que el
mar libera el calor absorbido durante el día. Este no parece ser el caso. Esta
caso rastrea el verano en Italia; Sería interesante ver si esta hipótesis es cierta en el
invierno o en otro lugar.
Otra medida meteorológica contenida en los 10 marcos de datos es la humedad.
Incluso para esta medida, puede ver la tendencia de la humedad durante el día para los tres
ciudades más cercanas al mar y para las tres más alejadas.
y1 = df_ravenna ['humedad']
x1 = df_ravenna ['día']
y2 = df_faenza ['humedad']
https://translate.googleusercontent.com/translate_f 305/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
x2 = df_faenza ['día']
y3 = df_cesena ['humedad']
x3 = df_cesena ['día']
y4 = df_milano ['humedad']
x4 = df_milano ['día']
432
Página 445
y5 = df_asti ['humedad']
x5 = df_asti ['día']
y6 = df_torino ['humedad']
x6 = df_torino ['día']
fig, ax = plt.subplots ()
plt.xticks (rotación = 70)
horas = mdates.DateFormatter ('% H:% M')
ax.xaxis.set_major_formatter (horas)
plt.plot (x1, y1, 'r', x2, y2, 'r', x3, y3, 'r')
plt.plot (x4, y4, 'g', x5, y5, 'g', x6, y6, 'g')
Figura 10-15. La tendencia de la humedad durante el día para las tres ciudades más cercanas al
mar (se muestra en rojo) y las tres ciudades más lejanas (indicadas en verde)
A primera vista, parecería que las ciudades más cercanas al mar experimentan más
humedad que los más lejanos y que esta diferencia de humedad (alrededor del 20%)
se extiende a lo largo del día. Veamos si esto sigue siendo cierto cuando informamos el máximo
y humedad mínima con respecto a las distancias del mar.
433
Página 446
https://translate.googleusercontent.com/translate_f 306/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
df_piacenza ['humedad']. max (),
df_milano ['humedad']. max (),
df_asti ['humedad']. max (),
df_torino ['humedad']. max ()
]
plt.plot (dist, hum_max, 'bo')
434
Página 447
https://translate.googleusercontent.com/translate_f 307/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
435
Página 448
Mirando Figuras 10-16 y10-17, ciertamente puede ver que la humedad es más alta,
tanto el mínimo como el máximo, en la ciudad más cercana al mar. Sin embargo, en mi opinión,
No es posible decir que existe una relación lineal o algún otro tipo de relación con
dibuja una curva. Los puntos recopilados (10) son demasiado pocos para resaltar una tendencia en este caso.
El viento rosa
Entre los diversos datos meteorológicos medidos que hemos recopilado para cada ciudad
son las relativas al viento:
436
Página 449
https://translate.googleusercontent.com/translate_f 308/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Para analizar mejor este tipo de datos es necesario visualizarlos. En este caso un
El gráfico lineal en coordenadas cartesianas no es el enfoque más óptimo.
Si usa el gráfico de dispersión clásico con los puntos contenidos en un solo marco de datos:
437
Página 450
Figura 10-19. Un diagrama de dispersión que representa una distribución de 360 grados.
Para representar una distribución de puntos en 360 grados, es mejor utilizar otro tipo de
visualización: la carta polar. Ya ha visto este tipo de gráfico en el Capítulo 8 .
Primero debe crear un histograma, mediante el cual los datos se distribuyan
intervalo de 360 grados dividido en ocho contenedores, cada uno de los cuales es de 45 grados.
https://translate.googleusercontent.com/translate_f 309/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
hist, bins = np.histogram (df_ravenna ['wind_deg'], 8, [0,360])
imprimir (hist)
imprimir (contenedores)
Los valores devueltos son ocurrencias dentro de cada bin expresados por una matriz llamada hist:
[0 5 11 1 0 1 0 0]
y una matriz llamada bins, que define los bordes de cada bin dentro del rango de 360
grados.
438
Página 451
Estos arreglos serán útiles para definir correctamente el gráfico polar a dibujar. Para esto
propósito, debe crear una función en parte utilizando el código contenido en el Capítulo 8 .
Llamará a esta función showRoseWind () y necesitará tres argumentos diferentes:
valores es la matriz que contiene los valores a mostrar, que en nuestro caso será el
matriz hist; city_name es una cadena que contiene el nombre de la ciudad que se mostrará como gráfico
título; y max_value es un número entero que establecerá el valor máximo para presentar
el color azul.
Definir una función de este tipo le ayuda a evitar reescribir el mismo código muchas veces,
y produce un código más modular, lo que le permite centrarse en los conceptos relacionados
a una operación particular dentro de una función.
Una cosa que cambió es el mapa de colores en colores. En este caso, cuanto más cerca del azul
color de la rebanada, mayor es el valor que representa.
Una vez que defina una función, puede usarla:
439
Página 452
https://translate.googleusercontent.com/translate_f 310/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Ejecutando este código obtendrás un gráfico polar como el que se muestra en la Figura 10-20 .
Como puede ver en la Figura 10-20 , tiene un rango de 360 grados dividido en ocho
áreas de 45 grados cada una (bin), en las que se representa radialmente una escala de valores. En cada
de las ocho áreas, un corte se representa con una longitud variable que corresponde exactamente
al valor correspondiente. Cuanto más extendido radialmente esté el corte, mayor será el valor
representado. Para aumentar la legibilidad del gráfico, se ha creado una escala de colores.
ingresado que corresponde a la extensión de su segmento. Cuanto más ancha sea la rebanada, más
el color tiende a un azul profundo.
Este gráfico polar le proporciona información sobre cómo será la dirección del viento.
distribuido radialmente. En este caso, el viento ha soplado puramente hacia el suroeste / oeste.
la mayor parte del día.
440
Página 453
Una vez que haya definido la función showRoseWind, es muy fácil observar la
vientos con respecto a cualquiera de las 10 ciudades de la muestra.
https://translate.googleusercontent.com/translate_f 311/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 10-21. Los gráficos polares muestran la distribución de la dirección del viento.
441
Página 454
Esta función devuelve una matriz NumPy que contiene las ocho velocidades medias del viento. Esta
array se utilizará como primer argumento de la función ShowRoseWind_Speed (), que
es una versión mejorada de la función ShowRoseWind () anterior utilizada para representar la
carta polar.
Figura 10-22 representa el RoseWind correspondiente a las velocidades del viento distribuidas
alrededor de 360 grados.
Figura 10-22. Este gráfico polar representa la distribución de las velocidades del viento dentro
360 grados
442
https://translate.googleusercontent.com/translate_f 312/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 455
Al final de todo este trabajo, puede guardar el marco de datos como un archivo CSV, gracias a la
función to_csv () de la biblioteca de pandas.
df_ferrara.to_csv ('ferrara.csv')
df_milano.to_csv ('milano.csv')
df_mantova.to_csv ('mantova.csv')
df_ravenna.to_csv ('ravenna.csv')
df_torino.to_csv ('torino.csv')
df_asti.to_csv ('asti.csv')
df_bologna.to_csv ('bologna.csv')
df_piacenza.to_csv ('piacenza.csv')
df_cesena.to_csv ('cesena.csv')
df_faenza.to_csv ('faenza.csv')
Conclusiones
El propósito de este capítulo fue principalmente mostrar cómo puede obtener información de
datos brutos. Parte de esta información no conducirá a conclusiones importantes, mientras que otras
información conducirá a la confirmación de una hipótesis, aumentando así su estado de
conocimiento. Estos son los casos en los que el análisis de datos ha tenido éxito.
En el siguiente capítulo, verá otro caso relacionado con datos reales obtenidos de
una fuente de datos abierta. También verá cómo puede mejorar aún más el gráfico
representación de los datos utilizando la biblioteca de JavaScript D3. Esta biblioteca, aunque no
Python, se puede integrar fácilmente en Python.
443
Página 456
CAPÍTULO 11
Incrustar JavaScript
Biblioteca D3 en IPython
Cuaderno
En este capítulo, verá cómo ampliar las capacidades de la representación gráfica
https://translate.googleusercontent.com/translate_f 313/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
incluida la biblioteca JavaScript D3 en su Jupyter Notebook. Esta biblioteca tiene enormes
gráficos potenciales y le permite construir representaciones gráficas que incluso el
La biblioteca matplotlib no puede representar.
En el transcurso de los diversos ejemplos, verá cómo puede implementar JavaScript
código en un entorno Python, utilizando la gran capacidad del Jupyter integrador
Cuaderno. También verá diferentes formas de usar los datos contenidos en los marcos de datos de Pandas
Pandas en representaciones basadas en código JavaScript.
445
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_11
Página 457
Figura 11-1. Esta es la página de inicio de la Oficina del Censo de Estados Unidos.
Ahora que tiene todas las bibliotecas necesarias, puede comenzar importando datos
de Census.gov en su cuaderno. Por lo tanto, debe cargar CO-EST2014-alldata.
csv directamente en forma de marco de datos de Pandas. La función pd.read_csv ()
https://translate.googleusercontent.com/translate_f 314/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
446
Página 458
convertir los datos tabulares contenidos en un archivo CSV a un marco de datos Pandas, que nombrará
pop2014. Con la opción dtype, puede forzar la interpretación de algunos campos que
podría interpretarse como números, en su lugar, como cadenas.
url = "https://raw.githubusercontent.com/dwdii/IS608-VizAnalytics/master/
Proyecto final / Datos / CO-EST2014-alldata.csv "
pop2014 = pd.read_csv (url, encoding = 'latin-1', dtype = {'ESTADO': 'str',
'CONDADO': 'str'})
Una vez que haya adquirido y recopilado datos en el marco de datos pop2014, podrá ver
cómo están estructurados simplemente escribiendo:
pop2014
Figura 11-2. El marco de datos pop2014 contiene todos los datos demográficos de los años.
de 2010 a 2014
Analizando cuidadosamente la naturaleza de los datos, puede ver cómo están organizados
dentro del marco de datos. La columna SUMLEV contiene el nivel geográfico de los datos; para
ejemplo, 40 indica un estado y 50 indica datos que cubren un solo condado.
Las columnas REGION, DIVISION, STATE y COUNTY contienen subdivisiones jerárquicas
de todas las áreas en las que se ha dividido el territorio estadounidense. STNAME y CTYNAME indican
el nombre del estado y el condado, respectivamente. Las siguientes columnas contienen el
datos sobre población. CENSUS2010POP es la columna que contiene los datos reales en el
población, es decir, los datos que fueron recopilados por el censo de 2010. Siguiendo eso son
otras columnas con las estimaciones de población calculadas para cada año. En este ejemplo,
puede ver 2010 (2011, 2012, 2013 y 2014 también están en el marco de datos, pero no se muestran en
Figura 11-2).
447
Página 459
https://translate.googleusercontent.com/translate_f 315/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Obtiene un marco de datos como el que se muestra en la Figura 11-3 .
Figura 11-3. El marco de datos pop2014_by_state contiene todos los datos demográficos relacionados
a los estados
Sin embargo, el marco de datos que se acaba de obtener todavía contiene demasiadas columnas con
información innecesaria. Dado el elevado número de columnas, en lugar de realizar
su eliminación con la función drop (), es más conveniente realizar una extracción.
448
Página 460
Ahora que tiene la información esencial necesaria, puede comenzar a hacer gráficos
representaciones. Por ejemplo, puede determinar los cinco estados más poblados del
país.
Enumerarlos en orden descendente, recibirá una trama de datos como se muestra en la Figura 11- 4.
Figura 11-4. Los cinco estados más poblados de los Estados Unidos
Por ejemplo, puede utilizar un gráfico de barras para representar los cinco estados más poblados de
orden descendiente. Este trabajo se logra fácilmente con matplotlib, pero en este capítulo,
aprovechará esta sencilla representación para ver cómo puede utilizar JavaScript
Biblioteca D3 para crear la misma representación.
La biblioteca JavaScript D3
D3 es una biblioteca de JavaScript que permite la inspección y manipulación directa del DOM
objeto (HTML5), pero está destinado únicamente a la visualización de datos y hace su trabajo
excelentemente. De hecho, el nombre D3 se deriva de las tres D contenidas en "datos controlados
documentos." D3 fue desarrollado íntegramente por Mike Bostock.
Esta biblioteca está demostrando ser muy versátil y potente, gracias a las tecnologías
en el que se basa: JavaScript, SVG y CSS. D3 combina una visualización potente
componentes con un enfoque basado en datos para la manipulación DOM. Al hacerlo, D3
aprovecha al máximo las capacidades del navegador moderno.
https://translate.googleusercontent.com/translate_f 316/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Dado que incluso los Jupyter Notebooks son objetos web y utilizan las mismas tecnologías
que son la base del navegador actual, la idea de utilizar esta biblioteca, aunque
JavaScript, dentro del cuaderno no es tan absurdo como puede parecer al principio.
449
Página 461
Para aquellos que no están familiarizados con la biblioteca JavaScript D3 y quieren saber más sobre
este tema, recomiendo leer otro libro, titulado "Crear gráficos web con D3",
por F. Nelli (Apress, 2014).
De hecho, Jupyter Notebook tiene la función mágica %% javascript para integrar
Código JavaScript dentro del código Python.
Pero el código JavaScript, de manera similar a Python, requiere que importe algunos
Bibliotecas. Las bibliotecas están disponibles en línea y deben cargarse cada vez que inicie el
ejecución. En HTML, el proceso de importación de la biblioteca tiene una construcción particular:
Esta es una etiqueta HTML. Para realizar la importación dentro de un Jupyter Notebook, debe
en su lugar, use esta construcción diferente:
%% javascript
require.config ({
caminos: {
d3: '//cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min'
}
});
Con require.config (), puede importar todas las bibliotecas de JavaScript necesarias.
Además, si está familiarizado con el código HTML, sabrá con seguridad que necesita
para definir estilos CSS si desea fortalecer la capacidad de visualización de un HTML
página. Paralelamente, también en Jupyter Notebook, puede definir un conjunto de estilos CSS. Que hacer
esto se puede escribir código HTML, gracias a la función HTML () perteneciente al IPython.
módulo core.display. Por lo tanto, realice las definiciones CSS adecuadas de la siguiente manera:
.bar {
relleno: azul acero;
}
450
Página 462
.bar: hover {
relleno: marrón;
}
.axis {
fuente: 10px sans-serif;
}
https://translate.googleusercontent.com/translate_f 317/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
.axis line {
llenar: ninguno;
trazo: # 000;
}
.x.axis path {
pantalla: ninguna;
}
</style>
<div id = "chart_d3" />
"" "))
En la parte inferior del código anterior, observa que se identifica la etiqueta HTML <div>
como chart_d3. Esta etiqueta identifica la ubicación donde se representará.
Ahora tienes que escribir el código JavaScript utilizando las funciones proporcionadas por
Biblioteca D3. Usando el objeto Plantilla proporcionado por la biblioteca Jinja2, puede definir
código JavaScript dinámico donde puede reemplazar el texto según los valores
contenido en un marco de datos Pandas.
Si todavía no hay una biblioteca Jinja2 instalada en su sistema, siempre puede instalarla
con Anaconda.
O usando
451
Página 463
Una vez que haya instalado esta biblioteca, puede definir la plantilla.
importar jinja2
var data = []
var margin = {top: 20, right: 20, bottom: 30, left: 40},
ancho = 800 - margin.left - margin.right,
altura = 400 - margin.top - margin.bottom;
var x = d3.scale.ordinal ()
.rangeRoundBands ([0, ancho], .25);
var y = d3.scale.linear ()
.range ([altura, 0]);
var xAxis = d3.svg.axis ()
.escala (x)
.orient ("abajo");
https://translate.googleusercontent.com/translate_f 318/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
garrapatas (10)
.tickFormat (d3.format ('. 1s'));
452
Página 464
svg.append ("g")
.attr ("clase", "eje x")
.attr ("transformar", "traducir (0," + altura + ")")
.call (xAxis);
svg.append ("g")
.attr ("clase", "eje y")
.call (yAxis)
.append ("texto")
.attr ("transformar", "rotar (-90)")
.attr ("y", 6)
.attr ("dy", ".71em")
.style ("ancla de texto", "fin")
.text ("Población");
svg.selectAll (". bar")
.data (datos)
.enter (). append ("rect")
.attr ("clase", "barra")
.attr ("x", function (d) {return x (d.state);})
.attr ("ancho", x.rangeBand ())
.attr ("y", function (d) {return y (d.población);})
.attr ("altura", función (d) {altura de retorno - y (d.población);});
});
"" ");
453
Página 465
https://translate.googleusercontent.com/translate_f 319/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 11-5. Los cinco estados más poblados de los Estados Unidos representados por un
gráfico de barras relativo a 2014
.bar2011 {
relleno: azul acero;
}
454
Página 466
.bar2012 {
relleno: rojo;
}
.bar2013 {
relleno: amarillo;
}
.bar2014 {
relleno: verde;
}
.axis {
fuente: 10px sans-serif;
}
.axis line {
llenar: ninguno;
trazo: # 000;
}
.x.axis path {
pantalla: ninguna;
}
https://translate.googleusercontent.com/translate_f 320/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
</style>
<div id = "chart_d3" />
"" "))
También debe modificar la plantilla agregando los otros tres conjuntos de datos
correspondientes a los años 2011, 2012 y 2013. Estos años estarán representados por un
color diferente en el gráfico de barras agrupadas.
importar jinja2
455
Página 467
var data = []
var data2 = []
var data3 = []
var data4 = []
var margin = {top: 20, right: 20, bottom: 30, left: 40},
ancho = 800 - margin.left - margin.right,
altura = 400 - margin.top - margin.bottom;
var x = d3.scale.ordinal ()
.rangeRoundBands ([0, ancho], .25);
var y = d3.scale.linear ()
.range ([altura, 0]);
456
Página 468
https://translate.googleusercontent.com/translate_f 321/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
CAPÍTULO 11 INTEGRANDO LA BIBLIOTECA JAVASCRIPT D3 EN EL PORTÁTIL IPYTHON
svg.append ("g")
.attr ("clase", "eje x")
.attr ("transformar", "traducir (0," + altura + ")")
.call (xAxis);
svg.append ("g")
.attr ("clase", "eje y")
.call (yAxis)
.append ("texto")
.attr ("transformar", "rotar (-90)")
.attr ("y", 6)
.attr ("dy", ".71em")
.style ("ancla de texto", "fin")
.text ("Población");
457
Página 469
});
"" ");
https://translate.googleusercontent.com/translate_f 322/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
La serie de datos que se pasarán del marco de datos a la plantilla ahora son cuatro,
por lo que debe actualizar los datos y los cambios que acaba de realizar en el código.
Por lo tanto, debe volver a ejecutar el código de la función render ().
Una vez que haya lanzado la función render () nuevamente, obtendrá un gráfico como el
se muestra en la Figura 11-6.
458
Página 470
Figura 11-6. Un gráfico de barras agrupadas que representa las poblaciones de los cinco
estados poblados de 2011 a 2014
459
https://translate.googleusercontent.com/translate_f 323/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 471
Un buen enlace para encontrar dicho material es el Atlas TopoJSON de EE. UU. (https://github.com/
mbostock / us-atlas ), pero hay mucha literatura disponible en línea.
Una representación de este tipo no solo es posible, sino que también es personalizable. Gracias a
la biblioteca D3, puede correlacionar las porciones geográficas en función del valor de particular
columnas contenidas en un marco de datos.
Primero, comencemos con un ejemplo que ya está en Internet, en la biblioteca D3,
http://bl.ocks.org/mbostock/4060606, pero completamente desarrollado en HTML. Así que ahora lo harás
aprenda a adaptar un ejemplo de D3 en HTML en un cuaderno IPython.
Si observa el código que se muestra en la página web del ejemplo, puede ver que allí
son tres bibliotecas JavaScript necesarias. Esta vez, además de la biblioteca D3, necesitamos
para importar bibliotecas de cola y TopoJSON.
460
Página 472
Por lo tanto, debe usar require.config () como lo hizo en las secciones anteriores.
%% javascript
require.config ({
caminos: {
d3: '//cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min',
cola: '//cdnjs.cloudflare.com/ajax/libs/queue-async/1.0.7/queue.min',
topojson: '//cdnjs.cloudflare.com/ajax/libs/topojson/1.6.19/
topojson.min '
https://translate.googleusercontent.com/translate_f 324/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
}
});
La parte pertinente de CSS se muestra nuevamente, todo dentro de la función HTML ().
.condados {
llenar: ninguno;
}
.states {
llenar: ninguno;
trazo: #fff;
stroke-linejoin: redondo;
}
461
Página 473
</style>
<div id = "choropleth" />
"" "))
Aquí está la nueva plantilla que refleja el código que se muestra en el ejemplo de Bostock, con
algunos cambios:
importar jinja2
// var data = []
https://translate.googleusercontent.com/translate_f 325/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
462
Página 474
.projection (proyección);
cola()
.defer (d3.json, "us.json")
.defer (d3.tsv, "desempleo.tsv", función (d) {rateById.set (d.id,
+ d. tasa); })
.await (listo);
svg.append ("g")
.attr ("clase", "condados")
.selectAll ("ruta")
.data (topojson.feature (us, us.objects.counties) .features)
.enter (). append ("ruta")
.attr ("clase", función (d) {return quantize (rateById.get (d.id));})
.attr ("d", ruta);
svg.append ("ruta")
.datum (topojson.mesh (us, us.objects.states, function (a, b) {return a
! == b; }))
.attr ("clase", "estados")
.attr ("d", ruta);
}
});
"" ");
Ahora lanza la representación, esta vez sin ningún valor para la plantilla,
ya que todos los valores están contenidos en los archivos us.json y Employment.tsv (puede encontrar
ellos en el código fuente de este libro).
463
Página 475
Los resultados son idénticos a los que se muestran en el ejemplo de Bostock (ver Figura 11-8).
https://translate.googleusercontent.com/translate_f 326/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 11-8. El mapa coroplético de los Estados Unidos con el color del
condados según los valores contenidos en el archivo TSV
464
Página 476
Obtiene un marco de datos que contiene todos los condados de EE. UU., Como se muestra en la Figura 11-9 .
Figura 11-9. El marco de datos pop2014_by_county contiene todos los datos demográficos de todos
Condados de EE. UU.
Debe utilizar sus datos en lugar del TSV utilizado anteriormente. Dentro de él, están los
Números de identificación correspondientes a los distintos condados. Puede utilizar un archivo en la Web para
determinar sus nombres. Puede descargarlo y convertirlo en un marco de datos.
https://translate.googleusercontent.com/translate_f 327/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
465
Página 477
Gracias a este archivo, ves los códigos con los condados correspondientes
(ver figura 11-10 ).
Figura 11-10. Los códigos de las provincias están contenidos en el archivo TSV
466
Página 478
Puede ver que en realidad hay dos condados con el mismo nombre, pero son
identificado por dos identificadores diferentes (Figura 11-11 ).
https://translate.googleusercontent.com/translate_f 328/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Obtienes una tabla y ves que hay dos condados y dos códigos diferentes.
Ahora ve esto en su marco de datos con datos tomados de la fuente de datos census.gov
(ver figura 11-12 ).
pop2014_by_county [pop2014_by_county ['CTYNAME'] == 'Condado de Baldwin']
Figura 11-12. Los códigos de identificación en los archivos TSV corresponden a la combinación de
valores contenidos en las columnas STATE y COUNTY
Puedes reconocer que hay una coincidencia. El ID contenido en TOPOJSON coincide con el
números en las columnas STATE y COUNTY si se combinan, pero eliminando el 0
cuando es el dígito al principio del código. Entonces ahora puedes reconstruir todos los datos
necesario para replicar el ejemplo de TSV de coropletas del marco de datos de los condados. los
El archivo se guardará como población.csv.
467
Página 479
Ahora reescribe el contenido de la función HTML () especificando una nueva etiqueta <div>
con el ID como choropleth2.
.condados {
llenar: ninguno;
}
.states {
llenar: ninguno;
trazo: #fff;
stroke-linejoin: redondo;
}
https://translate.googleusercontent.com/translate_f 329/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
.q8-9 {relleno: rgb (8,48,107); }
</style>
<div id = "choropleth2" />
"" "))
468
Página 480
var data = []
cola()
.defer (d3.json, "us.json")
.defer (d3.csv, "población.csv", función (d) {rateById.set (d.id,
+ d.pop); })
.await (listo);
svg.append ("g")
.attr ("clase", "condados")
.selectAll ("ruta")
.data (topojson.feature (us, us.objects.counties) .features)
469
Página 481
https://translate.googleusercontent.com/translate_f 330/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
svg.append ("ruta")
. datum (topojson.mesh (us, us.objects.states, function (a, b) {return a
! == b; }))
.attr ("clase", "estados")
.attr ("d", ruta);
}
});
"" ");
470
Página 482
Figura 11-13. El mapa de coropletas de los Estados Unidos muestra la densidad del
población de todos los condados
Conclusiones
En este capítulo, ha visto cómo es posible ampliar aún más la capacidad de mostrar
datos utilizando una biblioteca de JavaScript llamada D3. Los mapas de coropletas son solo uno de los muchos
https://translate.googleusercontent.com/translate_f 331/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
ejemplos de gráficos avanzados que se utilizan para representar datos. Esto también es muy bueno
manera de ver el Jupyter Notebook en acción. El mundo no gira en torno a Python
solo, pero Python puede proporcionar capacidades adicionales para nuestro trabajo.
En el próximo capítulo, verá cómo aplicar el análisis de datos a las imágenes. Verás como
fácil es construir un modelo que pueda reconocer números escritos a mano.
471
Página 483
CAPITULO 12
Reconociendo
Dígitos escritos a mano
Hasta ahora has visto cómo aplicar las técnicas de análisis de datos a los marcos de datos de Pandas
que contiene números y cadenas. De hecho, el análisis de datos no se limita a números y
cadenas, porque las imágenes y los sonidos también se pueden analizar y clasificar.
En este breve pero no menos importante capítulo, aprenderá a escribir a mano
reconocimiento.
473
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_12
Página 484
https://translate.googleusercontent.com/translate_f 332/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
CAPÍTULO 12 RECONOCIENDO LOS DÍGITOS ESCRITOS A MANO
cuaderno ipython
Luego cree un nuevo Cuaderno eligiendo Nuevo ➤ Python 3, como se muestra en la Figura 12-1 .
474
Página 485
https://translate.googleusercontent.com/translate_f 333/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 12-2. Una de las 1797 imágenes numéricas escritas a mano que componen el conjunto de datos
dígito
475
Página 486
Después de cargar el conjunto de datos, puede analizar el contenido. Primero, puedes leer muchos
información sobre los conjuntos de datos llamando al atributo DESCR.
imprimir (dígitos.DESCR)
Para una descripción textual del conjunto de datos, los autores que contribuyeron a su creación
y las referencias aparecerán como se muestra en la Figura 12-3.
Figura 12-3. Cada conjunto de datos de la biblioteca scikit-learn tiene un campo que contiene todos los
información
476
https://translate.googleusercontent.com/translate_f 334/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 487
Las imágenes de los dígitos escritos a mano están contenidas en una matriz digits.images. Cada
El elemento de esta matriz es una imagen que está representada por una matriz de 8x8 de valores numéricos.
que corresponden a una escala de grises desde el blanco, con un valor de 0, hasta el negro, con el valor de 15.
digits.images [0]
477
Página 488
Los valores numéricos representados por imágenes, es decir, los objetivos, están contenidos en el
matriz digit.targets.
digits.target
Se informó que el conjunto de datos es un conjunto de entrenamiento que consta de 1797 imágenes. Usted puede
determinar si eso es cierto.
digits.target.size
1797
https://translate.googleusercontent.com/translate_f 335/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Aprender y predecir
Ahora que ha cargado los conjuntos de datos Digits en su computadora portátil y ha definido un
Estimador SVC, puedes empezar a aprender.
Como aprendiste en el capítulo 8, una vez que defina un modelo predictivo, debe instruirlo
con un conjunto de entrenamiento, que es un conjunto de datos en el que ya conoce la clase a la que pertenece.
Dada la gran cantidad de elementos contenidos en el conjunto de datos Digits, seguramente
obtener un modelo muy efectivo, es decir, uno que sea capaz de reconocer con certeza
el número escrito a mano.
Este conjunto de datos contiene 1797 elementos, por lo que puede considerar los primeros 1791 como un
conjunto de entrenamiento y utilizará los últimos seis como conjunto de validación.
Puede ver en detalle estos seis dígitos escritos a mano utilizando la biblioteca matplotlib:
478
Página 489
Esto producirá una imagen con seis dígitos, como se muestra en la Figura 12-5 .
https://translate.googleusercontent.com/translate_f 336/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
479
Página 490
Después de un breve período de tiempo, aparecerá el estimador entrenado con salida de texto.
Ahora tienes que probar tu estimador, haciéndolo interpretar los seis dígitos del
conjunto de validación.
Página 491
Dado que el conjunto de datos está contenido en archivos comprimidos, estos serán automáticamente
descargado al espacio de trabajo de la sesión tan pronto como llame a la función read_data_sets.
Una buena práctica es crear un directorio que los contenga como MNIST_data.
https://translate.googleusercontent.com/translate_f 337/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Extrayendo MNIST_data / train-images-idx3-ubyte.gz
Extrayendo MNIST_data / train-labels-idx1-ubyte.gz
Extrayendo MNIST_data / t10k-images-idx3-ubyte.gz
Extrayendo MNIST_data / t10k-labels-idx1-ubyte.gz
Los datos de MNIST se dividen en tres partes: 55.000 puntos de datos de datos de entrenamiento (mnist.
train), 10,000 puntos de datos de prueba (mnist.test) y 5,000 puntos de datos de validación
(validación de mnist).
Dado el gran tamaño de este conjunto de datos, una buena práctica es dividirlo en lotes más pequeños,
especialmente cuando necesita ser analizado como un conjunto de entrenamiento. Para ayudarte a hacer esto, TensorFlow
utiliza la función next_batch (n), que le permite extraer n elementos del
conjunto de entrenamiento. Siempre que se llame a la función next_batch (n), los n elementos siguientes
se extraerán, hasta que se alcance el final del conjunto de entrenamiento.
Para ver los primeros 10 elementos del conjunto de entrenamiento, ingrese el siguiente código.
Al publicar el mismo código, obtendrá los siguientes 10 elementos del conjunto de entrenamiento,
y así.
481
Página 492
Figura 12-6. Un dígito del conjunto de entrenamiento en el conjunto de datos MNIST proporcionado por el
Biblioteca de TensorFlow
Aprender y predecir
Ahora que ha visto cómo obtener el conjunto de entrenamiento, el conjunto de pruebas y el conjunto de validación
con TensorFlow, es hora de hacer un análisis con una red neuronal muy similar a la
que usaste en el Capítulo 9.
482
Página 493
# Parámetros
tasa_de_aprendizaje = 0.01
training_epochs = 25
tamaño_lote = 100
display_step = 1
# tf Entrada de gráfico
x = tf.placeholder ("float", [None, 784]) # mnist imagen de datos de forma
28 * 28 = 784
y = tf.placeholder ("float", [None, 10]) # 0-9 dígitos de reconocimiento => 10 clases
# Crear modelo
# Construir modelo
activación = tf.nn.softmax (evidencia) # Softmax
# Configuración de parcela
avg_set = []
epoch_set = []
# Lanzar el gráfico
con tf.Session () como sess:
sess.run (init)
# Ciclo formativo
para la época en el rango (training_epochs):
483
Página 494
avg_cost = 0.
total_batch = int (mnist.train.num_examples / batch_size)
# Bucle sobre todos los lotes
para i en el rango (total_batch):
batch_xs, batch_ys = mnist.train.next_batch (tamaño_lote)
sess.run (optimizador, feed_dict = {x: batch_xs, y: batch_ys})
avg_cost + = sess.run (cost, feed_dict = {x: batch_xs, y: batch_
https://translate.googleusercontent.com/translate_f 339/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
ys}) / total_batch
si epoch% display_step == 0:
print ("Época:", '% 04d'% (época + 1), "costo =", "{: .9f}".
formato (avg_cost))
avg_set.append (avg_cost)
epoch_set.append (época + 1)
imprimir ("Fase de formación finalizada")
# Modelo de prueba
predicción_correcta = tf.equal (tf.argmax (activación, 1), tf.argmax (y, 1))
# Calcular la precisión
precisión = tf.reduce_mean (tf.cast (correct_prediction, "flotar"))
print ("Precisión del modelo:", precision.eval ({x: mnist.test.images, y: mnist.
test.labels}))
484
Página 495
https://translate.googleusercontent.com/translate_f 340/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Época: 0025 costo = 0.332482831
Fase de formación finalizada
A partir de los datos obtenidos, y observando la Figura 12-7 , puede ver que el aprendizaje
La fase de la red neuronal se ha completado y tiene una tendencia esperada.
El valor de precisión de 0,91 (91%) indica que el modelo que eligió funciona bastante
satisfactoriamente (no completamente).
485
Página 496
Figura 12-7. La tendencia de los costos durante la fase de aprendizaje de la red neuronal
Conclusiones
En este breve capítulo, aprendió cuántas posibilidades de aplicación este análisis de datos
proceso tiene. No se limita solo al análisis de datos numéricos o textuales, sino que también puede
analizar imágenes, como los dígitos escritos a mano leídos por una cámara o un escáner.
Además, ha visto que los modelos predictivos pueden proporcionar
resultados gracias al aprendizaje automático y las técnicas de aprendizaje profundo, que se
implementado gracias a la biblioteca scikit-learn.
486
Página 497
CAPITULO 13
https://translate.googleusercontent.com/translate_f 341/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
487
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_13
Página 498
El análisis de estos textos se ha convertido, por tanto, en una fuente de enorme interés, y
Hay muchas técnicas que se han introducido para este propósito, creando un verdadero
disciplina en sí misma. Algunas de las técnicas más importantes son las siguientes:
• Reconocimiento de patrones
• Etiquetado
https://translate.googleusercontent.com/translate_f 342/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Instalar NLTK en su computadora es una operación muy simple. Siendo un muy popular
Biblioteca de Python, simplemente necesita instalarla usando pip o conda.
En sistemas Linux, use esto:
488
Página 499
importar nltk
Entonces necesitas importar texto de la colección corpora. Para hacer esto hay un
función llamada nltk.download_shell (), que abre una herramienta llamada NLTK Downloader
que le permite realizar selecciones a través de una selección guiada de opciones.
Si ingresa este comando en la terminal:
nltk.download_shell ()
Descargador NLTK
-------------------------------------------------- -------------------------
d) Descargar l) Listar u) Actualizar c) Configurar h) Ayuda q) Salir
-------------------------------------------------- -------------------------
Descargador>
Ahora la herramienta está esperando una opción. Si desea ver una lista de posibles NLTK
extensiones, ingrese L para la lista y presione Enter. Inmediatamente verá una lista de todos los
posibles paquetes pertenecientes a NLTK que puede descargar para ampliar la funcionalidad
de NLTK, incluidos los textos de la colección corpora.
Paquetes:
[] abc ................. Comisión Australiana de Radiodifusión 2006
[] alpino .............. Alpino Dutch Treebank
[] averaged_perceptron_tagger Etiquetador de perceptrón promedio
[] averaged_perceptron_tagger_ru Averaged Perceptron Tagger (ruso)
[] basque_grammars ..... Gramáticas para euskera
[] biocreative_ppi ..... BioCreAtIvE (Evaluación crítica de la información
Sistemas de extracción en biología)
[] bllip_wsj_no_aux .... Analizador BLLIP: Modelo WSJ
489
Página 500
https://translate.googleusercontent.com/translate_f 343/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
-------------------------------------------------- -------------------------
d) Descargar l) Listar u) Actualizar c) Configurar h) Ayuda q) Salir
-------------------------------------------------- -------------------------
Descargador> d
490
Página 501
Para las siguientes horas, si ya conoce el nombre del paquete que desea
descargar, simplemente ingrese el comando nltk.download () con el nombre del paquete como
argumento. Esto no abrirá la herramienta NLTK Downloader, pero descargará directamente el
paquete requerido. Entonces la operación anterior equivale a escribir:
nltk.download ('gutenberg')
Una vez completado, puede ver el contenido del paquete gracias a los fileids ()
función, que muestra los nombres de los archivos que contiene.
gb = nltk.corpus.gutenberg
print ("Archivos Gutenberg:", gb.fileids ())
Aparecerá una matriz en la terminal con todos los archivos de texto contenidos en el gutenberg
paquete.
https://translate.googleusercontent.com/translate_f 344/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Para acceder al contenido interno de uno de estos archivos, primero seleccione uno, por ejemplo
Macbeth de Shakespeare (shakespeare-macbeth.txt), y luego asignarlo a una variable
de conveniencia. Un modo de extracción es para palabras, es decir, desea crear una matriz
que contiene palabras como elementos. En este sentido, debe utilizar la función words ().
Si desea ver la longitud de este texto (en palabras), puede usar la función len ().
len (macbeth)
23140
Por tanto, el texto utilizado para estos ejemplos está compuesto por 23140 palabras.
La variable macbeth que creamos es una matriz larga que contiene las palabras del texto.
Por ejemplo, si desea ver las primeras 10 palabras del texto, puede escribir lo siguiente
mando.
491
Página 502
macbeth [: 10]
['[',
'Los',
'Tragedie',
'de',
'Macbeth',
'por',
'Guillermo',
'Shakespeare',
'1603',
']']
Como puede ver, las primeras 10 palabras contienen el título de la obra, pero también el cuadrado
corchetes, que indican el comienzo y el final de una oración. Si hubiera usado el
modo de extracción de oraciones con la función sents (), habría obtenido una
matriz estructurada, con cada oración como un elemento. Estos elementos, a su vez, serían
matrices con palabras para elementos.
492
https://translate.googleusercontent.com/translate_f 345/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 503
text.common_contexts (['Etapa'])
el_ sangriento_: el_,
Si observa los resultados de la investigación anterior, puede ver que los tres resultados
corresponden a lo dicho.
Una vez que comprenda cómo NLTK concibe el concepto de la palabra y su contexto
durante la búsqueda, será fácil comprender el concepto de sinónimo. Eso es
Se supone que todas las palabras que tienen el mismo contexto pueden ser sinónimos. A
493
Página 504
buscar todas las palabras que tienen el mismo contexto que la buscada, debe utilizar la
función similar ().
text.similar ('Etapa')
fogge ayre sangrando reuolt buena muestra heeles skie otro mar miedo
consecuencia corazón cerebro seruice herbenger dama ronda deed doore
Estos métodos de investigación pueden parecer bastante extraños para aquellos que no se utilizan
procesar y analizar texto, pero pronto comprenderá que estos métodos de
investigación se adaptan perfectamente a las palabras y su significado en relación con el texto en
que están presentes.
https://translate.googleusercontent.com/translate_f 346/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
la matriz de palabras se pasa como argumento.
Entonces, para obtener una distribución estadística de todas las palabras del texto, deberá ingresar un
comando simple.
fd = nltk.FreqDist (macbeth)
Si desea ver las primeras 10 palabras más comunes del texto, puede usar la
función most_common ().
fd.most_common (10)
[(',', 1962),
('.', 1235),
("'", 637),
('el', 531),
(':', 477),
('y', 376),
('Yo', 333),
('de', 315),
('a', 311),
('?', 241)]
494
Página 505
Del resultado obtenido se puede ver que los elementos más comunes son
puntuación, preposiciones y artículos, y esto se aplica a muchos idiomas, incluidos
Inglés. Dado que estos tienen poco significado durante el análisis de texto, a menudo es necesario
eliminarlos. Se denominan palabras vacías .
Las palabras vacías son palabras que tienen poco significado en el análisis y deben filtrarse.
No existe una regla general para determinar si una palabra es una palabra de parada (para eliminar) o
no. Sin embargo, la biblioteca NLTK viene al rescate proporcionándole una variedad de
palabras vacías preseleccionadas. Para descargar palabras irrelevantes, puede utilizar nltk.download ()
mando.
Una vez que haya descargado todas las palabras irrelevantes, puede seleccionar solo las relacionadas con
Inglés, guardándolos en una variable sw.
['mediante',
'son',
'que',
'ni',
'ain',
"no",
'no',
"no",
'abajo',
'nuestro']
Hay 179 palabras vacías en el vocabulario inglés según NLTK. Ahora usted puede
utilice estas palabras vacías para filtrar la variable macbeth.
https://translate.googleusercontent.com/translate_f 347/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
495
Página 506
('.', 1235),
("'", 637),
(':', 477),
('?', 241),
('Macb', 137),
('haue', 117),
('-', 100),
('Entrar', 80),
('tú', 63)]
Ahora que se devuelven las primeras 10 palabras más comunes, puede ver que el
Se han eliminado las palabras vacías, pero el resultado aún no es satisfactorio. De hecho,
la puntuación todavía está presente en las palabras. Para eliminar toda la puntuación, puede cambiar
el código anterior insertando en el filtro una matriz de puntuación que contiene la
símbolos de puntuación. Esta matriz de puntuación se puede obtener importando la cadena
función.
importar cadena
puntuacion = set (string.punctuation)
macbeth_filtered2 = [w.lower () para w en macbeth si w.lower () no en sw
y w.lower () sin puntuación]
fd = nltk.FreqDist (macbeth_filtered2)
fd.most_common (10)
[('macb', 137),
('haue', 122),
('tú', 90),
('entrar', 81),
('deberá', 68),
('macbeth', 62),
('vpon', 62),
('tú', 61),
('macd', 58),
('vs', 57)]
496
Página 507
https://translate.googleusercontent.com/translate_f 348/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
ordenado (palabras_largas)
['Asesinato',
'Chamberlaines',
'Distingue',
'Gallowgrosses',
'Metafísica',
'Northumberland',
'Voluptuousnesse',
'elogios',
'multitudinario',
'supernaturall',
'vnaccompanied']
Como puede ver, hay 11 palabras que cumplen con este criterio.
Otro ejemplo es buscar todas las palabras que contienen una determinada secuencia de
caracteres, como 'ious'. Solo tiene que cambiar la condición en el bucle for in para
obtenga la selección deseada.
497
Página 508
'Lujoso',
'Malicioso',
'Obliuious',
'Piadoso',
'Rebelde',
'escrupuloso',
'furioso',
'Cortés',
'pernicioso',
'pernicioso',
'piadoso',
'precioso',
'rebelde',
'sacrílego',
'grave',
'espacioso',
'tedioso']
En este caso, usó sort () para hacer una conversión de lista, de modo que no contenga
palabras duplicadas.
Estos dos ejemplos son solo un punto de partida para mostrarle el potencial de esta herramienta y
la facilidad con la que puede filtrar palabras.
Bigrams y colocaciones
Otro elemento básico del análisis de texto es considerar pares de palabras ( bigramas ) en su lugar
de palabras sueltas. Las palabras "es" y "amarillo" son, por ejemplo, un bigrama, ya que su
la combinación es posible y significativa. Entonces, "es amarillo" se puede encontrar en datos textuales. Nosotros
Todos sabemos que algunos de estos bigramas son tan comunes en nuestra literatura que son casi
siempre se utilizan juntos. Los ejemplos incluyen "comida rápida", "preste atención", "buenos días" y
pronto. Estos bigramas se denominan colocaciones .
El análisis textual también puede involucrar la búsqueda de bigramas dentro del texto bajo
examen. Para encontrarlos, simplemente use la función bigrams (). Para excluir
https://translate.googleusercontent.com/translate_f 349/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
palabras vacías y puntuación de los bigramas, debe usar el conjunto de palabras ya
filtrado previamente, como macbeth_filtered2.
498
Página 509
Al mostrar los bigramas más comunes en el texto, se pueden encontrar ubicaciones lingüísticas.
Además de los bigramas, también puede haber ubicaciones basadas en trigramas, que
son combinaciones de tres palabras. En este caso, se utiliza la función trigrams ().
499
Página 510
https://translate.googleusercontent.com/translate_f 350/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
biblioteca es un excelente candidato para este propósito, ya que le permite descargar el texto
contenido de Internet, incluidas páginas HTML.
Primero importa la función request (), que se especializa en este tipo de
operación, desde la biblioteca urllib.
Luego tienes que escribir la URL de la página que contiene el texto a extraer.
Aún refiriéndose al proyecto de Gutenberg, puede elegir, por ejemplo, un libro escrito por
Dostoievski ( http://www.gutenberg.org). En el sitio hay texto en diferentes formatos; a
en este punto elegiremos el que está en formato raw (.txt).
url = "http://www.gutenberg.org/files/2554/2554-0.txt"
respuesta = request.urlopen (url)
raw = respuesta.read (). decode ('utf8')
Dentro del texto sin formato está todo el contenido textual del libro, descargado del
Internet. Siempre verifique el contenido de lo que ha descargado. Para hacer esto, los primeros 75
los personajes son suficientes.
crudo [: 75]
'\ ufeffThe Project Gutenberg EBook of Crime and Punishment, por Fyodor
Dostoievski \ r '
Como puede ver, estos caracteres corresponden al título del texto. Vemos eso
también hay un error en la primera palabra del texto. De hecho existe el carácter Unicode
BOM \ ufeff. Esto sucedió porque usamos el sistema de decodificación utf8, que es válido
en la mayoría de los casos, pero no en este caso. El sistema más adecuado en este caso es utf-8-sig.
Reemplace el valor incorrecto por el correcto.
500
Página 511
Ahora para poder trabajar en él hay que convertirlo en un corpus compatible con
NLTK. Para hacer esto, ingrese los siguientes comandos de conversión.
Estos comandos no hacen más que dividir en tokens (es decir, palabras)
texto de carácter con la función nltk.word_tokenize () y luego convertir tokens en un
cuerpo textual adecuado para NLTK con nltk.Text ().
Puedes ver el título ingresando este comando
webtext [: 12]
['Los',
'Proyecto',
'Gutenberg',
'Libro electronico',
'de',
'Crimen',
'y',
'Castigo',
',',
'por',
'Fyodor',
'Dostoievski']
https://translate.googleusercontent.com/translate_f 351/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
501
Página 512
url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
html = request.urlopen (url) .read (). decode ('utf8')
html [: 120]
'<! doctype html public "- // W3C // DTD HTML 4.0 Transitional // EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">\r\n <html> \ r \ n <hea '
Ahora, sin embargo, la conversión al corpus NLTK requiere una biblioteca adicional, bs4
(BeautifulSoup), que le proporciona analizadores adecuados que pueden reconocer HTML
etiquetas y extraer el texto que contienen.
Ahora también tiene un corpus en este caso, incluso si a menudo tiene que realizar más
operaciones de limpieza complejas que en el caso anterior para eliminar las palabras que no
te interesa.
Análisis sentimental
El análisis sentimental es un nuevo campo de investigación que se ha desarrollado muy recientemente en
para evaluar las opiniones de las personas sobre un tema en particular. Esta disciplina se basa
sobre diferentes técnicas que utilizan el análisis de texto y su campo de trabajo en el mundo de las
medios y foros ( minería de opinión ).
Gracias a los comentarios y reseñas de los usuarios, los algoritmos de análisis sentimental pueden
evaluar el grado de apreciación o valoración en función de determinadas palabras clave. Esta
El grado de apreciación se llama opinión y tiene tres valores posibles: positivo, neutral,
o negativo. La valoración de esta opinión se convierte así en una forma de clasificación.
Tantas técnicas de análisis sentimental son en realidad algoritmos de clasificación
similares a los que vio en capítulos anteriores que cubren el aprendizaje automático y
aprendizaje (véanse los capítulos 8 y 9 ).
502
Página 513
Como ejemplo para comprender mejor esta metodología, hacemos referencia a una clasificación
tutorial utilizando el algoritmo Naïve Bayes en el sitio web oficial (https://www.nltk.org/
libro / ch06.html), donde es posible encontrar muchos otros ejemplos muy útiles para mejorar
entender esta biblioteca.
https://translate.googleusercontent.com/translate_f 352/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Como conjunto de entrenamiento, este ejemplo utiliza otro corpus presente en NLTK, que es muy
Útil para este tipo de problemas de clasificación: movietitis. Este corpus contiene
numerosas reseñas de películas en las que hay texto de una extensión discreta junto con otro
campo que especifica si la crítica es positiva o negativa. Por tanto, sirve como
gran material de aprendizaje.
El propósito de este tutorial es encontrar las palabras que se repiten más en negativo.
documentos, o palabras que se repiten más en positivas, para centrarse en las palabras clave
relacionado con una opinión. Esta evaluación se realizará a través de un Naïve Bayes
Clasificación integrada en NLTK.
En primer lugar, es importante el corpus denominado movietitis.
Luego, construye el conjunto de entrenamiento a partir del corpus obtenido, creando una matriz de
pares de elementos llamados documentos. Esta matriz contiene en el primer campo el texto del single
revisar, y en el segundo campo la evaluación negativa o positiva. Al final, lo harás
mezclar todos los elementos de la matriz en orden aleatorio.
importar al azar
reseñas = nltk.corpus.movie×
documentos = [(lista (reviews.words (fileid)), categoría)
para categoría en reviews.categories ()
para fileid en reviews.fileids (categoría)]
random.shuffle (documentos)
Para comprender mejor, consulte el contenido de los documentos en detalle. El primer elemento
contiene dos campos; la primera es la reseña que contiene todas las palabras utilizadas.
503
Página 514
personajes que todos se conocen. está liz, que se queda dormida y también
llegando tarde a su cita, prue quien se va a casar, ...
Pero el conjunto de entrenamiento aún no está listo; de hecho tienes que crear una frecuencia
distribución de todas las palabras del corpus. Esta distribución se convertirá en una
lista de casting con la función list ().
Luego, el siguiente paso es definir una función para el cálculo de las características, es decir,
palabras que son lo suficientemente importantes para establecer la opinión de una revisión.
Una vez que haya definido la función document_features (), puede crear la función
conjuntos de documentos.
https://translate.googleusercontent.com/translate_f 353/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
featureets = [(document_features (d, c)) para (d, c) en documentos]
El objetivo es crear un conjunto de todas las palabras contenidas en todo el corpus de la película,
analizar si están presentes (verdadero o falso) en cada revisión y ver cómo
mucho contribuyen al juicio positivo o negativo de la misma. Cuanto más a menudo una palabra
está presente en las críticas negativas y cuanto menos a menudo está presente en las positivas, la
más se evalúa como una palabra "mala". Lo contrario es cierto para una "buena" evaluación de palabras.
Para determinar cómo subdividir este conjunto de funciones para el conjunto de entrenamiento y el conjunto de prueba,
primero debes ver cuántos elementos contiene.
504
Página 515
Luego, utiliza los primeros 1500 elementos del conjunto para el conjunto de entrenamiento y los últimos 500
elementos para el conjunto de prueba, con el fin de evaluar la precisión del modelo.
Finalmente, aplica el clasificador Naïve Bayes proporcionado por la biblioteca NLTK para clasificar
este problema. Luego, calcula su precisión y envía el conjunto de prueba al modelo.
La precisión no es tan alta como en los ejemplos de los capítulos anteriores, pero estamos
trabajar con palabras contenidas en el texto y, por lo tanto, es muy difícil crear
modelos relativos a problemas numéricos.
Ahora que ha completado el análisis, puede ver qué palabras tienen más
peso en la evaluación de la opinión negativa o positiva de una reseña.
classifier.show_most_informative_features (10)
Características más informativas
badly = True neg: pos = 11.1: 1.0
julie = Verdadero neg: pos = 9.5: 1.0
finest = Verdadero pos: neg = 9.0: 1.0
olvidó = Verdadero neg: pos = 8.8: 1.0
desnudo = Verdadero neg: pos = 8.8: 1.0
refrescante = Verdadero pos: neg = 7,9: 1,0
robado = Verdadero pos: neg = 7.3: 1.0
afortunadamente = Verdadero pos: neg = 7.3: 1.0
directs = True pos: neg = 7.3: 1.0
lluvia = Verdadero neg: pos = 7.3: 1.0
Al observar los resultados, no se sorprenderá al descubrir que la palabra "mal" es una mala
palabra de opinión y que "mejor" es una palabra de buena opinión. Lo interesante aquí es que
“Julie” es una palabra de mala opinión.
505
Página 516
https://translate.googleusercontent.com/translate_f 354/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Conclusiones
En este capítulo, echó un breve vistazo al mundo del análisis de texto. De hecho, hay muchos
otras técnicas y ejemplos que podrían discutirse. Sin embargo, al final de este
capítulo, debe estar familiarizado con esta rama del análisis y especialmente haber comenzado a
conozca la biblioteca NLTK (Natural Language Toolkit), una poderosa herramienta para el análisis de texto.
506
Página 517
CAPITULO 14
Análisis de imagen
y visión artificial
con OpenCV
En los capítulos anteriores, el análisis de datos se centró completamente en datos numéricos y
tabulados, mientras que en el anterior vimos cómo procesar y analizar datos en
forma textual. Este libro se cierra con razón presentando el último aspecto del análisis de datos:
análisis de imágenes .
Durante el capítulo se abordarán temas como la visión por computadora y el reconocimiento facial.
introducido. Verás como las técnicas de deep learning están en la base de este rey
de análisis. Además, se introducirá otra biblioteca, llamada openCV, que tiene
https://translate.googleusercontent.com/translate_f 355/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
siempre ha sido el punto de referencia para el análisis de imágenes.
507
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1_14
Página 518
OpenCV y Python
OpenCV (Open Source Computer Vision) es una biblioteca escrita en C ++ que está especializada
para visión artificial y análisis de imágenes ( https://opencv.org/). Esta poderosa biblioteca,
diseñado por Gary Bradsky, nació como un proyecto de Intel y en 2000 la primera versión fue
publicado. Luego, con el paso del tiempo, fue lanzado bajo una licencia de código abierto,
y desde entonces se ha ido generalizando poco a poco, llegando a la versión 3.3
(2017). En este momento, OpenCV admite muchos algoritmos relacionados con la visión por computadora y
aprendizaje automático y se expande día a día.
Su utilidad y difusión se debe precisamente a su antagonista: MATLAB. De hecho, esos
que necesitan trabajar con análisis de imágenes solo pueden seguir dos caminos: comprar MATLAB
paquetes o compile e instale la versión de código abierto de OpenCV. Bueno, es fácil de ver
por qué muchos han optado por la segunda opción.
508
https://translate.googleusercontent.com/translate_f 356/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 519
Instalación de OpenCV
Instalación de un paquete OpenCV en muchos sistemas operativos (Windows, iOS y Android)
se realiza a través del sitio web oficial (https://opencv.org/releases.html ).
Si usa Anaconda como medio de distribución, le recomiendo usar este enfoque.
La instalación es muy sencilla y limpia.
Desafortunadamente para los sistemas Linux, no existe un paquete PyPI oficial (con pip
clear) para ser instalado. Se requiere la instalación manual y puede variar según el
distribución y versión utilizada. Muchos procedimientos están presentes en Internet, algunos
más o menos válido. Para aquellos con Ubuntu 16, recomiendo este procedimiento de instalación
(ver https://github.com/BVLC/caffe/wiki/OpenCV-3.3-Installation-Guide-on-
Ubuntu-16.04 ).
509
Página 520
Antes de empezar
Una vez instalada la biblioteca OpenCV, puede abrir una sesión de IPython en Jupyter
QtConsole o Jupyter Notebook.
Luego, antes de comenzar a programar, debe importar la biblioteca openCV.
https://translate.googleusercontent.com/translate_f 357/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
matriz numérica correspondiente a las gradaciones de color y la posición.
Tenga en cuenta que puede encontrar las imágenes y los archivos en el código fuente de este libro.
Si está interesado en más detalles, puede ver el contenido de una imagen directamente.
Notará una matriz de matrices, cada una correspondiente a una posición específica de la imagen,
y cada uno caracterizado por números entre 0 y 255.
De hecho, si ve el contenido del primer elemento de la imagen, obtendrá la
siguiendo.
img [0]
matriz ([[38, 43, 11],
[37, 42, 10],
[36, 41, 9],
...,
[24, 37, 15],
[22, 36, 12],
[23, 36, 12]], dtype = uint8)
510
Página 521
Continuando con el código, ahora usará el método imshow () para crear una ventana
con la imagen cargada en la variable img. Este método toma dos parámetros: el
el nombre de la ventana y la variable de imagen. Una vez que haya creado la ventana, puede usar
el método waitKey ().
Al ejecutar este comando, se abre una nueva ventana y muestra la imagen, como se muestra en
Figura 14-1.
https://translate.googleusercontent.com/translate_f 358/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
511
Página 522
Si desea mantener abierta la ventana solo durante un período específico, debe escribir
el número de milisegundos como parámetro. Intente reemplazar el valor en el programa, por
ejemplo 2000 (dos segundos) y ejecute el programa.
Tenga en cuenta que este comportamiento puede variar mucho de un sistema a otro. a veces el
El kernel de Ipython podría dar problemas. luego use waitKey (0).
La ventana con la imagen (como se muestra en la Figura 14-1) debería aparecer y luego
desaparecen después de dos segundos.
Sin embargo, para ejemplos que son más complejos, es útil tener control directo sobre
el cierre de una ventana, sin el uso de tiempos de espera. El método destroyWindow ()
le permite cerrar la ventana deseada (pueden ser varias abiertas) especificando como
argumento el nombre de la ventana, que en su caso es Imagen.
b, r, g = cv2.split (img)
512
Página 523
Ahora vuelva a montar los tres canales, pero cambie el orden, por ejemplo,
intercambiando el canal rojo con el canal verde. Puede recombinar fácilmente el
canales utilizando el método merge ().
La nueva imagen está contenida en la variable img2. Muéstrelo junto con el original en
una nueva ventana.
Al ejecutar el programa, aparece una nueva ventana con colores alterados (como se muestra en
Figura 14-2).
https://translate.googleusercontent.com/translate_f 359/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
513
Página 524
https://translate.googleusercontent.com/translate_f 360/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
514
Página 525
Figura 14-3. Una nueva imagen del mismo tamaño (512x331 píxeles)
Ahora solo tienes que agregar las dos imágenes usando la función add ().
Al ejecutar este código, recibirá una combinación de las dos imágenes (como se muestra
en la Figura 14-4 ). Desafortunadamente, el efecto no es muy atractivo.
515
Página 526
https://translate.googleusercontent.com/translate_f 361/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 14-4. Una nueva imagen obtenida sumando las dos imágenes
516
Página 527
Puedes hacer lo mismo restando dos imágenes. Esta operación puede ser
realizado con la función cv2.subtract (). Esta vez esperaríamos una imagen que
tenderá cada vez más hacia el negro. Reemplace la función cv2.add () con la
siguiendo.
https://translate.googleusercontent.com/translate_f 362/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 14-5. Una nueva imagen obtenida restando una imagen de otra
517
Página 528
Figura 14-6. Una nueva imagen obtenida restando una imagen de otra
Sin embargo, esto es útil para saber que el orden de los operadores es importante.
por el resultado.
Más concretamente, ya ha visto que un objeto de imagen creado con OpenCV
biblioteca no es más que una serie de matrices que responden perfectamente a los cánones de
NumPy. Por lo tanto, puede utilizar las operaciones entre matrices proporcionadas por NumPy, como
la suma de matrices. Pero tenga cuidado, el resultado ciertamente no será el mismo.
518
Página 529
https://translate.googleusercontent.com/translate_f 363/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
sería 0. Las operaciones aritméticas no tienen esta característica.
Sin embargo, puedes probarlo directamente.
Al ejecutarlo obtendrás una imagen con un contraste de color muy fuerte (son los
puntos por encima de 255), como se muestra en la Figura 14-7.
Figura 14-7. Una imagen obtenida agregando dos imágenes como dos NumPy
matrices
519
Página 530
Mezcla de imágenes
En el ejemplo anterior, vio que la suma o resta de dos imágenes no
no produce una imagen intermedia entre los dos, sino que cambia la coloración
hacia blancos o negros.
La operación correcta se llama mezcla . Es decir, puedes considerar la operación
de superponer las dos imágenes, una encima de la otra, haciendo que la colocada encima
gradualmente más y más transparente. Al ajustar la transparencia gradualmente, obtiene una
mezcla de las dos imágenes, creando una nueva que es la intermedia.
La operación de mezcla no corresponde a una simple adición, sino a la fórmula
corresponde a la siguiente ecuación.
Como puede ver en la ecuación anterior, las dos imágenes tienen dos
coeficientes que toman valores entre 0 y 1. Con el crecimiento del parámetro α obtendrá
tener una transición suave de la primera imagen a la segunda.
La biblioteca OpenCV proporciona la operación de fusión con cv2.addWeighted ()
función.
Por lo tanto, si desea crear una imagen intermedia entre dos imágenes de origen,
puede utilizar el siguiente código.
https://translate.googleusercontent.com/translate_f 364/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
520
Página 531
Análisis de imagen
El propósito de los ejemplos de la sección anterior era comprender que las imágenes
no son más que matrices NumPy. Como tal, estas matrices numéricas se pueden procesar.
Por lo tanto, puede implementar muchas funciones matemáticas que procesarán el
números dentro de estas matrices para obtener nuevas imágenes. Estas nuevas imágenes, obtenidas de
operaciones, servirá para proporcionar nueva información.
Este es el concepto que subyace al análisis de imágenes . Las operaciones matemáticas realizadas
de una imagen inicial (matriz) a una imagen resultante (matriz) se denominan filtros de imagen
(ver figura 14-9 ). Para ayudarlo a comprender este proceso, seguramente tendrá que lidiar
con aplicaciones de edición de fotografías (como Photoshop). En cualquier caso, ciertamente has visto
521
Página 532
https://translate.googleusercontent.com/translate_f 365/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
que filtros que se pueden aplicar a las fotos. Estos filtros no son más que algoritmos
(secuencias de operaciones matemáticas) que modifican los valores numéricos en la matriz
de la imagen inicial.
Figura 14-9. Una representación de los filtros de imagen que son la base de la imagen.
análisis
Detección de bordes
Al analizar una imagen, y especialmente durante la visión por computadora, uno de los
operaciones fundamentales es comprender el contenido de la imagen, como los objetos
y gente. Primero es necesario comprender qué formas posibles están representadas en
la imagen. Sin embargo, para comprender las geometrías representadas, es necesario
reconocer los contornos que delimitan un objeto del fondo o de otros objetos.
Ésta es precisamente la tarea de la detección de bordes.
522
Página 533
En la detección de bordes, se han desarrollado y desarrollado una gran cantidad de algoritmos y técnicas.
explotan diferentes principios para determinar correctamente los contornos de los objetos.
Muchas de estas técnicas se basan en el principio de degradados de color y explotan la
proceso de análisis de gradiente de imagen.
https://translate.googleusercontent.com/translate_f 366/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
una imagen, gracias a los saltos de un color a otro. Además, tu ojo puede
percibir las profundidades gracias a las distintas tonalidades de color que van del claro al oscuro,
que es el gradiente.
De todo esto, queda bastante claro que medir un degradado en una imagen es crucial para ser
capaz de detectar los bordes de la imagen. Se hace con una simple operación (filtro) que es
realizado sobre la imagen.
523
Página 534
Como puede ver en la Figura 14-10 , una ventaja no es más que una transición rápida de una
matiz a otro. Para simplificar, 0 es negro y 1 es blanco. Todos los tonos de gris son valores flotantes
entre 0 y 1.
Si grafica todos los valores correspondientes a los valores de gradiente, obtiene la función f ().
Como puede ver, hay una transición repentina de 0 a 1, lo que indica el borde.
524
https://translate.googleusercontent.com/translate_f 367/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 535
Figura 14-11. Una imagen en blanco y negro que representa dos flechas.
525
Página 536
Figura 14-12. Un conjunto de degradados grises colocados uno al lado del otro.
Ahora puede comenzar a desarrollar el código necesario para la detección de bordes. Usarás
matplotlib para mostrar diferentes imágenes en la misma ventana. En esta prueba, usaremos dos
diferentes tipos de filtros de imagen proporcionados por OpenCV: Sobel y laplaciano . De hecho, su
https://translate.googleusercontent.com/translate_f 368/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Los nombres corresponden al nombre de las operaciones matemáticas realizadas en el
matrices (imágenes). La biblioteca openCV proporciona cv2.Sobel () y cv2.Laplacian () para
aplique estos dos cálculos.
Primero, comienza analizando la detección de bordes aplicada a la imagen en blanco y negro.jpg.
526
Página 537
Cuando ejecuta este código, obtiene una ventana con cuatro cuadros (como se muestra en
Figura 14-13 ). El primer cuadro es la imagen original en blanco y negro, mientras que los otros tres
son el resultado de los tres filtros aplicados a la imagen.
En lo que respecta a los filtros Sobel, la detección de bordes es perfecta, incluso si está limitada horizontalmente
o verticalmente. Las líneas diagonales son visibles en ambos casos, ya que tienen ambas horizontales
componentes verticales y verticales, pero los bordes horizontales en el Sobel X y los del
verticales Sobel Y no se detectan de ninguna manera.
Combinando los dos filtros (el cálculo de dos derivadas) para obtener el Laplaciano
filtro, la determinación de los bordes es omnidireccional pero tiene alguna pérdida de resolución.
De hecho, puedes ver que las ondulaciones correspondientes a los bordes son más tenues.
527
https://translate.googleusercontent.com/translate_f 369/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 538
La coloración en gris es muy útil para detectar bordes y degradados, pero si está
Si solo está interesado en detectar bordes, debe establecer como salida un archivo de imagen en cv2.CV_8U.
Por lo tanto, puede cambiar el tipo de datos de salida de cv2.CV_64F a cv2.CV_8U en
la función de filtros del código anterior. Reemplazar los argumentos pasados a las dos imágenes
filtra de la siguiente manera.
528
Página 539
https://translate.googleusercontent.com/translate_f 370/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
529
Página 540
https://translate.googleusercontent.com/translate_f 371/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
530
Página 541
Además de los bordes, verá que los filtros Laplacian y Sobel también pueden
detectar el nivel de degradados en una escala de grises. Aplica lo que has visto al degradado.jpg
imagen. Tienes que hacer algunos cambios al código anterior, dejando solo una imagen
(Laplaciano) que se mostrará.
531
Página 542
Al ejecutar este código, obtendrá una imagen que muestra los bordes blancos sobre un negro.
fondo (como se muestra en la Figura 14-17 ).
https://translate.googleusercontent.com/translate_f 372/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
532
Página 543
• Un archivo de texto prototipo , que define la arquitectura del modelo (es decir, las capas
sí mismos). Utilizará un archivo deploy.prototxt.txt descargado
de la webhttps://github.com/opencv/opencv/blob/master/
samples / dnn / face_detector / deploy.prototxt ).
Tenga en cuenta que también puede encontrar estos archivos en el código fuente del libro.
Ahora que tiene todo lo que necesita, comience cargando la red neuronal
modelo y toda la información sobre tu aprendizaje.
La biblioteca OpenCV es compatible con muchos marcos de aprendizaje profundo y tiene muchos
características que le ayudarán con esto. En particular (mencionado al principio del
capítulo), OpenCV tiene el módulo dnn, que se especializa en este tipo de operaciones.
Para cargar una red neuronal aprendida, puede usar dnn.readNetFromCaffe ()
función.
https://translate.googleusercontent.com/translate_f 373/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
533
Página 544
Como imagen de prueba, puede utilizar la foto con los jugadores de la selección italiana,
italy2018.jpg. Esta imagen es un gran ejemplo, ya que hay muchas caras adentro.
umbral_confianza = 0.5
net.setInput (blob)
detecciones = net.forward ()
Al ejecutar el código, aparecerá una ventana con los resultados del procesamiento de la cara.
detección (se muestra en la Figura 14-18). Los resultados son increíbles, ya que los rostros de todos los
Se han detectado jugadores. Puedes ver las caras rodeadas por un cuadrado rojo que
534
Página 545
https://translate.googleusercontent.com/translate_f 374/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Figura 14-18. Los rostros de los futbolistas nacionales han sido todos precisos.
Reconocido
Conclusiones
En este capítulo, vio algunos ejemplos simples de técnicas que forman la base de
análisis de imágenes y en particular de visión artificial. De hecho, viste cómo se ven las imágenes
procesado a través de filtros de imagen, y cómo se pueden construir algunas técnicas complejas usando
detección de bordes. También viste cómo funciona la visión por computadora al usar el aprendizaje profundo
redes para reconocer rostros en una imagen (detección de rostros).
Espero que este capítulo sea un buen punto de partida para profundizar sus conocimientos sobre el tema.
Si está interesado, encontrará información detallada sobre este tema en mi sitio web en
https://meccanismocomplesso.org.
535
Página 546
APÉNDICE A
Escritura matemática
Expresiones con LaTeX
LaTeX se usa ampliamente en Python. En este apéndice hay muchos ejemplos que pueden
ser útil para representar expresiones LaTeX dentro de implementaciones de Python. Este mismo
la información se puede encontrar en el enlace http://matplotlib.org/users/mathtext.html .
Con matplotlib
Puede ingresar la expresión LaTeX directamente como un argumento de varias funciones que pueden
aceptarlo. Por ejemplo, la función title () que dibuja un título de gráfico.
https://translate.googleusercontent.com/translate_f 375/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
$$ c = \ sqrt {a ^ 2 + b ^ 2} $$
2 2
c=a+b
537
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1
Página 547
Subíndices y superíndices
Para hacer subíndices y superíndices, use los símbolos '_' y '^':
r '$ \ alpha_i> \ beta_i $'
una
yo >
si yo
Esto puede resultar muy útil cuando tenga que escribir resúmenes:
r '$ \ sum_ {i = 0} ^ \ infty x_i $'
åx yo
i=0
3 æ3 ö4
C ÷
4 mi4 ø
1
5-
X
4
538
Página 548
Tenga en cuenta que se debe tener especial cuidado al colocar paréntesis y corchetes alrededor
https://translate.googleusercontent.com/translate_f 376/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
fracciones. Debe insertar \ left y \ right antes del corchete para informar al
analizador que esos corchetes abarcan todo el objeto:
æ 1 ö
C5 - ÷
C X÷
C 4 ÷
mi ø
Radicales
Los radicales se pueden producir con el comando \ sqrt [] {}.
r '$ \ sqrt {2} $'
Fuentes
La fuente predeterminada es cursiva para los símbolos matemáticos. Para cambiar fuentes, por ejemplo con
funciones trigonométricas como pecado:
st()
= Asin 2 t () w
539
Página 549
Acentos
Un comando de acento puede preceder a cualquier símbolo para agregar un acento encima. Hay mucho
y formas cortas para algunos de ellos.
\ agudo a o \ 'a
\ bar a
\ breve a
\ ddot a o \ "a
\ dot a o \ .a
\ grave a o \ `a
\ hat a o \ ^ a
\ tilde a o \ ~ a
\ vec a
\ overline {abc}
Simbolos
También puede utilizar una gran cantidad de símbolos TeX.
Griego minúsculo
https://translate.googleusercontent.com/translate_f 377/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
\ lambda \ mu \ nu \omega \fi
\ zeta
540
Página 550
Griego en mayúsculas
\ nabla
hebreo
Delimitadores
\ vert \{ \| \} ] |
Simbolos Grandes
541
Página 551
https://translate.googleusercontent.com/translate_f 378/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
( continuacion )
542
Página 552
\ geqslant \ gg \ ggg
https://translate.googleusercontent.com/translate_f 379/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
\ leq \ leqq \ leqslant
\ ll \ lll \ lnaprox
\medio \ modelos \ mp
\ nVdash \ nVdash \ naprox
\ ngtr \ ni \ nleq
( continuacion )
543
Página 553
\ wr
544
https://translate.googleusercontent.com/translate_f 380/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 554
Símbolos de flecha
\ longrightarrow \ lsh
\ nearrow \ nwarrow
\ rsh \ Searrow
\ enjambre \ Uparrow
\ Updownarrow \ circlearrowleft
\ circlearrowright \ curvearrowleft
\ curvearrowright \ dashleftarrow
\ downdownarrows \ downharpoonleft
\ downharpoonright \ hookleftarrow
\ hookrightarrow \lleva a
\flecha izquierda \ leftarrowtail
\ leftharpoondown \ leftharpoonup
\ leftleftarrows \ leftrightarrow
\ leftrightarrows \ leftrightharpoons
\ leftrightsquigarrow \ leftsquigarrow
\ longleftarrow \ longleftrightarrow
\ longmapsto \ longrightarrow
\ looparrowleft \ looparrowright
\ mapsto \ multimap
\ nleftarrow \ nleftrightarrow
\ nrightarrow \ nearrow
\ nleftarrow \ nleftrightarrow
( continuacion )
545
Página 555
\ nrightarrow \ nwarrow
\flecha correcta \ rightarrowtail
\ rightharpoondown \ rightharpoonup
\ rightleftarrows \ rightleftarrows
\ rightleftharpoons \ rightleftharpoons
\ rightrightarrows \ rightrightarrows
\ rightsquigarrow \ Searrow
\ enjambre \a
\ twoheadleftarrow \ twoheadrightarrow
\ uparrow \ updownarrow
\ updownarrow \ upharpoonleft
https://translate.googleusercontent.com/translate_f 381/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
\ upharpoonright \ upuparrows
Símbolos Misceláneos
\re \s \ángulo
\ backprime \gran estrella \ blacksquare
\ blacktriangle \ blacktriangledown \ cdots
\marca de verificación \ circledr \ círculos
( continuacion )
546
Página 556
\ sphericalangle \ ss \ triangledown
\ wp \yen
https://translate.googleusercontent.com/translate_f 382/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
547
Página 557
APÉNDICE B
http://data.gov
Socrata
http://www.socrata.com/resources/
Socrata es un buen lugar para explorar datos relacionados con el gobierno. Además, proporciona
algunas herramientas de visualización para explorar datos.
http://www.census.gov/data.html
Este sitio proporciona información sobre ciudadanos estadounidenses que cubren datos de población,
datos y educación.
UN3ta
https://data.un.org/
UNdata es un servicio de datos basado en Internet que ofrece bases de datos estadísticas de la ONU.
http://open-data.europa.eu/en/data/
Este sitio proporciona una gran cantidad de datos de las instituciones de la Unión Europea.
549
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1
Página 558
Data.gov.uk
http://data.gov.uk/
Este sitio del gobierno del Reino Unido incluye la bibliografía nacional británica: metadatos
en todos los libros y publicaciones del Reino Unido desde 1950.
https://www.cia.gov/library/publications/the-world-factbook/
Este sitio de la Agencia Central de Inteligencia proporciona mucha información sobre la historia,
https://translate.googleusercontent.com/translate_f 383/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
población, economía, gobierno, infraestructura y ejército de 267 países.
Datos de salud
Healthdata.gov
https://www.healthdata.gov/
http://www.hscic.gov.uk/home
Conjuntos de datos de salud del Servicio Nacional de Salud del Reino Unido.
Datos sociales
Gráfico de Facebook
https://developers.facebook.com/docs/graph-api
Topsy
http://topsy.com/
Topsy proporciona una base de datos de búsqueda de tweets públicos que se remontan a 2006, así como
varias herramientas para analizar las conversaciones.
550
Página 559
Tendencias de Google
http://www.google.com/trends/explore
Estadísticas sobre el volumen de búsqueda (como proporción de la búsqueda total) para cualquier término dado,
desde el 2004.
http://likebutton.com/
Extrae los datos públicos de Facebook, a nivel mundial y de su propia red, para brindar una
descripción general de lo que le gusta a la gente en este momento.
http://aws.amazon.com/datasets
Los conjuntos de datos públicos de Amazon Web Services proporcionan un repositorio centralizado de
conjuntos de datos públicos. Un conjunto de datos interesante es el Proyecto 1000 Genome, un intento de construir
la base de datos más completa de información genética humana. También una base de datos de la NASA
de imágenes de satélite de la Tierra está disponible.
DBPedia
http://wiki.dbpedia.org
Freebase
https://translate.googleusercontent.com/translate_f 384/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
http://www.freebase.com/
Esta base de datos comunitaria proporciona información sobre varios temas, con más de 45
millones de entradas.
551
Página 560
Gapminder
http://www.gapminder.org/data/
Este sitio proporciona datos provenientes de la Organización Mundial de la Salud y el Banco Mundial
cubriendo estadísticas económicas, médicas y sociales de todo el mundo.
Datos financieros
Finanzas de Google
https://www.google.com/finance
Datos climáticos
Centro Nacional de Datos Climáticos
http://www.ncdc.noaa.gov/data-access/quick-links#loc-clim
WeatherBase
http://www.weatherbase.com/
Este sitio proporciona promedios climáticos, pronósticos y condiciones actuales para más de 40,000
ciudades de todo el mundo.
Wunderground
http://www.wunderground.com/
Este sitio proporciona datos climáticos de satélites y estaciones meteorológicas, lo que le permite
Obtenga toda la información sobre la temperatura, el viento y otras medidas climáticas.
552
Página 561
Datos deportivos
Pro-Football-Reference
http://www.pro-football-reference.com/
https://translate.googleusercontent.com/translate_f 385/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Este sitio proporciona datos sobre fútbol y varios otros deportes.
http://developer.nytimes.com/docs
Archivo indexado y con capacidad de búsqueda de artículos de noticias que se remontan a 1851.
http://storage.googleapis.com/books/ngrams/books/datasetsv2.html
Esta fuente busca y analiza el texto completo de cualquiera de los millones de libros
digitalizado como parte del proyecto Google Books.
Datos musicales
Conjunto de datos de millones de canciones
http://aws.amazon.com/datasets/6468931156960467
Metadatos de más de un millón de canciones y piezas musicales. Parte de Amazon Web Services.
553
Página 562
Índice
UNA si
Acentos, LaTeX, 540– 547 Gráfico de barras
Agregación de datos avanzada 3D 306- 307
Aplicar () funciones, 225 barras de error, 281
función transform (), 226 horizontal, 281- 282
Anaconda, 24, 88 matplotlib, 278
Anderson Iris Dataset, ver flor de Iris multiserial 282– 284
conjunto de datos barra apilada multiserie, 286– 290
Manipulación de matrices Pandas DataFrame, 285– 286
uniendo matrices representaciones, 291
column_stack () y row_stack (), 72 gráficos de barras apiladas, 290
función hstack (), 71 eje x, 280
función vstack (), 71 función xticks (), 279
dividir matrices Métodos bayesianos, 4
función hsplit (), 72 Big Data, 353
función split (), 73- 74 Bigrams, 498
función vsplit (), 72 Redes neuronales biológicas, 361
Inteligencia artificial, 5, 350 Operación de mezcla, 520
esquematización de, 352
Redes neuronales artificiales
https://translate.googleusercontent.com/translate_f 386/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
redes biológicas, 361 C
bordes 356 Caffe2, 355
capa oculta, 357 Tipología de gráfico, 267
capa de entrada y salida, 357 Mapas de coropletas
perceptrón multicapa, 360 Biblioteca D3, 459
nodos, 356 representaciones geográficas, 459
esquematización de, 355– 356 Función HTML (), 461– 462
SLP ( ver Perceptrón de capa única (SLP)) jinja2, 462– 463
peso, 356 JSON y TSV, 463
555
© Fabio Nelli 2018
F. Nelli, Python Data Analytics , https://doi.org/10.1007/978-1-4842-3913-1
Página 563
ÍNDICE
556
Página 564
ÍNDICE
https://translate.googleusercontent.com/translate_f 387/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
validación del modelo, 13 procedimientos de, 181
fase de planificación, 9 Estructuras de datos, operaciones
modelado predictivo, 12 DataFrame y series, 121- 122
preparación, 10 aritmética flexible
definición del problema, 8 métodos, 120- 121
etapas, 6- 8 Transformación de datos
propósito de, 1 función drop_duplicates (), 199
Python y, 17 cartografía
cuantitativo y cualitativo, 14 sumando valores, 201
tipos ejes, 202
datos categóricos, 6 dict objetos, 199
datos numéricos, 6 reemplazando valores, 199
Marco de datos eliminar duplicados, 198- 199
pandas Visualización de datos
definición, 103- 105 agregando texto
dictado anidado, 111 etiquetas de eje, 251- 252
operaciones, 121 etiqueta informativa, 254
estructura, 103 expresión matemática, 254- 255
transposición, 111 modificado de, 252
estructura, 102 función text (), 253
Manipulación de datos gráfico de barras ( ver gráfico de barras)
agregación ( ver agregación de datos) tipología de cartas, 267
concatenación, 188 gráfico de contorno / mapa, 297– 299
discretización y agrupamiento, 204 análisis de los datos, 231
iteración de grupo, 222 Superficies 3D, 302, 304
permutación, 210 cuadrícula, 256
fases de, 181 cuadrículas, subtramas, 309
preparación ( ver preparación de datos) manejo de valores de fecha, 264- 267
cadena ( ver manipulación de cadenas) histograma, 277– 278
transformación, 197 instalación, 233
Preparación de datos, 181 IPython e IPython
Marco de datos, 182 QtConsole, 233, 235
operación de fusión, 182 kwargs
pandas.concat (), 182 figuras y ejes, 249
pandas.DataFrame.combine_ subtramas horizontales, 249- 250
primero (), 182 ancho de línea, 248
557
Página 565
ÍNDICE
https://translate.googleusercontent.com/translate_f 388/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
ventana de trazado función de corte (), 205– 206, 208–209
botones de, 241 describir () función, 209
comandos, 241 detectar y filtrar
matplotlib y NumPy, 246 valores atípicos, 209
función plt.plot (), 242, 243 qcut (), 208- 209
propiedades, 243 función std (), 210
QtConsole, 241– 242 función value_counts (), 206
carta polar, 299, 301 Django, 17
módulo pyplot, 239 Goteante, 117- 118
ahorro, gráficos
Archivo HTML, 262– 263
archivo de imagen, 264
mi
código fuente, 260– 261 Eclipse (pyDev), 41– 42
gráfico de dispersión, 3D, 304- 305 Cálculo por elementos, 47
Árboles de decisión, 11 Programación orientada a expresiones, 33
558
Página 566
ÍNDICE
F yo
Datos financieros, 552 IDE, consulte Desarrollo interactivo
Métodos aritméticos flexibles, 120- 121 entornos (IDE)
Fuentes, LaTeX, 539 Análisis de imagen
concepto de, 521
convoluciones, 523
GRAMO
definición, 507
Teoría del gradiente 523
detección de bordes, 522, 525
Unidad de procesamiento de gráficos (GPU), 353 blanco y negro.jpg
Agrupación, 11
imagen, 526– 529, 531
Iteración de grupo sistema blanco y negro, 525
cadena de transformaciones, 222, 224
función de filtros, 528
funciones en grupos gradients.jpg imagen, 532
función mark (), 224- 225
degradados grises, 525
función cuantiles (), 224 Filtros Laplacianos y Sobel, 531
Objeto GroupBy, 222
resultados, 528
código fuente, 530
H detección de rostros, 532
Reconocimiento de escritura a mano teoría del gradiente, 523
conjunto de datos de dígitos, 475– 478 OpenCV ( ver Computadora de código abierto
dígitos escritos a mano, matplotlib Visión (OpenCV))
biblioteca, 478 operaciones, 508
aprender y predecir, 478, 480, 482 representacion de, 522
Software de OCR, 473 Funciones de indexación
scikit-learn, 474– 475 aritmética y datos
estimador de svc, 480 alineación, 118, 120
TensorFlow, 480 goteante, 117- 118
conjunto de validación, seis dígitos, 479 reindexar, 114, 116
Datos de salud, 550 Integración, 47
Indexación jerárquica Entornos de desarrollo interactivos
arrays, 136- 137 (IDE)
Marco de datos, 135 Eclipse (pyDev), 41– 42
reordenamiento y los niveles de clasificación, 137- 138 Komodo, 45
función stack (), 136 Liclipse, 43– 46
niveles estadísticos, 138 NinjaIDE, 44- 45
estructura, 134 Spyder, 41
estructura bidimensional, 134 Sublime, 42– 43
559
Página 567
https://translate.googleusercontent.com/translate_f 389/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
ÍNDICE
560
Página 568
ÍNDICE
https://translate.googleusercontent.com/translate_f 390/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
función matemática, 268 Expresiones matemáticas con LaTeX,
pandas 276 ver LaTeX
función plot (), 268 MATLAB, 17
función set_position (), 273 matplotlib, 48
funciones xticks () y yticks (), 271 biblioteca matplotlib
Distribución de Linux, 90 arquitectura
Diagrama de nubes LOD, 16 capa de artista, 236- 238
Regresión logística, 12 capa de backend, 236
funciones y herramientas, 235
capas, 235
METRO pylab y pyplot, 238- 239
Aprendizaje automático (ML), 5 capa de secuencias de comandos (pyplot), 238
proceso de desarrollo de algoritmos, 313 capa de artista
aprendizaje profundo, 351 representación gráfica, 237
conjunto de datos de diabetes, 327– 328 estructura jerárquica, 236
características / atributos, 314 primitivo y compuesto, 237
Conjunto de datos de flores de iris, 316 representación grafica, 231, 233
problema de aprendizaje, 314 Látex, 232
regresión lineal / de mínimos cuadrados NumPy, 246
561
Página 569
ÍNDICE
562
https://translate.googleusercontent.com/translate_f 391/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
Página 570
ÍNDICE
563
Página 571
ÍNDICE
https://translate.googleusercontent.com/translate_f 392/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
datos sociales, 550– 551 transposición, 111
datos deportivos, 553 evaluar valores, 98– 99
Visión por computadora de código abierto (OpenCV) objetos de índice, 112
aprendizaje profundo, 509 etiquetas duplicadas, 112- 113
procesamiento y análisis de imágenes, 509 métodos, 112
función add (), 515 Valores de NaN, 99, 101
imagen negruzca, 518 Matrices NumPy y existentes
mezcla, 520 serie, 96– 97
método destroyWindow (), 512 operaciones, 120- 122
operaciones elementales, 514 operaciones y matemática
método imread (), 510 funciones, 97– 98
método imshow (), 511 serie, 93
carga y visualización, 510 asignar valores, 95
método merge (), 513 declaración, 94
Matrices NumPy, 519 diccionarios, 101
opción de ahorro, 514 filtrado de valores, 97
método waitKey (), 511 índice, 93
proceso de trabajo, 512 elementos internos, selección, 95
instalación, 509 operaciones, 102
Paquetes MATLAB, 508 Biblioteca Pandas, 87
empezar a programar, 510 correlación y covarianza, 129- 131
Programación de código abierto estructuras de datos ( ver datos de Pandas
idioma, 21 estructuras)
564
Página 572
ÍNDICE
https://translate.googleusercontent.com/translate_f 393/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
marco de datos
Lenguaje pop2014, 447–
de programación 448 20
portátil, bibliotecas, 46
matplotlib, 48
565
Página 573
ÍNDICE
566
Página 574
ÍNDICE
https://translate.googleusercontent.com/translate_f 394/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
opciones nrows y skiprows, 149 atributo de forma, 70
porción por porción, 149 función transpose (), 71
escritura ( ver Escritura de datos) Perceptrón de capa única (SLP), 371
XML ( ver XML) precisión, 359
Modelos de regresión, 4, 12 función de activación, 358, 359
Reindexar, 114- 116 arquitectura, 357
RoseWind optimización de costes, 382
DataFrame, 436– 437 análisis de los datos, 372
matriz hist, 438– 439 fase de evaluación, 359
carta polar, 438, 440–441 fase de aprendizaje, 359, 378
representación del diagrama de dispersión, 438 definición de modelo, 374
función showRoseWind (), 439, 441 explícitamente, 376
implícitamente, 376
fase de aprendizaje, 375
S marcadores de posición, 376
Biblioteca Scikit-learn, 473 función tf.add (), 377
análisis de los datos, 474 función tf.nn.softmax (), 377
k-clasificación de vecinos más cercanos, 322 módulos, 372
PCA, 320 representación, 358
Módulo de Python, 313 equipo de prueba, 385
sklearn.svm.SVC, 475 fase de prueba y precisión
aprendizaje supervisado, 315 cálculo, 383
módulo svm, 475 conjuntos de entrenamiento, 359
Ciencia Datos sociales, 550
bibliotecas, 46 función sort_index (), 126-128 , 138
matplotlib, 48 Datos deportivos, 553
NumPy, 47 SQLite3, 171
pandas 47 función stack (), 136
567
Página 575
ÍNDICE
https://translate.googleusercontent.com/translate_f 395/396
30/8/2020 Con Pandas, NumPy y Matplotlib - Segunda edición - Fabio Nelli
matriz de support_vectors, 337 representaciones de, 367
conjunto de formación, espacio de decisión, 334– 336 función tf.convert_to_tensor (), 368
Soporta máquinas de vectores (SVM) método tf.ones (), 369
espacio decisional, 334 función tf.random_normal (), 369
límite de decisión, 334 función tf.random_uniform (), 369
Conjunto de datos de iris método tf.zeros (), 368
568
Página 576
ÍNDICE
U, V
Oficina del censo de Estados Unidos, 445 a 446 X, Y, Z
Funciones universales (ufunc), 61 XML
Aprendizaje sin supervisión, 314 books.xml, 157- 158
getchildren (), 158
función getroot (), 158
W estructura de árbol lxml.etree, 159
Raspado web, 4, 10 biblioteca lxml, 157
Velocidad del viento objetivar, 158
representación de carta polar, 442 función parse (), 158
Función RoseWind_Speed (), 441 atributo de etiqueta, 158
Función ShowRoseWind (), 442 atributo de texto, 159
569
https://translate.googleusercontent.com/translate_f 396/396