1 - Scraping HTML

Extracción de datos de páginas web

Motivación

Hay veces que la información no está disponible para descargar en un formato estructurado, como CSV o JSON. En estos casos, es necesario extraer la información de la página web y convertirla a un formato estructurado.

Nota: Es importante revisar la política de uso de la página web para asegurarnos de que no estamos infringiendo ninguna norma.

Acceso a los datos

Accedemos a los datos por selectores de CSS o expresiones XPath.

Para CSS aquí tienes un buen resumen de selectores https://gist.github.com/magicznyleszek/809a69dd05e1d5f12d01

Para XPath aquí tienes un buen resumen de selectores https://devhints.io/xpath

requests-html

requests-html permite acceder a página generadas con JavaScript (SPA por ejemplo). Pero la gestión de los procesos choca con Jupyter.

Echa un vistazo a este ejemplo: https://github.com/lmorillas/curso-python-iot/blob/main/src/scraping-spa.py

Descárgalo y ejecútalo en tu ordenador.

TAREA

Genera un archivo json con los datos de los libros de alguna de las librerías siguientes:

El primer caso es un scraping normal (html estático). El segundo es un scraping de una SPA (Single Page Application).

Un ejemplo del archivo json generado puede ser el siguiente:

[
  {"titulo": "A Light in the Attic",
  "autor": "by Suzanne Collins",
  "precio": "51.77",
  "stock": "true",
  "categoria": "Poetry",
  "imagen": "http://books.toscrape.com/media/cache/fe/72/fe72f0532301ec28892ae79a629a293c.jpg"
  },
  ...
]

Si algún dato no está disponible o no se puede extraer, puedes poner null.

2 - Extracción texto de webs e imágenes

Extracción de texto. Práctica con AWS

Práctica de extracción de texto con AWS

En esta práctica vamos a utilizar el servicio de AWS Sagemaker para extraer texto de páginas web y de imágenes.

Para extraer texto de imágnes usaremos Textract.

Sigue las instrucciones de esta actividad del curso: https://awsacademy.instructure.com/courses/55981/modules/items/4907052

Extra

Puedes intentar alguno de estos ejemplos en el mismo lab de Sagemaker: https://github.com/aws-samples/amazon-textract-code-samples/tree/master

Por ejemplo:

Intenta cambiar las imágenes de ejemplo por otras que te resulten más interesantes.

Escrito a mano

https://aws.amazon.com/es/blogs/machine-learning/amazon-textract-recognizes-handwriting-and-adds-five-new-languages/

3 - Streamlit

Introducción a la creación de apps y cuadros de mando con Streamlit

¿Qué es Streamlit?

Es un framework para crear aplicaciones web de datos con Python.

Ventajas

  • Visualización en tiempo real
  • Paneles interactivos
  • Facilidad de uso
  • Integración con el conjunto de herramientas de ciencia de datos de Python: Pandas, NumPy, Plotly

Instalar

mejor en un entorno virtual

pip install streamlit

Demo

streamlit hello

Ejecutar

 streamlit run your_script.py [-- script args]

También se puede ejecutar una aplicación remota

$ streamlit run https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/streamlit_app.py

Primeros recursos

Texto

import streamlit as st

# Text/Title
st.title("Streamlit Tutorial")

# Header/Subheader
st.header("Encabezado de la app")
st.subheader("Segundo nivel de encabezado")

# Text
st.text("Texto normal de la app")

# Markdown
st.markdown("### Texto en markdown")

Texto en colores y errores

st.success("Successful")

st.info("Information!")

st.warning("This is a warning")

st.error("This is an error Danger")

st.exception("NameError('name three not defined')")

Widgets

# Checkbox
if st.checkbox("Show/Hide"):
	st.text("Showing or Hiding Widget")

# Radio Buttons
status = st.radio("What is your status",("Active","Inactive"))

if status == 'Active':
	st.success("You are Active")
else:
	st.warning("Inactive, Activate")

# SelectBox
occupation = st.selectbox("Your Occupation",["Programmer","DataScientist","Doctor","Businessman"])
st.write("You selected this option ",occupation)


# MultiSelect
location = st.multiselect("Where do you work?",("London","New York","Accra","Kiev","Nepal"))
st.write("You selected",len(location),"locations")

# Slider
level = st.slider("What is your level",1,5)

# Buttons
st.button("Simple Button")

if st.button("About"):
	st.text("Streamlit is Cool")

Input del usuario

# Receiving User Text Input
firstname = st.text_input("Enter Your Firstname","Type Here..")
if st.button("Submit"):
	result = firstname.title()
	st.success(result)


# Text Area
message = st.text_area("Enter Your message","Type Here..")
if st.button("Submit"):
	result = message.title()
	st.success(result)
with st.sidebar:
    st.title("Título de la barra lateral")

    st.markdown(":+1: Introducción a la biblioteca `streamlit`. :sunglasses:")

    tech = st.selectbox(
        "Selecciona un color",
		["red", "orange", "yellow", "green", "blue", "indigo", "violet"],
    )

    start, end = st.slider(
        "Curso", 1990, 2023, (1990, 2023), step=1, help="Selecciona el año de inicio y fin del curso"
    )

Configuración

En el archivo ~/.streamlit/config.toml se puede configurar el puerto, el ancho de la página, etc. https://docs.streamlit.io/library/advanced-features/configuration

Tema

https://docs.streamlit.io/library/advanced-features/theming

Más

Primer ejemplo

https://github.com/lmorillas/streamlit-tdt/blob/main/tdt.py

  • requisitos: instalar streamlit y requests

4 - Primeros pasos con Pandas

Introducción rápida a la gestión de datos con Pandas

Introducción

¿Qué es Pandas?

Pandas es una biblioteca de Python que proporciona estructuras de datos de alto rendimiento y herramientas de análisis de datos. Es ideal para manipular y analizar datos, así como para organizar datos en un formato tabular y adjuntar etiquetas descriptivas a las filas y columnas.

¿Por qué usar Pandas?

  1. Facilita el manejo de datos: Ofrece estructuras como DataFrames y Series para manejar datos de manera eficiente.
  2. Potente para análisis de datos: Proporciona funciones incorporadas para agrupar, fusionar y resumir datos.
  3. Compatibilidad con diferentes formatos de archivos: Puedes importar datos desde varios formatos como CSV, Excel, JSON, SQL y muchos otros.

Componentes principales

  1. Series: Un array unidimensional etiquetado capaz de contener cualquier tipo de datos.
  2. DataFrame: Una matriz bidimensional con etiquetas tanto de fila como de columna. Esencialmente, un conjunto de Series que comparten un índice.

Ampliación: pandas en AWS Sagemaker

Vemos cómo se lanza el lab en clase.

5 - Proyecto 3

Visualización de canales de TDT con Streamlit

Modifica el proyecto 2 para que use pandas para la gestión de los datos.

Filtrar y organizar datos climáticos

Ten cuidado con el encoding de los archivos.


url_metadatos = "https://raw.githubusercontent.com/lmorillas/curso-python-iot/main/notebooks/metadatos-clima.json"

r = requests.get(url_metadatos)

r.encoding = 'ISO-8859-1'  # los datos no están en utf-8

Puedes usar encoding='latin-1' en pd.read_csv() para evitar problemas.

Tareas

  • Analiza los metadatos.
  • Crea un DataFrame con los datos de julio y otro con los de agosto.
  • Explora los datos
  • Crea un DataFrame con los datos de julio y agosto (concaténalos). En este caso usaremos una unión vertical (por filas)
import pandas as pd

# Leer archivos JSON en DataFrames
df1 = pd.read_json("archivo_climatico1.json")
df2 = pd.read_json("archivo_climatico2.json")

df_unido = pd.concat([df1, df2])
  • Guarda todos los datos unidos en un nuevo archivo JSON.

  • Crea una gráfica con los datos de temperatura máxima y mínima de julio y agosto.

Aplicación con los centros educativos de Aragón

Revisa el listado de centros educativos del portal del Gobierno de Aragón: https://educa.aragon.es/buscador-de-centros Tienes un json en centros.json

Crea una aplicación con Streamlit que permita filtrar los centros por provincia y localidad, tipo de centro, tipo de enseñanza, etc y que muestre los resultados en una tabla o en un mapa.