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

在Pandas中识别趋势连续区间的首尾值及关联信息

提取Pandas中连续趋势区间的信息

步骤说明

  1. 标记连续趋势组:通过比较当前行与前一行的Trend是否不同,生成分组ID,用于聚合连续的同趋势区间。
  2. 聚合趋势区间信息:按分组ID聚合,提取每个区间的起止日期、起止价格。
  3. 添加前趋势结束价:用shift()方法获取上一个区间的结束价格。

完整代码实现

import pandas as pd
import numpy as np

# 生成原始数据
df2 = pd.DataFrame({
    'Price': [0.0, 3.6, 9.3, 4.5, 2.9, 3.2, 1.0, 6.7, 8.7, 9.8, 3.4, .7, 2.2, 6.5, 3.4, 1.7, 9.4, 10.0],
    'PriceDate': ['2023-10-01', '2023-10-02', '2023-10-03', '2023-10-04', '2023-10-05', '2023-10-06', 
                  '2023-10-07', '2023-10-08', '2023-10-09', '2023-10-10', '2023-10-11', '2023-10-12', 
                  '2023-10-13', '2023-10-14', '2023-10-15', '2023-10-16', '2023-10-17']
})

# 标记每日趋势
df2['Trend'] = np.where(df2['Price'] > df2['Price'].shift(), "UPTREND", "DOWNTREND")

# 1. 生成连续趋势的分组ID:当Trend与前一行不同时,分组ID+1
df2['TrendGroup'] = (df2['Trend'] != df2['Trend'].shift()).cumsum()

# 2. 聚合每个趋势区间的关键信息
trend_runs = df2.groupby('TrendGroup').agg(
    Trend=('Trend', 'first'),
    StartDate=('PriceDate', 'first'),
    EndDate=('PriceDate', 'last'),
    StartPrice=('Price', 'first'),
    EndPrice=('Price', 'last')
).reset_index(drop=True)

# 3. 添加前一个趋势的结束价格
trend_runs['PrevTrendEndPrice'] = trend_runs['EndPrice'].shift(1)

# 查看结果
print(trend_runs)

输出结果示例

Trend   StartDate     EndDate  StartPrice  EndPrice  PrevTrendEndPrice
0  DOWNTREND  2023-10-01  2023-10-01         0.0       0.0                NaN
1    UPTREND  2023-10-02  2023-10-03         3.6       9.3                0.0
2  DOWNTREND  2023-10-04  2023-10-05         4.5       2.9                9.3
3    UPTREND  2023-10-06  2023-10-06         3.2       3.2                2.9
4  DOWNTREND  2023-10-07  2023-10-07         1.0       1.0                3.2
5    UPTREND  2023-10-08  2023-10-10         6.7       9.8                1.0
6  DOWNTREND  2023-10-11  2023-10-12         3.4       0.7                9.8
7    UPTREND  2023-10-13  2023-10-14         2.2       6.5                0.7
8  DOWNTREND  2023-10-15  2023-10-16         3.4       1.7                6.5
9    UPTREND  2023-10-17  2023-10-17         9.4      10.0                1.7

关键细节说明

  • TrendGroup生成:通过df2['Trend'] != df2['Trend'].shift()判断趋势是否切换,cumsum()累加得到唯一的连续区间ID,确保同趋势的连续行被分到同一组。
  • 聚合逻辑:用first()和last()分别提取区间的起始、结束值,因为连续区间内的Trend一致,所以Trend取first()即可。
  • PrevTrendEndPrice:shift(1)会将上一行的EndPrice移到当前行,第一个区间没有前趋势,所以显示NaN,可根据需求用fillna()处理。

内容的提问来源于stack exchange,提问作者Stumbling Through Data Science

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:10:27