You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:57:22