Versión imprimible multipagina. Haga click aquí para imprimir.
Extracción y visualización de datos
1 - Scraping HTML
Documentación
- Requests: https://docs.python-requests.org/en/master/ & https://requests-html.kennethreitz.org/
- Beautiful Soup: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
- LXML: https://lxml.de/
- Selenium: https://selenium-python.readthedocs.io/
Algunos tutoriales
- https://www.learndatasci.com/tutorials/ultimate-guide-web-scraping-w-python-requests-and-beautifulsoup/
- https://aprendepython.es/pypi/scraping/
- https://realpython.com/beautiful-soup-web-scraper-python/
Notebook Base
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
Documentación
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:
- https://github.com/aws-samples/amazon-textract-code-samples/blob/master/python/03-reading-order.py
- https://github.com/aws-samples/amazon-textract-code-samples/blob/master/python/04-nlp-comprehend.py
Intenta cambiar las imágenes de ejemplo por otras que te resulten más interesantes.
Escrito a mano
3 - 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)
Sidebar
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
yrequests
4 - Primeros pasos con Pandas
Documentación
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?
- Facilita el manejo de datos: Ofrece estructuras como DataFrames y Series para manejar datos de manera eficiente.
- Potente para análisis de datos: Proporciona funciones incorporadas para agrupar, fusionar y resumir datos.
- Compatibilidad con diferentes formatos de archivos: Puedes importar datos desde varios formatos como CSV, Excel, JSON, SQL y muchos otros.
Componentes principales
- Series: Un array unidimensional etiquetado capaz de contener cualquier tipo de datos.
- 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
- Descarga los datos de Zaragoza de este verano (julio y agosto) de la web de AEMET: https://opendata.aemet.es/centrodedescargas/productosAEMET? Necesitarás generarte una API Key. Los datos los tienes también aquí: julio agosto metadatos
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.