Menu iconMenu icon
Fundamentos de Ingeniería de Datos

Capítulo 1: Introducción: Más allá de lo básico

1.2 Cómo Este Libro se Basa en los Fundamentos

Al embarcarte en este viaje de nivel intermedio en el análisis de datos, es crucial reflexionar sobre los fundamentos que has construido y cómo tus habilidades existentes servirán como peldaños para los conceptos más avanzados que exploraremos en este libro. Tu recorrido de novato a analista intermedio está marcado por un cambio significativo en la perspectiva y el enfoque hacia la manipulación e interpretación de datos.

Durante tu incursión inicial en el análisis de datos, adquiriste habilidades esenciales como la manipulación básica de datos, técnicas fundamentales de visualización y análisis estadístico rudimentario. Probablemente te familiarizaste con bibliotecas poderosas como Pandas para la manipulación de datos, NumPy para cálculos numéricos y posiblemente Matplotlib para crear visualizaciones. Estas herramientas forman la base del análisis de datos y seguirán siendo indispensables a medida que avances en tu viaje analítico.

Sin embargo, a medida que pasas al nivel intermedio, tu enfoque evolucionará de simplemente entender estas herramientas a dominarlas con destreza. Te adentrarás en las complejidades de optimizar tus flujos de trabajo, mejorar la eficiencia de tus análisis y aplicar estas herramientas para enfrentar problemas complejos del mundo real. Este libro está diseñado para cerrar la brecha entre tus conocimientos fundamentales y las técnicas analíticas avanzadas, preparándote para enfrentar y resolver desafíos de datos más intrincados. En las siguientes secciones, describiremos cómo este recurso se basará en tu conjunto de habilidades existentes, elevando tus capacidades para navegar el multifacético panorama del análisis de datos intermedio.

1.2.1 De la Manipulación de Datos Básica a la Avanzada

A nivel principiante, probablemente aprendiste a cargar datos, filtrar filas, seleccionar columnas y realizar operaciones básicas de agrupamiento con Pandas. Estas habilidades fundamentales forman la piedra angular de la manipulación de datos, permitiéndote realizar tareas esenciales como limpieza de datos, análisis básico y transformaciones simples. Sin embargo, a medida que avanzas al nivel intermedio, descubrirás que estas habilidades, aunque cruciales, son solo el comienzo de tu viaje en la manipulación de datos.

La manipulación de datos a nivel intermedio requiere una comprensión más profunda de las características y funcionalidades avanzadas de Pandas. Deberás dominar técnicas para manejar estructuras de datos complejas, como DataFrames con múltiples índices y datos jerárquicos. Además, aprenderás a realizar operaciones complejas como el pivotado, el uso de melt y la reestructuración de datos para extraer conocimientos significativos de conjuntos de datos complejos.

Además, la eficiencia se vuelve primordial al trabajar con conjuntos de datos grandes. Deberás desarrollar estrategias para optimizar tu código y manejar millones de filas sin una degradación significativa del rendimiento. Esto podría implicar el uso de operaciones vectorizadas, aprovechando la potencia de NumPy en segundo plano o empleando técnicas como el procesamiento en fragmentos (chunking) para manejar datos en porciones manejables.

Por otra parte, la manipulación de datos intermedia a menudo implica transformaciones más sofisticadas. Aprenderás a aplicar funciones personalizadas a tus datos usando métodos como apply() y applymap(), lo que permite realizar transformaciones de datos más flexibles y potentes. También te adentrarás en técnicas avanzadas de agrupación y agregación, que te permitirán realizar cálculos complejos en múltiples dimensiones de tus datos.

A medida que avances, también tendrás que considerar aspectos de integridad y calidad de datos. Esto incluye implementar un manejo de errores más robusto, técnicas de validación de datos y estrategias para lidiar con casos extremos en tus datos. Aprenderás a escribir código que no solo manipula datos de manera efectiva, sino que también lo hace de una forma que mantiene la calidad y fiabilidad de los datos a lo largo de tu flujo de análisis.

Por ejemplo, considera el siguiente ejemplo en el que filtramos y agrupamos datos para calcular las ventas promedio en un conjunto de datos de ventas minoristas:

Ejemplo de Código: Manipulación de Datos a Nivel Principiante

import pandas as pd

# Sample data
data = {'Store': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Sales': [200, 220, 210, 250, 215, 240]}

df = pd.DataFrame(data)

# Group by Store and calculate the average sales
avg_sales = df.groupby('Store')['Sales'].mean()
print(avg_sales)

Desglosemos esto:

  • Primero, se importa la biblioteca pandas como 'pd'.
  • Se crea un conjunto de datos de muestra como un diccionario con dos claves: 'Store' y 'Sales'. Cada clave corresponde a una lista de valores.
  • El diccionario se convierte en un DataFrame de pandas usando pd.DataFrame(data).
  • El código luego utiliza la función groupby() para agrupar los datos por la columna 'Store'.
  • La función mean() se aplica a la columna 'Sales' para cada grupo, calculando las ventas promedio para cada tienda.
  • Finalmente, los resultados se almacenan en la variable avg_sales y se imprimen.

Este código calcula las ventas promedio para cada tienda, una operación esencial pero básica. Sin embargo, ¿qué pasaría si estuvieras trabajando con un conjunto de datos mucho más grande, potencialmente de millones de filas, y necesitaras optimizar el rendimiento? ¿Y si quisieras realizar operaciones adicionales, como agregar múltiples columnas o filtrar en función de criterios más complejos?

1.2.2 Manipulación de Datos a Nivel Intermedio

Tomemos ese mismo concepto y hagámoslo más robusto, eficiente y flexible. Supongamos que ahora estás trabajando con un conjunto de datos que incluye información de ventas más detallada y deseas realizar múltiples agregaciones, como calcular tanto las ventas promedio como el total de ventas, además de filtrar para tiendas específicas.

Así es como podrías abordar ese problema a nivel intermedio:

# Sample data with more details
data = {'Store': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Sales': [200, 220, 210, 250, 215, 240],
        'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Electronics', 'Clothing']}

df = pd.DataFrame(data)

# Group by Store and Category, calculating multiple aggregations
agg_sales = df.groupby(['Store', 'Category']).agg(
    avg_sales=('Sales', 'mean'),
    total_sales=('Sales', 'sum')
).reset_index()

print(agg_sales)

Desglosemos esto:

  • Primero, se crea un conjunto de datos de muestra con información más detallada, incluyendo columnas 'Store', 'Sales' y 'Category'.
  • Los datos se convierten en un DataFrame de pandas.
  • La clave de este ejemplo es el uso de la función groupby() con múltiples columnas ('Store' y 'Category') y el método agg() para realizar múltiples agregaciones simultáneamente.
  • Se realizan dos agregaciones:
    • 'avg_sales': Calcula la media de 'Sales' para cada grupo.
    • 'total_sales': Calcula la suma de 'Sales' para cada grupo.
  • El método reset_index() se usa para convertir el DataFrame de multi-índice resultante de vuelta a un DataFrame regular con 'Store' y 'Category' como columnas.
  • Finalmente, se imprimen los resultados agregados.

Este código muestra un enfoque de nivel intermedio para la manipulación y análisis de datos usando pandas. Es más eficiente y flexible que ejecutar operaciones separadas para cada agregación, particularmente cuando se manejan conjuntos de datos grandes. El ejemplo ilustra cómo el análisis de datos de nivel intermedio a menudo implica combinar múltiples operaciones en un flujo de trabajo único y optimizado, mejorando tanto el rendimiento como la legibilidad.

1.2.3 Construcción de Flujos de Trabajo Eficientes

Otro aspecto crítico en el que este libro se basa en tus conocimientos fundamentales es en la optimización de flujos de trabajo. A medida que avanzas del nivel principiante al intermedio, aprenderás a cambiar tu enfoque de simplemente completar tareas a crear flujos de trabajo eficientes y escalables. Esta transición es crucial porque, a medida que los conjuntos de datos se expanden y los análisis se vuelven más complejos, la importancia de optimizar tus procesos aumenta exponencialmente.

Considera el proceso de preprocesamiento de un conjunto de datos grande. A nivel principiante, podrías abordar esta tarea limpiando y transformando los datos de manera manual, usando operaciones individuales. Aunque este método puede ser efectivo para conjuntos de datos pequeños, rápidamente se vuelve difícil de manejar y requiere mucho tiempo a medida que crece el volumen de datos. En contraste, a nivel intermedio, aprenderás a aprovechar técnicas más avanzadas para automatizar y optimizar estos procesos.

Un concepto clave que explorarás es el uso de Pipelines. Los pipelines te permiten encadenar múltiples pasos de procesamiento de datos en un flujo de trabajo cohesivo. Esto no solo hace que tu código sea más organizado y fácil de mantener, sino que también mejora significativamente la eficiencia. Al definir una serie de operaciones que se pueden aplicar a tus datos de manera optimizada, puedes procesar grandes volúmenes de información de manera más rápida y con menos intervención manual.

Además, profundizarás en técnicas de procesamiento paralelo, que te permiten distribuir tareas computacionales en múltiples núcleos o incluso en varias máquinas. Esto puede reducir drásticamente el tiempo de procesamiento para operaciones de datos a gran escala. También aprenderás técnicas de eficiencia en memoria para manejar conjuntos de datos que son demasiado grandes para caber en la RAM de tu computadora, como el procesamiento fuera de núcleo y la transmisión de datos (data streaming).

Otro aspecto de la optimización de flujos de trabajo que explorarás es la creación de módulos de código reutilizables. En lugar de escribir código personalizado para cada nuevo proyecto, aprenderás a desarrollar funciones y clases modulares y flexibles que se pueden adaptar fácilmente a diferentes conjuntos de datos y requisitos de análisis. Esto no solo ahorra tiempo, sino que también reduce la probabilidad de errores e inconsistencias en tu trabajo.

Al dominar estas técnicas avanzadas de optimización de flujos de trabajo, podrás abordar tareas de análisis de datos cada vez más complejas con mayor eficiencia y confianza. Este cambio de enfoque es un diferenciador clave entre analistas de datos principiantes y de nivel intermedio, permitiéndote manejar conjuntos de datos más grandes, realizar análisis más sofisticados y entregar conocimientos de manera más rápida y confiable.

Ejemplo de Código: Creación de un Pipeline de Preprocesamiento de Datos

Supongamos que estamos trabajando con un conjunto de datos que contiene valores faltantes y características que necesitan ser escaladas para modelado. A nivel principiante, podrías manejar esto escribiendo líneas individuales de código para imputar valores faltantes y luego escalar manualmente las características.

Aquí tienes cómo podrías manejar esto en un flujo de trabajo más estructurado y de nivel intermedio utilizando un Pipeline de Scikit-learn:

import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer

# Sample data with missing values and categorical features
data = {
    'Feature1': [1, 2, np.nan, 4, 5],
    'Feature2': [10, np.nan, 12, 14, 15],
    'Category': ['A', 'B', 'A', 'C', 'B']
}

df = pd.DataFrame(data)

# Define preprocessing for numeric columns
numeric_features = ['Feature1', 'Feature2']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())
])

# Define preprocessing for categorical columns
categorical_features = ['Category']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# Combine preprocessing steps
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])

# Create and fit the pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor)])
transformed_data = pipeline.fit_transform(df)

# Convert to DataFrame for better visualization
feature_names = (numeric_features + 
                 pipeline.named_steps['preprocessor']
                 .named_transformers_['cat']
                 .named_steps['onehot']
                 .get_feature_names(categorical_features).tolist())
transformed_df = pd.DataFrame(transformed_data, columns=feature_names)

print("Original Data:")
print(df)
print("\nTransformed Data:")
print(transformed_df)

Desglose detallado:

  1. Importación de Bibliotecas:
    • Importamos pandas para la manipulación de datos, numpy para operaciones numéricas y varios módulos de scikit-learn para preprocesamiento y creación de pipelines.
  2. Creación de Datos de Muestra:
    • Creamos un conjunto de datos de muestra con dos características numéricas ('Feature1' y 'Feature2') que contienen valores faltantes, y una característica categórica ('Category').
  3. Definición del Preprocesamiento para Columnas Numéricas:
    • Creamos un pipeline para características numéricas que incluye:
      a) SimpleImputer: Rellena los valores faltantes con la media de la columna.
      b) StandardScaler: Estandariza las características eliminando la media y escalando a varianza unitaria.
  4. Definición del Preprocesamiento para Columnas Categóricas:
    • Creamos un pipeline para características categóricas que incluye:
      a) SimpleImputer: Rellena los valores faltantes con una constante ('missing').
      b) OneHotEncoder: Convierte las variables categóricas en columnas codificadas en one-hot.
  5. Combinación de Pasos de Preprocesamiento:
    • Usamos ColumnTransformer para aplicar diferentes pasos de preprocesamiento a distintos tipos de columnas:
      • El transformador 'num' se aplica a las características numéricas.
      • El transformador 'cat' se aplica a las características categóricas.
  6. Creación y Ajuste del Pipeline:
    • Creamos un pipeline principal que incluye el preprocesador.
    • Ajustamos el pipeline a nuestros datos y los transformamos en un solo paso usando fit_transform().
  7. Conversión de Resultados a DataFrame:
    • Extraemos los nombres de las características para los datos transformados, incluyendo las características categóricas codificadas en one-hot.
    • Creamos un nuevo DataFrame con los datos transformados y los nombres de columnas adecuados para una mejor visualización.
  8. Impresión de Resultados:
    • Imprimimos tanto los datos originales como los transformados para mostrar los efectos de nuestro pipeline de preprocesamiento.

Este ejemplo demuestra un enfoque integral para el preprocesamiento de datos, manejando tanto datos numéricos como categóricos. Muestra cómo utilizar el Pipeline y ColumnTransformer de scikit-learn para crear un flujo de preprocesamiento robusto y reutilizable que pueda manejar valores faltantes, escalar características numéricas y codificar variables categóricas, todo en un proceso único y coherente.

1.2.4 Aprovechando NumPy para el Rendimiento

A medida que avanzas más allá de lo básico, también necesitarás volverte más competente en el uso de NumPy para optimizar el rendimiento, especialmente al manejar cálculos numéricos. Los principiantes suelen depender mucho de Pandas para cada tarea, pero NumPy puede manejar operaciones numéricas a gran escala mucho más rápido, gracias a sus estructuras de datos optimizadas.

La eficiencia de NumPy proviene de su uso de bloques de memoria contiguos y su capacidad para realizar operaciones vectorizadas. Esto significa que, en lugar de recorrer elementos individuales, NumPy puede aplicar operaciones a matrices enteras a la vez, acelerando significativamente los cálculos. Por ejemplo, al trabajar con grandes conjuntos de datos, el uso de operaciones de matriz de NumPy puede ser órdenes de magnitud más rápido que las operaciones equivalentes en Python puro o incluso en Pandas.

Además, NumPy proporciona una amplia gama de funciones matemáticas optimizadas para el rendimiento, que incluyen operaciones de álgebra lineal, transformadas de Fourier y generación de números aleatorios, entre otras. Al aprovechar estas funciones, puedes realizar operaciones matemáticas complejas de manera eficiente, lo cual es crucial al trabajar con grandes conjuntos de datos o al implementar algoritmos sofisticados.

Otra ventaja de NumPy es su eficiencia en el uso de memoria. Las matrices de NumPy utilizan un tipo de dato fijo para todos los elementos, lo que permite un almacenamiento más compacto en comparación con las listas de Python. Esto no solo ahorra memoria, sino que también permite cálculos más rápidos, ya que la CPU puede procesar datos de manera más eficiente cuando están almacenados en un formato consistente.

A medida que avances en tu viaje de análisis de datos, descubrirás que dominar NumPy es esencial para tareas como la ingeniería de características, la implementación de algoritmos personalizados y la optimización de código existente para un mejor rendimiento. Al combinar las fortalezas de Pandas para la manipulación de datos y NumPy para cálculos numéricos, podrás crear flujos de trabajo de análisis de datos más eficientes y escalables.

Por ejemplo, consideremos una operación de nivel principiante donde podrías calcular una suma a través de columnas en un DataFrame de Pandas:

# Beginner-level approach using Pandas
df['Total'] = df['Feature1'] + df['Feature2']
print(df)

Aquí tienes una explicación de lo que hace este código:

  • Crea una nueva columna llamada 'Total' en el DataFrame 'df'.
  • La columna 'Total' se calcula sumando los valores de las columnas 'Feature1' y 'Feature2'.
  • Finalmente, imprime el DataFrame completo, que ahora incluye la nueva columna 'Total'.

Este enfoque es directo y fácil de entender, lo que lo hace adecuado para principiantes. Sin embargo, para conjuntos de datos más grandes o operaciones más complejas, existen métodos más eficientes usando NumPy, como se menciona en las partes posteriores del texto.

Ejemplo de Código: Cálculos Numéricos de Nivel Intermedio con NumPy

import numpy as np

# Convert DataFrame to NumPy array for faster operations
data_np = df.to_numpy()

# Perform element-wise sum across columns using NumPy
total = np.nansum(data_np, axis=1)  # Handling NaN values
print(total)

Este código demuestra un enfoque de nivel intermedio para cálculos numéricos usando NumPy, que es más eficiente para conjuntos de datos grandes en comparación con el enfoque de Pandas de nivel principiante.

Aquí tienes un desglose de lo que hace el código:

  • Primero, importa la biblioteca NumPy, esencial para operaciones numéricas de alto rendimiento.
  • El DataFrame 'df' se convierte a un array de NumPy usando df.to_numpy(). Esta conversión permite operaciones más rápidas en los datos.
  • La función np.nansum() se utiliza para calcular la suma a lo largo de las columnas (axis=1) del array de NumPy. El 'nan' en 'nansum' indica que esta función puede manejar valores NaN (Not a Number), lo cual es útil para conjuntos de datos con valores faltantes.
  • El resultado se almacena en la variable 'total', que contiene la suma de cada fila, creando efectivamente una nueva columna 'Total'.
  • Finalmente, se imprime el array 'total', mostrando la suma para cada fila.

Este enfoque es más eficiente que el método de Pandas para conjuntos de datos grandes, ya que aprovecha las operaciones optimizadas de arrays de NumPy y maneja valores faltantes sin problemas.

1.2 Cómo Este Libro se Basa en los Fundamentos

Al embarcarte en este viaje de nivel intermedio en el análisis de datos, es crucial reflexionar sobre los fundamentos que has construido y cómo tus habilidades existentes servirán como peldaños para los conceptos más avanzados que exploraremos en este libro. Tu recorrido de novato a analista intermedio está marcado por un cambio significativo en la perspectiva y el enfoque hacia la manipulación e interpretación de datos.

Durante tu incursión inicial en el análisis de datos, adquiriste habilidades esenciales como la manipulación básica de datos, técnicas fundamentales de visualización y análisis estadístico rudimentario. Probablemente te familiarizaste con bibliotecas poderosas como Pandas para la manipulación de datos, NumPy para cálculos numéricos y posiblemente Matplotlib para crear visualizaciones. Estas herramientas forman la base del análisis de datos y seguirán siendo indispensables a medida que avances en tu viaje analítico.

Sin embargo, a medida que pasas al nivel intermedio, tu enfoque evolucionará de simplemente entender estas herramientas a dominarlas con destreza. Te adentrarás en las complejidades de optimizar tus flujos de trabajo, mejorar la eficiencia de tus análisis y aplicar estas herramientas para enfrentar problemas complejos del mundo real. Este libro está diseñado para cerrar la brecha entre tus conocimientos fundamentales y las técnicas analíticas avanzadas, preparándote para enfrentar y resolver desafíos de datos más intrincados. En las siguientes secciones, describiremos cómo este recurso se basará en tu conjunto de habilidades existentes, elevando tus capacidades para navegar el multifacético panorama del análisis de datos intermedio.

1.2.1 De la Manipulación de Datos Básica a la Avanzada

A nivel principiante, probablemente aprendiste a cargar datos, filtrar filas, seleccionar columnas y realizar operaciones básicas de agrupamiento con Pandas. Estas habilidades fundamentales forman la piedra angular de la manipulación de datos, permitiéndote realizar tareas esenciales como limpieza de datos, análisis básico y transformaciones simples. Sin embargo, a medida que avanzas al nivel intermedio, descubrirás que estas habilidades, aunque cruciales, son solo el comienzo de tu viaje en la manipulación de datos.

La manipulación de datos a nivel intermedio requiere una comprensión más profunda de las características y funcionalidades avanzadas de Pandas. Deberás dominar técnicas para manejar estructuras de datos complejas, como DataFrames con múltiples índices y datos jerárquicos. Además, aprenderás a realizar operaciones complejas como el pivotado, el uso de melt y la reestructuración de datos para extraer conocimientos significativos de conjuntos de datos complejos.

Además, la eficiencia se vuelve primordial al trabajar con conjuntos de datos grandes. Deberás desarrollar estrategias para optimizar tu código y manejar millones de filas sin una degradación significativa del rendimiento. Esto podría implicar el uso de operaciones vectorizadas, aprovechando la potencia de NumPy en segundo plano o empleando técnicas como el procesamiento en fragmentos (chunking) para manejar datos en porciones manejables.

Por otra parte, la manipulación de datos intermedia a menudo implica transformaciones más sofisticadas. Aprenderás a aplicar funciones personalizadas a tus datos usando métodos como apply() y applymap(), lo que permite realizar transformaciones de datos más flexibles y potentes. También te adentrarás en técnicas avanzadas de agrupación y agregación, que te permitirán realizar cálculos complejos en múltiples dimensiones de tus datos.

A medida que avances, también tendrás que considerar aspectos de integridad y calidad de datos. Esto incluye implementar un manejo de errores más robusto, técnicas de validación de datos y estrategias para lidiar con casos extremos en tus datos. Aprenderás a escribir código que no solo manipula datos de manera efectiva, sino que también lo hace de una forma que mantiene la calidad y fiabilidad de los datos a lo largo de tu flujo de análisis.

Por ejemplo, considera el siguiente ejemplo en el que filtramos y agrupamos datos para calcular las ventas promedio en un conjunto de datos de ventas minoristas:

Ejemplo de Código: Manipulación de Datos a Nivel Principiante

import pandas as pd

# Sample data
data = {'Store': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Sales': [200, 220, 210, 250, 215, 240]}

df = pd.DataFrame(data)

# Group by Store and calculate the average sales
avg_sales = df.groupby('Store')['Sales'].mean()
print(avg_sales)

Desglosemos esto:

  • Primero, se importa la biblioteca pandas como 'pd'.
  • Se crea un conjunto de datos de muestra como un diccionario con dos claves: 'Store' y 'Sales'. Cada clave corresponde a una lista de valores.
  • El diccionario se convierte en un DataFrame de pandas usando pd.DataFrame(data).
  • El código luego utiliza la función groupby() para agrupar los datos por la columna 'Store'.
  • La función mean() se aplica a la columna 'Sales' para cada grupo, calculando las ventas promedio para cada tienda.
  • Finalmente, los resultados se almacenan en la variable avg_sales y se imprimen.

Este código calcula las ventas promedio para cada tienda, una operación esencial pero básica. Sin embargo, ¿qué pasaría si estuvieras trabajando con un conjunto de datos mucho más grande, potencialmente de millones de filas, y necesitaras optimizar el rendimiento? ¿Y si quisieras realizar operaciones adicionales, como agregar múltiples columnas o filtrar en función de criterios más complejos?

1.2.2 Manipulación de Datos a Nivel Intermedio

Tomemos ese mismo concepto y hagámoslo más robusto, eficiente y flexible. Supongamos que ahora estás trabajando con un conjunto de datos que incluye información de ventas más detallada y deseas realizar múltiples agregaciones, como calcular tanto las ventas promedio como el total de ventas, además de filtrar para tiendas específicas.

Así es como podrías abordar ese problema a nivel intermedio:

# Sample data with more details
data = {'Store': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Sales': [200, 220, 210, 250, 215, 240],
        'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Electronics', 'Clothing']}

df = pd.DataFrame(data)

# Group by Store and Category, calculating multiple aggregations
agg_sales = df.groupby(['Store', 'Category']).agg(
    avg_sales=('Sales', 'mean'),
    total_sales=('Sales', 'sum')
).reset_index()

print(agg_sales)

Desglosemos esto:

  • Primero, se crea un conjunto de datos de muestra con información más detallada, incluyendo columnas 'Store', 'Sales' y 'Category'.
  • Los datos se convierten en un DataFrame de pandas.
  • La clave de este ejemplo es el uso de la función groupby() con múltiples columnas ('Store' y 'Category') y el método agg() para realizar múltiples agregaciones simultáneamente.
  • Se realizan dos agregaciones:
    • 'avg_sales': Calcula la media de 'Sales' para cada grupo.
    • 'total_sales': Calcula la suma de 'Sales' para cada grupo.
  • El método reset_index() se usa para convertir el DataFrame de multi-índice resultante de vuelta a un DataFrame regular con 'Store' y 'Category' como columnas.
  • Finalmente, se imprimen los resultados agregados.

Este código muestra un enfoque de nivel intermedio para la manipulación y análisis de datos usando pandas. Es más eficiente y flexible que ejecutar operaciones separadas para cada agregación, particularmente cuando se manejan conjuntos de datos grandes. El ejemplo ilustra cómo el análisis de datos de nivel intermedio a menudo implica combinar múltiples operaciones en un flujo de trabajo único y optimizado, mejorando tanto el rendimiento como la legibilidad.

1.2.3 Construcción de Flujos de Trabajo Eficientes

Otro aspecto crítico en el que este libro se basa en tus conocimientos fundamentales es en la optimización de flujos de trabajo. A medida que avanzas del nivel principiante al intermedio, aprenderás a cambiar tu enfoque de simplemente completar tareas a crear flujos de trabajo eficientes y escalables. Esta transición es crucial porque, a medida que los conjuntos de datos se expanden y los análisis se vuelven más complejos, la importancia de optimizar tus procesos aumenta exponencialmente.

Considera el proceso de preprocesamiento de un conjunto de datos grande. A nivel principiante, podrías abordar esta tarea limpiando y transformando los datos de manera manual, usando operaciones individuales. Aunque este método puede ser efectivo para conjuntos de datos pequeños, rápidamente se vuelve difícil de manejar y requiere mucho tiempo a medida que crece el volumen de datos. En contraste, a nivel intermedio, aprenderás a aprovechar técnicas más avanzadas para automatizar y optimizar estos procesos.

Un concepto clave que explorarás es el uso de Pipelines. Los pipelines te permiten encadenar múltiples pasos de procesamiento de datos en un flujo de trabajo cohesivo. Esto no solo hace que tu código sea más organizado y fácil de mantener, sino que también mejora significativamente la eficiencia. Al definir una serie de operaciones que se pueden aplicar a tus datos de manera optimizada, puedes procesar grandes volúmenes de información de manera más rápida y con menos intervención manual.

Además, profundizarás en técnicas de procesamiento paralelo, que te permiten distribuir tareas computacionales en múltiples núcleos o incluso en varias máquinas. Esto puede reducir drásticamente el tiempo de procesamiento para operaciones de datos a gran escala. También aprenderás técnicas de eficiencia en memoria para manejar conjuntos de datos que son demasiado grandes para caber en la RAM de tu computadora, como el procesamiento fuera de núcleo y la transmisión de datos (data streaming).

Otro aspecto de la optimización de flujos de trabajo que explorarás es la creación de módulos de código reutilizables. En lugar de escribir código personalizado para cada nuevo proyecto, aprenderás a desarrollar funciones y clases modulares y flexibles que se pueden adaptar fácilmente a diferentes conjuntos de datos y requisitos de análisis. Esto no solo ahorra tiempo, sino que también reduce la probabilidad de errores e inconsistencias en tu trabajo.

Al dominar estas técnicas avanzadas de optimización de flujos de trabajo, podrás abordar tareas de análisis de datos cada vez más complejas con mayor eficiencia y confianza. Este cambio de enfoque es un diferenciador clave entre analistas de datos principiantes y de nivel intermedio, permitiéndote manejar conjuntos de datos más grandes, realizar análisis más sofisticados y entregar conocimientos de manera más rápida y confiable.

Ejemplo de Código: Creación de un Pipeline de Preprocesamiento de Datos

Supongamos que estamos trabajando con un conjunto de datos que contiene valores faltantes y características que necesitan ser escaladas para modelado. A nivel principiante, podrías manejar esto escribiendo líneas individuales de código para imputar valores faltantes y luego escalar manualmente las características.

Aquí tienes cómo podrías manejar esto en un flujo de trabajo más estructurado y de nivel intermedio utilizando un Pipeline de Scikit-learn:

import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer

# Sample data with missing values and categorical features
data = {
    'Feature1': [1, 2, np.nan, 4, 5],
    'Feature2': [10, np.nan, 12, 14, 15],
    'Category': ['A', 'B', 'A', 'C', 'B']
}

df = pd.DataFrame(data)

# Define preprocessing for numeric columns
numeric_features = ['Feature1', 'Feature2']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())
])

# Define preprocessing for categorical columns
categorical_features = ['Category']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# Combine preprocessing steps
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])

# Create and fit the pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor)])
transformed_data = pipeline.fit_transform(df)

# Convert to DataFrame for better visualization
feature_names = (numeric_features + 
                 pipeline.named_steps['preprocessor']
                 .named_transformers_['cat']
                 .named_steps['onehot']
                 .get_feature_names(categorical_features).tolist())
transformed_df = pd.DataFrame(transformed_data, columns=feature_names)

print("Original Data:")
print(df)
print("\nTransformed Data:")
print(transformed_df)

Desglose detallado:

  1. Importación de Bibliotecas:
    • Importamos pandas para la manipulación de datos, numpy para operaciones numéricas y varios módulos de scikit-learn para preprocesamiento y creación de pipelines.
  2. Creación de Datos de Muestra:
    • Creamos un conjunto de datos de muestra con dos características numéricas ('Feature1' y 'Feature2') que contienen valores faltantes, y una característica categórica ('Category').
  3. Definición del Preprocesamiento para Columnas Numéricas:
    • Creamos un pipeline para características numéricas que incluye:
      a) SimpleImputer: Rellena los valores faltantes con la media de la columna.
      b) StandardScaler: Estandariza las características eliminando la media y escalando a varianza unitaria.
  4. Definición del Preprocesamiento para Columnas Categóricas:
    • Creamos un pipeline para características categóricas que incluye:
      a) SimpleImputer: Rellena los valores faltantes con una constante ('missing').
      b) OneHotEncoder: Convierte las variables categóricas en columnas codificadas en one-hot.
  5. Combinación de Pasos de Preprocesamiento:
    • Usamos ColumnTransformer para aplicar diferentes pasos de preprocesamiento a distintos tipos de columnas:
      • El transformador 'num' se aplica a las características numéricas.
      • El transformador 'cat' se aplica a las características categóricas.
  6. Creación y Ajuste del Pipeline:
    • Creamos un pipeline principal que incluye el preprocesador.
    • Ajustamos el pipeline a nuestros datos y los transformamos en un solo paso usando fit_transform().
  7. Conversión de Resultados a DataFrame:
    • Extraemos los nombres de las características para los datos transformados, incluyendo las características categóricas codificadas en one-hot.
    • Creamos un nuevo DataFrame con los datos transformados y los nombres de columnas adecuados para una mejor visualización.
  8. Impresión de Resultados:
    • Imprimimos tanto los datos originales como los transformados para mostrar los efectos de nuestro pipeline de preprocesamiento.

Este ejemplo demuestra un enfoque integral para el preprocesamiento de datos, manejando tanto datos numéricos como categóricos. Muestra cómo utilizar el Pipeline y ColumnTransformer de scikit-learn para crear un flujo de preprocesamiento robusto y reutilizable que pueda manejar valores faltantes, escalar características numéricas y codificar variables categóricas, todo en un proceso único y coherente.

1.2.4 Aprovechando NumPy para el Rendimiento

A medida que avanzas más allá de lo básico, también necesitarás volverte más competente en el uso de NumPy para optimizar el rendimiento, especialmente al manejar cálculos numéricos. Los principiantes suelen depender mucho de Pandas para cada tarea, pero NumPy puede manejar operaciones numéricas a gran escala mucho más rápido, gracias a sus estructuras de datos optimizadas.

La eficiencia de NumPy proviene de su uso de bloques de memoria contiguos y su capacidad para realizar operaciones vectorizadas. Esto significa que, en lugar de recorrer elementos individuales, NumPy puede aplicar operaciones a matrices enteras a la vez, acelerando significativamente los cálculos. Por ejemplo, al trabajar con grandes conjuntos de datos, el uso de operaciones de matriz de NumPy puede ser órdenes de magnitud más rápido que las operaciones equivalentes en Python puro o incluso en Pandas.

Además, NumPy proporciona una amplia gama de funciones matemáticas optimizadas para el rendimiento, que incluyen operaciones de álgebra lineal, transformadas de Fourier y generación de números aleatorios, entre otras. Al aprovechar estas funciones, puedes realizar operaciones matemáticas complejas de manera eficiente, lo cual es crucial al trabajar con grandes conjuntos de datos o al implementar algoritmos sofisticados.

Otra ventaja de NumPy es su eficiencia en el uso de memoria. Las matrices de NumPy utilizan un tipo de dato fijo para todos los elementos, lo que permite un almacenamiento más compacto en comparación con las listas de Python. Esto no solo ahorra memoria, sino que también permite cálculos más rápidos, ya que la CPU puede procesar datos de manera más eficiente cuando están almacenados en un formato consistente.

A medida que avances en tu viaje de análisis de datos, descubrirás que dominar NumPy es esencial para tareas como la ingeniería de características, la implementación de algoritmos personalizados y la optimización de código existente para un mejor rendimiento. Al combinar las fortalezas de Pandas para la manipulación de datos y NumPy para cálculos numéricos, podrás crear flujos de trabajo de análisis de datos más eficientes y escalables.

Por ejemplo, consideremos una operación de nivel principiante donde podrías calcular una suma a través de columnas en un DataFrame de Pandas:

# Beginner-level approach using Pandas
df['Total'] = df['Feature1'] + df['Feature2']
print(df)

Aquí tienes una explicación de lo que hace este código:

  • Crea una nueva columna llamada 'Total' en el DataFrame 'df'.
  • La columna 'Total' se calcula sumando los valores de las columnas 'Feature1' y 'Feature2'.
  • Finalmente, imprime el DataFrame completo, que ahora incluye la nueva columna 'Total'.

Este enfoque es directo y fácil de entender, lo que lo hace adecuado para principiantes. Sin embargo, para conjuntos de datos más grandes o operaciones más complejas, existen métodos más eficientes usando NumPy, como se menciona en las partes posteriores del texto.

Ejemplo de Código: Cálculos Numéricos de Nivel Intermedio con NumPy

import numpy as np

# Convert DataFrame to NumPy array for faster operations
data_np = df.to_numpy()

# Perform element-wise sum across columns using NumPy
total = np.nansum(data_np, axis=1)  # Handling NaN values
print(total)

Este código demuestra un enfoque de nivel intermedio para cálculos numéricos usando NumPy, que es más eficiente para conjuntos de datos grandes en comparación con el enfoque de Pandas de nivel principiante.

Aquí tienes un desglose de lo que hace el código:

  • Primero, importa la biblioteca NumPy, esencial para operaciones numéricas de alto rendimiento.
  • El DataFrame 'df' se convierte a un array de NumPy usando df.to_numpy(). Esta conversión permite operaciones más rápidas en los datos.
  • La función np.nansum() se utiliza para calcular la suma a lo largo de las columnas (axis=1) del array de NumPy. El 'nan' en 'nansum' indica que esta función puede manejar valores NaN (Not a Number), lo cual es útil para conjuntos de datos con valores faltantes.
  • El resultado se almacena en la variable 'total', que contiene la suma de cada fila, creando efectivamente una nueva columna 'Total'.
  • Finalmente, se imprime el array 'total', mostrando la suma para cada fila.

Este enfoque es más eficiente que el método de Pandas para conjuntos de datos grandes, ya que aprovecha las operaciones optimizadas de arrays de NumPy y maneja valores faltantes sin problemas.

1.2 Cómo Este Libro se Basa en los Fundamentos

Al embarcarte en este viaje de nivel intermedio en el análisis de datos, es crucial reflexionar sobre los fundamentos que has construido y cómo tus habilidades existentes servirán como peldaños para los conceptos más avanzados que exploraremos en este libro. Tu recorrido de novato a analista intermedio está marcado por un cambio significativo en la perspectiva y el enfoque hacia la manipulación e interpretación de datos.

Durante tu incursión inicial en el análisis de datos, adquiriste habilidades esenciales como la manipulación básica de datos, técnicas fundamentales de visualización y análisis estadístico rudimentario. Probablemente te familiarizaste con bibliotecas poderosas como Pandas para la manipulación de datos, NumPy para cálculos numéricos y posiblemente Matplotlib para crear visualizaciones. Estas herramientas forman la base del análisis de datos y seguirán siendo indispensables a medida que avances en tu viaje analítico.

Sin embargo, a medida que pasas al nivel intermedio, tu enfoque evolucionará de simplemente entender estas herramientas a dominarlas con destreza. Te adentrarás en las complejidades de optimizar tus flujos de trabajo, mejorar la eficiencia de tus análisis y aplicar estas herramientas para enfrentar problemas complejos del mundo real. Este libro está diseñado para cerrar la brecha entre tus conocimientos fundamentales y las técnicas analíticas avanzadas, preparándote para enfrentar y resolver desafíos de datos más intrincados. En las siguientes secciones, describiremos cómo este recurso se basará en tu conjunto de habilidades existentes, elevando tus capacidades para navegar el multifacético panorama del análisis de datos intermedio.

1.2.1 De la Manipulación de Datos Básica a la Avanzada

A nivel principiante, probablemente aprendiste a cargar datos, filtrar filas, seleccionar columnas y realizar operaciones básicas de agrupamiento con Pandas. Estas habilidades fundamentales forman la piedra angular de la manipulación de datos, permitiéndote realizar tareas esenciales como limpieza de datos, análisis básico y transformaciones simples. Sin embargo, a medida que avanzas al nivel intermedio, descubrirás que estas habilidades, aunque cruciales, son solo el comienzo de tu viaje en la manipulación de datos.

La manipulación de datos a nivel intermedio requiere una comprensión más profunda de las características y funcionalidades avanzadas de Pandas. Deberás dominar técnicas para manejar estructuras de datos complejas, como DataFrames con múltiples índices y datos jerárquicos. Además, aprenderás a realizar operaciones complejas como el pivotado, el uso de melt y la reestructuración de datos para extraer conocimientos significativos de conjuntos de datos complejos.

Además, la eficiencia se vuelve primordial al trabajar con conjuntos de datos grandes. Deberás desarrollar estrategias para optimizar tu código y manejar millones de filas sin una degradación significativa del rendimiento. Esto podría implicar el uso de operaciones vectorizadas, aprovechando la potencia de NumPy en segundo plano o empleando técnicas como el procesamiento en fragmentos (chunking) para manejar datos en porciones manejables.

Por otra parte, la manipulación de datos intermedia a menudo implica transformaciones más sofisticadas. Aprenderás a aplicar funciones personalizadas a tus datos usando métodos como apply() y applymap(), lo que permite realizar transformaciones de datos más flexibles y potentes. También te adentrarás en técnicas avanzadas de agrupación y agregación, que te permitirán realizar cálculos complejos en múltiples dimensiones de tus datos.

A medida que avances, también tendrás que considerar aspectos de integridad y calidad de datos. Esto incluye implementar un manejo de errores más robusto, técnicas de validación de datos y estrategias para lidiar con casos extremos en tus datos. Aprenderás a escribir código que no solo manipula datos de manera efectiva, sino que también lo hace de una forma que mantiene la calidad y fiabilidad de los datos a lo largo de tu flujo de análisis.

Por ejemplo, considera el siguiente ejemplo en el que filtramos y agrupamos datos para calcular las ventas promedio en un conjunto de datos de ventas minoristas:

Ejemplo de Código: Manipulación de Datos a Nivel Principiante

import pandas as pd

# Sample data
data = {'Store': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Sales': [200, 220, 210, 250, 215, 240]}

df = pd.DataFrame(data)

# Group by Store and calculate the average sales
avg_sales = df.groupby('Store')['Sales'].mean()
print(avg_sales)

Desglosemos esto:

  • Primero, se importa la biblioteca pandas como 'pd'.
  • Se crea un conjunto de datos de muestra como un diccionario con dos claves: 'Store' y 'Sales'. Cada clave corresponde a una lista de valores.
  • El diccionario se convierte en un DataFrame de pandas usando pd.DataFrame(data).
  • El código luego utiliza la función groupby() para agrupar los datos por la columna 'Store'.
  • La función mean() se aplica a la columna 'Sales' para cada grupo, calculando las ventas promedio para cada tienda.
  • Finalmente, los resultados se almacenan en la variable avg_sales y se imprimen.

Este código calcula las ventas promedio para cada tienda, una operación esencial pero básica. Sin embargo, ¿qué pasaría si estuvieras trabajando con un conjunto de datos mucho más grande, potencialmente de millones de filas, y necesitaras optimizar el rendimiento? ¿Y si quisieras realizar operaciones adicionales, como agregar múltiples columnas o filtrar en función de criterios más complejos?

1.2.2 Manipulación de Datos a Nivel Intermedio

Tomemos ese mismo concepto y hagámoslo más robusto, eficiente y flexible. Supongamos que ahora estás trabajando con un conjunto de datos que incluye información de ventas más detallada y deseas realizar múltiples agregaciones, como calcular tanto las ventas promedio como el total de ventas, además de filtrar para tiendas específicas.

Así es como podrías abordar ese problema a nivel intermedio:

# Sample data with more details
data = {'Store': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Sales': [200, 220, 210, 250, 215, 240],
        'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Electronics', 'Clothing']}

df = pd.DataFrame(data)

# Group by Store and Category, calculating multiple aggregations
agg_sales = df.groupby(['Store', 'Category']).agg(
    avg_sales=('Sales', 'mean'),
    total_sales=('Sales', 'sum')
).reset_index()

print(agg_sales)

Desglosemos esto:

  • Primero, se crea un conjunto de datos de muestra con información más detallada, incluyendo columnas 'Store', 'Sales' y 'Category'.
  • Los datos se convierten en un DataFrame de pandas.
  • La clave de este ejemplo es el uso de la función groupby() con múltiples columnas ('Store' y 'Category') y el método agg() para realizar múltiples agregaciones simultáneamente.
  • Se realizan dos agregaciones:
    • 'avg_sales': Calcula la media de 'Sales' para cada grupo.
    • 'total_sales': Calcula la suma de 'Sales' para cada grupo.
  • El método reset_index() se usa para convertir el DataFrame de multi-índice resultante de vuelta a un DataFrame regular con 'Store' y 'Category' como columnas.
  • Finalmente, se imprimen los resultados agregados.

Este código muestra un enfoque de nivel intermedio para la manipulación y análisis de datos usando pandas. Es más eficiente y flexible que ejecutar operaciones separadas para cada agregación, particularmente cuando se manejan conjuntos de datos grandes. El ejemplo ilustra cómo el análisis de datos de nivel intermedio a menudo implica combinar múltiples operaciones en un flujo de trabajo único y optimizado, mejorando tanto el rendimiento como la legibilidad.

1.2.3 Construcción de Flujos de Trabajo Eficientes

Otro aspecto crítico en el que este libro se basa en tus conocimientos fundamentales es en la optimización de flujos de trabajo. A medida que avanzas del nivel principiante al intermedio, aprenderás a cambiar tu enfoque de simplemente completar tareas a crear flujos de trabajo eficientes y escalables. Esta transición es crucial porque, a medida que los conjuntos de datos se expanden y los análisis se vuelven más complejos, la importancia de optimizar tus procesos aumenta exponencialmente.

Considera el proceso de preprocesamiento de un conjunto de datos grande. A nivel principiante, podrías abordar esta tarea limpiando y transformando los datos de manera manual, usando operaciones individuales. Aunque este método puede ser efectivo para conjuntos de datos pequeños, rápidamente se vuelve difícil de manejar y requiere mucho tiempo a medida que crece el volumen de datos. En contraste, a nivel intermedio, aprenderás a aprovechar técnicas más avanzadas para automatizar y optimizar estos procesos.

Un concepto clave que explorarás es el uso de Pipelines. Los pipelines te permiten encadenar múltiples pasos de procesamiento de datos en un flujo de trabajo cohesivo. Esto no solo hace que tu código sea más organizado y fácil de mantener, sino que también mejora significativamente la eficiencia. Al definir una serie de operaciones que se pueden aplicar a tus datos de manera optimizada, puedes procesar grandes volúmenes de información de manera más rápida y con menos intervención manual.

Además, profundizarás en técnicas de procesamiento paralelo, que te permiten distribuir tareas computacionales en múltiples núcleos o incluso en varias máquinas. Esto puede reducir drásticamente el tiempo de procesamiento para operaciones de datos a gran escala. También aprenderás técnicas de eficiencia en memoria para manejar conjuntos de datos que son demasiado grandes para caber en la RAM de tu computadora, como el procesamiento fuera de núcleo y la transmisión de datos (data streaming).

Otro aspecto de la optimización de flujos de trabajo que explorarás es la creación de módulos de código reutilizables. En lugar de escribir código personalizado para cada nuevo proyecto, aprenderás a desarrollar funciones y clases modulares y flexibles que se pueden adaptar fácilmente a diferentes conjuntos de datos y requisitos de análisis. Esto no solo ahorra tiempo, sino que también reduce la probabilidad de errores e inconsistencias en tu trabajo.

Al dominar estas técnicas avanzadas de optimización de flujos de trabajo, podrás abordar tareas de análisis de datos cada vez más complejas con mayor eficiencia y confianza. Este cambio de enfoque es un diferenciador clave entre analistas de datos principiantes y de nivel intermedio, permitiéndote manejar conjuntos de datos más grandes, realizar análisis más sofisticados y entregar conocimientos de manera más rápida y confiable.

Ejemplo de Código: Creación de un Pipeline de Preprocesamiento de Datos

Supongamos que estamos trabajando con un conjunto de datos que contiene valores faltantes y características que necesitan ser escaladas para modelado. A nivel principiante, podrías manejar esto escribiendo líneas individuales de código para imputar valores faltantes y luego escalar manualmente las características.

Aquí tienes cómo podrías manejar esto en un flujo de trabajo más estructurado y de nivel intermedio utilizando un Pipeline de Scikit-learn:

import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer

# Sample data with missing values and categorical features
data = {
    'Feature1': [1, 2, np.nan, 4, 5],
    'Feature2': [10, np.nan, 12, 14, 15],
    'Category': ['A', 'B', 'A', 'C', 'B']
}

df = pd.DataFrame(data)

# Define preprocessing for numeric columns
numeric_features = ['Feature1', 'Feature2']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())
])

# Define preprocessing for categorical columns
categorical_features = ['Category']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# Combine preprocessing steps
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])

# Create and fit the pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor)])
transformed_data = pipeline.fit_transform(df)

# Convert to DataFrame for better visualization
feature_names = (numeric_features + 
                 pipeline.named_steps['preprocessor']
                 .named_transformers_['cat']
                 .named_steps['onehot']
                 .get_feature_names(categorical_features).tolist())
transformed_df = pd.DataFrame(transformed_data, columns=feature_names)

print("Original Data:")
print(df)
print("\nTransformed Data:")
print(transformed_df)

Desglose detallado:

  1. Importación de Bibliotecas:
    • Importamos pandas para la manipulación de datos, numpy para operaciones numéricas y varios módulos de scikit-learn para preprocesamiento y creación de pipelines.
  2. Creación de Datos de Muestra:
    • Creamos un conjunto de datos de muestra con dos características numéricas ('Feature1' y 'Feature2') que contienen valores faltantes, y una característica categórica ('Category').
  3. Definición del Preprocesamiento para Columnas Numéricas:
    • Creamos un pipeline para características numéricas que incluye:
      a) SimpleImputer: Rellena los valores faltantes con la media de la columna.
      b) StandardScaler: Estandariza las características eliminando la media y escalando a varianza unitaria.
  4. Definición del Preprocesamiento para Columnas Categóricas:
    • Creamos un pipeline para características categóricas que incluye:
      a) SimpleImputer: Rellena los valores faltantes con una constante ('missing').
      b) OneHotEncoder: Convierte las variables categóricas en columnas codificadas en one-hot.
  5. Combinación de Pasos de Preprocesamiento:
    • Usamos ColumnTransformer para aplicar diferentes pasos de preprocesamiento a distintos tipos de columnas:
      • El transformador 'num' se aplica a las características numéricas.
      • El transformador 'cat' se aplica a las características categóricas.
  6. Creación y Ajuste del Pipeline:
    • Creamos un pipeline principal que incluye el preprocesador.
    • Ajustamos el pipeline a nuestros datos y los transformamos en un solo paso usando fit_transform().
  7. Conversión de Resultados a DataFrame:
    • Extraemos los nombres de las características para los datos transformados, incluyendo las características categóricas codificadas en one-hot.
    • Creamos un nuevo DataFrame con los datos transformados y los nombres de columnas adecuados para una mejor visualización.
  8. Impresión de Resultados:
    • Imprimimos tanto los datos originales como los transformados para mostrar los efectos de nuestro pipeline de preprocesamiento.

Este ejemplo demuestra un enfoque integral para el preprocesamiento de datos, manejando tanto datos numéricos como categóricos. Muestra cómo utilizar el Pipeline y ColumnTransformer de scikit-learn para crear un flujo de preprocesamiento robusto y reutilizable que pueda manejar valores faltantes, escalar características numéricas y codificar variables categóricas, todo en un proceso único y coherente.

1.2.4 Aprovechando NumPy para el Rendimiento

A medida que avanzas más allá de lo básico, también necesitarás volverte más competente en el uso de NumPy para optimizar el rendimiento, especialmente al manejar cálculos numéricos. Los principiantes suelen depender mucho de Pandas para cada tarea, pero NumPy puede manejar operaciones numéricas a gran escala mucho más rápido, gracias a sus estructuras de datos optimizadas.

La eficiencia de NumPy proviene de su uso de bloques de memoria contiguos y su capacidad para realizar operaciones vectorizadas. Esto significa que, en lugar de recorrer elementos individuales, NumPy puede aplicar operaciones a matrices enteras a la vez, acelerando significativamente los cálculos. Por ejemplo, al trabajar con grandes conjuntos de datos, el uso de operaciones de matriz de NumPy puede ser órdenes de magnitud más rápido que las operaciones equivalentes en Python puro o incluso en Pandas.

Además, NumPy proporciona una amplia gama de funciones matemáticas optimizadas para el rendimiento, que incluyen operaciones de álgebra lineal, transformadas de Fourier y generación de números aleatorios, entre otras. Al aprovechar estas funciones, puedes realizar operaciones matemáticas complejas de manera eficiente, lo cual es crucial al trabajar con grandes conjuntos de datos o al implementar algoritmos sofisticados.

Otra ventaja de NumPy es su eficiencia en el uso de memoria. Las matrices de NumPy utilizan un tipo de dato fijo para todos los elementos, lo que permite un almacenamiento más compacto en comparación con las listas de Python. Esto no solo ahorra memoria, sino que también permite cálculos más rápidos, ya que la CPU puede procesar datos de manera más eficiente cuando están almacenados en un formato consistente.

A medida que avances en tu viaje de análisis de datos, descubrirás que dominar NumPy es esencial para tareas como la ingeniería de características, la implementación de algoritmos personalizados y la optimización de código existente para un mejor rendimiento. Al combinar las fortalezas de Pandas para la manipulación de datos y NumPy para cálculos numéricos, podrás crear flujos de trabajo de análisis de datos más eficientes y escalables.

Por ejemplo, consideremos una operación de nivel principiante donde podrías calcular una suma a través de columnas en un DataFrame de Pandas:

# Beginner-level approach using Pandas
df['Total'] = df['Feature1'] + df['Feature2']
print(df)

Aquí tienes una explicación de lo que hace este código:

  • Crea una nueva columna llamada 'Total' en el DataFrame 'df'.
  • La columna 'Total' se calcula sumando los valores de las columnas 'Feature1' y 'Feature2'.
  • Finalmente, imprime el DataFrame completo, que ahora incluye la nueva columna 'Total'.

Este enfoque es directo y fácil de entender, lo que lo hace adecuado para principiantes. Sin embargo, para conjuntos de datos más grandes o operaciones más complejas, existen métodos más eficientes usando NumPy, como se menciona en las partes posteriores del texto.

Ejemplo de Código: Cálculos Numéricos de Nivel Intermedio con NumPy

import numpy as np

# Convert DataFrame to NumPy array for faster operations
data_np = df.to_numpy()

# Perform element-wise sum across columns using NumPy
total = np.nansum(data_np, axis=1)  # Handling NaN values
print(total)

Este código demuestra un enfoque de nivel intermedio para cálculos numéricos usando NumPy, que es más eficiente para conjuntos de datos grandes en comparación con el enfoque de Pandas de nivel principiante.

Aquí tienes un desglose de lo que hace el código:

  • Primero, importa la biblioteca NumPy, esencial para operaciones numéricas de alto rendimiento.
  • El DataFrame 'df' se convierte a un array de NumPy usando df.to_numpy(). Esta conversión permite operaciones más rápidas en los datos.
  • La función np.nansum() se utiliza para calcular la suma a lo largo de las columnas (axis=1) del array de NumPy. El 'nan' en 'nansum' indica que esta función puede manejar valores NaN (Not a Number), lo cual es útil para conjuntos de datos con valores faltantes.
  • El resultado se almacena en la variable 'total', que contiene la suma de cada fila, creando efectivamente una nueva columna 'Total'.
  • Finalmente, se imprime el array 'total', mostrando la suma para cada fila.

Este enfoque es más eficiente que el método de Pandas para conjuntos de datos grandes, ya que aprovecha las operaciones optimizadas de arrays de NumPy y maneja valores faltantes sin problemas.

1.2 Cómo Este Libro se Basa en los Fundamentos

Al embarcarte en este viaje de nivel intermedio en el análisis de datos, es crucial reflexionar sobre los fundamentos que has construido y cómo tus habilidades existentes servirán como peldaños para los conceptos más avanzados que exploraremos en este libro. Tu recorrido de novato a analista intermedio está marcado por un cambio significativo en la perspectiva y el enfoque hacia la manipulación e interpretación de datos.

Durante tu incursión inicial en el análisis de datos, adquiriste habilidades esenciales como la manipulación básica de datos, técnicas fundamentales de visualización y análisis estadístico rudimentario. Probablemente te familiarizaste con bibliotecas poderosas como Pandas para la manipulación de datos, NumPy para cálculos numéricos y posiblemente Matplotlib para crear visualizaciones. Estas herramientas forman la base del análisis de datos y seguirán siendo indispensables a medida que avances en tu viaje analítico.

Sin embargo, a medida que pasas al nivel intermedio, tu enfoque evolucionará de simplemente entender estas herramientas a dominarlas con destreza. Te adentrarás en las complejidades de optimizar tus flujos de trabajo, mejorar la eficiencia de tus análisis y aplicar estas herramientas para enfrentar problemas complejos del mundo real. Este libro está diseñado para cerrar la brecha entre tus conocimientos fundamentales y las técnicas analíticas avanzadas, preparándote para enfrentar y resolver desafíos de datos más intrincados. En las siguientes secciones, describiremos cómo este recurso se basará en tu conjunto de habilidades existentes, elevando tus capacidades para navegar el multifacético panorama del análisis de datos intermedio.

1.2.1 De la Manipulación de Datos Básica a la Avanzada

A nivel principiante, probablemente aprendiste a cargar datos, filtrar filas, seleccionar columnas y realizar operaciones básicas de agrupamiento con Pandas. Estas habilidades fundamentales forman la piedra angular de la manipulación de datos, permitiéndote realizar tareas esenciales como limpieza de datos, análisis básico y transformaciones simples. Sin embargo, a medida que avanzas al nivel intermedio, descubrirás que estas habilidades, aunque cruciales, son solo el comienzo de tu viaje en la manipulación de datos.

La manipulación de datos a nivel intermedio requiere una comprensión más profunda de las características y funcionalidades avanzadas de Pandas. Deberás dominar técnicas para manejar estructuras de datos complejas, como DataFrames con múltiples índices y datos jerárquicos. Además, aprenderás a realizar operaciones complejas como el pivotado, el uso de melt y la reestructuración de datos para extraer conocimientos significativos de conjuntos de datos complejos.

Además, la eficiencia se vuelve primordial al trabajar con conjuntos de datos grandes. Deberás desarrollar estrategias para optimizar tu código y manejar millones de filas sin una degradación significativa del rendimiento. Esto podría implicar el uso de operaciones vectorizadas, aprovechando la potencia de NumPy en segundo plano o empleando técnicas como el procesamiento en fragmentos (chunking) para manejar datos en porciones manejables.

Por otra parte, la manipulación de datos intermedia a menudo implica transformaciones más sofisticadas. Aprenderás a aplicar funciones personalizadas a tus datos usando métodos como apply() y applymap(), lo que permite realizar transformaciones de datos más flexibles y potentes. También te adentrarás en técnicas avanzadas de agrupación y agregación, que te permitirán realizar cálculos complejos en múltiples dimensiones de tus datos.

A medida que avances, también tendrás que considerar aspectos de integridad y calidad de datos. Esto incluye implementar un manejo de errores más robusto, técnicas de validación de datos y estrategias para lidiar con casos extremos en tus datos. Aprenderás a escribir código que no solo manipula datos de manera efectiva, sino que también lo hace de una forma que mantiene la calidad y fiabilidad de los datos a lo largo de tu flujo de análisis.

Por ejemplo, considera el siguiente ejemplo en el que filtramos y agrupamos datos para calcular las ventas promedio en un conjunto de datos de ventas minoristas:

Ejemplo de Código: Manipulación de Datos a Nivel Principiante

import pandas as pd

# Sample data
data = {'Store': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Sales': [200, 220, 210, 250, 215, 240]}

df = pd.DataFrame(data)

# Group by Store and calculate the average sales
avg_sales = df.groupby('Store')['Sales'].mean()
print(avg_sales)

Desglosemos esto:

  • Primero, se importa la biblioteca pandas como 'pd'.
  • Se crea un conjunto de datos de muestra como un diccionario con dos claves: 'Store' y 'Sales'. Cada clave corresponde a una lista de valores.
  • El diccionario se convierte en un DataFrame de pandas usando pd.DataFrame(data).
  • El código luego utiliza la función groupby() para agrupar los datos por la columna 'Store'.
  • La función mean() se aplica a la columna 'Sales' para cada grupo, calculando las ventas promedio para cada tienda.
  • Finalmente, los resultados se almacenan en la variable avg_sales y se imprimen.

Este código calcula las ventas promedio para cada tienda, una operación esencial pero básica. Sin embargo, ¿qué pasaría si estuvieras trabajando con un conjunto de datos mucho más grande, potencialmente de millones de filas, y necesitaras optimizar el rendimiento? ¿Y si quisieras realizar operaciones adicionales, como agregar múltiples columnas o filtrar en función de criterios más complejos?

1.2.2 Manipulación de Datos a Nivel Intermedio

Tomemos ese mismo concepto y hagámoslo más robusto, eficiente y flexible. Supongamos que ahora estás trabajando con un conjunto de datos que incluye información de ventas más detallada y deseas realizar múltiples agregaciones, como calcular tanto las ventas promedio como el total de ventas, además de filtrar para tiendas específicas.

Así es como podrías abordar ese problema a nivel intermedio:

# Sample data with more details
data = {'Store': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Sales': [200, 220, 210, 250, 215, 240],
        'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Electronics', 'Clothing']}

df = pd.DataFrame(data)

# Group by Store and Category, calculating multiple aggregations
agg_sales = df.groupby(['Store', 'Category']).agg(
    avg_sales=('Sales', 'mean'),
    total_sales=('Sales', 'sum')
).reset_index()

print(agg_sales)

Desglosemos esto:

  • Primero, se crea un conjunto de datos de muestra con información más detallada, incluyendo columnas 'Store', 'Sales' y 'Category'.
  • Los datos se convierten en un DataFrame de pandas.
  • La clave de este ejemplo es el uso de la función groupby() con múltiples columnas ('Store' y 'Category') y el método agg() para realizar múltiples agregaciones simultáneamente.
  • Se realizan dos agregaciones:
    • 'avg_sales': Calcula la media de 'Sales' para cada grupo.
    • 'total_sales': Calcula la suma de 'Sales' para cada grupo.
  • El método reset_index() se usa para convertir el DataFrame de multi-índice resultante de vuelta a un DataFrame regular con 'Store' y 'Category' como columnas.
  • Finalmente, se imprimen los resultados agregados.

Este código muestra un enfoque de nivel intermedio para la manipulación y análisis de datos usando pandas. Es más eficiente y flexible que ejecutar operaciones separadas para cada agregación, particularmente cuando se manejan conjuntos de datos grandes. El ejemplo ilustra cómo el análisis de datos de nivel intermedio a menudo implica combinar múltiples operaciones en un flujo de trabajo único y optimizado, mejorando tanto el rendimiento como la legibilidad.

1.2.3 Construcción de Flujos de Trabajo Eficientes

Otro aspecto crítico en el que este libro se basa en tus conocimientos fundamentales es en la optimización de flujos de trabajo. A medida que avanzas del nivel principiante al intermedio, aprenderás a cambiar tu enfoque de simplemente completar tareas a crear flujos de trabajo eficientes y escalables. Esta transición es crucial porque, a medida que los conjuntos de datos se expanden y los análisis se vuelven más complejos, la importancia de optimizar tus procesos aumenta exponencialmente.

Considera el proceso de preprocesamiento de un conjunto de datos grande. A nivel principiante, podrías abordar esta tarea limpiando y transformando los datos de manera manual, usando operaciones individuales. Aunque este método puede ser efectivo para conjuntos de datos pequeños, rápidamente se vuelve difícil de manejar y requiere mucho tiempo a medida que crece el volumen de datos. En contraste, a nivel intermedio, aprenderás a aprovechar técnicas más avanzadas para automatizar y optimizar estos procesos.

Un concepto clave que explorarás es el uso de Pipelines. Los pipelines te permiten encadenar múltiples pasos de procesamiento de datos en un flujo de trabajo cohesivo. Esto no solo hace que tu código sea más organizado y fácil de mantener, sino que también mejora significativamente la eficiencia. Al definir una serie de operaciones que se pueden aplicar a tus datos de manera optimizada, puedes procesar grandes volúmenes de información de manera más rápida y con menos intervención manual.

Además, profundizarás en técnicas de procesamiento paralelo, que te permiten distribuir tareas computacionales en múltiples núcleos o incluso en varias máquinas. Esto puede reducir drásticamente el tiempo de procesamiento para operaciones de datos a gran escala. También aprenderás técnicas de eficiencia en memoria para manejar conjuntos de datos que son demasiado grandes para caber en la RAM de tu computadora, como el procesamiento fuera de núcleo y la transmisión de datos (data streaming).

Otro aspecto de la optimización de flujos de trabajo que explorarás es la creación de módulos de código reutilizables. En lugar de escribir código personalizado para cada nuevo proyecto, aprenderás a desarrollar funciones y clases modulares y flexibles que se pueden adaptar fácilmente a diferentes conjuntos de datos y requisitos de análisis. Esto no solo ahorra tiempo, sino que también reduce la probabilidad de errores e inconsistencias en tu trabajo.

Al dominar estas técnicas avanzadas de optimización de flujos de trabajo, podrás abordar tareas de análisis de datos cada vez más complejas con mayor eficiencia y confianza. Este cambio de enfoque es un diferenciador clave entre analistas de datos principiantes y de nivel intermedio, permitiéndote manejar conjuntos de datos más grandes, realizar análisis más sofisticados y entregar conocimientos de manera más rápida y confiable.

Ejemplo de Código: Creación de un Pipeline de Preprocesamiento de Datos

Supongamos que estamos trabajando con un conjunto de datos que contiene valores faltantes y características que necesitan ser escaladas para modelado. A nivel principiante, podrías manejar esto escribiendo líneas individuales de código para imputar valores faltantes y luego escalar manualmente las características.

Aquí tienes cómo podrías manejar esto en un flujo de trabajo más estructurado y de nivel intermedio utilizando un Pipeline de Scikit-learn:

import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer

# Sample data with missing values and categorical features
data = {
    'Feature1': [1, 2, np.nan, 4, 5],
    'Feature2': [10, np.nan, 12, 14, 15],
    'Category': ['A', 'B', 'A', 'C', 'B']
}

df = pd.DataFrame(data)

# Define preprocessing for numeric columns
numeric_features = ['Feature1', 'Feature2']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())
])

# Define preprocessing for categorical columns
categorical_features = ['Category']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# Combine preprocessing steps
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])

# Create and fit the pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor)])
transformed_data = pipeline.fit_transform(df)

# Convert to DataFrame for better visualization
feature_names = (numeric_features + 
                 pipeline.named_steps['preprocessor']
                 .named_transformers_['cat']
                 .named_steps['onehot']
                 .get_feature_names(categorical_features).tolist())
transformed_df = pd.DataFrame(transformed_data, columns=feature_names)

print("Original Data:")
print(df)
print("\nTransformed Data:")
print(transformed_df)

Desglose detallado:

  1. Importación de Bibliotecas:
    • Importamos pandas para la manipulación de datos, numpy para operaciones numéricas y varios módulos de scikit-learn para preprocesamiento y creación de pipelines.
  2. Creación de Datos de Muestra:
    • Creamos un conjunto de datos de muestra con dos características numéricas ('Feature1' y 'Feature2') que contienen valores faltantes, y una característica categórica ('Category').
  3. Definición del Preprocesamiento para Columnas Numéricas:
    • Creamos un pipeline para características numéricas que incluye:
      a) SimpleImputer: Rellena los valores faltantes con la media de la columna.
      b) StandardScaler: Estandariza las características eliminando la media y escalando a varianza unitaria.
  4. Definición del Preprocesamiento para Columnas Categóricas:
    • Creamos un pipeline para características categóricas que incluye:
      a) SimpleImputer: Rellena los valores faltantes con una constante ('missing').
      b) OneHotEncoder: Convierte las variables categóricas en columnas codificadas en one-hot.
  5. Combinación de Pasos de Preprocesamiento:
    • Usamos ColumnTransformer para aplicar diferentes pasos de preprocesamiento a distintos tipos de columnas:
      • El transformador 'num' se aplica a las características numéricas.
      • El transformador 'cat' se aplica a las características categóricas.
  6. Creación y Ajuste del Pipeline:
    • Creamos un pipeline principal que incluye el preprocesador.
    • Ajustamos el pipeline a nuestros datos y los transformamos en un solo paso usando fit_transform().
  7. Conversión de Resultados a DataFrame:
    • Extraemos los nombres de las características para los datos transformados, incluyendo las características categóricas codificadas en one-hot.
    • Creamos un nuevo DataFrame con los datos transformados y los nombres de columnas adecuados para una mejor visualización.
  8. Impresión de Resultados:
    • Imprimimos tanto los datos originales como los transformados para mostrar los efectos de nuestro pipeline de preprocesamiento.

Este ejemplo demuestra un enfoque integral para el preprocesamiento de datos, manejando tanto datos numéricos como categóricos. Muestra cómo utilizar el Pipeline y ColumnTransformer de scikit-learn para crear un flujo de preprocesamiento robusto y reutilizable que pueda manejar valores faltantes, escalar características numéricas y codificar variables categóricas, todo en un proceso único y coherente.

1.2.4 Aprovechando NumPy para el Rendimiento

A medida que avanzas más allá de lo básico, también necesitarás volverte más competente en el uso de NumPy para optimizar el rendimiento, especialmente al manejar cálculos numéricos. Los principiantes suelen depender mucho de Pandas para cada tarea, pero NumPy puede manejar operaciones numéricas a gran escala mucho más rápido, gracias a sus estructuras de datos optimizadas.

La eficiencia de NumPy proviene de su uso de bloques de memoria contiguos y su capacidad para realizar operaciones vectorizadas. Esto significa que, en lugar de recorrer elementos individuales, NumPy puede aplicar operaciones a matrices enteras a la vez, acelerando significativamente los cálculos. Por ejemplo, al trabajar con grandes conjuntos de datos, el uso de operaciones de matriz de NumPy puede ser órdenes de magnitud más rápido que las operaciones equivalentes en Python puro o incluso en Pandas.

Además, NumPy proporciona una amplia gama de funciones matemáticas optimizadas para el rendimiento, que incluyen operaciones de álgebra lineal, transformadas de Fourier y generación de números aleatorios, entre otras. Al aprovechar estas funciones, puedes realizar operaciones matemáticas complejas de manera eficiente, lo cual es crucial al trabajar con grandes conjuntos de datos o al implementar algoritmos sofisticados.

Otra ventaja de NumPy es su eficiencia en el uso de memoria. Las matrices de NumPy utilizan un tipo de dato fijo para todos los elementos, lo que permite un almacenamiento más compacto en comparación con las listas de Python. Esto no solo ahorra memoria, sino que también permite cálculos más rápidos, ya que la CPU puede procesar datos de manera más eficiente cuando están almacenados en un formato consistente.

A medida que avances en tu viaje de análisis de datos, descubrirás que dominar NumPy es esencial para tareas como la ingeniería de características, la implementación de algoritmos personalizados y la optimización de código existente para un mejor rendimiento. Al combinar las fortalezas de Pandas para la manipulación de datos y NumPy para cálculos numéricos, podrás crear flujos de trabajo de análisis de datos más eficientes y escalables.

Por ejemplo, consideremos una operación de nivel principiante donde podrías calcular una suma a través de columnas en un DataFrame de Pandas:

# Beginner-level approach using Pandas
df['Total'] = df['Feature1'] + df['Feature2']
print(df)

Aquí tienes una explicación de lo que hace este código:

  • Crea una nueva columna llamada 'Total' en el DataFrame 'df'.
  • La columna 'Total' se calcula sumando los valores de las columnas 'Feature1' y 'Feature2'.
  • Finalmente, imprime el DataFrame completo, que ahora incluye la nueva columna 'Total'.

Este enfoque es directo y fácil de entender, lo que lo hace adecuado para principiantes. Sin embargo, para conjuntos de datos más grandes o operaciones más complejas, existen métodos más eficientes usando NumPy, como se menciona en las partes posteriores del texto.

Ejemplo de Código: Cálculos Numéricos de Nivel Intermedio con NumPy

import numpy as np

# Convert DataFrame to NumPy array for faster operations
data_np = df.to_numpy()

# Perform element-wise sum across columns using NumPy
total = np.nansum(data_np, axis=1)  # Handling NaN values
print(total)

Este código demuestra un enfoque de nivel intermedio para cálculos numéricos usando NumPy, que es más eficiente para conjuntos de datos grandes en comparación con el enfoque de Pandas de nivel principiante.

Aquí tienes un desglose de lo que hace el código:

  • Primero, importa la biblioteca NumPy, esencial para operaciones numéricas de alto rendimiento.
  • El DataFrame 'df' se convierte a un array de NumPy usando df.to_numpy(). Esta conversión permite operaciones más rápidas en los datos.
  • La función np.nansum() se utiliza para calcular la suma a lo largo de las columnas (axis=1) del array de NumPy. El 'nan' en 'nansum' indica que esta función puede manejar valores NaN (Not a Number), lo cual es útil para conjuntos de datos con valores faltantes.
  • El resultado se almacena en la variable 'total', que contiene la suma de cada fila, creando efectivamente una nueva columna 'Total'.
  • Finalmente, se imprime el array 'total', mostrando la suma para cada fila.

Este enfoque es más eficiente que el método de Pandas para conjuntos de datos grandes, ya que aprovecha las operaciones optimizadas de arrays de NumPy y maneja valores faltantes sin problemas.