滑动时间窗口下DataFrame中percentage_change列的乘积计算需求
滑动窗口内百分比变化的乘积计算方案
问题描述
我有一个包含date和percentage_change两列的DataFrame,需要计算不同滑动窗口内percentage_change的乘积:
- 窗口大小=2时,计算相邻2行的乘积,共得到9个结果;
- 窗口大小=3时,计算连续3行的乘积,共得到8个结果;
- 窗口大小=9时,计算连续9行的乘积,共得到2个结果。
原始DataFrame数据:
date percentage_change 2010-01-01 1.1 2011-01-01 0.95 2013-01-01 1.3 2014-01-01 1.2 2015-01-01 1.1 2016-01-01 0.8 2017-01-01 0.6 2018-01-01 1.1 2019-01-01 1.7 2020-01-01 0.9
解决方案
使用Pandas的rolling()方法结合prod()函数可以直接实现滑动窗口乘积计算,步骤如下:
1. 构造DataFrame
import pandas as pd data = { 'date': ['2010-01-01', '2011-01-01', '2013-01-01', '2014-01-01', '2015-01-01', '2016-01-01', '2017-01-01', '2018-01-01', '2019-01-01', '2020-01-01'], 'percentage_change': [1.1, 0.95, 1.3, 1.2, 1.1, 0.8, 0.6, 1.1, 1.7, 0.9] } df = pd.DataFrame(data)
2. 计算不同窗口的滑动乘积
窗口大小=2
# 计算滑动乘积并去除NaN值 window_2_prod = df['percentage_change'].rolling(window=2).prod().dropna() # 关联对应的日期范围,让结果更直观 window_2_result = pd.DataFrame({ 'date_range': [f"{df['date'].iloc[i]} → {df['date'].iloc[i+1]}" for i in range(len(df)-1)], 'product': window_2_prod.values }) print("窗口大小=2的结果:") print(window_2_result)
输出结果包含9条记录,对应每相邻两行的乘积。
窗口大小=3
window_3_prod = df['percentage_change'].rolling(window=3).prod().dropna() window_3_result = pd.DataFrame({ 'date_range': [f"{df['date'].iloc[i]} → {df['date'].iloc[i+2]}" for i in range(len(df)-2)], 'product': window_3_prod.values }) print("\n窗口大小=3的结果:") print(window_3_result)
输出结果包含8条记录。
窗口大小=9
window_9_prod = df['percentage_change'].rolling(window=9).prod().dropna() window_9_result = pd.DataFrame({ 'date_range': [f"{df['date'].iloc[i]} → {df['date'].iloc[i+8]}" for i in range(len(df)-8)], 'product': window_9_prod.values }) print("\n窗口大小=9的结果:") print(window_9_result)
输出结果包含2条记录。
关键说明
rolling(window=N)会创建一个大小为N的滑动窗口,默认从当前行向前取N行数据;prod()自动计算窗口内所有数值的乘积;dropna()用于去除前N-1个未填满窗口的NaN值,得到符合需求的结果数量。
内容的提问来源于stack exchange,提问作者David95
相关产品推荐
相关产品推荐

