Pandas使用教程 - 数据累积操作 (cumsum, cumprod)


进阶篇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=1txi,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=1txi,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=1t(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=1txi
  • cumprod():计算累积乘积,数学表达为
    P t = ∏ i = 1 t x i P_t = \prod_{i=1}^{t} x_i Pt=i=1txi

这些方法广泛应用于金融分析、销售数据、统计计算等场景。通过代码示例,你应该已掌握如何利用这些累积操作捕捉数据的累计趋势,并结合实际项目进行数据探索和特征工程。

在使用过程中,注意处理缺失值,确保数据对齐,以及合理利用向量化运算来提高性能。不断实践和调优,将帮助你在数据分析和建模过程中获得更高效、更准确的结果。


7. 参考资料


希望本文能帮助你全面理解并灵活运用 Pandas 的累积操作方法,在实际数据分析中捕捉数据累计趋势,并构造出有效的特征。不断实践与优化,将使你在数据科学的道路上获得更高效、更精确的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲人编程

你的鼓励就是我最大的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值