如何使用Pandas Series对连续涨跌数据段进行分组
问题根因
你原有代码的逻辑错误:直接对差分结果做累计求和后按值分组,无法作为连续涨跌段的唯一标识——累计求和值会随数值波动重复出现,根本不能区分不同的连续涨跌分段。
实现方案
核心逻辑分三步:
- 先计算序列相邻值的差分,标记每个位置相对前值的涨跌方向(上涨标记为1,下跌标记为-1,持平标记为0)
- 检测相邻位置的涨跌方向是否发生变化,每次方向变化就生成新的分组ID
- 按生成的分组ID拆分序列,同时标记每个组的涨跌类型即可
可直接运行的代码
import pandas as pd import numpy as np # 替换成你自己的目标序列self.df_dataset即可,以下为示例数据构造 data = [ 25.847718, 29.310294, 31.791339, 33.382136, 31.791339, 29.310294, 25.847718, 21.523483, 16.691068, 11.858653, 7.534418 ] dates = pd.date_range(start="2022-01-07", periods=11) s = pd.Series(data, index=dates) # 计算涨跌方向,首个值默认对齐后续的上涨方向 diff_sign = np.sign(s.diff()).fillna(1) # 检测方向变化点,生成分组ID group_id = (diff_sign != diff_sign.shift()).cumsum() # 遍历分组输出结果 for gid, sub_series in s.groupby(group_id): trend = "consecutive growth" if diff_sign[sub_series.index[0]] == 1 else "consecutive fall" print(f"Group #{gid} ({trend})") print(sub_series) print()
输出说明
代码运行后输出如下,和你预期的结构一致:
Group #1 (consecutive growth) 2022-01-07 25.847718 2022-01-08 29.310294 2022-01-09 31.791339 2022-01-10 33.382136 dtype: float64 Group #2 (consecutive fall) 2022-01-11 31.791339 2022-01-12 29.310294 2022-01-13 25.847718 2022-01-14 21.523483 2022-01-15 16.691068 2022-01-16 11.858653 2022-01-17 7.534418 dtype: float64
你给出的期望输出漏掉了2022-01-11的拐点值31.791339,该值是上涨转下跌后的第一个下跌点位,逻辑上属于连续下跌段的起始位置。如果业务规则需要剔除该拐点,可在分组后自行加过滤逻辑处理。
内容的提问来源于stack exchange,提问作者Baiel Muzuraimov
相关产品推荐
相关产品推荐

