Carga y almacenamiento de datos

Aprende a cargar en pandas datos de los formatos que los analistas encuentran a diario y a guardarlos de nuevo sin perder información. Lee archivos CSV y otros archivos de texto con los delimitadores, formatos numéricos, marcadores de valores faltantes, fechas y codificaciones adecuados, incluidos informes con líneas de título y pies. Carga libros de Excel, archivos JSON y datos de API web, guarda resultados en CSV, Excel y Parquet, y lee y escribe datos en bases de datos SQL mediante consultas parametrizadas seguras.

IntermedioUnidad 3 de 8 del curso Curso de Análisis de datos con Python

Lo que aprenderás

  1. Lee archivos CSV y otros archivos de texto delimitado con pd.read_csv, controla cómo pandas divide, etiqueta y asigna tipos a las columnas y comprueba el resultado antes de analizarlo.
    • Lee un archivo CSV e inspecciona el resultado creado por pandas
      Carga un archivo separado por comas en un DataFrame, elige el encabezado, los nombres de las columnas, el índice y las columnas que conservarás, y comprueba los tipos que pandas ha inferido.
    • Gestiona delimitadores y formatos numéricos regionales
      Reconoce el delimitador, el separador decimal y el separador de millares que usa un archivo, y configura sep, decimal y thousands para que los números se carguen como números.
    • Controla los valores faltantes, los tipos de las columnas y las fechas durante la lectura
      Indica a pandas qué marcadores significan «faltante», conserva los identificadores como texto, elige tipos numéricos e interpreta fechas con un formato explícito.
    • Lee archivos con estructuras irregulares
      Omite líneas de título, comentarios y pies de informe, lee encabezados de varias filas y columnas de ancho fijo, y decide cómo tratar las líneas con formato incorrecto.
  2. Comprende cómo se almacena el texto como bytes, corrige errores de codificación y caracteres corruptos, y lee archivos demasiado grandes o lentos para cargarlos de una sola vez.
    • Comprende cómo se representan los caracteres mediante bytes
      Explica qué es una codificación y reconoce ASCII, UTF-8, Latin-1, Windows-1252, UTF-16 y la marca de orden de bytes.
    • Diagnostica y corrige problemas de codificación
      Reconoce un error de decodificación y el texto corrupto por una codificación incorrecta (mojibake), encuentra la codificación adecuada y escribe archivos que otros programas puedan leer correctamente.
    • Lee archivos de texto grandes y comprimidos de forma eficiente
      Reduce el uso de memoria durante la lectura, procesa un archivo por bloques, combina correctamente los resultados parciales y lee archivos comprimidos directamente.
  3. Lee datos de hojas de cálculo con títulos, celdas combinadas y fórmulas, y escribe uno o varios DataFrames en un libro para otras personas.
    • Lee hojas de cálculo de libros de Excel
      Elige la hoja, las filas y las columnas que vas a leer, y conoce qué hace pandas con las fechas, las fórmulas, las celdas combinadas y el formato.
    • Escribe DataFrames en libros de Excel
      Guarda una o varias tablas en un libro que puedan abrir tus colegas y evita sobrescribir datos o etiquetarlos incorrectamente.
  4. Lee y escribe JSON, convierte registros anidados en tablas y solicita datos a API web de forma fiable y segura.
    • Lee y escribe datos JSON
      Conoce la sintaxis de JSON y su correspondencia con objetos de Python, y lee y escribe JSON y JSON por líneas con Python y pandas.
    • Convierte datos JSON anidados en una tabla plana
      Convierte objetos y listas anidados en columnas y filas con pd.json_normalize, y decide qué representa cada fila.
    • Solicita datos a una API web
      Llama a una API con la biblioteca requests, comprueba la respuesta, gestiona claves, páginas y límites de solicitudes, y lee tablas de páginas web.
  5. Escribe resultados limpios en CSV, compara formatos de texto y binarios y utiliza Parquet para mantener los datos compactos y con los tipos correctos entre etapas del análisis.
    • Escribe DataFrames en archivos CSV y de texto
      Controla el índice, los valores faltantes, los formatos de números y fechas y la codificación de los archivos escritos, y protege los datos en bruto.
    • Compara formatos de almacenamiento de texto y binarios
      Explica las diferencias entre los formatos de texto y los formatos binarios orientados a filas o a columnas, y elige CSV, Excel, JSON, Parquet, Feather, pickle o una base de datos para una tarea determinada.
    • Lee y escribe archivos Parquet
      Guarda DataFrames en Parquet con sus tipos, lee columnas seleccionadas y organiza los datos como un conjunto de datos particionado.
  6. Conecta pandas a una base de datos, carga resultados de consultas con parámetros y tipos correctos, y escribe DataFrames en tablas de forma segura.
    • Conéctate a una base de datos y carga los resultados de las consultas
      Abre una conexión a SQLite u otra base de datos, ejecuta una consulta SQL proporcionada desde pandas y gestiona las credenciales y conexiones.
    • Pasa parámetros de consulta de forma segura y controla los tipos de los resultados
      Inserta valores en las consultas mediante parámetros en lugar de formatear cadenas, y obtén fechas, enteros y tamaños de bloque correctos en el resultado.
    • Escribe DataFrames en tablas de bases de datos
      Crea, amplía y sustituye tablas con to_sql, elige tipos de columnas y verifica y repite las escrituras de forma segura.

Guía de estudio de Carga y almacenamiento de datos

6 capítulos

1

Carga archivos de texto delimitado en pandas

Los archivos de texto pueden parecer tablas y dejar sin especificar decisiones importantes. Leerás registros en pandas, comprobarás las filas y columnas resultantes y elegirás opciones para encabezados, campos entre comillas, convenciones numéricas, marcadores de valores faltantes y fechas. También localizarás las observaciones reales dentro de informes que contienen títulos, comentarios y totales, para que la importación completada proporcione la tabla y los valores previstos.

1.1 De registros CSV a una tabla comprobada

Un archivo CSV es texto plano organizado en registros y campos. Las comas suelen separar los campos y el primer registro suele proporcionar los nombres de las columnas. El archivo contiene caracteres, no un esquema de pandas, por lo que leerlo también implica decidir qué representan esos caracteres.

Carga e inspecciona un archivo pequeño

Supón que un archivo contiene:

order_id,date,region,units,price
1001,2026-03-02,North,3,4.50
1002,2026-03-02,South,1,12.00
1003,2026-03-03,North,2,7.25

Léelo e inspecciona el resultado:

import pandas as pd

df = pd.read_csv("sales.csv")
print(df.head())
print(df.shape)
print(df.dtypes)
df.info()

La forma es (3, 5): tres filas de datos y cinco columnas. pandas infiere int64 para order_id y units, y float64 para price. La columna date sigue conteniendo texto. En pandas 3, las columnas de texto inferidas suelen mostrar str; las versiones anteriores de pandas suelen mostrar object.

Cada inspección responde a una pregunta distinta. head() muestra si los campos están alineados con sus etiquetas. shape revela filas faltantes o una columna adicional inesperada. dtypes comprueba la interpretación e info() añade recuentos de valores no nulos. Si una columna destinada a números se carga como texto, conviene examinar los valores en bruto: una unidad, un marcador o una convención decimal distinta pueden impedir la inferencia numérica.

Relaciona las etiquetas con los registros

Para un archivo sin encabezado cuya primera línea es 1001,North,3, usa:

df = pd.read_csv(
    "orders.txt",
    header=None,
    names=["id", "region", "units"]
)

Sin esa opción, pandas toma el primer registro como encabezado. Sus valores se convierten en nombres de columnas y el registro desaparece de los datos. Usa index_col="order_id" cuando una columna existente deba etiquetar las filas. Usa usecols=["region", "units"] para leer solo esas columnas o nrows=1000 para inspeccionar las primeras 1000 filas de datos antes de cargar un archivo grande.

Deja que el lector de CSV gestione las comillas

El registro "Smith, Jane",Boston,10 tiene tres campos. La coma dentro del nombre entre comillas pertenece a ese nombre. Dos comillas dobles dentro de un campo entre comillas representan una comilla doble literal: "O'Neil ""Red""" se convierte en O'Neil "Red". Un campo entre comillas puede incluso contener un salto de línea, por lo que los registros y las líneas físicas no siempre coinciden.

Llamar a line.split(",") divide el nombre y no puede gestionar estas reglas. read_csv las gestiona como parte del análisis sintáctico. pd.read_table usa el tabulador como separador predeterminado; pd.read_fwf gestiona campos definidos por posiciones de caracteres.

Encuentra el archivo que busca Python

Una ruta relativa se resuelve desde el directorio de trabajo actual del programa. Si no se encuentra "data/sales.csv", inspecciónalo con Path.cwd() después de from pathlib import Path. También puedes pasar a read_csv una ruta absoluta, un objeto Path, una URL o un archivo de texto en memoria como StringIO. Comprueba la ubicación antes de cambiar las opciones de lectura: un archivo faltante y un archivo interpretado incorrectamente son problemas distintos.

Puntos clave

  • CSV almacena caracteres; pandas infiere los tipos de las columnas al leer.
  • Comprueba las primeras filas, la forma, los tipos y los recuentos de valores no nulos después de una importación.
  • Usa header=None y names cuando el archivo no tenga encabezado.
  • Los delimitadores y saltos de línea entre comillas pertenecen al campo; usa un analizador de CSV.
  • Las rutas relativas parten del directorio de trabajo actual.

1.2 Separadores y números que se cargan correctamente

Un delimitador separa campos; un separador decimal separa las partes entera y decimal de un número. Un separador de millares agrupa dígitos. Estas tres funciones requieren configuraciones distintas, incluso cuando se usa el mismo símbolo para distintas funciones en diferentes archivos.

Inspecciona los caracteres antes de elegir opciones

Examina algunas líneas en bruto en un editor. Una extensión .csv no garantiza que haya comas y .txt no identifica una estructura. Algunas configuraciones habituales son:

Estructura del archivoOpción de lectura
Campos separados por tabuladoressep="\t"
Campos separados por barras verticales`sep="
Campos separados por secuencias de espaciossep=r"\s+"
Campos separados por punto y comasep=";"

Puedes inspeccionar el comienzo sin leer todo el archivo:

with open("products.csv", encoding="utf-8") as f:
    print(f.readline())
    print(f.readline())
Analiza una exportación regional

Considera este texto:

product;price;qty
Tea;3,50;1.200
Coffee;12,90;850

Los puntos y coma dividen los campos, la coma es el separador decimal y el punto agrupa millares. Indica explícitamente las tres convenciones al leer:

df = pd.read_csv(
    "products.csv",
    sep=";",
    decimal=",",
    thousands="."
)

Los precios se convierten en 3,5 y 12,9. Las cantidades se convierten en 1200 y 850. Con la coma como separador predeterminado, este encabezado no describe tres columnas separadas por comas. Incluso después de elegir sep=";", la tarea no está terminada: los precios siguen siendo texto y "1.200" puede convertirse en el decimal 1,2. Este último resultado es un número válido con un significado incorrecto, por lo que puede producirse un error grave sin que se genere una excepción de análisis sintáctico.

Compara algunos valores cargados con su texto de origen e inspecciona describe() en busca de rangos poco plausibles. Una cantidad que se espera en miles y aparece cerca de uno apunta a un problema de convención numérica. Cambiar solo el delimitador no lo solucionará.

Distingue los límites de los campos de la agrupación de números

En un archivo delimitado por comas, un número agrupado como "1,234.50" debe ir entre comillas. Su coma interna forma parte del número. Con thousands=",", pandas puede leer el campo entre comillas como 1234,5. Sin comillas, la coma también crea un límite de campo; thousands no puede recuperar la estructura perdida del registro.

Elige un motor de análisis sintáctico compatible

El motor C predeterminado gestiona rápidamente las estructuras habituales. El motor Python admite la detección del separador con sep=None, los separadores con expresiones regulares y skipfooter. La detección examina una muestra y puede elegir mal en un informe irregular, así que indica directamente un separador conocido.

Un separador de más de un carácter se trata generalmente como una expresión regular y requiere el motor Python; r"\s+" es un caso especial que también admite el motor C. El motor PyArrow puede leer con hilos paralelos, pero admite un conjunto distinto de opciones. Por ejemplo, chunksize no es compatible con engine="pyarrow". Elige el motor según las opciones que necesita tu archivo y comprueba después la estructura y los valores del resultado.

Puntos clave

  • Elige sep, decimal y thousands según sus distintas funciones.
  • Un resultado que parece numérico aún puede ser incorrecto por un factor de 1000.
  • Pon un campo entre comillas cuando su contenido incluya el delimitador.
  • El motor Python admite la detección y skipfooter; las opciones varían según el motor.

1.3 Valores faltantes, identificadores y fechas

La inferencia de tipos no puede saber si 999 es una medición o un código para un valor desconocido. Tampoco puede saber si los ceros iniciales tienen significado. Usa las definiciones de los datos para establecer las opciones de lectura antes de que la inferencia cambie esos valores.

Declara los marcadores de valores faltantes donde correspondan

pandas reconoce los campos vacíos y marcadores incorporados como "NA", "N/A", "n/a", "NULL", "NaN" y "None". Una fuente puede usar marcadores adicionales. Supón que score contiene 88, "n/a", "-" y 999, y que 999 está definido como desconocido:

df = pd.read_csv(
    "scores.csv",
    na_values={"score": ["-", "999"]}
)

La columna de puntuaciones contiene ahora 88,0 y tres valores faltantes. Sin declarar los marcadores, "-" puede hacer que la columna siga siendo texto; un valor centinela numérico no declarado puede entrar en los cálculos. La media de 88 y 999 es 543,5, aunque la única puntuación conocida es 88.

Un diccionario limita un marcador a su columna. Un na_values=["999"] para todo el archivo también eliminaría un código de producto real 999. Si "NA" es una etiqueta real, usa keep_default_na=False para desactivar la lista de marcadores incorporada e indica explícitamente los marcadores que sí significan faltante. Con esa configuración, incluye "" si los campos vacíos deben seguir contándose como faltantes.

Conserva los valores según su función

Lee los identificadores como texto:

df = pd.read_csv(
    "visits.csv",
    dtype={"site_code": str, "visits": "Int64"}
)

Un código como "00501" debe seguir teniendo cinco caracteres. Leerlo como entero da 501; convertir después ese entero en texto produce "501", no el código original. Usa un tipo numérico para los valores con los que calculas.

Las columnas de enteros normales de NumPy no pueden contener NaN, por lo que una columna de recuentos con un hueco suele convertirse en float64. El tipo "Int64" de pandas que admite valores faltantes, con I mayúscula, conserva los valores enteros y representa un hueco con <NA>. dtype_backend="numpy_nullable" solicita tipos que admiten valores faltantes en todo el resultado. Para un conjunto pequeño de etiquetas repetidas, dtype={"region": "category"} almacena las etiquetas como categorías y puede reducir el uso de memoria.

Especifica cómo se escriben las fechas

El texto que parece una fecha sigue siendo texto hasta que se interpreta. Para fechas con el día primero como "03/04/2026" y "13/04/2026", usa:

df = pd.read_csv(
    "events.csv",
    parse_dates=["day"],
    date_format="%d/%m/%Y"
)

Estos valores se convierten en el 3 y el 13 de abril. Sin un formato, una suposición con el mes primero puede intercambiar días y meses válidos o no convertir la columna. dayfirst=True expresa una preferencia; un formato explícito indica la estructura esperada. Las fechas ISO como "2026-04-03" evitan la ambigüedad entre día y mes.

Después de leer, inspecciona dtypes, isna().sum() y el recuento de filas. Comprueba una fecha cuya interpretación distinga las convenciones. Una columna que sigue mostrando texto indica que la interpretación no produjo los valores de fecha y hora previstos; un recuento de valores faltantes que aumenta inesperadamente puede revelar que una etiqueta real se confundió con un marcador.

Puntos clave

  • Declara los marcadores de valores faltantes específicos de la fuente, preferiblemente por columna.
  • Usa keep_default_na=False cuando un marcador incorporado sea un dato real.
  • Lee los identificadores formados solo por dígitos como texto para conservar los ceros iniciales.
  • Usa Int64, que admite valores faltantes, para recuentos enteros con valores faltantes.
  • Proporciona un formato explícito para las fechas ambiguas y verifica su tipo de datos.
  • Comprueba los recuentos de valores faltantes frente a la fuente.

1.4 Tablas dentro de informes y archivos de ancho fijo

Un informe puede mezclar una tabla con títulos, líneas vacías, comentarios, totales y notas sobre la fuente. Localiza primero el encabezado y los límites de los datos. De lo contrario, un lector puede confundir un título con los nombres de las columnas o incluir un total como una observación normal.

Lee solo la tabla

Un informe contiene estas nueve líneas físicas:

Monthly sales report
Exported 2026-04-01

region,jan,feb
North,120,135
# test row below
South,98,101
Total,218,236
Source: internal system

Las tres primeras líneas preceden al encabezado. Las dos últimas no son observaciones. Léelo con:

df = pd.read_csv(
    "report.csv",
    skiprows=3,
    comment="#",
    skipfooter=2,
    engine="python"
)

El resultado tiene dos filas. El total de enero es 218 entre North y South. Conservar la fila de totales añadiría otros 218 y daría 436. Con las opciones predeterminadas, el título de un campo puede convertirse en el encabezado y provocar un error de análisis sintáctico cuando llegan registros de tres campos.

skiprows=3 cuenta las tres primeras líneas físicas, incluida la línea vacía. Una lista como skiprows=[0, 2] elimina posiciones concretas de línea contadas desde cero. Las líneas vacías se omiten de forma predeterminada y comment="#" elimina el texto de los comentarios. skipfooter necesita el motor Python. Ajusta estas opciones a la estructura real; un número fijo de líneas que omitir puede dejar de ser correcto cuando el programa de exportación añade una línea de título.

Investiga los registros con formato incorrecto

Un registro con demasiados campos puede activar on_bad_lines="error", la opción predeterminada. "warn" lo omite con una advertencia, mientras que "skip" lo elimina sin avisar. Antes de elegir cualquiera de las dos, inspecciona el registro en bruto. Una coma sin comillas dentro de un nombre o un delimitador incorrecto pueden crear campos adicionales; al omitirlo se pierde una observación válida en lugar de corregir la causa.

Un número insuficiente de campos se trata de otra forma. Bajo id,name,score, el registro 2,Ben se carga con una puntuación faltante. No tiene por qué generar un error. Comprueba los recuentos de valores faltantes además de los recuentos de filas, y compara los registros conservados con la fuente al excluir líneas con formato incorrecto.

Lee encabezados apilados o posiciones de caracteres

Dos filas de etiquetas de columnas pueden formar un índice jerárquico (MultiIndex). Con las etiquetas de grupo region,sales,sales sobre ,2025,2026, header=[0, 1] produce etiquetas como ("sales", "2025"). Si las etiquetas planas son más adecuadas para el análisis, omite ambas filas de encabezado y proporciona names=["region", "sales_2025", "sales_2026"].

El texto de ancho fijo no tiene delimitador. Los límites de las columnas son posiciones de caracteres:

df = pd.read_fwf(
    "readings.txt",
    colspecs=[(0, 4), (4, 11), (11, 16)]
)

Estos intervalos semiabiertos incluyen cada inicio y excluyen su final. El primer campo ocupa las posiciones de 0 a 3 y el siguiente comienza en 4. widths=[4, 7, 5] describe la misma estructura. La inferencia es práctica para muestras regulares; los límites explícitos impiden que un valor corto al principio defina una anchura incorrecta.

Puntos clave

  • Localiza el encabezado, las observaciones y el pie de informe antes de elegir las opciones de omisión.
  • Las filas de totales incluidas como observaciones pueden duplicar una suma.
  • Omitir líneas incorrectas hace perder registros; investiga primero los campos adicionales.
  • Los registros cortos pueden cargarse con valores faltantes al final.
  • Usa encabezados de varias filas o límites explícitos de ancho fijo para esas estructuras.
2

Lee texto de forma correcta y eficiente

La corrección del texto depende de la regla utilizada para decodificar sus bytes y la eficiencia de la lectura depende de lo que el programa conserva en memoria. Distinguirás los errores de codificación del texto corrupto, usarás evidencia para elegir una codificación y conservarás los caracteres durante el intercambio. Después reducirás el uso de memoria en archivos grandes mediante la selección de columnas, tipos adecuados y procesamiento por bloques, incluida la combinación correcta de resultados parciales.

2.1 Cómo se almacena el texto como bytes

Un archivo almacena bytes, cada uno con un valor de 0 a 255. Una codificación define cómo se representan los caracteres mediante esos bytes. La codificación convierte texto de Python en bytes; la decodificación convierte los bytes de nuevo en texto. Los mismos bytes pueden representar caracteres distintos según las reglas de decodificación.

Cuenta los caracteres y los bytes por separado
text = "café"
raw = text.encode("utf-8")
print(len(text))  # 4 characters
print(len(raw))   # 5 bytes
print(raw.decode("utf-8"))  # café

Aquí el acento no crea un segundo carácter visible. La letra "é" necesita dos bytes en UTF-8, por lo que cuatro caracteres ocupan cinco bytes. Un recuento de bytes y un recuento de caracteres responden a preguntas distintas.

ASCII define 128 caracteres, incluidas las letras inglesas básicas, dígitos, signos de puntuación y códigos de control. Sus valores de byte coinciden en ASCII, UTF-8, Latin-1 y Windows-1252. Esa parte inicial compartida explica por qué una muestra que solo contiene inglés puede parecer correcta incluso cuando la configuración de codificación es incorrecta.

Reconoce las principales familias de codificaciones
CodificaciónCómo representa el textoPista útil
UTF-8De uno a cuatro bytes por carácter UnicodeLas letras ASCII usan un byte; "é" usa dos
Latin-1Un byte por carácter de su repertorio limitadoSe decodifica cualquier valor de byte
Windows-1252Un byte por carácter admitidoIncluye símbolos imprimibles adicionales como "€"
UTF-16Normalmente dos bytes por carácter, cuatro para otrosEl orden de bytes importa

UTF-8 representa todos los caracteres Unicode y es la opción habitual para el intercambio de texto. Latin-1 y Windows-1252 representan un conjunto más pequeño de caracteres. Coinciden en muchas letras acentuadas, pero difieren en una parte del intervalo de bytes: Windows-1252 usa el byte 0x80 para "€", mientras que Latin-1 tiene ahí un carácter de control. No son nombres intercambiables para una misma codificación.

Lee correctamente las marcas de orden de bytes

Una marca de orden de bytes, o BOM, es un marcador al principio de algunos archivos. UTF-16 puede comenzar con FF FE para el orden de byte menos significativo primero o FE FF para el orden de byte más significativo primero. encoding="utf-16" usa la BOM para elegir el orden. Sin una BOM, especifica "utf-16-le" o "utf-16-be" según la fuente.

Una BOM de UTF-8 es EF BB BF. open(..., encoding="utf-8-sig") de Python la elimina al decodificar. El uso de "utf-8" sin más en open() la conserva como \ufeff, que puede convertirse inesperadamente en parte del nombre del primer encabezado. El lector CSV de pandas también gestiona una BOM de UTF-8 inicial, pero elegir utf-8-sig deja clara la convención prevista para el archivo.

Indica la codificación explícitamente
with open("notes.txt", encoding="utf-8") as f:
    text = f.read()

El valor predeterminado de open() depende de la versión de Python y del modo UTF-8. Python 3.11 a 3.14 pueden usar la codificación de la configuración regional; Python 3.15 activa el modo UTF-8 de forma predeterminada, con la opción de desactivarlo. Una codificación explícita mantiene el script vinculado al formato real del archivo en distintos equipos. También evita que un valor predeterminado de la plataforma cambie sin avisar la forma de leer los mismos bytes.

Puntos clave

  • La codificación convierte texto en bytes; la decodificación convierte bytes en texto.
  • Los recuentos de caracteres y bytes pueden ser distintos.
  • Las muestras que solo contienen ASCII pueden ocultar una elección incorrecta de codificación.
  • Latin-1 y Windows-1252 difieren aunque comparten muchos caracteres.
  • Usa la BOM y la información sobre el orden de bytes al leer UTF-16.
  • Pasa explícitamente la codificación prevista a open().

2.2 Encuentra la causa del texto corrupto

Una codificación incorrecta puede fallar de forma evidente con UnicodeDecodeError o producir silenciosamente texto que parece legible pero es incoherente, llamado mojibake. Ambos problemas parten de interpretar los bytes con una regla incorrecta. Conserva el archivo original para poder decodificarlo de nuevo.

Diagnostica un error a partir de la fuente

Un CSV guardado como Windows-1252 contiene nombres de ciudades, entre ellos "Zürich" y "Málaga". Leerlo como UTF-8 puede fallar en el byte 0xfc, usado para "ü" en Windows-1252. Cuando la configuración de exportación de la fuente confirme su codificación, léelo con:

df = pd.read_csv("cities.csv", encoding="cp1252")
print(df["city"].head())

Inspecciona nombres que contengan acentos o símbolos. Una muestra formada solo por caracteres ASCII no permite distinguir estas codificaciones. Un byte concreto que no es válido en UTF-8 sugiere una posible codificación antigua; no identifica de manera única cuál produjo el archivo.

Reconoce un error que no generó una excepción

Los bytes UTF-8 decodificados como Windows-1252 pueden convertir "café" en "café" y "São Paulo" en "São Paulo". El lector ha producido caracteres correctamente, pero son los caracteres equivocados. Vuelve a leer los bytes originales usando UTF-8:

df = pd.read_csv("cities.csv", encoding="utf-8")

Buscar y sustituir repara un síntoma visible cada vez y puede pasar por alto otras letras dañadas. También puede cambiar una aparición legítima de un carácter. La decodificación correcta aborda la causa en todo el archivo.

Reúne evidencia sobre la codificación

Empieza por la documentación del proveedor o la configuración de exportación. Si es necesario, inspecciona una pequeña muestra de bytes:

with open("cities.csv", "rb") as f:
    sample = f.read(200)
print(sample)

El modo binario conserva los bytes sin decodificarlos. Una BOM puede dar una pista directa. Un detector como charset-normalizer estima una codificación probable, pero una muestra corta puede encajar con varias candidatas. Comprueba el resultado frente a nombres con acentos y símbolos conocidos.

Latin-1 asigna un carácter a cada byte, por lo que puede decodificar cualquier secuencia de bytes sin error. Ese éxito por sí solo no indica si los caracteres son correctos. Windows-1252 también usa caracteres de un byte, pero deja unos pocos valores de byte sin definir y puede generar un error de decodificación.

Evita descartar la evidencia

encoding_errors="replace" sustituye por "�" los bytes que el decodificador no puede leer. encoding_errors="ignore" los elimina. Estas opciones pueden ayudar a inspeccionar una entrada dañada, pero pierden información y no deben sustituir la búsqueda de la codificación correcta. Un nombre cambiado a "Zrich" puede impedir una coincidencia igual que un texto visiblemente corrupto.

Para la salida, UTF-8 admite la mayor variedad de caracteres. Algunos programas de hojas de cálculo lo identifican de forma más fiable cuando hay una BOM:

df.to_csv("cities_export.csv", index=False, encoding="utf-8-sig")

Vuelve a abrir la exportación en el programa receptor e inspecciona los mismos valores con acentos. El objetivo es que el texto sea correcto en ambos extremos del intercambio.

Puntos clave

  • Comprueba tanto los errores de decodificación como los caracteres visiblemente corruptos.
  • Vuelve a leer los bytes originales con la codificación correcta para reparar el mojibake.
  • Que la decodificación con Latin-1 tenga éxito no demuestra que el texto sea correcto.
  • Los modos de sustitución e ignorar descartan información de los caracteres.
  • Usa UTF-8 con una BOM cuando el programa de hojas de cálculo receptor la necesite.

2.3 Lee archivos grandes sin conservar todas las filas

El tamaño del archivo en disco no equivale a la memoria que necesita. pandas crea arreglos, índices y valores de texto en memoria, y sus tipos afectan al espacio necesario. Mide con df.memory_usage(deep=True) o df.info(memory_usage="deep") antes de decidir cómo cargar más datos.

Reduce los datos que cargas en memoria

Lee columnas seleccionadas con usecols, inspecciona una muestra inicial con nrows y elige tipos adecuados con dtype. Una categoría puede almacenar de forma compacta nombres de regiones repetidos. float32 usa menos espacio que float64, pero ofrece unas siete cifras significativas, así que elígelo solo cuando esa precisión sea adecuada para las mediciones. Una pequeña vista previa ayuda a identificar los tipos; no demuestra que todas las filas posteriores sigan el mismo patrón.

Procesa bloques y conserva un resultado reducido

chunksize cambia el valor devuelto de un DataFrame a un iterador de DataFrames. Para un total y una media:

total = 0.0
count = 0
with pd.read_csv(
    "measurements.csv",
    usecols=["amount"],
    chunksize=100_000
) as reader:
    for chunk in reader:
        total += chunk["amount"].sum()
        count += chunk["amount"].count()
mean = total / count if count else float("nan")

El bucle mantiene una suma acumulada y un recuento de valores presentes. Cada bloque puede liberarse después de usarlo. Reunir todos los bloques en una lista y concatenarlos después vuelve a exigir la memoria del conjunto completo; procesar por bloques solo ahorra memoria cuando se conserva un resultado reducido o se escriben las partes procesadas.

Un archivo de diez filas leído con chunksize=4 produce partes de 4, 4 y 2 filas. Para importes del 1 al 10 con regiones que se repiten en el orden N, S, E, suma los totales regionales parciales para obtener N 22, S 15 y E 18. Su total combinado es 55.

Combina las cantidades adecuadas

Las sumas y los recuentos se suman. Los mínimos se combinan tomando el menor de los mínimos parciales; los máximos, tomando el mayor de los máximos parciales. Las medias necesitan ponderaciones porque los bloques pueden contener distintos números de observaciones válidas.

Para los valores 1, 2 y 3 en un bloque y 10 en otro, las medias de los bloques son 2 y 10. La media de esas medias es 6, lo que da al bloque de un valor el mismo peso que al de tres valores. En su lugar, suma las sumas y los recuentos: un total de 16 entre cuatro observaciones da una media de 4. Las medianas de los bloques no contienen información suficiente para reconstruir una mediana general.

Lee archivos comprimidos directamente

read_csv normalmente infiere la compresión a partir de extensiones reconocidas como .gz, .bz2, .zip, .xz y .zst. Descomprime durante la lectura:

with pd.read_csv("measurements.csv.gz", chunksize=100_000) as reader:
    for chunk in reader:
        print(len(chunk))

Un archivo ZIP usado de esta manera debe contener exactamente un archivo de datos. df.to_csv("out.csv.gz", index=False) escribe CSV comprimido con gzip. La compresión reduce el espacio en disco y el tamaño de transferencia; no elimina la memoria que usa la tabla decodificada. Para análisis repetidos, convertir un conjunto de datos comprobado a Parquet también evita volver a interpretar el texto y restablece los tipos de columna almacenados.

Puntos clave

  • Mide el uso de memoria con el contenido de los objetos incluido y lee solo las columnas necesarias.
  • Los lectores por bloques producen DataFrames; conserva resultados reducidos para ahorrar memoria.
  • Combina las sumas y los recuentos de valores presentes antes de calcular una media general.
  • Las medianas de los bloques no pueden combinarse para obtener la mediana general.
  • El texto comprimido se descomprime durante la lectura; un ZIP necesita un archivo de datos.
  • Parquet es adecuado para conjuntos de datos que se cargan repetidamente.
3

Trabaja con libros de Excel

Los libros mezclan datos con una presentación diseñada para las personas: varias hojas, títulos, fórmulas, etiquetas combinadas y formatos de visualización. Localizarás una tabla dentro de esa estructura y distinguirás los valores almacenados de lo que muestra una celda. Después escribirás informes de una o varias hojas, controlarás las actualizaciones de un libro existente y comprobarás que las hojas guardadas contienen las filas y los valores previstos.

3.1 Encuentra y lee la tabla de una hoja de cálculo

Un libro de Excel puede contener varias hojas, títulos y totales calculados. Las celdas tienen valores y tipos almacenados, además de formato de visualización. Leer una hoja de cálculo implica localizar la tabla de datos y comprender qué partes del libro se convierten en valores del DataFrame.

Elige la hoja y sus límites
df = pd.read_excel(
    "quarterly.xlsx",
    sheet_name="Q1",
    skiprows=2,
    usecols="A:C",
    nrows=2
)

Supón que la fila 1 es un título combinado, la fila 2 está vacía, la fila 3 contiene region, date y sales, y las filas 4 a 5 contienen las observaciones. skiprows=2 hace que la fila 3 sea el encabezado; nrows=2 se detiene antes del total de la fila 6. Para North 1200 y South 950, las dos observaciones suman 2150. Incluir un total almacenado en caché de 2150 como tercera observación duplicaría esa cantidad.

Excel muestra los números de fila a partir de 1; las posiciones de fila de pandas empiezan en 0. header=2 también selecciona la fila 3 de Excel como encabezado. usecols="A,C,E:F" selecciona columnas separadas y un rango. La opción predeterminada sheet_name=0 lee la primera hoja; un nombre selecciona una hoja concreta y sheet_name=1 selecciona la segunda.

sheet_name=None devuelve un diccionario que relaciona nombres de hojas con DataFrames. Selecciona una clave o recorre .items(); el propio diccionario no es un DataFrame. Para varias lecturas de un mismo libro:

with pd.ExcelFile("quarterly.xlsx") as xf:
    print(xf.sheet_names)
    q1 = pd.read_excel(xf, sheet_name="Q1")
Conoce qué almacena realmente la celda

Un porcentaje mostrado como "15%" almacena 0,15. Un número mostrado con cinco dígitos puede almacenar 2139, aunque la pantalla muestre "02139". Ninguna opción de lectura puede recuperar un cero que solo existe en el formato. Almacena los identificadores como texto en el libro y pasa también dtype={"zip": str} al leer; de lo contrario, pandas puede inferir enteros incluso a partir de celdas de texto formadas solo por dígitos.

La precisión numérica de Excel está limitada a 15 cifras significativas. Un identificador de 16 dígitos introducido como número puede estar dañado antes de que Python lo lea. Almacena esos valores como texto. Una hoja de cálculo tiene como máximo 1 048 576 filas y 16 384 columnas, por lo que un conjunto de datos muy grande necesita otro formato.

Trata con cuidado las fórmulas y las celdas combinadas

pandas no calcula fórmulas. Lee los resultados almacenados en caché en el libro. Una aplicación de hojas de cálculo puede guardar resultados actualizados; un archivo generado por un script puede tener resultados en caché faltantes, de marcador o desactualizados. openpyxl no calcula un resultado y XlsxWriter normalmente escribe un cero como marcador salvo que se le proporcione uno. Vuelve a calcular los valores importantes en pandas o abre y guarda el libro en un programa de hojas de cálculo antes de confiar en sus totales almacenados en caché.

Solo la celda superior izquierda de un rango de celdas combinadas almacena su etiqueta. Por ello, una etiqueta de país combinada puede dejar huecos en las filas inferiores. Cuando la estructura confirme que la etiqueta se aplica a esas filas, df["country"] = df["country"].ffill() la propaga hacia abajo. Inspecciona los límites de la tabla antes de rellenar.

La lectura requiere una biblioteca de motor. openpyxl gestiona .xlsx y .xlsm; xlrd gestiona .xls, pyxlsb gestiona .xlsb, odf gestiona .ods y calamine admite varios formatos de hojas de cálculo. Un motor faltante genera un ImportError que indica la dependencia. Los colores, comentarios y otros estilos de presentación no se cargan como datos del DataFrame.

Puntos clave

  • Selecciona explícitamente la hoja, el encabezado, las columnas y las filas de observaciones.
  • sheet_name=None devuelve un diccionario de DataFrames.
  • Los valores almacenados pueden diferir de los porcentajes o identificadores con ceros iniciales que se muestran.
  • pandas no calcula las fórmulas; sus resultados en caché pueden estar desactualizados o faltar.
  • Las etiquetas combinadas se encuentran en la celda superior izquierda.
  • Almacena los identificadores largos como texto antes de que Excel pueda redondearlos.
  • Instala un motor de lectura compatible con el formato del libro.

3.2 Escribe un libro con varias hojas

Excel es útil cuando las personas necesitan abrir e inspeccionar un informe en un programa de hojas de cálculo. Un DataFrame puede convertirse en una hoja de cálculo o varios DataFrames pueden compartir un libro. Elige la ruta de destino y los nombres de las hojas antes de escribir para que cada tabla vaya al lugar previsto.

Escribe una tabla o varias
weather.to_excel(
    "weather.xlsx",
    sheet_name="Weather",
    index=False
)

index=False evita que los números de fila predeterminados aparezcan en la hoja. Sin esta opción, aparecen como una primera columna adicional y pueden regresar como "Unnamed: 0" en una lectura posterior. Conserva un índice solo cuando contenga etiquetas significativas que deban estar en el informe.

Una llamada a to_excel basada en una ruta escribe un libro en esa ruta y sustituye cualquier archivo existente. Llamarla una vez para Weather y otra para Counts en la misma ruta puede dejar solo la segunda tabla. Usa un único gestor de escritura para ambas:

with pd.ExcelWriter("report.xlsx") as writer:
    weather.to_excel(writer, sheet_name="Weather", index=False)
    counts.to_excel(writer, sheet_name="Counts", index=False)

El gestor de contexto cierra y termina el libro cuando acaba el bloque. Leerlo con pd.read_excel("report.xlsx", sheet_name=None) devuelve un diccionario que contiene ambos nombres de hoja. Escribir .xlsx requiere openpyxl o XlsxWriter.

Actualiza una hoja de un libro existente

Para conservar las demás hojas mientras sustituyes una, usa un gestor de escritura en modo de adición:

with pd.ExcelWriter(
    "report.xlsx",
    mode="a",
    engine="openpyxl",
    if_sheet_exists="replace"
) as writer:
    counts.to_excel(writer, sheet_name="Counts", index=False)

if_sheet_exists controla qué ocurre cuando un nombre ya existe. "error" detiene la operación, "new" crea otra hoja, "replace" sustituye esa hoja y "overlay" escribe en sus celdas existentes. La superposición no borra las celdas antiguas que quedan fuera de la nueva tabla, por lo que una actualización más corta puede dejar filas antiguas. Decide si el informe necesita sustituir por completo la hoja o superponer datos en una posición elegida con cuidado.

Facilita la reapertura del archivo

Los nombres de las hojas tienen un límite de 31 caracteres y no pueden contener :, \, /, ?, *, [ o ]. Un nombre corto como "Q1 Summary" funciona; "Q1/Q2" contiene una barra prohibida. Algunos motores advierten en lugar de detenerse ante un nombre demasiado largo, así que elige tú nombres compatibles.

startrow y startcol sitúan una tabla mediante desplazamientos contados desde cero. na_rep da a los valores faltantes un marcador visible. float_format="%.2f" redondea los números escritos y autofilter=True añade botones de filtro al encabezado en pandas 3. Las columnas de fecha y hora se escriben como fechas de Excel.

Redondear en la salida cambia los números almacenados, no solo su visualización. Conserva por separado un archivo de análisis con precisión completa cuando necesites un informe redondeado. Vuelve a abrir el libro y comprueba la lista de hojas, las dimensiones de las tablas y algunos valores representativos. La lectura de Excel es relativamente lenta y un ciclo de escritura y lectura puede cambiar los tipos de datos de pandas, así que usa Parquet para tablas de análisis intermedias cuando importe conservar los tipos.

Puntos clave

  • Usa un único ExcelWriter para colocar varias tablas en un libro nuevo.
  • Una escritura basada en una ruta sustituye un libro existente.
  • El modo de adición e if_sheet_exists controlan las actualizaciones de hojas existentes.
  • Elige nombres de hoja válidos y verifica el libro después de volver a abrirlo.
4

Obtén datos de archivos JSON y API web

JSON y las API web proporcionan registros con estructuras que no siempre se ajustan a una tabla. Interpretarás y escribirás JSON, elegirás una estructura de tabla adecuada y convertirás objetos o listas anidados en tablas planas sin perder de vista qué representa cada fila. También comprobarás las respuestas HTTP, recorrerás las páginas y gestionarás credenciales y límites de solicitudes, para que el conjunto de datos resultante contenga los registros que querías recopilar.

4.1 Objetos JSON, tablas y registros línea por línea

JSON almacena datos anidados como texto. Los objetos contienen pares de nombre y valor, los arreglos contienen valores ordenados y las cadenas usan comillas dobles. Sus otros valores son números, true, false y null. El módulo json de Python convierte esta sintaxis en objetos de Python antes de que construyas una tabla.

Interpreta y escribe JSON válido
import json

text = '{"station":"Oslo","active":true,"temp_c":[3.5,null,4.0]}'
data = json.loads(text)
print(data["active"])   # True
print(data["temp_c"])   # [3.5, None, 4.0]

Los objetos se convierten en diccionarios, los arreglos en listas y null en None. json.loads interpreta una cadena; json.load lee un archivo abierto. Las funciones de escritura realizan el proceso inverso: json.dumps devuelve texto y json.dump escribe en un archivo.

with open("station.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

ensure_ascii=False deja legibles caracteres como "ü". La opción predeterminada puede escribir el mismo carácter como \u00fc; ambas formas representan la misma cadena. Un diccionario de Python impreso no es JSON: las comillas simples, True, None y las comas finales son sintaxis JSON no válida. El JSON estándar tampoco tiene NaN. El codificador de Python lo permite de forma predeterminada, pero allow_nan=False lo rechaza; pandas escribe los valores faltantes como null.

Ajusta la estructura de la tabla

Una tabla JSON necesita una orientación, es decir, la disposición de filas, etiquetas y valores. orient="records" produce un objeto por fila:

[{"city":"Lyon","temp_c":21.5},{"city":"Osaka","temp_c":null}]

La orientación predeterminada de DataFrame, "columns", agrupa los valores bajo los nombres de las columnas y después bajo las etiquetas de las filas. "split" almacena columnas, índice y datos por separado. Especifica una orientación que coincida con el programa receptor en lugar de suponer que todas las tablas JSON tienen la misma forma.

from io import StringIO
import pandas as pd

df = pd.read_json(
    StringIO('[{"code":"0042","amount":9.5}]'),
    orient="records",
    dtype={"code": str}
)

En pandas 3, una cadena simple pasada a read_json es una ruta, así que envuelve el texto JSON propiamente dicho en StringIO. Incluso las cadenas JSON que solo contienen dígitos pueden inferirse como números; el tipo de datos explícito conserva "0042".

Usa JSON por líneas para registros secuenciales

JSON por líneas tiene un objeto JSON completo por línea, sin un arreglo que los englobe ni comas entre registros:

{"id":1,"amount":9.5}
{"id":2,"amount":12.0}

Léelo con pd.read_json(path, lines=True) y escríbelo con df.to_json(path, orient="records", lines=True). Las opciones chunksize y nrows del lector requieren lines=True, que permite acceder a los registros individuales de forma secuencial.

Al exportar fechas, establece date_format="iso" para obtener marcas de tiempo ISO legibles. pandas 3.1 sigue usando de forma predeterminada milisegundos desde la época para la salida JSON normal de DataFrame, pero ese valor predeterminado está cambiando. Una salida de fechas explícita evita depender de que el lector adivine qué representa un entero grande.

Puntos clave

  • La sintaxis JSON difiere de un diccionario de Python impreso.
  • load y dump usan archivos; loads y dumps usan cadenas.
  • Elige una orientación que coincida con la estructura de la tabla.
  • Envuelve el texto JSON en StringIO para read_json y conserva los tipos de los identificadores.
  • JSON por líneas usa un objeto por línea y admite la lectura por bloques.
  • Usa la salida de fechas ISO para intercambiar marcas de tiempo legibles.

4.2 Elige qué representa cada fila de datos anidados

El JSON anidado puede describir un pedido, su cliente y varios artículos en un solo objeto. Antes de convertirlo en una tabla plana, decide la granularidad: qué representa cada fila. La granularidad determina qué importes se pueden sumar.

Convierte primero los objetos anidados en columnas

Considera dos pedidos. El pedido 501 pertenece a Ana y tiene los artículos A1 (cantidad 2, precio 3,5) y B7 (cantidad 1, precio 10,0). El pedido 502 pertenece a Ben y tiene A1 (cantidad 4, precio 3,5). Los datos de los clientes son objetos anidados y sus artículos son listas.

orders = [
    {"order_id": 501,
     "customer": {"name": "Ana", "country": "PT"},
     "items": [{"sku": "A1", "qty": 2, "price": 3.5},
               {"sku": "B7", "qty": 1, "price": 10.0}]},
    {"order_id": 502,
     "customer": {"name": "Ben", "country": "CA"},
     "items": [{"sku": "A1", "qty": 4, "price": 3.5}]}
]
order_rows = pd.json_normalize(orders)

Esto produce dos filas y cuatro columnas: order_id, items, customer.name y customer.country. Los campos anidados de los clientes se convierten en columnas con nombres separados por puntos. Las listas de artículos permanecen en las celdas; la normalización no convierte automáticamente todas las listas en filas.

Expande una lista con información del objeto contenedor
items = pd.json_normalize(
    orders,
    record_path="items",
    meta=["order_id", ["customer", "name"]]
)

record_path elige la lista cuyas entradas se convierten en filas. meta copia los valores del objeto contenedor en cada fila, con una lista de claves para una ruta anidada. El resultado tiene tres filas de artículos: dos para el pedido de Ana y una para el de Ben. Los ingresos son la cantidad multiplicada por el precio: 7,0; 10,0 y 14,0, que suman 31,0.

Si un cargo de envío a nivel de pedido es 4,00, se repite en ambas filas de artículos del pedido 501. Sumar esos cargos repetidos da 8,00 para un pedido. Conserva los importes del pedido en una tabla de pedidos separada cuando también necesites una tabla de artículos; conserva order_id para conectarlas.

Controla los nombres y los campos faltantes

sep="_" crea nombres como customer_name. record_prefix="item_" distingue los campos de los artículos de los campos del objeto contenedor con el mismo nombre. max_level=0 deja intactos los diccionarios anidados.

Un campo anidado normal que falta en un registro aparece como faltante en su columna de salida. Un campo faltante solicitado mediante meta genera KeyError de forma predeterminada; errors="ignore" permite metadatos faltantes y los rellena con NaN. Una lista faltante indicada por record_path sigue necesitando corrección.

Extrae el contenido de las respuestas de API antes de convertirlo en una tabla plana

Una API puede devolver un envoltorio que contiene count, next y results. Pasa data["results"] a pd.json_normalize para convertir los registros en una tabla plana. Pasar el propio envoltorio normaliza un objeto contenedor y deja su lista de resultados dentro de una celda. Mantén disponibles los metadatos de paginación para obtener páginas posteriores, pero construye la tabla de análisis a partir de la lista de registros propiamente dicha.

Puntos clave

  • Decide si cada fila representa un objeto contenedor o una entrada de una lista.
  • json_normalize expande objetos anidados; record_path expande una lista elegida.
  • meta repite los campos del objeto contenedor en cada fila de sus elementos.
  • Los importes del objeto contenedor pueden contarse dos veces después de expandir una lista.
  • Convierte en una tabla plana los registros dentro de un envoltorio de API, no el envoltorio.

4.3 Solicita un resultado completo y comprobado de una API

Una API web acepta una solicitud HTTP en un punto de acceso y devuelve un código de estado, encabezados y un cuerpo. Muchas API usan cuerpos JSON, pero que llegue una respuesta no significa que contenga los datos o todos los registros que necesitas.

Envía parámetros y comprueba la respuesta
import requests

resp = requests.get(
    url,
    params={"city": "Lima", "units": "metric"},
    timeout=10
)
resp.raise_for_status()
data = resp.json()
df = pd.json_normalize(data["results"])

Aquí url es el punto de acceso documentado de la API. params codifica la cadena de consulta, por lo que los espacios y caracteres especiales de los valores se gestionan correctamente. Requests no tiene un tiempo máximo de espera predeterminado. Un único valor de tiempo máximo controla la espera de conexión y de lectura; no es un plazo para descargar toda la respuesta.

Llama a raise_for_status() antes de usar el cuerpo. Genera un error HTTP para respuestas 4xx y 5xx. Un mensaje de error JSON puede interpretarse correctamente y aun así describir una solicitud fallida; a la inversa, una respuesta 200 puede contener texto que no sea JSON y hacer que resp.json() falle. Inspecciona resp.text cuando el formato de la respuesta no sea el esperado.

EstadoSignificado que se debe investigar
200La solicitud tuvo éxito
400Los datos de la solicitud no son válidos
401Las credenciales faltan o no son válidas
403El acceso está prohibido
404No se encontró el recurso solicitado
429La frecuencia de solicitudes es demasiado alta
5xxFallo del servidor
Mantén separadas las credenciales

Usa el método de autenticación documentado por la API. Para un token de portador, lee una clave de una variable de entorno y envíala en un encabezado:

import os

key = os.environ["WEATHER_API_KEY"]
headers = {"Authorization": "Bearer " + key}

Mantén las claves fuera del código guardado y de los cuadernos interactivos. Si una clave se ha compartido o incluido en un commit, revócala y sustitúyela. Una clave concede acceso; ocultar después un valor mostrado no elimina su exposición.

Continúa hasta leer todas las páginas

Sigue el mecanismo de página siguiente documentado por la API, ya use números de página, desplazamientos o una URL siguiente. Recopila los registros de cada página y detente cuando se cumpla la condición final indicada. Un total de 230 registros con 100 por página requiere páginas de 100, 100 y 30. La primera página puede ser perfectamente válida y el conjunto de datos estar incompleto.

Compara el recuento recopilado con el total comunicado cuando esté disponible. Respeta los límites de solicitudes: 429 exige esperar antes de otra solicitud y Retry-After puede especificar el retraso. Ese encabezado puede contener segundos o una fecha HTTP. Guarda las respuestas en bruto para que el análisis sea reproducible y para evitar descargar los mismos datos en cada nueva ejecución.

Reconoce otros formatos de tablas web

pd.read_html(url) devuelve una lista de DataFrames, uno por cada tabla HTML coincidente. match="Population" limita las tablas según su texto. Necesita una dependencia de análisis de HTML como lxml o BeautifulSoup con html5lib. pd.read_xml lee elementos XML repetidos como filas, mediante lxml o parser="etree". Consulta las condiciones de un sitio antes de extraer datos y prefiere una descarga oficial o una API cuando esté disponible.

Puntos clave

  • Envía los valores de consulta con params y establece un tiempo máximo de espera explícito.
  • Comprueba el estado HTTP antes de interpretar el cuerpo de respuesta esperado.
  • Mantén las claves en variables de entorno y sustituye las claves expuestas.
  • Sigue la paginación hasta el final y verifica el recuento recopilado.
  • Respeta los límites de solicitudes y guarda las respuestas en bruto para asegurar la reproducibilidad.
  • read_html devuelve una lista de tablas; XML tiene un lector independiente.
5

Almacena datos en el formato de archivo adecuado

Guardar una tabla implica elegir en función de su próximo uso. Una persona de tu equipo puede necesitar un CSV o un libro legible, mientras que tu siguiente análisis necesita tipos exactos y precisión completa. Controlarás la salida CSV, compararás formatos habituales de intercambio y formatos binarios, y usarás Parquet para tablas con tipos. También seleccionarás columnas y particiones durante la lectura y mantendrás la coherencia de los archivos del conjunto de datos a medida que se añadan más datos.

5.1 Escribe CSV sin añadir datos accidentalmente

Una exportación CSV debe conservar los valores que necesita la persona receptora y dejar claras sus convenciones. Elige si el índice de filas es un dato, cómo aparecen los valores faltantes y si la salida se destina a un análisis preciso o a una visualización redondeada.

Elige qué se convierte en columna
df.to_csv("weather_processed.csv", index=False)

La opción predeterminada es escribir el índice. Para una tabla con un índice numerado normal, esto añade un primer campo sin nombre; un read_csv posterior puede mostrarlo como "Unnamed: 0". index=False omite esos números de fila. Cuando el índice contenga etiquetas significativas, consérvalo y vuelve a leerlo con index_col=0.

Los valores faltantes normalmente se convierten en campos vacíos. na_rep="NA" los hace visibles, pero el lector receptor debe interpretar correctamente ese marcador. En una tabla de ciudades con Lyon a 21,5 °C y Osaka a 18,25 °C, un valor de precipitación faltante para Osaka debe seguir siendo distinto de una precipitación cero.

Adapta la convención de texto al destinatario
df.to_csv(
    "weather_export.csv",
    index=False,
    sep=";",
    decimal=",",
    na_rep="NA",
    date_format="%Y-%m-%d",
    encoding="utf-8"
)

Las opciones de separador y decimal producen valores como Lyon;21,5;0,0. La salida de fecha ISO mantiene el día y el mes sin ambigüedad. Usa encoding="utf-8-sig" cuando un programa de hojas de cálculo receptor necesite una BOM para reconocer UTF-8.

float_format="%.1f" escribe una cifra decimal. El valor 18,25 se convierte en "18.2" con este formato y la precisión descartada no puede recuperarse del CSV. Conserva la precisión completa para los datos de análisis; crea un informe redondeado separado cuando sea necesario.

Comprueba qué se conserva en un ciclo de escritura y lectura

CSV almacena caracteres sin metadatos de tipos de datos de pandas. Considera cuatro columnas: un identificador "02139", una fecha y hora, una categoría ordenada A < B < C y enteros que admiten valores faltantes con un hueco. Una lectura CSV predeterminada puede devolver el entero 2139, texto de fecha, etiquetas de categoría simples sin su orden y números de coma flotante para los recuentos.

Por tanto, que una lectura termine correctamente no significa necesariamente que se haya restablecido el DataFrame original. Conserva las opciones necesarias para reconstruir los datos, incluidos los identificadores de texto, la interpretación de fechas y los marcadores de valores faltantes. El orden de las categorías también debe definirse de nuevo. Para análisis repetidos en los que importan estos tipos, Parquet puede conservarlos directamente.

Añade registros y protege la entrada en bruto
df.to_csv(
    "daily_results.csv",
    mode="a",
    header=False,
    index=False
)

Esto añade filas a un archivo existente. Mantén el orden de las columnas y las convenciones coherentes con ese archivo. Con header=True, una adición escribe otro encabezado en medio y el siguiente lector puede tratarlo como un registro. Para un archivo nuevo, escribe el encabezado una vez antes de las adiciones posteriores.

Mantén los archivos recibidos o descargados sin cambios en una ubicación de datos en bruto. Escribe los resultados derivados por separado con nombres descriptivos. Al volver a abrir una exportación procesada, comprueba su recuento de filas, columnas, valores faltantes y valores representativos, incluidos ceros iniciales y fechas.

Puntos clave

  • Omite un índice de filas predeterminado con index=False.
  • Elige marcadores de valores faltantes, codificación y convenciones numéricas para el destinatario.
  • El redondeo en la salida elimina precisión de forma permanente.
  • Los ciclos de escritura y lectura de CSV necesitan opciones de lectura explícitas para restablecer los tipos.
  • Añade filas sin repetir encabezados y mantén los archivos en bruto sin cambios.

5.2 Elige un formato para el próximo uso

El mejor formato de almacenamiento depende de quién lea los datos después y de qué deba conservarse durante el intercambio. Una tabla enviada a una persona de tu equipo, una respuesta anidada de una API y un conjunto de datos de análisis con tipos tienen necesidades distintas.

Compara el almacenamiento de texto y binario

Los formatos de texto codifican caracteres visibles. CSV es fácil de inspeccionar y tiene amplia compatibilidad; JSON representa de forma natural objetos y arreglos anidados. CSV no tiene un esquema de tipos de columnas y los tipos de valores JSON habituales no conservan todos los tipos de datos de pandas. Volver a leerlos requiere interpretarlos y puede requerir elecciones explícitas de tipos.

Los formatos binarios codifican datos para que el software los lea directamente. Formatos como Parquet y Feather almacenan un esquema que describe columnas y tipos, lo que reduce la necesidad de volver a inferirlos. La compatibilidad con los tipos sigue dependiendo del formato y del lector: los objetos Python arbitrarios no se vuelven portables solo porque el archivo sea binario.

Una estructura orientada a filas mantiene juntos los campos de un registro. Una estructura por columnas mantiene juntos los valores de la misma columna. El análisis suele necesitar unas pocas columnas de muchas filas, por lo que los lectores por columnas pueden omitir las columnas innecesarias. Los valores similares adyacentes también se comprimen bien. El tamaño del archivo y la velocidad dependen de los datos; el resultado de compresión de una tabla no es una proporción fija para todas las tablas.

Relaciona cada formato con una tarea
FormatoUna tarea adecuadaConsideración principal
CSVIntercambio de tablas sencillasReconstruir los tipos al leer
ExcelInformes utilizados en hojas de cálculoImportan la estructura y los límites de las hojas de cálculo
JSONRegistros anidados y servicios webElegir la estructura del objeto y de la tabla
ParquetConjuntos de datos de análisis almacenadosCon tipos, por columnas, comprimido y con amplia compatibilidad
FeatherIntercambio rápido de DataFramesAlmacenamiento basado en Arrow para herramientas compatibles
pickleObjetos Python temporales propiosImportan la confianza y la compatibilidad entre versiones
HDF5Varios conjuntos de datos científicos grandesOrganización jerárquica; PyTables para pandas
Base de datosConsultas y actualizaciones compartidasConexiones, permisos y transacciones

Parquet es un formato abierto utilizado por pandas, R, Spark y DuckDB. Feather usa Arrow IPC y es útil para el intercambio rápido entre Python y R o entre etapas locales. to_feather y read_feather permiten ese intercambio. HDF5 agrupa varios conjuntos de datos en un archivo; to_hdf de pandas requiere PyTables.

Comprende el límite de confianza de pickle

pickle puede guardar objetos Python más allá de las tablas normales, pero cargarlo puede ejecutar código. Nunca cargues un archivo pickle de una fuente no fiable. Úsalo para tus propios objetos de corta duración y espera límites de compatibilidad a medida que cambien Python y las bibliotecas. Por ejemplo, pandas 3 ya no admite leer archivos pickle creados con versiones de pandas anteriores a 1.0.

Decide según el resultado necesario

Si una persona necesita inspeccionar una tabla pequeña sin herramientas especiales, CSV es práctico. Si necesita hojas de libro con nombres, usa Excel. Si necesitas conservar identificadores, categorías y tipos que admiten valores faltantes entre sesiones de análisis, elige Parquet. Si varios programas necesitan consultar y actualizar registros compartidos, una base de datos se ajusta mejor a la tarea que repartir copias de un archivo. La elección del formato depende del próximo uso, no de la extensión de la entrada original.

Puntos clave

  • Elige un formato según el destinatario, la estructura de los datos y la fidelidad necesaria de los tipos.
  • Los formatos por columnas permiten leer columnas seleccionadas y ofrecen una compresión útil.
  • Parquet es adecuado para tablas de análisis almacenadas; Excel, para informes de hojas de cálculo.
  • Feather permite el intercambio rápido; HDF5 agrupa conjuntos de datos científicos.
  • Los archivos pickle no fiables pueden ejecutar código al cargarse.
  • Las bases de datos permiten consultas y actualizaciones compartidas.

5.3 Conserva tablas con tipos en Parquet

Parquet almacena una tabla con los tipos de sus columnas en un formato abierto y por columnas. Es útil cuando un DataFrame comprobado se va a cargar repetidamente o a pasar a otras herramientas de análisis. pandas usa PyArrow para los ejemplos siguientes.

Escribe y verifica un ciclo de lectura y escritura con tipos
df.to_parquet("sales.parquet", engine="pyarrow")
restored = pd.read_parquet("sales.parquet", engine="pyarrow")
print(restored.dtypes)

Un identificador de texto "02139", una columna de fecha y hora, una categoría ordenada y enteros que admiten valores faltantes pueden conservar sus tipos en este ciclo de pandas a PyArrow y de vuelta a pandas. A diferencia de una lectura CSV, no es necesario adivinar la función del identificador ni reconstruir el orden de la categoría. Inspecciona los tipos y valores representativos al introducir un nuevo escritor o lector.

La opción predeterminada index=None almacena un RangeIndex de forma compacta como metadatos. Otro índice se escribe como columnas y se restablece al leer. Usa index=False cuando no necesites el índice. Esa elección afecta a las etiquetas de fila independientemente de las columnas normales de la tabla.

Lee menos datos y elige la compresión
small = pd.read_parquet(
    "sales.parquet",
    columns=["zip", "amount"]
)

El lector puede recuperar solo esas columnas del almacenamiento. Esto es distinto de cargar la tabla completa y seleccionarlas después, pues entonces ya se ha asumido el coste de leerla entera. La selección de columnas es especialmente útil para tablas anchas.

Snappy es el códec de compresión predeterminado. compression="zstd" o "gzip" suele producir archivos más pequeños a cambio de más trabajo de escritura, mientras que compression=None escribe datos sin comprimir. Mide la relación entre tamaño y velocidad con datos representativos; las etiquetas repetidas y las mediciones aleatorias no se comprimen igual. Instala PyArrow; el motor alternativo fastparquet está obsoleto en pandas 3.1.

Organiza un conjunto de datos en particiones
df.to_parquet(
    "sales_dataset",
    engine="pyarrow",
    partition_cols=["year"],
    index=False
)
recent = pd.read_parquet(
    "sales_dataset",
    filters=[("year", "==", 2026)]
)

El destino es un directorio con subdirectorios como year=2025 y year=2026. Leer el directorio carga el conjunto de datos; un filtro puede evitar las particiones que no correspondan. Con esta estructura, PyArrow obtiene los valores de year de los nombres de los directorios y pandas suele recibir una columna de partición categórica.

Elige una columna de partición con un conjunto pequeño de valores útiles por los que filtres a menudo. Un identificador único de registro crea miles de particiones diminutas y aumenta el trabajo con archivos y directorios. El año o un conjunto pequeño de regiones suelen ofrecer una división más práctica.

Añade datos sin dañar el conjunto

Un único archivo Parquet no admite añadir filas mediante pandas como se hace con CSV. Escribe archivos o particiones nuevos en el directorio del conjunto de datos, o lee, combina y vuelve a escribir un único archivo. Los archivos de un mismo conjunto de datos necesitan esquemas compatibles. Si uno almacena un código como texto y otro como entero, la carga puede fallar o convertir los valores. Establece tipos de datos coherentes antes de escribir cada parte y comprueba que una partición añadida no cree copias superpuestas de los mismos registros.

Puntos clave

  • Parquet conserva los tipos de columna admitidos mediante lectores compatibles.
  • columns lee solo las columnas necesarias; filters limita los datos a los que coinciden.
  • El almacenamiento del índice se controla por separado de las columnas normales.
  • Particiona por unos pocos valores que filtres con frecuencia y evita los archivos diminutos.
  • Añade archivos al conjunto de datos con esquemas compatibles; no añadas bytes a un único archivo.
6

Lee y escribe datos en bases de datos SQL

El trabajo con bases de datos combina dos decisiones: qué resultado solicitar y qué cambio almacenar. Abrirás y cerrarás conexiones, leerás consultas SQL proporcionadas en pandas y vincularás valores variables sin alterar la estructura de la consulta. Después controlarás los tipos de los resultados y la lectura por bloques, elegirás un modo de escritura de tablas y verificarás su efecto, incluida la diferencia entre una carga completa y una adición repetida.

6.1 Abre una conexión a una base de datos y lee un resultado

Una base de datos relacional almacena registros en tablas con columnas nombradas. Un programa envía una consulta SQL mediante una conexión y recibe un resultado que pandas puede convertir en un DataFrame. La base de datos puede seleccionar solo los datos necesarios antes de enviarlos a Python.

Empieza con un archivo SQLite
import sqlite3
import pandas as pd

con = sqlite3.connect("shop.db")
try:
    df = pd.read_sql_query(
        "SELECT region, amount FROM sales", con
    )
finally:
    con.close()

SQLite funciona sin un servidor independiente y almacena una base de datos en un archivo. Al conectarse crea el archivo si no existe, por lo que una ruta mal escrita puede abrir una base de datos nueva y vacía en lugar de la prevista. ":memory:" crea una base de datos temporal en memoria. La consulta anterior devuelve las columnas region y amount de una tabla sales existente; los nombres de las columnas del resultado se convierten en etiquetas del DataFrame.

El bloque with de una conexión SQLite gestiona una transacción, pero no cierra la conexión. Llama explícitamente a close() cuando termines. Un bloque try/finally cierra la conexión incluso si la lectura genera un error.

Usa un motor para una base de datos con servidor

SQLAlchemy proporciona motores para sistemas como PostgreSQL, MySQL y SQL Server, con el controlador correspondiente instalado. Una URL de conexión identifica el dialecto, el controlador, el servidor y la base de datos. Guárdala en una variable de entorno:

import os
from sqlalchemy import create_engine

engine = create_engine(os.environ["ANALYSIS_DB_URL"])
try:
    with engine.connect() as conn:
        df = pd.read_sql_query(
            "SELECT region, amount FROM sales", conn
        )
finally:
    engine.dispose()

El contexto de la conexión devuelve la conexión al grupo del motor. dispose() libera los recursos agrupados cuando ya no se necesita el motor. Usa una cuenta de solo lectura para el análisis y mantén las credenciales fuera de los cuadernos interactivos y del control de versiones. Una URL de motor para un archivo SQLite local puede ser "sqlite:///shop.db".

Elige el lector que corresponda a la entrada
LectorEntrada
read_sql_queryUna consulta SQL y una conexión
read_sql_tableUn nombre de tabla y una conexión o motor de SQLAlchemy
read_sqlUna consulta o, con una conexión compatible, un nombre de tabla

Con una conexión sqlite3 directa, pasa una consulta completa. pd.read_sql("sales", con) envía sales como SQL y falla; usa pd.read_sql_query("SELECT * FROM sales", con) en su lugar. pandas admite conexiones de SQLAlchemy, ADBC y SQLite; una conexión directa de un controlador cualquiera no es un sustituto compatible solo porque el controlador pueda ejecutar SQL.

Transfiere el resultado que necesitas

Una consulta que devuelve filas y columnas seleccionadas transfiere menos datos que leer una tabla completa y descartar la mayor parte en pandas. La consulta proporcionada SELECT SUM(amount) AS total FROM sales devuelve un valor agregado, etiquetado como total. Leer el resultado de una consulta no cambia la tabla almacenada. Después de cargarlo, comprueba el recuento de filas y los tipos como harías con un archivo; los tipos declarados en la base de datos y los tipos de pandas devueltos están relacionados, pero no son idénticos.

Puntos clave

  • SQLite es una base de datos de archivo local; las bases de datos con servidor necesitan una conexión y un controlador.
  • Usa consultas completas con una conexión SQLite directa.
  • Deja que una consulta reduzca las filas y columnas transferidas a pandas.
  • Mantén las credenciales separadas y usa acceso de solo lectura para el análisis.
  • Cierra las conexiones SQLite y libera los recursos de SQLAlchemy.

6.2 Mantén los valores de consulta separados de SQL

Los valores variables deben ir en parámetros de consulta. La instrucción SQL define la operación; los parámetros vinculados proporcionan la región, el umbral u otro valor utilizado en esta ejecución. Esto conserva la estructura de la consulta incluso cuando un valor contiene una comilla.

Vincula valores con la sintaxis de la conexión

Para SQLite:

query = "SELECT region, amount, sold_on FROM sales WHERE amount > ? ORDER BY amount DESC"
df = pd.read_sql_query(query, con, params=(70,))

Para los importes de ventas 120,0; 75,5; 60,0 y 210,0, esto devuelve 210,0; 120,0 y 75,5 en orden descendente. La tupla (70,) tiene un elemento; (70) es solo el número 70. SQLite también acepta marcadores de posición con nombre, por ejemplo WHERE region = :r con params={"r": "North"}.

Las reglas de los marcadores de posición dependen de la interfaz. psycopg usa %s o %(name)s. Con SQLAlchemy, envuelve una instrucción en text y usa parámetros con nombre:

from sqlalchemy import text

query = text("SELECT region, amount FROM sales WHERE amount >= :m")
with engine.connect() as conn:
    df = pd.read_sql_query(query, conn, params={"m": 100})

Pasa los valores mediante params; no uses el formato de cadenas de Python para insertarlos en la instrucción.

Comprende qué protege la parametrización

Supón que el código construye una condición usando una cadena f y una entrada "x' OR '1'='1". Pegarla entre comillas cambia la condición a region = 'x' OR '1'='1', que coincide con todas las filas. Esto es una inyección SQL: un valor se ha convertido en estructura ejecutable de la consulta.

Un parámetro vinculado se compara como un solo valor, por lo que esa misma cadena solo coincide con una región que tenga literalmente ese texto. La vinculación también gestiona nombres normales que contienen apóstrofos sin tener que construir manualmente secuencias de escape para las comillas. La regla se aplica tanto a entradas de archivos como de formularios de usuarios.

Los parámetros representan valores, no nombres de tablas o columnas. Un parámetro en lugar de un nombre de tabla no selecciona esa tabla. Cuando un programa necesite un identificador variable, elígelo de una lista fija controlada por el código.

Controla los tipos del resultado

SQLite suele almacenar las fechas como texto. Pide a pandas que las interprete:

df = pd.read_sql_query(
    "SELECT sold_on, visits FROM observations", con,
    parse_dates=["sold_on"],
    dtype={"visits": "Int64"}
)

La columna de fecha se convierte en valores de fecha y hora, y un recuento con NULL de SQL usa enteros que admiten valores faltantes en lugar de convertirse en coma flotante solo para contener huecos. Inspecciona el resultado para comprobar la conversión.

Distingue los bloques del almacenamiento en búfer del controlador

chunksize=1000 devuelve un iterador de DataFrames que contienen como máximo 1000 filas cada uno. Un resultado de cuatro filas con chunksize=3 produce partes de tres y una. Mantén la conexión abierta mientras las procesas. Algunos controladores de bases de datos siguen almacenando en búfer el resultado completo antes de que pandas produzca los bloques; también puede necesitarse un cursor del lado del servidor o una configuración de lectura en flujo para limitar la memoria en todo el recorrido de la conexión.

Puntos clave

  • Vincula los valores variables mediante params usando el estilo de marcadores de posición de la interfaz.
  • Una tupla posicional de un valor necesita una coma final.
  • Los parámetros impiden que un valor cambie la estructura de la consulta.
  • Elige los nombres variables de tablas y columnas de una lista fija autorizada.
  • Interpreta las fechas y solicita explícitamente tipos enteros que admitan valores faltantes para los resultados.
  • El tamaño de bloque de pandas no determina cómo almacena los datos en búfer el controlador.

6.3 Escribe tablas y verifica el cambio previsto

to_sql crea una tabla de base de datos a partir de un DataFrame o escribe filas en una tabla existente. Sus opciones determinan si se conservan los datos existentes, si el índice se convierte en una columna y cómo se confirma un conjunto de escrituras.

Elige el comportamiento ante una tabla existente
df.to_sql("sales", con, index=False)

La opción predeterminada if_exists="fail" detiene la operación cuando sales ya existe. Elige otro modo solo cuando su efecto coincida con la carga prevista:

ModoComportamiento ante una tabla existente
failDetenerse sin cargar datos en esa tabla
appendAñadir filas al contenido existente
replaceEliminar la tabla y volver a crearla
delete_rowsEliminar todas las filas, conservar la tabla e insertar los datos

delete_rows está disponible en pandas 3. Sustituir una tabla elimina su definición anterior, incluidas claves, índices y restricciones; los permisos específicos de la base de datos también pueden verse afectados. Eliminar las filas conserva la definición, pero sigue borrando todos los registros existentes. Úsalo para una recarga completa prevista, no cuando el DataFrame solo contenga un lote nuevo.

Establece las columnas y escribe en una transacción

La opción predeterminada escribe el índice del DataFrame como una columna. Un índice sin nombre se convierte en index; uno con nombre conserva su nombre. index_label le da un nombre explícito e index=False lo excluye. Si un identificador ya es una columna normal, escribir los números de fila predeterminados no suele añadir información útil.

Con SQLAlchemy, dtype puede elegir tipos de base de datos:

from sqlalchemy import types

with engine.begin() as conn:
    df.to_sql(
        "sales", conn,
        if_exists="append",
        index=False,
        dtype={"sold_on": types.Date()},
        chunksize=1000
    )

engine.begin() confirma los cambios al salir correctamente y los revierte si se produce una excepción. Para una tabla existente, el esquema almacenado sigue determinando qué valores pueden insertarse; dtype no es una orden para rediseñar sus columnas. Las garantías de la transacción también dependen de que la base de datos admita las operaciones utilizadas. Añadir filas dentro de una transacción de SQLAlchemy mantiene unida la carga de inserción del ejemplo.

chunksize agrupa las filas en lotes. method="multi" coloca varias filas en una instrucción INSERT cuando se admite. Puede mejorar o reducir el rendimiento según la base de datos y el tamaño del lote, así que mídelo con datos representativos.

Verifica el aumento, no solo la finalización
check = pd.read_sql_query("SELECT COUNT(*) AS n FROM sales", con)
print(check["n"].iloc[0])

Para una tabla nueva o recargada por completo, compara el recuento con len(df). Para una adición, compara el aumento: una tabla de cuatro filas que recibe dos filas debe contener seis. El recuento de filas devuelto por to_sql procede de lo que comunica el controlador; verifica directamente los datos almacenados.

Ejecutar una adición dos veces repite los registros salvo que la base de datos rechace duplicados o el programa seleccione solo registros nuevos. Decide si la operación es una recarga completa o una adición de registros nuevos antes de volver a ejecutarla. Una transacción evita una carga parcial ante un fallo; no hace que las adiciones repetidas que terminan correctamente sean únicas.

Puntos clave

  • append añade filas; replace elimina la tabla; delete_rows conserva su definición.
  • Usa index=False salvo que el índice deba formar parte de los datos almacenados.
  • Usa una transacción de SQLAlchemy para confirmar o revertir una carga en conjunto.
  • Verifica una adición mediante el aumento esperado de las filas almacenadas.
  • Repetir una adición que terminó correctamente puede duplicar registros.
  • El rendimiento del tamaño de lote y de INSERT con varias filas depende de la base de datos.

Ejemplos de Carga y almacenamiento de datos

6 Lecciones Interactivas

1

Construye una tabla fiable a partir de texto

17 pasos
Trabaja desde los registros en bruto hasta un DataFrame comprobado, eligiendo encabezados, formatos numéricos, tipos y límites del informe.
  1. 1
    IntroducciónLee la estructura antes que los valores

    Una exportación de texto deja decisiones importantes a quien la lee. Una coma puede dividir campos o aparecer dentro de un nombre entre comillas; un número puede ser una medición o un identificador.

    Primero establecerás los registros y las columnas, después interpretarás sus valores y, por último, eliminarás el material del informe que queda fuera de la tabla. Inspecciona el resultado después de cada decisión para que una lectura satisfactoria no oculte cambios en los datos.

  2. 2
    EjemploCarga tres registros de ventas

    El archivo de ventas tiene un encabezado y tres observaciones:

    order_id,date,region,units,price
    1001,2026-03-02,North,3,4.50
    1002,2026-03-02,South,1,12.00
    1003,2026-03-03,North,2,7.25
    

    df = pd.read_csv("sales.csv") produce la forma (3, 5). units es una columna de enteros y price es de coma flotante. Las cadenas que parecen fechas aún necesitan interpretarse como fechas.

  3. 3
    ExplicaciónDa un propósito a cada inspección

    Usa head() para comprobar que los campos estén bajo sus nombres previstos, shape para comparar dimensiones y dtypes para inspeccionar la interpretación. info() añade recuentos de valores no nulos.

    Si una columna numérica es texto, inspecciona los valores en bruto en busca de marcadores o convenciones numéricas. Si no se encuentra un archivo, comprueba el directorio de trabajo actual: cambiar las opciones de las columnas no puede corregir una ruta relativa que apunta a una ubicación incorrecta.

  4. 4
    DesafíoConserva la primera observación

    Un archivo sin encabezado comienza con V12,South,6 y tiene 40 observaciones. Una lectura predeterminada produce 39 filas con esos tres valores como etiquetas. ¿Qué cambio de lectura conserva todas las observaciones y proporciona nombres útiles?

    ---reveal---

    Usa header=None, names=["site", "region", "units"]. El primer registro sigue siendo un dato, por lo que la forma esperada es (40, 3). Proporcionar nombres de sustitución con header=0 seguiría consumiendo ese primer registro.

  5. 5
    Idea claveLas comillas definen el límite del campo

    El registro "Smith, Jane",Boston,10 tiene tres campos. La coma dentro de las comillas forma parte del nombre. Una comilla duplicada dentro de un campo entre comillas representa una comilla literal.

    Los campos entre comillas también pueden contener un salto de línea. Deja que read_csv interprete los registros: dividir cada línea física por las comas puede crear tanto columnas falsas como registros falsos.

  6. 6
    EjemploIdentifica tres símbolos distintos

    La exportación de productos contiene Tea;3,50;1.200. Un punto y coma separa sus campos, una coma marca la parte decimal del precio y un punto agrupa los dígitos de la cantidad.

    df = pd.read_csv(
        "products.csv", sep=";",
        decimal=",", thousands="."
    )
    

    Los valores se convierten en el precio 3,5 y la cantidad 1200. La opción de separador por sí sola no establece la convención numérica.

  7. 7
    DesafíoDetecta un error de escala silencioso

    Una exportación separada por punto y coma documenta las cantidades como unidades enteras. Su cantidad en bruto es "6.400", pero una lectura que solo usa sep=";" da 6,4. ¿Qué opción numérica y qué valor esperado corrigen la interpretación?

    ---reveal---

    Usa thousands="." para interpretar el punto como separador de millares y obtener 6400. El valor 6,4 es numéricamente válido si el punto se interpreta como separador decimal, por lo que este error puede producirse sin una excepción. Compara los valores cargados con la fuente.

  8. 8
    ConsejoAdapta el motor a las opciones necesarias

    El motor C habitual gestiona rápidamente los archivos comunes. El motor Python admite la detección del separador, separadores generales con expresiones regulares y la omisión del pie de informe. sep=None puede detectar un separador, pero puede equivocarse con informes irregulares.

    Indica un separador que ya conozcas. Selecciona engine="python" al usar skipfooter; el motor PyArrow tiene sus propios límites de opciones, entre ellos la falta de compatibilidad con chunksize.

  9. 9
    EjemploDefine marcadores de valores faltantes por columna

    Los valores de puntuación son 88, "n/a", "-" y 999. Los dos últimos están documentados como marcadores de valores faltantes.

    df = pd.read_csv(
        "scores.csv",
        na_values={"score": ["-", "999"]}
    )
    

    La puntuación pasa a ser 88,0 seguido de tres valores faltantes. Limita la regla a score para que un 999 legítimo en otra columna siga siendo un dato. Un valor centinela no declarado puede distorsionar totales y medias.

  10. 10
    ExplicaciónConserva los códigos e interpreta las fechas

    Un identificador como "00501" necesita almacenarse como texto, mientras que los recuentos con huecos pueden usar "Int64", que admite valores faltantes. Las fechas también necesitan su propia interpretación.

    df = pd.read_csv(
        "visits.csv",
        dtype={"code": str, "visits": "Int64"},
        parse_dates=["day"], date_format="%d/%m/%Y"
    )
    

    El patrón explícito convierte "03/04/2026" en el 3 de abril. Inspecciona los tipos de datos después para confirmar que la conversión solicitada se realizó realmente.

  11. 11
    DesafíoRespeta una etiqueta real y un valor faltante

    En un CSV, la zona "NA" es una etiqueta real. Un campo visits vacío significa que el valor falta y los recuentos conocidos son enteros. ¿Qué opciones de valores faltantes y tipos conservan esos significados?

    ---reveal---

    Usa keep_default_na=False, na_values={"visits": [""]}, dtype={"visits": "Int64"}. La etiqueta de zona se conserva, mientras que los campos de visitas vacíos se convierten en valores faltantes de tipo entero. Dejar activados los marcadores predeterminados también eliminaría la etiqueta real "NA".

  12. 12
    EjemploLocaliza la tabla del informe

    Un informe tiene tres líneas antes de su encabezado, un comentario # en el cuerpo y, después, observaciones seguidas de un total y una nota sobre la fuente.

    df = pd.read_csv(
        "report.csv", skiprows=3, comment="#",
        skipfooter=2, engine="python"
    )
    

    Se excluyen las líneas de título, el comentario y el pie de informe. Si las observaciones de enero suman 218, conservar una fila de total de 218 haría que la suma de la columna fuera incorrectamente 436.

  13. 13
    Idea claveNo todos los registros incorrectos generan errores

    Los campos adicionales pueden provocar un error de línea con formato incorrecto. En cambio, un número insuficiente de campos puede producir valores faltantes al final: bajo id,name,score, el registro 2,Ben se carga sin puntuación.

    Omitir registros con formato incorrecto también descarta sus observaciones. Comprueba por separado los recuentos de filas y de valores faltantes e investiga si hay un separador incorrecto o un campo sin comillas antes de decidir que deben eliminarse registros.

  14. 14
    DesafíoMantén claras las posiciones

    Una exportación de ancho fijo asigna las posiciones 0 a 2 a un código, 3 a 9 a un nombre y 10 a 14 a un valor. ¿Qué colspecs corresponden a esos campos?

    ---reveal---

    Usa [(0, 3), (3, 10), (10, 15)]. Cada intervalo incluye su inicio y excluye su final, lo que da anchuras de 3, 7 y 5. Usar los extremos 2, 9 y 14 eliminaría el último carácter de cada campo porque esos extremos se excluyen.

  15. 15
    ExplicaciónElige etiquetas apiladas o planas

    Cuando dos filas de encabezado describen grupos y años, header=[0, 1] crea etiquetas de columnas con dos niveles. Una columna de ventas puede identificarse entonces mediante ("sales", "2026").

    Si el análisis necesita nombres planos normales, omite ambas filas de encabezado y proporciona nombres como "region", "sales_2025" y "sales_2026". Comprueba que ninguno de los encabezados haya quedado entre las observaciones.

  16. 16
    DesafíoCombina las opciones de estructura y de valores

    Una exportación tiene una línea de título y después el encabezado code;amount;day. Un registro es 00018;2.100,50;11/12/2026. Los importes usan el punto para agrupar millares y la coma decimal; las fechas llevan el día primero. Indica las opciones de lectura esenciales.

    ---reveal---

    Usa skiprows=1, sep=";", thousands=".", decimal=",", dtype={"code": str}, parse_dates=["day"], date_format="%d/%m/%Y". El registro conserva el código "00018", el importe 2100,5 y el 11 de diciembre como fecha.

  17. 17
    RepasoComprueba el significado de los datos importados

    Ajusta primero los límites de los registros, los encabezados y los límites de la tabla. Después establece las convenciones numéricas, los marcadores de valores faltantes, los tipos de identificadores y las fechas.

    Inspecciona las dimensiones y los tipos, compara algunos valores en bruto y comprueba los valores faltantes y los totales. Un analizador puede terminar correctamente y aun así perder un cero inicial, intercambiar una fecha o contar el total de un informe como una observación. Estas comprobaciones te indican si la tabla importada tiene el mismo significado que el archivo.

2

Decodifica texto y procésalo por partes

13 pasos
Diagnostica caracteres dañados y después procesa entradas grandes o comprimidas sin conservar todo el conjunto de datos.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDos problemas de lectura distintos
  2. 2
    EjemploSigue la conversión de un carácter en bytes
  3. 3
    ExplicaciónUsa marcadores y documentación
  4. 4
    DesafíoInterpreta la marca
  5. 5
    EjemploCorrige la interpretación original
  6. 6
    ConsejoNo borres los caracteres ilegibles
  7. 7
    DesafíoElige la evidencia frente a la ausencia de errores
  8. 8
    ExplicaciónMide la tabla cargada
  9. 9
    EjemploMantén una suma y un recuento acumulados
  10. 10
    DesafíoDa el mismo peso a las observaciones
  11. 11
    Idea claveLa compresión y la lectura por bloques reducen costes distintos
  12. 12
    DesafíoConserva la ventaja de memoria
  13. 13
    RepasoMantén fiables los bytes y los resultados parciales
3

Lee un libro y crea un informe claro

11 pasos
Localiza las observaciones de las hojas, comprende las celdas almacenadas y guarda varias tablas sin perder hojas.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónSepara la tabla de su presentación
  2. 2
    EjemploSelecciona las observaciones de Q1
  3. 3
    ExplicaciónLee el valor almacenado
  4. 4
    Idea claveUna fórmula no es una solicitud de cálculo
  5. 5
    DesafíoExplica dos celdas sospechosas
  6. 6
    ConsejoComprueba el conjunto de hojas
  7. 7
    EjemploEscribe dos hojas mediante un único gestor
  8. 8
    ExplicaciónElige cómo cambia una hoja existente
  9. 9
    DesafíoEvita que queden filas antiguas
  10. 10
    DesafíoCrea un informe a partir de varias hojas de origen
  11. 11
    RepasoVerifica el libro en ambos extremos
4

Convierte registros de una API en una tabla con la granularidad adecuada

16 pasos
Interpreta JSON, expande registros anidados y recopila resultados completos de API con comprobaciones en cada etapa.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDel texto de respuesta a las observaciones
  2. 2
    EjemploConvierte valores JSON en Python
  3. 3
    ExplicaciónElige explícitamente una estructura de tabla
  4. 4
    DesafíoConserva un identificador JSON
  5. 5
    ConsejoHaz que el JSON intercambiado sea legible y válido
  6. 6
    EjemploEmpieza con una fila por pedido
  7. 7
    EjemploExpande la lista elegida
  8. 8
    Idea claveRelaciona los totales con la granularidad de las filas
  9. 9
    DesafíoMantén visible un registro contenedor sin elementos
  10. 10
    EjemploComprueba el estado antes de construir una tabla
  11. 11
    ConsejoProtege el acceso y respeta los tiempos de espera
  12. 12
    DesafíoTen en cuenta todas las páginas
  13. 13
    ExplicaciónExtrae los registros e inspecciona los valores faltantes
  14. 14
    ConexiónReconoce otro formato web
  15. 15
    DesafíoSepara la recopilación de la normalización
  16. 16
    RepasoComprueba cada etapa en orden
5

Elige qué conserva tu archivo guardado

13 pasos
Controla las exportaciones CSV, compara opciones de almacenamiento y lee partes útiles de un conjunto de datos Parquet con tipos.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónGuarda los datos para quien los leerá después
  2. 2
    EjemploEscribe los campos CSV previstos
  3. 3
    Idea claveUna exportación puede descartar precisión y tipos
  4. 4
    DesafíoAñade solo registros
  5. 5
    ExplicaciónLee columnas sin leer todos los campos
  6. 6
    ConexiónRelaciona los formatos con las actividades
  7. 7
    DesafíoElige portabilidad y confianza
  8. 8
    EjemploEscribe y lee una tabla con tipos
  9. 9
    EjemploUsa una división útil en directorios
  10. 10
    DesafíoEvita miles de partes diminutas
  11. 11
    ConsejoAñade archivos con tipos compatibles
  12. 12
    DesafíoConserva un informe y un conjunto de datos de análisis
  13. 13
    RepasoVerifica las propiedades que necesitarás después
6

Lee resultados de consultas y verifica las escrituras en tablas

14 pasos
Gestiona conexiones, vincula valores, controla los tipos de los resultados y almacena un lote verificando su efecto en la base de datos.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónUna lectura devuelve datos; una escritura los cambia
  2. 2
    EjemploLee una base de datos SQLite local
  3. 3
    ExplicaciónGestiona la duración del motor y de las conexiones
  4. 4
    DesafíoEnvía una consulta en lugar de un nombre de tabla
  5. 5
    EjemploVincula un umbral variable
  6. 6
    Idea claveUn valor no puede convertirse en sintaxis de consulta
  7. 7
    DesafíoConserva los tipos y los límites de los parámetros
  8. 8
    ConsejoProcesa los bloques mientras la conexión esté abierta
  9. 9
    ExplicaciónDecide qué ocurre con los registros existentes
  10. 10
    EjemploAñade filas dentro de una transacción
  11. 11
    DesafíoVerifica el cambio y la nueva ejecución
  12. 12
    ConsejoComprueba directamente los resultados almacenados
  13. 13
    DesafíoConserva la definición y sustituye una instantánea
  14. 14
    RepasoAjusta la llamada a su efecto en la base de datos

Ejercicios de Carga y almacenamiento de datos

50 Preguntas de Práctica en 5 sets

Set 1: Lee los datos y comprueba su significado10 Preguntas de Práctica

Pregunta 1 de 10

Un archivo sin encabezado comienza con S14,East,8. ¿Cómo debe leerse para que este registro siga siendo un dato?
  1. header=0, names=["site", "zone", "count"]
  2. header=None, names=["site", "zone", "count"]
  3. header=1, names=["site", "zone", "count"]
  4. skiprows=1, names=["site", "zone", "count"]
Mostrar respuestaOcultar respuesta
Respuesta: B
header=None indica que no hay una fila de etiquetas, mientras que names proporciona las etiquetas por separado. Usar header=0 consumiría el primer registro como encabezado incluso si se proporcionan nombres de sustitución. La fila que comienza con S14 debe permanecer entre las observaciones.

Pregunta 2 de 10

Un archivo separado por punto y coma contiene sensor;distance_m seguido de R8;2.450,75. ¿Cómo debe obtenerse la distancia 2450,75?
  1. sep=";", decimal=".", thousands=","
  2. sep=",", decimal=",", thousands="."
  3. sep=";", decimal=",", thousands=" "
  4. sep=";", decimal=",", thousands="."
Mostrar respuestaOcultar respuesta
Respuesta: D
El punto y coma divide los campos, la coma marca la parte decimal y el punto agrupa millares. Estas opciones convierten la distancia en 2450,75. Invertir las opciones decimal y de agrupación no corresponde al número de origen, aunque el separador de campos sea correcto.

Pregunta 3 de 10

En UTF-8, cada letra ASCII usa un byte y "é" usa dos. ¿Cuántos bytes codifican "été"?
  1. 5 bytes
  2. 3 bytes
  3. 4 bytes
  4. 6 bytes
Mostrar respuestaOcultar respuesta
Respuesta: A
Las dos letras acentuadas usan dos bytes cada una y la letra ASCII "t" usa uno, lo que suma cinco bytes. Contar tres mide los caracteres, no su tamaño codificado. La distinción importa al examinar bytes almacenados o diagnosticar un problema de codificación.

Pregunta 4 de 10

Una hoja de cálculo tiene un título en la fila 1, una fila 2 vacía, etiquetas en la fila 3, tres observaciones en las filas 4 a 6 y un total en la fila 7. ¿Qué opciones de lectura aíslan las observaciones?
  1. skiprows=3, nrows=3
  2. skiprows=2, nrows=4
  3. skiprows=2, nrows=3
  4. skiprows=1, nrows=3
Mostrar respuestaOcultar respuesta
Respuesta: C
Omitir dos filas sitúa la tercera fila de la hoja en el encabezado y después nrows=3 lee las tres observaciones. Omitir tres consumiría la primera observación como etiquetas con el comportamiento predeterminado del encabezado. Leer cuatro filas de datos también incluiría el total como observación.

Pregunta 5 de 10

Un registro contiene un objeto JSON completo en cada línea y no tiene un arreglo que los englobe. ¿Qué opción de lectura de pandas corresponde a esa estructura?
  1. orient="split"
  2. lines=False
  3. lines=True
  4. orient="index"
Mostrar respuestaOcultar respuesta
Respuesta: C
lines=True indica a pandas que interprete registros JSON separados línea por línea. Cambiar solo la orientación no convierte objetos sucesivos en un documento JSON normal. El formato por líneas también admite la lectura por bloques cuando un registro grande debe procesarse por partes.

Pregunta 6 de 10

Una respuesta tiene las claves count, next y results; cada entrada de results es un registro anidado de equipo. ¿Qué debe pasarse a json_normalize para obtener una tabla de equipos?
  1. data["results"]
  2. data
  3. data["count"]
  4. data["next"]
Mostrar respuestaOcultar respuesta
Respuesta: A
El valor results contiene los registros de observaciones, por lo que normalizar esa lista produce filas de equipos y expande los campos de objetos anidados. Normalizar todo el envoltorio produce, en cambio, una fila para el objeto contenedor y deja la lista de registros dentro de una celda. Conserva los demás campos para comprobar la recopilación y la paginación.

Pregunta 7 de 10

Un CSV importado de nuevo contiene una columna nueva "Unnamed: 0" que solo contiene los antiguos números de fila predeterminados. ¿Qué cambio en la exportación lo evita?
  1. Usar header=False.
  2. Usar na_rep="0".
  3. Usar mode="a".
  4. Usar index=False.
Mostrar respuestaOcultar respuesta
Respuesta: D
El escritor CSV incluye de forma predeterminada el índice del DataFrame, por lo que sus números de fila sin nombre regresan como una columna adicional. index=False omite esas etiquetas. Desactivar el encabezado elimina los nombres reales de las columnas y no soluciona el campo de índice no deseado.

Pregunta 8 de 10

Un equipo necesita un archivo con amplia compatibilidad para análisis repetidos que conserve una categoría ordenada y recuentos que admitan valores faltantes. ¿Qué formato es el más adecuado?
  1. Texto CSV
  2. Parquet
  3. Registros JSON
  4. Libro de Excel
Mostrar respuestaOcultar respuesta
Respuesta: B
Parquet almacena los tipos de columnas y metadatos admitidos, lo que permite que estos tipos de pandas se conserven en un ciclo de escritura y lectura compatible. CSV conserva los valores visibles, pero pierde el orden de las categorías y los metadatos de enteros que admiten valores faltantes. Excel es útil para informes de hojas de cálculo, pero también puede cambiar los tipos de pandas al volver a leerlo.

Pregunta 9 de 10

Una base de datos tiene una tabla readings existente y con es una conexión SQLite directa. ¿Qué llamada la recupera como DataFrame?
  1. pd.read_sql("readings", con)
  2. pd.read_sql_table("readings", con)
  3. pd.read_sql_query("readings", con)
  4. pd.read_sql_query("SELECT * FROM readings", con)
Mostrar respuestaOcultar respuesta
Respuesta: D
Una consulta SQL completa puede ejecutarse mediante la conexión SQLite y su resultado se convierte en un DataFrame. Un nombre de tabla sin más no es una consulta en esta forma de conexión. read_sql_table necesita una conexión mediante SQLAlchemy en lugar de una conexión sqlite3 directa.

Pregunta 10 de 10

Una consulta SQLite contiene WHERE site = ?. ¿Cómo debe pasarse el único valor "West"?
  1. params=("West",)
  2. params=("West")
  3. params={"site": "West"}
  4. params="West"
Mostrar respuestaOcultar respuesta
Respuesta: A
Un marcador de posición posicional de SQLite necesita una secuencia de valores; la coma final hace que esto sea una tupla de un elemento. Los paréntesis sin esa coma dejan una cadena normal. Un diccionario con nombre corresponde a un marcador de posición con nombre coincidente, como :site, en lugar del signo de interrogación usado aquí.
Set 2: Conserva valores entre archivos y conexiones10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

En un CSV, "NA" es una etiqueta de zona válida y un recuento vacío significa que falta el valor. ¿Qué configuración conserva ambos significados?
  1. keep_default_na=True, na_values={"count": [""]}
  2. keep_default_na=False, na_values={"zone": ["NA"]}
  3. keep_default_na=False, na_values={"count": [""]}
  4. keep_default_na=True, na_values={"zone": ["NA"]}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un encabezado CSV tiene cuatro campos. Un registro posterior proporciona solo tres y se carga sin error. ¿Qué debes comprobar?
  1. El recuento de valores faltantes de la última columna y ese registro en bruto.
  2. Solo el recuento de valores faltantes, ignorando la estructura de origen.
  3. Solo las advertencias de líneas rechazadas para el registro corto.
  4. El recuento global de filas, como comprobación de completitud.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Un nombre de origen UTF-8 aparece como "André" después de una lectura con Windows-1252. ¿Cuál es la reparación adecuada?
  1. Volver a leer la tabla alterada con Latin-1.
  2. Sustituir cada carácter no ASCII por un espacio.
  3. Guardar la tabla corrupta con una BOM de UTF-8.
  4. Volver a leer el archivo original con UTF-8.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un bloque tiene los valores presentes 2, 6 y 10; un segundo tiene 18. ¿Cuál es la media general?
  1. 12
  2. 9
  3. 6
  4. 18
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Deben guardarse dos tablas en hojas separadas de un libro nuevo. ¿Qué método de escritura conserva ambas?
  1. Llamar a to_excel dos veces con la misma ruta de archivo.
  2. Escribir ambas mediante un único contexto ExcelWriter.
  3. Escribir la segunda tabla con header=False en esa ruta.
  4. Abrir un gestor nuevo para cada tabla en modo de escritura.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una API comunica 275 registros coincidentes y devuelve páginas de como máximo 80 registros. ¿Cuántas solicitudes se necesitan para recopilar el resultado completo?
  1. 4 solicitudes
  2. 3 solicitudes
  3. 5 solicitudes
  4. 275 solicitudes
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Un conjunto de datos Parquet está particionado en directorios por año. Un análisis solo necesita registros de 2024 y dos columnas. ¿Qué lectura aprovecha ambas características?
  1. pd.read_parquet(path, columns=["year"], filters=[("site", "==", 2024)])
  2. pd.read_parquet(path, columns=["site", "value", "year"])
  3. pd.read_parquet(path, filters=[("year", "!=", 2024)])
  4. pd.read_parquet(path, columns=["site", "value"], filters=[("year", "==", 2024)])
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Se usa una conexión SQLite dentro de with con:. ¿Qué debe hacerse todavía después de terminar el trabajo con la base de datos?
  1. Volver a crear la conexión para confirmar.
  2. Liberar el grupo de conexiones.
  3. Cerrar explícitamente la conexión.
  4. Volver a abrir para liberar la transacción.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un resultado de SQLite contiene texto de fecha ISO en day y recuentos enteros con NULL en n. Un script debe seleccionar un sitio proporcionado en tiempo de ejecución sin cambiar la estructura de la consulta. ¿Qué combinación es adecuada?
  1. Insertar el sitio mediante formato en SQL, interpretar day y establecer n como Int64.
  2. Vincular el sitio con params, mantener day como texto y forzar n a int64.
  3. Vincular el sitio con params, interpretar day y establecer n como Int64.
  4. Vincular un nombre de tabla con params, interpretar day y establecer n como Int64.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla tiene 32 filas. Se añade un lote de cinco filas y después se añade de nuevo tras una primera ejecución satisfactoria. Ninguna restricción de unicidad lo rechaza. ¿Qué recuento y conclusión son adecuados?
  1. 42 filas; las nuevas ejecuciones satisfactorias pueden duplicar el lote.
  2. 37 filas; la segunda adición sustituye el primer lote.
  3. 42 filas; una transacción siempre detecta los registros duplicados.
  4. 32 filas; añadir filas requiere eliminar antes la tabla.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 3: Diagnostica las importaciones antes de confiar en la tabla10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Un registro CSV es "Field ""A,B""",7. ¿Qué valores debe producir un analizador CSV estándar?
  1. Field "A y B" y 7
  2. Field A y B y 7
  3. Field ""A,B"" y 7
  4. Field "A,B" y 7
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un archivo separado por punto y coma contiene code;score;day y 00064;999;07/08/2026. El código es un identificador, 999 significa que falta el valor solo para la puntuación y las fechas llevan el día primero. ¿Qué importación conserva los tres significados?
  1. sep=";", dtype={"code": int}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  2. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  3. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%m/%d/%Y"
  4. sep=";", dtype={"code": str}, na_values={"code": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

open() de Python conserva una BOM inicial de UTF-8 en el primer encabezado cuando decodifica con UTF-8 normal. ¿Qué configuración de codificación elimina ese marcador?
  1. encoding="utf-8-sig"
  2. encoding="utf-16-le"
  3. encoding="cp1252"
  4. encoding="ascii"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un CSV enorme tiene una columna numérica amount con algunos valores faltantes. El programa necesita su media general con memoria limitada. ¿Qué diseño sigue siendo correcto cuando los bloques contienen distintos recuentos de valores válidos?
  1. Acumular las medias de los bloques y dividir entre el número de bloques.
  2. Acumular las sumas y dividir entre el tamaño de bloque solicitado.
  3. Acumular la suma y el recuento de valores presentes de cada bloque y dividir una vez.
  4. Conservar todos los bloques y concatenarlos antes de calcular la media.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un libro almacena un código como el número 537 con el formato de visualización 00000. Una celda con fórmula no tiene un resultado almacenado en caché. ¿Qué debes esperar de una lectura de pandas que solicita un tipo de texto para el código?
  1. El código no conserva los ceros mostrados y pandas no calcula la fórmula.
  2. El código obtiene los ceros mostrados y pandas calcula la fórmula.
  3. El código no conserva los ceros mostrados y pandas calcula la fórmula.
  4. El código obtiene los ceros mostrados y la fórmula se lee a partir de su texto.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una cadena JSON contiene [{"device":"00091","active":true}]. ¿Cómo debe leerla pandas sin tratar la cadena como una ruta ni eliminar los ceros del identificador?
  1. Usar text directamente y dtype={"device": str}.
  2. Usar StringIO(text) y dtype={"device": int}.
  3. Usar json.dumps(text) y dtype={"device": str}.
  4. Usar StringIO(text) y dtype={"device": str}.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una API devuelve HTTP 200 con JSON válido y una URL next no vacía. El recuento de filas recopiladas es inferior a count. Una persona del equipo presenta la tabla actual como completa. ¿Cuál es el problema?
  1. El total debe sustituirse por el recuento de la primera página.
  2. La URL siguiente debe apuntar de nuevo a los registros recopilados.
  3. Se confundió el éxito HTTP con la recopilación completa de todas las páginas.
  4. El campo de recuento del servidor muestra que los registros están completos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un valor preciso de análisis es 6,347. Se exporta con float_format="%.2f" y después se lee como número. ¿Qué valor puede recuperar ese CSV?
  1. 6,347
  2. 6,35
  3. 6,34
  4. 6,3
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un conjunto de datos particionado por año almacena code como texto en 2025 y como enteros en un archivo propuesto para 2026. Los datos nuevos también contienen una sola fila por cada código casi único. ¿Qué preparación favorece mejor una lectura fiable?
  1. Mantener tipos de código mezclados y sustituir los años por particiones de código.
  2. Alinear los tipos de código y crear una partición para cada código.
  3. Mantener tipos de código mezclados y confiar en que la proyección de columnas los corrija.
  4. Alinear los tipos de código y conservar la partición útil por año.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla existente tiene restricciones importantes y contiene una instantánea completa antigua. Un DataFrame nuevo es la instantánea completa de sustitución. ¿Qué modo conserva la definición de la tabla mientras carga el nuevo contenido?
  1. if_exists="append"
  2. if_exists="delete_rows"
  3. if_exists="replace"
  4. if_exists="fail"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 4: Relaciona las opciones de interpretación con los resultados almacenados10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Una tabla separada por barras verticales almacena un campo numérico entre comillas "7,680.25". El delimitador se lee correctamente, pero el importe sigue siendo texto. ¿Qué opción de lectura adicional corresponde al número?
  1. thousands=","
  2. decimal=","
  3. thousands="."
  4. quotechar="|"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un informe comienza con dos líneas de título y después site,jan,feb. Su cuerpo contiene una línea # note y termina con un total más una nota sobre la fuente. ¿Qué configuración lee solo las observaciones sin tratar las notas como registros?
  1. skiprows=3, comment="#", skipfooter=2, engine="python"
  2. skiprows=2, comment="#", skipfooter=1, engine="python"
  3. skiprows=2, comment="#", skipfooter=2, engine="python"
  4. skiprows=2, comment="#", skipfooter=2, engine="c"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Un CSV documentado como UTF-8 se leyó como Windows-1252 y produjo nombres corruptos. Esa tabla se guardó después correctamente como UTF-8. La descarga original aún existe. ¿Qué recuperación restablece los nombres previstos?
  1. Volver a leer la exportación derivada como UTF-8 y guardarla sin cambios.
  2. Volver a leer el original como Windows-1252 y añadir una BOM de UTF-8.
  3. Volver a leer la exportación derivada como Latin-1 y sustituir los bytes no válidos.
  4. Volver a leer el original como UTF-8 y reconstruir la exportación derivada.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un libro contiene History y Current. Solo debe sustituirse Current y debe conservarse History. ¿Qué configuración del gestor de escritura es adecuada?
  1. Modo de escritura, motor openpyxl y nombre de hoja Current.
  2. Modo de adición, motor openpyxl e if_sheet_exists="replace".
  3. Modo de adición, motor openpyxl e if_sheet_exists="overlay".
  4. Modo de escritura, motor XlsxWriter e index=False para Current.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una tabla normalizada de piezas tiene las filas (visit_id, visit_fee, part_cost): (51, 12, 3), (51, 12, 5) y (52, 7, 4). ¿Cuál es el total de los cargos por visita más las piezas para estas dos visitas?
  1. 43
  2. 31
  3. 27
  4. 35
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un script de recopilación ha guardado la página 1 de un resultado de API. Su solicitud de la página 2 recibe HTTP 429 con Retry-After: 45. ¿Qué continuación conserva la recopilación y respeta la respuesta?
  1. Esperar 45 segundos, volver a solicitar la página 2 y seguir con las páginas restantes.
  2. Esperar 45 segundos, reiniciar en la página 1 y añadir todas las páginas a los registros guardados.
  3. Solicitar inmediatamente la página 3 y tratar la página 2 como un resultado vacío.
  4. Guardar el cuerpo 429 como página 2 y solicitar después su página siguiente.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

¿Por qué cargar un archivo pickle sin verificar de una persona del equipo implica una decisión de confianza distinta de leer un CSV normal?
  1. Cargar el pickle demuestra que el archivo procede de su remitente declarado.
  2. Un tipo de datos conservado hace seguro cargar un pickle sin verificar.
  3. Cargar el pickle puede ejecutar código al cargar el objeto.
  4. La compatibilidad entre versiones de bibliotecas impide ejecutar código en un pickle.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una tabla tiene 2 millones de filas, 60 columnas y cuatro años. Un análisis recurrente necesita dos columnas para un año. ¿Qué diseño de almacenamiento y lectura evita columnas y grupos de años innecesarios?
  1. Parquet particionado por identificador de registro, seguido de una lectura completa del conjunto.
  2. Un CSV por año, seguido de la lectura de todas las columnas de todos los archivos.
  3. Un archivo Parquet por año, seguido de la carga de todos los archivos antes de filtrar.
  4. Parquet particionado por año, con una lista de columnas y un filtro por año.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un programa permite elegir una tabla y un umbral. Su consulta usa un marcador de posición para el nombre de la tabla e inserta el umbral mediante formato en SQL. ¿Qué rediseño permite esas elecciones de forma segura?
  1. Elegir la tabla de una lista fija y vincular el valor del umbral.
  2. Vincular el nombre de la tabla y el umbral como valores normales.
  3. Insertar ambas entradas mediante formato tras quitar los espacios de su texto.
  4. Vincular el nombre de la tabla e insertar mediante formato un umbral de aspecto numérico.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Debe añadirse un lote diario a una tabla existente con restricciones. Un lote fallido no debe dejar inserciones parciales y uno satisfactorio debe aumentar el recuento almacenado en su número de filas. ¿Qué diseño es adecuado?
  1. Sustituir en una transacción de SQLAlchemy y comparar el recuento con el tamaño del lote.
  2. Añadir sin transacción y comparar el total con el tamaño del lote.
  3. Eliminar todas las filas en una transacción y verificar el aumento respecto al total anterior.
  4. Añadir mediante una transacción de SQLAlchemy y verificar el aumento del recuento.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 5: Resuelve varios riesgos de carga y almacenamiento10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Un CSV tiene los códigos "0072" y "0073", recuentos enteros que admiten valores faltantes y las fechas "12/01/2026", "26/01/2026". La fuente define las fechas con el día primero. ¿Qué combinación conserva estos significados?
  1. Código como texto, recuento como int32, fechas interpretadas con %d/%m/%Y.
  2. Código como enteros, recuento como Int64, fechas interpretadas con %d/%m/%Y.
  3. Código como texto, recuento como Int64, fechas interpretadas con %d/%m/%Y.
  4. Código como texto, recuento como Int64, fechas interpretadas con %m/%d/%Y.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un cargador usa on_bad_lines="skip". De 1000 observaciones de origen, se cargan 995; dos de ellas tienen campos faltantes al final. ¿Qué se deduce de estos resultados?
  1. Se perdieron siete observaciones; cada campo faltante indica un registro omitido.
  2. Se perdieron cinco observaciones; los registros cortos cargados aún necesitan inspección.
  3. Se perdieron cinco observaciones; todos los registros cargados deben estar completos.
  4. Se perdieron dos observaciones; la diferencia de recuento solo refleja campos vacíos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Un archivo corto se decodifica sin error como Latin-1, pero se desconoce la codificación de origen. ¿Qué evidencia reforzaría esa elección?
  1. La ausencia de una excepción de decodificación en la lectura con Latin-1.
  2. Que un editor de texto abra el archivo sin mostrar su codificación.
  3. Que un encabezado formado solo por ASCII parezca correcto con ese decodificador.
  4. La documentación de exportación y valores con acentos correctamente decodificados.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un CSV gzip se procesa por bloques. Una persona del equipo suma los importes, pero divide entre el número de filas, incluidos los importes faltantes, y conserva todos los bloques en una lista. ¿Qué corrección doble cumple una tarea que solo necesita la media con memoria limitada?
  1. Contar los importes presentes y conservar solo sumas y recuentos.
  2. Contar todas las filas y conservar solo el promedio de las medias de los bloques.
  3. Contar los importes presentes y concatenar todos los bloques conservados.
  4. Contar los bloques y conservar sus sumas sin recuentos de observaciones.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

El total de una fórmula en una hoja de cálculo muestra 90, pero el último resultado guardado en caché es 74. Un identificador de dispositivo de 16 dígitos se introdujo como número. ¿Qué dos limitaciones deben resolverse antes de confiar en la importación?
  1. Hay que actualizar los resultados de fórmulas en caché; leer como texto restablece el identificador completo.
  2. La fórmula mostrada está actualizada; el identificador original completo debe almacenarse como texto.
  3. Hay que actualizar los resultados de fórmulas en caché; el identificador original completo debe almacenarse como texto.
  4. La fórmula mostrada está actualizada; leer como texto restablece el identificador completo.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un envoltorio contiene tres pedidos con 2, 1 y 0 artículos. La tabla de artículos repite el cargo de entrega de cada pedido. La persona analista necesita tanto el recuento de pedidos como el total de cargos de entrega. ¿Qué diseño evita perder o repetir pedidos?
  1. Contar las filas de artículos y sumar cada cargo repetido en la tabla de artículos.
  2. Conservar solo los pedidos que aparecen en la tabla de artículos y tomar el cargo mayor.
  3. Usar el recuento de filas de artículos como recuento de pedidos y dividir los cargos entre tres.
  4. Conservar una tabla de pedidos para recuentos y cargos, vinculada a otra tabla de artículos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Un CSV procesado tiene un encabezado duplicado entre los registros, mediciones redondeadas e identificadores con ceros iniciales dañados después de volver a leerlo. ¿Qué conjunto de cambios aborda las tres causas?
  1. Añadir filas con encabezados, exportar con precisión completa y leer los identificadores como texto.
  2. Añadir filas sin encabezados, exportar con precisión completa y leer los identificadores como texto.
  3. Añadir filas sin encabezados, ampliar el tipo de coma flotante de lectura y leer los identificadores como enteros.
  4. Añadir filas sin encabezados, exportar valores redondeados y convertir después los identificadores en texto.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una persona del equipo necesita un informe de hoja de cálculo con hojas nombradas para mediciones y recuentos. ¿Qué formato de salida satisface directamente ese uso?
  1. Libro de Excel
  2. Archivo JSON por líneas
  3. Archivo Feather
  4. Conjunto de datos Parquet
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una tabla almacenada tiene 140 filas. Un lote de siete filas contiene solo registros nuevos y debe conservar las filas y restricciones existentes. Después de la carga, ¿qué modo y comprobación del recuento son adecuados?
  1. Usar replace y verificar que el recuento almacenado sea siete.
  2. Usar append y verificar que el recuento almacenado sea 147.
  3. Usar append y verificar que el recuento almacenado sea siete.
  4. Usar delete_rows y verificar que el recuento almacenado sea 147.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla con restricciones tiene 80 filas. Una adición de 12 filas dentro de una transacción compatible falla después de insertar cinco filas y la excepción sale del bloque de transacción. ¿Qué recuento debe quedar y qué produciría un nuevo intento satisfactorio?
  1. 80 tras la reversión; 92 tras un nuevo intento satisfactorio.
  2. 85 tras el fallo; 97 tras un nuevo intento satisfactorio.
  3. 80 tras la reversión; 80 tras un nuevo intento satisfactorio.
  4. 92 tras el fallo; 104 tras un nuevo intento satisfactorio.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

91 Términos Clave, cada uno con su definición

A

Adición de filas
Una adición de filas añade filas nuevas a una tabla existente sin eliminar sus registros anteriores, por lo que repetir un lote puede añadir registros duplicados.
Una tabla con 11 filas tiene 15 después de cuatro inserciones satisfactorias y puede tener 19 después de repetir esa adición.
Agregado parcial
Un agregado parcial es un resultado reducido de una parte de los datos que puede combinarse mediante una regla adecuada con los resultados de otras partes.
Las sumas de bloques se suman directamente, pero una media general necesita la suma combinada y el recuento de valores presentes.
Almacenamiento por columnas
El almacenamiento por columnas mantiene juntos los valores de cada columna, lo que permite leer columnas seleccionadas y comprimir valores similares adyacentes.
Un análisis que necesita dos campos puede evitar leer las demás columnas de un conjunto de datos Parquet ancho.
Archivo de ancho fijo
Un archivo de ancho fijo almacena campos en posiciones de caracteres especificadas en lugar de separarlos mediante un carácter delimitador.
Usa anchuras explícitas cuando una exportación de equipos reserve cuatro caracteres para un código y siete para un nombre.
Arreglo JSON
Un arreglo JSON es una secuencia ordenada de valores encerrada entre corchetes que se convierte en una lista de Python durante la interpretación.
Un arreglo de temperaturas puede mezclar observaciones numéricas con null para una medición faltante.
ASCII
ASCII define 128 caracteres básicos cuyos valores de byte comparten UTF-8 y varias codificaciones occidentales comunes de un byte.
Un encabezado que solo contiene inglés puede parecer correcto aunque la codificación utilizada para los nombres posteriores con acentos sea incorrecta.

B

Base de datos relacional
Una base de datos relacional almacena registros en tablas con columnas nombradas y permite a los programas recuperar o cambiar datos mediante operaciones SQL.
Una consulta puede devolver solo las filas y columnas requeridas antes de que pandas construya una tabla de análisis.
Bloque de registros
Un bloque de registros es un grupo limitado de registros que produce un lector iterativo y que permite a un programa trabajar con una parte de un archivo cada vez.
Una entrada de 13 filas leída en bloques de cinco produce DataFrames de cinco, cinco y tres filas.
Byte
Un byte es una unidad de datos almacenados con 256 valores posibles, de 0 a 255, que se usa como parte de la representación del texto.
Cuatro caracteres visibles de un nombre pueden requerir cinco bytes cuando uno de ellos usa dos bytes UTF-8.

C

Carácter de sustitución
El carácter de sustitución, "�", marca contenido que un decodificador no pudo interpretar cuando se le indicó que sustituyera los bytes no válidos.
Un nombre cargado como "Ren�" ha perdido información de caracteres; conserva los bytes originales para corregir la lectura.
Ciclo de escritura y lectura de CSV
Un ciclo de escritura y lectura de CSV escribe una tabla como texto y vuelve a leerla, lo que requiere reconstruir los tipos que CSV no almacena como metadatos.
Una categoría ordenada puede regresar como texto normal aunque todas las etiquetas visibles permanezcan sin cambios.
Clave de API
Una clave de API es una credencial que un cliente envía mediante el método de autenticación documentado de la API para obtener acceso autorizado.
Lee una clave privada de una variable de entorno en lugar de guardarla dentro de una celda de un cuaderno interactivo.
Códec de compresión
Un códec de compresión es un algoritmo utilizado para comprimir y descomprimir datos almacenados, que equilibra el tamaño del archivo y los costes de procesamiento.
Snappy es la opción predeterminada de pandas para Parquet; otro códec puede producir archivos más pequeños con un coste de escritura distinto.
Codificación
Una codificación es una regla para representar caracteres como bytes e interpretar esos bytes como caracteres cuando se leen.
Un mismo nombre puede ocupar distintas secuencias de bytes al guardarse como UTF-8 y como Windows-1252.
Código de estado HTTP
Un código de estado HTTP es un número de respuesta que comunica el resultado de la solicitud; los códigos 4xx y 5xx indican clases de errores.
Comprueba si hay un estado de error antes de convertir un mensaje de error JSON en algo que parezca una tabla de datos.
Columna categórica
Una columna categórica almacena valores mediante un conjunto definido de etiquetas y suele ahorrar memoria cuando muchas filas repiten unas pocas etiquetas.
Cuatro etiquetas regionales repetidas en miles de registros son una buena candidata para el almacenamiento categórico.
Columnas con índice jerárquico
Las columnas con índice jerárquico tienen etiquetas de varios niveles que pandas puede construir a partir de más de una fila de encabezado.
Una tabla de ventas puede etiquetar una columna tanto con su medida como con su año, por ejemplo ("sales", "2026").
Compresión
La compresión codifica datos en menos bytes almacenados y reduce el tamaño del archivo, aunque requiere descompresión antes de poder usar sus valores.
pandas puede descomprimir un archivo .csv.gz durante la lectura sin crear primero una copia descomprimida.
Conexión
Una conexión es una interfaz activa mediante la cual un programa envía operaciones a una base de datos y recibe sus resultados.
Mantén la conexión abierta hasta que se haya procesado por completo un resultado de consulta por bloques y después ciérrala.
Conjunto de datos particionado
Un conjunto de datos particionado divide los archivos de una tabla entre directorios según valores de campos seleccionados, lo que permite a los lectores omitir grupos que no correspondan.
Los directorios llamados year=2025 y year=2026 permiten que un filtro por año se centre en la parte necesaria.
Controlador de base de datos
Un controlador de base de datos es la biblioteca que implementa la comunicación entre la interfaz de bases de datos de Python y un sistema de base de datos concreto.
Una URL de SQLAlchemy para PostgreSQL puede seleccionar psycopg, que también debe estar instalado para la conexión.
CSV
Un archivo CSV es un archivo de texto de registros cuyos campos están separados por un delimitador y en el que las comillas protegen los delimitadores que aparecen dentro de los campos.
Una dirección que contiene una coma permanece en un solo campo cuando está correctamente entre comillas en el CSV.
Cursor del lado del servidor
Un cursor del lado del servidor permite a una interfaz de base de datos recuperar un resultado progresivamente en lugar de almacenarlo completo en búfer de una sola vez.
La lectura por bloques de pandas aún puede necesitar compatibilidad con lectura en flujo para evitar que el controlador de base de datos almacene el resultado completo en búfer.

D

Datos en bruto
Los datos en bruto son la entrada recibida o descargada para un análisis que se conserva sin cambios y por separado de los archivos de salida derivados y limpios.
Conserva el archivo de mediciones recibido para que una corrección posterior de decodificación o interpretación pueda partir de sus bytes originales.
Decodificación
La decodificación convierte bytes almacenados en texto según una codificación especificada y determina qué caracteres aparecen en el resultado.
Abrir un archivo UTF-8 con un decodificador antiguo puede producir acentos corruptos sin generar un error.
Delimitación mediante comillas
La delimitación mediante comillas encierra un campo de texto para que los delimitadores o saltos de línea que contiene se traten como contenido y no como estructura del registro.
El campo "Harbor, West" conserva su coma dentro de un único nombre de ubicación durante una importación CSV.
Delimitador
Un delimitador es un carácter o patrón que marca el límite entre campos, como una coma, un tabulador, una barra vertical o un punto y coma.
Un archivo separado por punto y coma necesita sep=";" aunque su extensión sea .csv.

E

Encabezado
Un encabezado es una fila de etiquetas de campos que un lector usa como nombres de columnas en lugar de tratar esas etiquetas como una observación.
Para un archivo sin encabezado, proporciona nombres de columnas para que la primera medición permanezca en la tabla.
Envoltorio de la respuesta de una API
Un envoltorio de la respuesta de una API es un objeto contenedor que incluye datos de registros junto con información como el recuento de resultados y la ubicación de la página siguiente.
Convierte en una tabla plana la lista de resultados del envoltorio mientras conservas el valor de la página siguiente para otra solicitud.
Error de decodificación Unicode
Un error de decodificación Unicode ocurre cuando un decodificador encuentra una secuencia de bytes que no puede interpretar con la codificación de texto elegida.
Un carácter acentuado de Windows-1252 puede provocar este error cuando el archivo se abre como UTF-8.
Esquema
Un esquema describe la estructura de un conjunto de datos, incluidos los nombres y tipos de columnas que usan los lectores compatibles para interpretar los valores almacenados.
Un conjunto de datos compartido necesita tipos compatibles en la columna de códigos entre sus archivos para evitar lecturas fallidas o que cambien los valores.
Exportación del índice
La exportación del índice escribe las etiquetas de fila de un DataFrame en una columna de salida, lo que solo es útil cuando esas etiquetas pertenecen a los datos intercambiados.
Excluye un índice numerado normal para evitar una nueva columna "Unnamed: 0" después de volver a leer el CSV.

F

Feather
Feather es un formato binario basado en Arrow IPC para el intercambio rápido de DataFrames con tipos entre herramientas de análisis compatibles.
Una etapa local de Python puede guardar una tabla Feather para una etapa posterior o un flujo de trabajo compatible de R.
Formato de fecha
Un formato de fecha es un patrón que indica a un analizador cómo están dispuestos los componentes de una fecha, como el día, el mes y el año de cuatro dígitos.
El patrón %d/%m/%Y convierte "09/10/2026" en el 9 de octubre en lugar del 10 de septiembre.
Formato de visualización
Un formato de visualización cambia cómo aparece el valor almacenado de una celda, por ejemplo como porcentaje o código con ceros añadidos, sin cambiar el valor subyacente.
Una celda mostrada como "15%" almacena 0,15, por lo que el valor cargado es una proporción y no el número 15.

G

Gestor de escritura de libros de Excel
Un gestor de escritura de libros de Excel administra una sesión de escritura de un libro para que varios DataFrames puedan colocarse en distintas hojas antes de cerrar el archivo.
Escribir dos tablas mediante un único gestor conserva ambas hojas de cálculo en el mismo libro de informe terminado.
Granularidad de las filas
La granularidad de las filas indica qué representa cada fila de una tabla, lo que determina cómo deben interpretarse las etiquetas y los importes repetidos.
Una fila por cada artículo de un pedido tiene una unidad de recuento distinta de una fila por cada pedido completo.

H

HDF5
HDF5 es un formato binario jerárquico que puede organizar varios conjuntos de datos dentro de un archivo y que suele usarse para grandes volúmenes de datos científicos.
pandas requiere PyTables para escribir varios conjuntos de datos de análisis mediante su interfaz HDF5.
Hoja de cálculo
Una hoja de cálculo es una cuadrícula de celdas con nombre dentro de un libro, seleccionada en pandas por su nombre de hoja o por su posición contada desde cero.
Usar sheet_name=1 lee la segunda hoja de cálculo, que puede ser distinta de la hoja abierta en pantalla.

I

Identificador
Un identificador es una etiqueta de un registro o entidad cuyos dígitos pueden tener significado sin representar una cantidad para realizar operaciones aritméticas.
Leer un código de equipo del tipo "00028" como texto conserva los ceros necesarios para relacionarlo con el mismo código en una lista de origen.
Inferencia de tipos
La inferencia de tipos es la elección que hace el lector del tipo de una columna a partir de sus valores de entrada cuando el programa no ha especificado ese tipo.
Un código de equipo formado solo por dígitos puede convertirse en entero salvo que se indique al lector que lo conserve como texto.
Intervalo semiabierto
Un intervalo semiabierto incluye su posición inicial y excluye su posición final, como ocurre con los límites de columnas de ancho fijo.
El intervalo (2, 7) selecciona cinco posiciones de caracteres y termina justo antes de la posición 7.
Inyección SQL
La inyección SQL ocurre cuando un texto insertado cambia la estructura de una operación SQL en lugar de permanecer como un valor de datos normal.
Una entrada que contiene comillas y una condición verdadera puede ampliar una consulta construida mediante formato de cadenas.

J

JSON
JSON es un formato de texto para objetos, arreglos, cadenas entre comillas dobles, números, valores booleanos y null, que se usa a menudo para intercambiar registros anidados.
Una API JSON puede devolver una lista de objetos de estaciones, cada uno con un nombre y una serie de temperaturas.
JSON por líneas
JSON por líneas es una estructura de texto con un objeto JSON completo en cada línea, sin un arreglo exterior que englobe todos los registros.
Las exportaciones grandes de registros pueden leerse por bloques cuando se indica a pandas que la entrada usa JSON por líneas.

L

Latin-1
Latin-1 es una codificación de un byte que asigna cada valor de byte a un carácter, incluidos caracteres de control en parte de su intervalo.
Una lectura con Latin-1 puede terminar sin errores y aun así convertir un símbolo previsto en un carácter equivocado.
Libro de cálculo
Un libro de cálculo es un archivo de hoja de cálculo que contiene una o varias hojas junto con valores de celdas, tipos, fórmulas y detalles de presentación.
Un solo libro .xlsx puede contener hojas separadas para observaciones, totales y un resumen del informe.
Límite de solicitudes por unidad de tiempo
Un límite de solicitudes por unidad de tiempo restringe el número de solicitudes que un cliente puede enviar en un período y suele señalar el exceso de solicitudes con HTTP 429.
Espera según lo indicado por Retry-After antes de volver a intentar una solicitud rechazada por superar la frecuencia permitida.
Línea con formato incorrecto
Una línea con formato incorrecto es un registro que el analizador no puede ajustar a la estructura esperada, por ejemplo uno con más campos de los que describe su encabezado.
Un delimitador sin comillas dentro de un nombre puede hacer que una observación válida parezca contener un campo adicional.

M

Marca de orden de bytes
Una marca de orden de bytes, o BOM, es un marcador inicial que algunos archivos de texto usan para identificar información de codificación, como el orden de bytes de UTF-16.
Usar utf-8-sig al leer texto con Python elimina una BOM inicial de UTF-8 del primer encabezado.
Marcador de posición
Un marcador de posición indica la posición de un valor vinculado en SQL usando la sintaxis requerida por el controlador o la interfaz de consulta.
SQLite acepta ? para valores posicionales y :name para valores proporcionados en un diccionario.
Marcador de valor faltante
Un marcador de valor faltante es un valor de origen que representa una observación ausente y se convierte en un valor faltante durante la lectura.
Si "-" significa que no hay puntuación, declararlo como faltante evita que la columna de puntuaciones siga siendo texto.
Media ponderada
Una media ponderada da a cada media parcial una influencia proporcional a su recuento de observaciones válidas al combinar grupos de datos desiguales.
Un bloque de un registro no debe contar tanto como un bloque de cien registros al calcular la media general.
Metadatos del objeto contenedor
Los metadatos del objeto contenedor son campos copiados de un objeto JSON contenedor a cada fila creada a partir de su lista anidada de registros.
Un identificador de pedido copiado en cada fila de artículo permite vincular los artículos con su pedido original.
Modo de adición
El modo de adición abre un libro existente para actualizarlo y permite añadir hojas o tratarlas según un criterio para nombres de hoja ya existentes.
Un gestor de escritura de openpyxl en modo de adición puede sustituir una hoja existente de un libro mientras conserva las demás hojas del libro.
Motor de análisis sintáctico
Un motor de análisis sintáctico es la implementación que lee una estructura de texto y la convierte en valores, con su propia velocidad y conjunto de opciones admitidas.
Un informe que necesita skipfooter usa el motor Python porque el motor C no admite esa opción.
Motor de lectura y escritura de Excel
Un motor de lectura y escritura de Excel es una biblioteca que pandas usa para leer o escribir un formato de hoja de cálculo y cuya compatibilidad depende del tipo de archivo.
La falta de una instalación de openpyxl puede impedir la lectura de un archivo .xlsx aunque pandas esté instalado.
Motor de SQLAlchemy
Un motor de SQLAlchemy configura el acceso a una base de datos mediante un controlador y gestiona un grupo de conexiones que se obtienen al ejecutar operaciones.
Un contexto de conexión devuelve su conexión al grupo; liberar el motor libera los recursos agrupados.

N

Normalización
La normalización de JSON anidado expande campos de objetos y registros de listas seleccionados en una tabla con una granularidad de filas elegida explícitamente.
Normalizar objetos de clientes que contienen pedidos puede crear columnas con nombres separados por puntos sin expandir la lista de artículos de cada pedido.

O

Objeto JSON
Un objeto JSON es una colección de valores con nombres de cadena encerrada entre llaves, que el analizador JSON de Python convierte en un diccionario.
Un objeto puede asociar "active" con true y "name" con la etiqueta de texto de una estación.
Orientación JSON
Una orientación JSON especifica cómo se organizan las filas, columnas, etiquetas y valores de una tabla dentro de una representación JSON.
La orientación records escribe cada observación como un objeto, mientras que split mantiene las etiquetas y los datos por separado.

P

Paginación
La paginación divide un resultado de API en páginas solicitadas por separado, con un mecanismo documentado para acceder a los registros restantes.
Una colección de 260 registros devuelta en páginas de 100 necesita tres solicitudes para recuperar todos los registros.
Parámetro vinculado
Un parámetro vinculado proporciona un valor de datos separado de la sintaxis SQL, lo que impide que los caracteres de ese valor redefinan la consulta.
Un nombre de región que contiene un apóstrofo sigue siendo un único valor de comparación cuando se pasa como parámetro.
Parquet
Parquet es un formato de archivo abierto por columnas, con tipos y compresión, que cuenta con amplia compatibilidad para leer y almacenar tablas de análisis.
Un identificador y un recuento que admite valores faltantes pueden conservar sus tipos en un ciclo compatible de escritura y lectura de Parquet con pandas.
Pie de informe
Un pie de informe es material final de un informe situado fuera de la tabla de observaciones, como totales, notas sobre la fuente o explicaciones de la exportación.
Omite las dos últimas líneas del informe cuando contengan un total y una nota sobre la fuente en lugar de observaciones.
Precisión de salida
La precisión de salida es el número de dígitos conservados en los valores escritos y puede reducirse de forma permanente mediante el formato numérico de exportación.
Un informe redondeado durante la escritura necesita un archivo de análisis separado con precisión completa si importan los dígitos descartados.
Proyección
La proyección selecciona las columnas que se leerán de una tabla almacenada, lo que permite a un lector por columnas dejar en disco las columnas que no se necesitan.
Pasa una lista de columnas a read_parquet cuando un análisis solo necesite región e importe.
Punto de acceso de una API
Un punto de acceso de una API es una URL documentada en la que una API acepta una solicitud HTTP para un recurso u operación determinados.
Un punto de acceso puede aceptar un parámetro de ciudad y devolver registros de mediciones coincidentes en una respuesta JSON.

R

Rango de celdas combinadas
Un rango de celdas combinadas une visualmente varias celdas de una hoja de cálculo mientras mantiene el valor almacenado en su celda superior izquierda.
Una etiqueta regional combinada puede dejar entradas vacías en las filas posteriores cuando la tabla se lee en pandas.
Registro
Un registro es una entrada completa de un archivo delimitado, formada por campos; el contenido entre comillas puede hacer que ocupe más de una línea física.
Un comentario con un salto de línea interno puede ocupar dos líneas físicas y seguir perteneciendo a un solo registro.
Representación de valores faltantes
Una representación de valores faltantes es el texto escrito para un valor ausente, como un campo vacío o un marcador de exportación elegido.
Escribir la precipitación faltante como "NA" la mantiene distinta de un cero registrado cuando la persona receptora la lee correctamente.
Resultado de fórmula almacenado en caché
Un resultado de fórmula almacenado en caché es el valor guardado junto a una fórmula de hoja de cálculo para que un lector lo use sin volver a calcularla.
Un libro generado por un script puede mostrar datos de fórmula faltantes porque no se guardó un resultado actualizado.
Reversión de una transacción
Una reversión de una transacción cancela los cambios no confirmados de una transacción cuando no puede completarse correctamente y restablece el estado confirmado anterior.
Si una carga de inserción compatible falla dentro de una transacción del motor, sus inserciones anteriores pueden revertirse.
Ruta de los registros
Una ruta de los registros selecciona la lista anidada cuyas entradas se convierten en filas de salida cuando pandas normaliza una colección de objetos JSON.
Establecer record_path="items" crea una fila de artículo por cada elemento de la lista de artículos de un pedido.

S

Separador de millares
Un separador de millares agrupa dígitos dentro de un campo numérico y debe distinguirse del separador decimal y del delimitador de campos.
Un valor agrupado escrito como "4.200,50" usa un punto para los millares y una coma para su parte decimal.
Separador decimal
Un separador decimal separa las partes entera y decimal de un número; pandas puede interpretar el separador elegido durante la lectura de texto.
Con coma decimal, "8,75" representa el mismo valor que 8,75 en la salida de Python.
Serialización
La serialización convierte objetos en memoria en una representación almacenada o intercambiada, como al escribir valores de Python como texto JSON.
Usa json.dump para serializar registros en un archivo UTF-8 abierto en lugar de escribir la representación de un diccionario de Python.
Serialización de objetos Python
Un objeto serializado con pickle es una representación de un objeto Python que puede ejecutar código durante la carga y depende de bibliotecas compatibles.
Usa un archivo pickle personal y fiable para un objeto temporal, y elige un formato de tabla portable para el intercambio.
SQLite
SQLite es un motor de base de datos que funciona sin un servidor independiente y suele almacenar una base de datos completa dentro de un único archivo local.
Al conectarse a una ruta de base de datos mal escrita puede crearse un archivo nuevo, en el que faltarán las tablas esperadas.
Superposición de datos en una hoja
La superposición de datos en una hoja escribe valores en una hoja de cálculo existente sin borrar todas las celdas antiguas que quedan fuera del área recién escrita.
Superponer una tabla más corta puede dejar filas anteriores debajo, por lo que debes inspeccionar el contenido restante de la hoja.
Sustitución de una tabla
La sustitución de una tabla elimina una tabla de base de datos existente y vuelve a crearla, eliminando tanto su definición anterior como sus registros.
Sustituir una tabla compartida puede eliminar claves e índices que formaban parte de su diseño original.

T

Texto corrupto por una codificación incorrecta
El texto corrupto por una codificación incorrecta es texto alterado al interpretar bytes codificados según una regla equivocada, incluso cuando el decodificador no comunica ningún error.
Un nombre que contiene "Ã" en lugar de un acento sugiere comprobar si los bytes UTF-8 se leyeron como Windows-1252.
Tiempo máximo de espera de una solicitud
Un tiempo máximo de espera de una solicitud limita la espera de conexión o lectura durante una solicitud HTTP, sin imponer un plazo a toda la descarga.
Establece un tiempo máximo de espera para que una conexión que no responde no mantenga esperando indefinidamente a un script de recopilación de API.
Tipo entero que admite valores faltantes
Un tipo entero que admite valores faltantes es un tipo de pandas que puede contener tanto entradas faltantes como números enteros, por ejemplo el tipo de datos Int64.
Una columna de recuento de visitas puede conservar 3 y 8 como enteros mientras representa cualquier observación vacía en ella como <NA>.
Transacción
Una transacción agrupa cambios de base de datos para confirmarlos si tienen éxito o revertirlos si fallan, dentro de las operaciones admitidas por la base de datos.
Una transacción de SQLAlchemy puede evitar que una adición deje almacenados solo algunos de sus registros previstos.

U

Uso de memoria con el contenido de los objetos incluido
El uso de memoria con el contenido de los objetos incluido contabiliza la memoria de los valores almacenados, incluido el contenido de los objetos de texto, además del tamaño superficial de sus arreglos.
Usa un informe de memoria que incluya el contenido de los objetos para comparar nombres de regiones repetidos almacenados como texto y como categorías.
UTF-8
UTF-8 representa caracteres Unicode usando de uno a cuatro bytes, mantiene los caracteres ASCII en un byte y admite todos los caracteres Unicode.
La letra "é" usa dos bytes en UTF-8, por lo que un recuento de caracteres no tiene por qué coincidir con el recuento de bytes del archivo.
UTF-16
UTF-16 codifica Unicode usando unidades de dos bytes, con un orden de bytes que debe conocerse o identificarse mediante una marca de orden de bytes inicial.
Lee una exportación sin BOM y con el byte menos significativo primero con encoding="utf-16-le" cuando esa sea su estructura documentada.

V

Valor centinela
Un valor centinela es un código designado para un significado especial, como «desconocido», que de otro modo puede parecer una medición normal.
Una puntuación de 999 documentada como desconocida debe declararse faltante antes de calcular una media con sentido.
Verificación de la escritura
La verificación de la escritura comprueba los resultados almacenados en la base de datos frente al cambio previsto, como el aumento esperado del recuento de filas después de una adición.
Después de añadir seis filas a una tabla de 20, consulta el recuento y comprueba que el total esperado sea 26.

W

Windows-1252
Windows-1252 es una codificación antigua de un byte con letras occidentales y símbolos adicionales que difiere de Latin-1 en parte de su intervalo.
El byte del símbolo del euro en Windows-1252 se convierte en un carácter de control cuando se interpreta con Latin-1.

Sobre esta unidad

Por StudeliInformar de un error

Crea tus propios Materiales de Estudio

Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.

Comenzar