目录
进阶篇29. 数据累积操作 (cumsum, cumprod)
在数据分析和特征工程中,经常需要对数据进行累积计算。例如,在金融领域,你可能需要计算股票的累计收益;在销售数据中,需要计算累计销售额。Pandas 提供了两种常用的累积操作方法:
- cumsum():用于计算累积和,将数据的每个元素与前面的元素求和。
- cumprod():用于计算累积乘积,将数据的每个元素与前面的元素相乘。
这两种方法均以向量化方式实现,能够高效处理大规模数据集。下面,我们将详细介绍它们的基本原理、数学公式和具体用法。
1. cumsum() 方法
1.1 基本概念
cumsum()
是 “cumulative sum” 的缩写,用于计算一个数组或 Series 的累积和。假设有一个数列:
x
1
,
x
2
,
…
,
x
n
x_1, x_2, \dots, x_n
x1,x2,…,xn
则累积和序列 ( S ) 定义为:
S
t
=
∑
i
=
1
t
x
i
,
t
=
1
,
2
,
…
,
n
S_t = \sum_{i=1}^{t} x_i, \quad t = 1, 2, \dots, n
St=i=1∑txi,t=1,2,…,n
例如,对于序列 [1, 2, 3, 4],累积和为 [1, 3, 6, 10]。
1.2 代码示例
import pandas as pd
import numpy as np
# 创建示例数据
data = np.array([1, 2, 3, 4, 5])
s = pd.Series(data)
# 计算累积和
cumulative_sum = s.cumsum()
print("原始数据:")
print(s)
print("\n累积和:")
print(cumulative_sum)
输出结果:
原始数据:
0 1
1 2
2 3
3 4
4 5
dtype: int64
累积和:
0 1
1 3
2 6
3 10
4 15
dtype: int64
在这个示例中,s.cumsum()
依次计算每个位置的累计和,帮助你跟踪数据随时间的累积变化。
2. cumprod() 方法
2.1 基本概念
cumprod()
是 “cumulative product” 的缩写,用于计算一个数列的累积乘积。数学上,对于一个数列:
x
1
,
x
2
,
…
,
x
n
x_1, x_2, \dots, x_n
x1,x2,…,xn
累积乘积序列 ( P ) 定义为:
P
t
=
∏
i
=
1
t
x
i
,
t
=
1
,
2
,
…
,
n
P_t = \prod_{i=1}^{t} x_i, \quad t = 1, 2, \dots, n
Pt=i=1∏txi,t=1,2,…,n
例如,对于序列 [1, 2, 3, 4],累积乘积为 [1, 2, 6, 24]。
2.2 代码示例
import pandas as pd
import numpy as np
# 创建示例数据
data = np.array([1, 2, 3, 4, 5])
s = pd.Series(data)
# 计算累积乘积
cumulative_product = s.cumprod()
print("原始数据:")
print(s)
print("\n累积乘积:")
print(cumulative_product)
输出结果:
原始数据:
0 1
1 2
2 3
3 4
4 5
dtype: int64
累积乘积:
0 1
1 2
2 6
3 24
4 120
dtype: int64
在这个示例中,s.cumprod()
将每个元素与之前所有元素相乘,生成累计乘积序列。
3. 应用场景
3.1 金融领域
- 累计收益:对于每日的收益率数据,可以利用累积乘积计算累计收益率。例如,如果每日收益率为
r
t
r_t
rt,则累计收益率为:
Cumulative Return t = ∏ i = 1 t ( 1 + r i ) − 1 \text{Cumulative Return}_t = \prod_{i=1}^{t} (1 + r_i) - 1 Cumulative Returnt=i=1∏t(1+ri)−1
可以先计算(1 + r)
的累积乘积,再减去 1。
3.2 销售数据
- 累计销售额:利用累积和计算销售数据的累计增长情况,观察销售趋势。
3.3 统计与特征工程
- 数据平滑:累积和在某些情况下可以用于数据平滑,帮助识别长期趋势。
- 构造新特征:如累计比例、累计增长率等,在机器学习模型中常作为新特征加入。
4. 性能与最佳实践
-
向量化计算
cumsum() 和 cumprod() 都是基于底层 C 语言实现的向量化运算,即使在大数据集上也能高效运行。 -
缺失值处理
在进行累积操作时,如果数据中存在 NaN,结果通常也会包含 NaN。可以使用fillna()
方法预先填充缺失值:s_filled = s.fillna(0) # 对于累积和 s_filled = s.fillna(1) # 对于累积乘积,1 是乘法单位元
-
对齐问题
累积操作结果与原始数据对齐,通常第一个结果为原始数据的第一个值。若需要其他对齐方式,可以结合 shift() 操作进行调整。
5. 综合示例:计算股票累计收益率
假设我们有一组每日股票收益率数据,计算累计收益率:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 模拟每日收益率数据(百分比形式转换为小数,例如 0.01 表示 1%)
np.random.seed(42)
dates = pd.date_range(start="2024-01-01", periods=50, freq="D")
daily_returns = np.random.normal(loc=0.001, scale=0.02, size=50) # 模拟每日小幅波动
df_returns = pd.DataFrame({'Return': daily_returns}, index=dates)
# 计算每日累计收益率
# 公式:累计收益 = cumprod(1 + Return) - 1
df_returns['Cumulative_Return'] = (1 + df_returns['Return']).cumprod() - 1
# 绘制收益率曲线
plt.figure(figsize=(10, 5))
plt.plot(df_returns.index, df_returns['Cumulative_Return'], marker='o', color='green')
plt.title('股票累计收益率')
plt.xlabel('日期')
plt.ylabel('累计收益率')
plt.grid(True)
plt.show()
在这个例子中,我们先模拟了一组每日收益率数据,然后利用 cumprod() 计算累计收益率,并将结果绘图展示。这样可以直观地看到股票在一段时间内的累计增长情况。
6. 总结
本文详细介绍了 Pandas 中的数据累积操作方法,主要包括:
- cumsum():计算累积和,数学表达为
S t = ∑ i = 1 t x i S_t = \sum_{i=1}^{t} x_i St=i=1∑txi - cumprod():计算累积乘积,数学表达为
P t = ∏ i = 1 t x i P_t = \prod_{i=1}^{t} x_i Pt=i=1∏txi
这些方法广泛应用于金融分析、销售数据、统计计算等场景。通过代码示例,你应该已掌握如何利用这些累积操作捕捉数据的累计趋势,并结合实际项目进行数据探索和特征工程。
在使用过程中,注意处理缺失值,确保数据对齐,以及合理利用向量化运算来提高性能。不断实践和调优,将帮助你在数据分析和建模过程中获得更高效、更准确的结果。
7. 参考资料
- Pandas 官方文档:DataFrame.cumsum
- Pandas 官方文档:DataFrame.cumprod
- 《Python for Data Analysis》 by Wes McKinney
希望本文能帮助你全面理解并灵活运用 Pandas 的累积操作方法,在实际数据分析中捕捉数据累计趋势,并构造出有效的特征。不断实践与优化,将使你在数据科学的道路上获得更高效、更精确的结果。