Pandas & NumPy Academy · Lección

Cálculo de ingresos e ingeniería de características

Calcule los ingresos por línea de pedido, cree columnas de mes y trimestre, y añada una marca de descuento para los pedidos que superen un umbral.

Lección 2 de 413 pasos

Cálculo de ingresos e ingeniería de características es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

Cálculo de los ingresos por línea de pedido

El cálculo más fundamental en un conjunto de datos de ventas son los ingresos por línea de pedido: el producto de la cantidad y el precio unitario de cada fila. Cree la columna mediante una multiplicación vectorizada para que NumPy procese todas las filas simultáneamente, sin un bucle de Python. Esta columna será la base de todas las agregaciones del análisis.

import pandas as pd

df = pd.read_parquet('sales_clean.parquet')

df['revenue'] = df['quantity'] * df['unit_price']
print(df[['quantity', 'unit_price', 'revenue']].head())

Extracción de las columnas de mes y trimestre

Agrupar por periodos naturales es esencial para analizar tendencias. Utilice el accesor .dt en una columna de fecha y hora para extraer el año, el mes y el trimestre. Almacenar estos valores en columnas enteras independientes acelera las operaciones de groupby y permite filtrar por periodo fácilmente, sin analizar cadenas repetidamente.

df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['quarter'] = df['order_date'].dt.quarter
df['year_month'] = df['order_date'].dt.to_period('M')

print(df[['order_date', 'year', 'month', 'quarter', 'year_month']].head())

Creación de un indicador de descuento

Las reglas de negocio suelen definir un indicador de descuento: los pedidos cuyo total supera un umbral reciben un descuento. Utilice np.where o una comparación booleana para crear esta columna binaria de forma eficiente. Un indicador de descuento permite a los analistas comparar las distribuciones de ingresos entre pedidos con descuento y pedidos a precio completo en una sola llamada a groupby.

import numpy as np

DISCOUNT_THRESHOLD = 500

df['is_discounted'] = np.where(df['revenue'] >= DISCOUNT_THRESHOLD, 1, 0)

print(df['is_discounted'].value_counts())
print(df.groupby('is_discounted')['revenue'].mean())

Cálculo de la columna de margen de beneficio

Si el conjunto de datos incluye una columna cost_price, puede calcular el margen de beneficio como (unit_price - cost_price) / unit_price. Utilice clip(lower=0) para limitar a cero los márgenes negativos causados por errores en los datos antes de continuar con el análisis. Las columnas de margen permiten realizar agregaciones de groupby centradas en el beneficio, además de en los ingresos.

df['margin'] = ((df['unit_price'] - df['cost_price']) / df['unit_price']).clip(lower=0)

print(df[['unit_price', 'cost_price', 'margin']].describe())

Característica de días desde el primer pedido

El número de días entre el primer pedido de un cliente y el pedido actual es una característica útil de antigüedad del cliente. Calcúlelo agrupando por customer_id, tomando la fecha mínima como fecha de la cohorte y restándola de la fecha de cada fila. La aritmética con timedelta devuelve una columna de valores timedelta64, que debe convertir a días enteros con .dt.days.

first_order = df.groupby('customer_id')['order_date'].transform('min')
df['days_since_first_order'] = (df['order_date'] - first_order).dt.days

print(df[['customer_id', 'order_date', 'days_since_first_order']].head())

Segmentación del tamaño del pedido con pd.cut

Agrupe la columna revenue en intervalos de tamaño etiquetados mediante pd.cut() para crear una característica ordinal destinada a la segmentación. Proporcione bins y labels explícitos que correspondan a sus definiciones de negocio de pedidos pequeños, medianos y grandes. La columna resultante es un Categorical de Pandas, que permite agrupar de forma eficiente.

bins = [0, 100, 500, 2000, float('inf')]
labels = ['Small', 'Medium', 'Large', 'Enterprise']

df['order_size'] = pd.cut(df['revenue'], bins=bins, labels=labels)
print(df['order_size'].value_counts())

Ingresos acumulados a lo largo del tiempo

order_date y utilice cumsum() en la columna de ingresos para seguir cómo se acumularon los ingresos totales durante el año. Esta serie acumulada facilita detectar si los ingresos crecen linealmente, se aceleran o se estabilizan, y constituye la base de un gráfico de cascada o de líneas acumuladas.

df_sorted = df.sort_values('order_date')
df_sorted['cumulative_revenue'] = df_sorted['revenue'].cumsum()

print(df_sorted[['order_date', 'revenue', 'cumulative_revenue']].tail())

Característica de fin de semana frente a día laborable

La propiedad dt.day_of_week devuelve valores del 0 (lunes) al 6 (domingo). Marque el sábado (5) y el domingo (6) como pedidos de fin de semana para comprobar si el comportamiento de compra durante el fin de semana difiere del de los días laborables. Esta es una característica habitual en el análisis exploratorio de datos minoristas y en el análisis de pruebas A/B.

df['is_weekend'] = df['order_date'].dt.day_of_week >= 5

print(df.groupby('is_weekend')['revenue'].agg(['mean', 'count']))

Clasificación de clientes por ingresos

Identifique a sus mejores clientes calculando los ingresos totales por customer_id con groupby().sum() y clasificándolos después con .rank(ascending=False, method='dense'). Añadir la clasificación al DataFrame principal con map() permite filtrar los N clientes principales mediante una sola condición booleana.

customer_revenue = df.groupby('customer_id')['revenue'].sum()
customer_rank = customer_revenue.rank(ascending=False, method='dense').astype(int)

df['customer_revenue_rank'] = df['customer_id'].map(customer_rank)
print(df[df['customer_revenue_rank'] <= 10][['customer_id', 'customer_revenue_rank']].drop_duplicates())

Normalización de los ingresos con puntuación Z

Normalice la columna de ingresos como una puntuación Z para poder comparar los tamaños de los pedidos entre distintas categorías de productos con rangos de precios muy diferentes. Utilice (df['revenue'] - df['revenue'].mean()) / df['revenue'].std(). Las puntuaciones Z superiores a 3 o inferiores a -3 son valores atípicos estadísticos que conviene investigar antes de crear modelos.

mean_rev = df['revenue'].mean()
std_rev = df['revenue'].std()

df['revenue_zscore'] = (df['revenue'] - mean_rev) / std_rev

outliers = df[df['revenue_zscore'].abs() > 3]
print(f'Outlier orders: {len(outliers)}')

Guardado del DataFrame enriquecido con características

Después de añadir las columnas calculadas, guarde el DataFrame enriquecido para que todos los notebooks posteriores comiencen desde el mismo estado coherente. Utilice to_parquet() para conservar los tipos de datos, especialmente la columna Categorical order_size y la columna de fecha y hora order_date. Documente las nuevas columnas en un breve bloque de comentarios al principio del script.

# New columns added:
# revenue, year, month, quarter, year_month
# is_discounted, order_size, is_weekend
# days_since_first_order, customer_revenue_rank, revenue_zscore

df.to_parquet('sales_features.parquet', index=False)
print('Feature DataFrame saved:', df.shape)

Comprobación rápida

Compruebe su comprensión de los conceptos de análisis de datos de esta lección.

Resumen de la lección

En esta lección ha aprendido a: calcular las columnas de ingresos y margen de beneficio, extraer características temporales con el accesor .dt y crear características como indicadores de descuento, intervalos de tamaño de pedido y clasificaciones de clientes. A continuación, exploraremos el análisis con groupby por región y categoría.

Gratis para empezar

Aprende Python con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
30
Lecciones
120

Preguntas frecuentes

¿La lección «Cálculo de ingresos e ingeniería de características» es gratis?

Sí — el texto completo de «Cálculo de ingresos e ingeniería de características» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cálculo de ingresos e ingeniería de características»?

Calcule los ingresos por línea de pedido, cree columnas de mes y trimestre, y añada una marca de descuento para los pedidos que superen un umbral. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Pandas & NumPy Academy?

No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Cálculo de ingresos e ingeniería de características»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?

Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Cargar y auditar el dataset de ventas
  2. Cálculo de ingresos e ingeniería de características
  3. Análisis con GroupBy por región y categoría
  4. Visualización de tendencias mensuales
← Volver a Pandas & NumPy Academy