如何查找pandas DataFrame列中的最大连续增减幅度?
解决思路与实现代码
核心逻辑
要找到最大连续增幅/降幅,关键是先识别出连续上升/下降的区间,再计算每个区间内终点与起点的差值(增幅取正,降幅取起点减终点的正数值),最后取最大值。
具体实现步骤
以你的示例数组 x = [1, 2, 6, 3, 5, 9, 5, 4, 5, 1] 为例,用pandas实现:
- 转换为Series并计算相邻差值
import pandas as pd x = [1, 2, 6, 3, 5, 9, 5, 4, 5, 1] s = pd.Series(x) diff = s.diff() # 计算相邻元素差值,第一个值为NaN
- 标记连续上升/下降的区间
- 连续上升区间:当
diff>0时属于同一区间,差值≤0时开启新区间 - 连续下降区间:当
diff<0时属于同一区间,差值≥0时开启新区间
# 标记上升区间分组 up_groups = (diff <= 0).cumsum() # 标记下降区间分组 down_groups = (diff >= 0).cumsum()
- 计算每个区间的增幅/降幅并取最大值
# 最大连续增幅:每个上升区间的终点值减起点值,取最大值 max_up = s.groupby(up_groups).apply(lambda g: g.iloc[-1] - g.iloc[0]).max() # 最大连续降幅:每个下降区间的起点值减终点值,取最大值 max_down = s.groupby(down_groups).apply(lambda g: g.iloc[0] - g.iloc[-1]).max() print(f"最大连续增幅:{max_up}") # 输出6 print(f"最大连续降幅:{max_down}") # 输出5
逻辑解释
(diff <=0).cumsum():当差值≤0时(上升趋势中断),累加计数,让连续上升的部分归为同一组。示例中,连续上升的区间为[1,2,6]、[3,5,9]、[4,5],计算每个区间的终点减起点,最大值为9-3=6。(diff>=0).cumsum():当差值≥0时(下降趋势中断),累加计数,让连续下降的部分归为同一组。示例中,连续下降的区间为[6,3]、[9,5,4]、[5,1],计算每个区间的起点减终点,最大值为9-4=5。
内容的提问来源于stack exchange,提问作者dch27
相关产品推荐
相关产品推荐

