如何为Pandas Series实现先扩展后固定窗口的pct_change计算
实现思路与代码示例
核心逻辑
- 前N个元素(索引0到N-1):计算每个元素相对于第一个元素的变化率,公式为
(当前值 - 第一个值) / 第一个值,索引0的结果固定为0 - 从第N个元素(索引N)开始:使用固定窗口N的变化率,即Pandas原生
pct_change(periods=N)的结果
代码实现
通过三步即可完成需求:
- 计算原生固定窗口的变化率
- 生成前N个元素的自定义变化率序列
- 将自定义序列覆盖原生结果中的NaN值
完整代码
import pandas as pd def custom_pct_change(s, periods): # 生成原生固定窗口变化率 pct_result = s.pct_change(periods=periods) # 计算前periods个元素的自定义变化率 first_value = s.iloc[0] initial_pct = (s.iloc[:periods] - first_value) / first_value # 替换初始NaN值 pct_result.iloc[:periods] = initial_pct return pct_result # 测试示例1 s1 = pd.Series([1, 2, 4, 5, 6], name='Numbers') print("示例1结果:") print(custom_pct_change(s1, periods=3)) # 测试示例2 s2 = pd.Series([4, 5, 6, 7, 8, 9], name='Numbers') print("\n示例2结果:") print(custom_pct_change(s2, periods=3))
输出结果
示例1输出:
0 0.0 1 1.0 2 3.0 3 4.0 4 2.0 Name: Numbers, dtype: float64
示例2输出:
0 0.00 1 0.25 2 0.50 3 0.75 4 0.60 5 0.50 Name: Numbers, dtype: float64
扩展说明
- 若原Series存在空值,可先通过
dropna()或fillna()做预处理 - 如需支持DataFrame,只需将函数中的
iloc操作改为按列遍历处理即可
内容的提问来源于stack exchange,提问作者Ajax
相关产品推荐
相关产品推荐

