Curso de Ingeniería de Datos con Python
¿Qué es la Ciencia e Ingeniería de Datos?
La Ciencia de Datos es la disciplina que se encarga de extraer conocimiento de los datos disponibles. Casi siempre cuando te realizas una pregunta sobre datos estas fuentes se encuentra escondidas, ocultas o de difícil acceso. A nuestro alrededor hay datos en tu computadora, mesa, reloj, etc.
Los datos están por todas partes.
La Ciencia de datos es multidisciplinaria. A diferencia de muchos otros ámbitos profesionales dentro del mundo de la tecnología, cuando hablamos de un científico de datos es una persona que sabe de matemáticas, ingeniería de software y sabe de negocios.
Se apoya en la Computer science, Matemáticas(Regresiones e Inferencias),
También se auxilia de:
- Bases de Datos
- Análisis de texto y procesamiento de lenguaje natural
- Análisis de redes
- Visualización de datos
- Machine learning e Inteligencia Artificial
- Análisis de señales digitales
- Análisis de datos en la nube(Big Data)
Roles
Existen por lo menos tres diferentes roles para tener un pipeline completo de ciencia de datos. Este curso trata sobre el primer rol:
Configuración del ambiente
Anaconda es una instalación de Python que ya trae preinstalado todos los paquetes necesarios para tu labor en la Ciencia de Datos, tiene más de 1400 paquetes. Nos permite configurar ambientes virtuales para poder utilizar diferentes versiones de nuestros paquetes.
conda --version # para conocer la versión y saber que lo tenemos instalado
conda --help # nos da todos los comandos que podemos usar.
conda list # nos lista todos los paquetes que Anaconda instaló.
Una buena práctica es generar un ambiente virtual por cada proyecto, los ambientes virtuales nos permiten generar varios proyectos con diferentes versiones de la librería sin generarnos errores de compatibilidad. Tradicionalmente en Python se utiliza virtualenv.
conda create --name [nombre-del-proyecto] [librerías-a-usar]
conda create --name platzi-data beautifulsoup4 requests numpy pandas matplotlib yaml
source activate platzi-data # Para activar
source deactivate # Para salir
conda env list # nos muestra los ambientes virtuales que tenemos
conda remove --name [nombre-del-proyecto] --all # eliminar nuestro entorno virtual con todos nuestros paquetes
Jupyter Notebook
Algo interesante que tenemos con Anaconda es que nos trae Jupyter Notebooks.
Jupyter Notebooks es un entorno de programación en el cual podemos mezclar ejecución de código en vivo, visualizaciones y añadir markdown.
Para inicializar nuestro servidor de jupyter, escribimos en el command line: jupyter notebook.
Jupyter Notebook tiene diferentes tipos de celdas en las cuales podemos escribir código o markdown. Si queremos ejecutar nuestro código hacemos ctrl + enter y si queremos ejecutar y añadir una nueva celda shift + enter.
Jupyter Notebook tiene dos modalidades, la modalidad de edición y navegación.
Tipos de datos
Los datos vienen en mucha formas y estas formas las podemos clasificar de diferentes maneras, permitiéndonos poder aplicar técnicas distintas a cada uno de los tipos de datos.
Los primeros datos son los primitivos.
- int,
- str,
- bool,
- float,
- hex,
- oct,
- datetime,
- objetos especiales
from datetime import datetime
integer_type = 42
float_type = 3.14159
bool_type = False
hex_type = 0xff
oct_type = 0o23
today = datetime.now()
str_type = 'Jesus'
Tenemos clasificaciones ulteriores como:
- Los datos estructurados: son los más fáciles de acceder
- Bases de datos
- Data warehouses
- Semi estructurados: son con los que podemos utilizar APIs
- json API
- Datos tabulares (csv, excel)
- no estructurados: la mayoría de datos que vamos a tener disponibles están clasificados aquí
- HTML
- Texto libre
- Currículums vitae
- Imágenes, audio, social media
- Datos científicos
- Cualitativos vs cuantitativos
- Tiempo real vs históricos
Fuentes de datos
Es una mina enorme con datos financieros, de startups, del clima, precipitación fluvial, astronómicos, de negocios, etc.
Endpoints que viven en la web y nos devuelven JSON. Por ejemplo, la API de twitter, google, facebook.
Son el comportamiento del usuario dentro de nuestra aplicaciones, algo similiar a los que nos ofrece Google Analytics.
Se ha vuelto una mina espectacular en los últimos años. Como automóviles.
Links de fuentes de datos
ETL (Extract Transform Load)
Extract: Es el proceso de lectura de datos de diversas fuentes
- Base de datos
- CRM
- Archivos CSV
- Datasets públicos
Transform: En este momento cuando nosotros tenemos que transformar los datos, tenemos que identificar datos faltantes o datos erróneos o una edad negativa. En esta etapa donde tenemos que identificar todos los problemas y solucionarlos.
- Limpieza
- Estructurado
- Enriquecimiento.
Load: Una vez transformados debemos insertarlos en el data warehouse
- Depende del tipo de solución que se haya escogido
Introducción a las tecnologías web
Las tecnologías web en principio podemos pensarlas como el internet, pero el internet es mucho más grande, es la red de redes, la forma en la que millones de computadores se conectan entre ellas para transferirse información.
El internet también se compone de otros pedazos como:
- Telefonía(voip),
- Mail(pop3, imap),
- Compartir archivos(ftp).
El internet es una red que une varias redes públicas, privadas, académicas, de negocios, de gobiernos, etc.
La web específicamente es un espacio de información en el cual varios documentos(y otros recursos web) se pueden acceder a través de URLs y vínculos(links). La comunicación se da a través del protocolo HTTP.
Elementos básicos de la web:
- HTML: nos da la estructura de la información. Es un lenguaje para anotar pedazos de información para que el navegador o otros tipos de programa puedan interpretar que tipo de información se encuentra ahí.
- CSS: nos permite darle colores, arreglar el texto y añadir diferentes elementos de presentación.
- Javascript: nos permite añadir interactividad y cómputo a nuestra web.
- JSON: Simplemente es una forma de transmitir datos entre servidores y clientes. Es la forma estándar en las que en la web y las aplicaciones se comunican con los servidores backend.
Un link interesante para los sitios SPA, sería Puppeteer, ya que al ser rendereado por JavaScript, nuestro scrapping a veces puede que nos traiga sitios "vacíos".
Realizando solicitudes HTTP con Python
Para poder experimentar con la web necesitamos un método programático para solicitar URLs y obtener HTML.
Requests: Nos permite generar solicitudes a la web dentro de Python y utilizar los diferentes verbos HTTP, normalmente utilizaremos el método GET porque vamos a traer datos.
Algunos ejemplos de verbos HTTP:
- GET
- POST
- PUT
- DELETE
- PATCH
- OPTIONS
requests.get('url') # para hacer una solicitud a la web y nos devolverá un objeto response
Todas las solicitudes HTTP tienen metadatos para que los diferentes sistemas y computadoras puedan entender de qué va la solicitud.
Algunos de los códigos de estado del protocolo HTTP:
- 200 : OK - Petición correcta.
- 400 : Bad request - Petición incorrecta.
- 404 : Not found - Recurso no encontrado.
Estos códigos estan categorizados en los siguientes grupos:
- 1xx : Respuestas informativas (Ej: 100, 101, 102, etc.)
- 2xx : Peticiones correctas (Ej: 200, 201, 202, etc.)
- 3xx : Redirecciones (Ej: 300, 301, 302, etc.)
- 4xx : Errores en el lado del cliente (Ej: 400, 401, 402, etc.)
- 5xx : Errores en el lado del servidor (Ej: 500, 501, 502, etc.)
Puedes ver la lista en este link
Un ejemplo del uso de una librería de Python llamada requests:
import requests
response = requests.get('https://platzi.com')
response? # Nos da una respuesta con información mínima del tipo de contenido
response?? # Nos extiende la respuesta de la clase con su contenido
print(dir(response)) # Nos da todos los métodos que podemos usar en response
# ['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', '_next', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history',