Función Pandas Series.cumsum()
Series.cumsum()Es una función de Pandas que se utiliza para calcular la suma acumulada de una Series. La suma acumulada significa que, desde el primer elemento, el valor en cada posición es igual a la suma de todos los elementos anteriores a esa posición (incluido el elemento actual).
La suma acumulada se utiliza con frecuencia en escenarios como el análisis de datos financieros (por ejemplo, el cálculo de rendimientos acumulados), el análisis de ventas (por ejemplo, el cálculo de ventas acumuladas) y el análisis de series temporales.
Sintaxis básica y parámetros
cumsum()Es una función miembro del objeto Series y se invoca directamente mediante el operador de punto.
Formato de sintaxis
Series.cumsum(axis=None, skipna=True, dtype=None, out=None, **kwargs)
Descripción de parámetros
| Parámetro | Tipo | Descripción | Valor predeterminado |
|---|---|---|---|
| axis | int | Especifica el eje. Series solo tiene una columna; este parámetro existe principalmente para la compatibilidad con DataFrame. | None |
| skipna | bool | Si es True, omite los valores NaN durante el cálculo; si es False, la acumulación se interrumpe al encontrar un NaN. | True |
| dtype | dtype | Especifica el tipo de datos de salida. | None |
| out | ndarray | El array utilizado para almacenar el resultado; normalmente no es necesario configurarlo. | None |
Valor de retorno
- Tipo de retorno:
Series - DescripciónDevuelve una nueva Series, donde el valor de cada posición es la suma acumulada.
Ejemplos
Vamos a dominar completamente, mediante una serie de ejemplos de simples a complejos, el usoSeries.cumsum()de la función.
Ejemplo 1: Uso básico - Calcular las ventas acumuladas
La suma acumulada es el total de todos los valores hasta la posición actual.
Ejemplo
# Crear una Series con las ventas diarias
daily_sales = pd.Series([1000, 1500, 1200, 1800, 2000, 900, 1600])
print("Ventas diarias (yuanes):")
print(daily_sales)
print()
# Calcular las ventas acumuladas
cumulative_sales = daily_sales.cumsum()
print("Ventas acumuladas (yuanes):")
print(cumulative_sales)
print()
print("Análisis:")
print("- Acumulado del día 1: 1000")
print("- Acumulado del día 2: 1000 + 1500 = 2500")
print("- Acumulado del día 3: 1000 + 1500 + 1200 = 3700")
print("Y así sucesivamente...")
Resultado de la ejecución:
每日销售额(元): 0 1000 1 1500 2 1200 3 1800 4 2000 5 900 6 1600 dtype: int64 累计销售额(元): 0 1000 1 2500 2 3700 3 5500 4 7500 5 8400 6 10000 dtype: int64 分析: - 第1天的累计销售就是当天的销售额 - 第2天的累计销售额 = 第1天 + 第2天的销售额 - 以此类推...
Análisis del código:
- Suma acumulada en la posición 1 = 1000
- Suma acumulada en la posición 2 = 1000 + 1500 = 2500
- Suma acumulada en la posición 3 = 1000 + 1500 + 1200 = 3700
- Y así sucesivamente...
Ejemplo 2: Manejo de datos con valores faltantes
skipnaEl parámetro determina cómo se manejan los valores faltantes.
Ejemplo
import numpy as np
# Crear una Series con valores faltantes
data_with_nan = pd.Series([10, 20, np.nan, 30, 40])
print("Datos originales (con valores faltantes):")
print(data_with_nan)
print()
# Por defecto skipna=True, omite los NaN al calcular la suma acumulada
cumulative_skipna = data_with_nan.cumsum()
print("Suma acumulada con skipna=True (predeterminado):")
print(cumulative_skipna)
print()
# Establecer skipna=False, la posición con NaN interrumpe la acumulación
cumulative_no_skipna = data_with_nan.cumsum(skipna=False)
print("Suma acumulada con skipna=False:")
print(cumulative_no_skipna)
Resultado de la ejecución:
原始数据(含缺失值): 0 10.0 1 20.0 2 NaN 3 30.0 4 40.0 dtype: float64 skipna=True(默认)的累计和: 0 10.0 1 30.0 2 NaN 3 60.0 4 100.0 dtype: float64 skipna=False 的累计和: 0 10.0 1 30.0 2 NaN 3 NaN 4 DataFrame
Análisis del código:
- Cuando
skipna=TrueCuando skipna=True, las posiciones con NaN se omiten y la acumulación posterior continúa basándose en los valores válidos. - Cálculo: 10 → 30 → (omitido) → 60 → 100
- Cuando
skipna=FalseCuando skipna=False, todas las posiciones después de un NaN se convierten en NaN.
Ejemplo 3: Análisis combinado con los datos originales
En el análisis práctico, normalmente es necesario ver simultáneamente los datos originales y los datos acumulados.
Ejemplo
# Crear datos de precios de acciones
stock_prices = pd.Series([100, 102, 98, 105, 103, 108, 110])
# Calcular el cambio diario
daily_change = stock_prices.diff()
# Calcular el cambio acumulado
cumulative_change = stock_prices.cumsum() - stock_prices.iloc[0] * len(stock_prices) + stock_prices
# O, más simplemente, usar cumsum para calcular el cambio acumulado relativo al precio inicial
print("Datos de precios de acciones:")
print(stock_prices.values)
print()
# Calcular el cambio de precio del día (en comparación con el día anterior)
print("Cambio diario:")
print(daily_change.fillna(0).values)
print()
# Otra forma: calcular el rendimiento acumulado
cumulative_return = ((stock_prices / stock_prices.iloc[0]) - 1) * 100
print("Rendimiento acumulado (%):")
print(cumulative_return.values)
print()
# Valor acumulado a partir de 100 yuanes
initial_price = 100
cumulative_value = initial_price + stock_prices.cumsum() - stock_prices.iloc[0]
print("Valor acumulado (asumiendo 100 yuanes iniciales):")
print(cumulative_value.values)
Resultado de la ejecución:
股价数据:[100, 102, 98, 105, 103, 108, 110] 每日涨跌(与前一天相比): [ 0., 2., -4., 7., -2., 5., 2.] 累计收益(%): [0.0, 2.0, -2.0, 5.0, 3.0, 8.0, 10.0] 累计价值(假设初始 100 元): 0 100 1 202 2 300 3 405 4 508 5 616 6 726 dtype: int64 分析:第 7 天时,股价从 100 涨到 110,累计收益率为 10%。
Ejemplo 4: Aplicación práctica - Datos acumulados mensuales
Muestra una aplicación típica de cumsum en el análisis financiero.
Ejemplo
# Crear datos de ventas mensuales
monthly_sales = pd.Series({
'Enero': 50000,
'Febrero': 62000,
'Marzo': 58000,
'Abril': 70000,
'Mayo': 75000,
'Junio': 80000
})
print("Ventas mensuales (yuanes):")
print(monthly_sales)
print()
# Calcular las ventas acumuladas mensuales
cumulative_sales = monthly_sales.cumsum()
# Crear una tabla resumen
summary = pd.DataFrame({
'Ventas mensuales': monthly_sales,
'Ventas acumuladas': cumulative_sales,
'Proporción de cumplimiento del objetivo anual': (cumulative_sales / 500000 * 100).round(1)
})
print("Tabla resumen de ventas:")
print(summary)
print()
print(f"Ventas acumuladas del primer semestre: {cumulative_sales.iloc[-1]} yuanes")
print(f"Tasa de cumplimiento del objetivo anual: {cumulative_sales.iloc[-1]/500000*100:.1f}%")
Resultado de la ejecución:
月度销售额(元):
1月 50000
2月 62000
累计 112000
4月 70000
5月 75000
6月 80000
dtype: int64
销售汇总表:
月度销售额 累计销售额 完成年度目标(%)
1月 50000 50000 10.0
2月 62000 112000 22.4
3月 58000 170000 34.0
4月 70000 240000 累计 34.0%
5月 75000 315000 63.0
6月 累计 395000 79.0
dtype: int64
分析:6 月底累计销售额为 39.5 万元,已完成年度目标的 79.0%。
Ejemplo 5: Aplicación en DataFrame
cumsum también se puede utilizar en DataFrame por columnas o por filas.
Ejemplo
# Crear un DataFrame con las ventas de varios productos
sales_data = pd.DataFrame({
'Producto A': [100, 150, 120, 180],
'Producto B': [80, 90, 110, 130],
'Producto C': [50, 60, 70, 80]
}, index=['Enero', 'Febrero', 'Marzo', 'Abril'])
print("Datos de ventas mensuales:")
print(sales_data)
print()
# Calcular las ventas acumuladas por columna (predeterminado)
cumulative_by_col = sales_data.cumsum()
print("Ventas acumuladas por producto:")
print(cumulative_by_col)
print()
# Calcular las ventas acumuladas por fila
cumulative_by_row = sales_data.cumsum(axis=1)
print("Ventas acumuladas por mes:")
print(cumulative_by_row)
Resultado de la ejecución:
月度销售数据:
产品A 产品B 产品C
1月 100 80 50
2月 150 90 60
3月 120
4月 180 130 80
按产品累计销量:
产品A 产品B 产品C
1月 100 80 50
2月 250 170 110
3月 370 280 180
4月 550 410 260
按月度累计销量:
产品A 产品B 产品C
1月 100.0 180.0 230.0
2月 250.0 340.0 400.0
Análisis del código:
- Por defecto
axis=0, se calcula la suma acumulada en la dirección de las columnas. - Al configurar
axis=1, se calcula la suma acumulada en la dirección de las filas.
Notas importantes
- cumsum devuelve una nueva Series y no modifica los datos originales.
- Por defecto skipna=True, los valores NaN se omiten.
- Cuando skipna=False, encontrar un NaN hace que todos los valores posteriores se conviertan en NaN.
- En DataFrame, se puede usar el parámetro axis para controlar la dirección de la acumulación.
- El cálculo de la suma acumulada depende del orden y no se puede paralelizar.
Resumen
Series.cumsum()Es una función básica en el análisis de series temporales. Sus principales características incluyen:
- Calcula el valor acumulado desde el inicio hasta la posición actual.
- Admite el manejo de valores faltantes, que se puede controlar mediante el parámetro skipna.
- Admite el cálculo por filas o por columnas en DataFrame.
- Se aplica ampliamente en escenarios como análisis financiero, estadísticas de ventas y seguimiento de progreso.
La suma acumulada nos ayuda a comprender la tendencia de cambio de los datos a lo largo del tiempo y es una herramienta importante en el análisis de datos. Utilizada junto con otras funciones acumulativas (como cumprod, cummax, cummin), se puede obtener una visión más completa de los datos.
Otras extensiones
Funciones comunes de Pandas