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.
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.
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
- Cargar y auditar el dataset de ventas
- Cálculo de ingresos e ingeniería de características
- Análisis con GroupBy por región y categoría
- Visualización de tendencias mensuales