在Pandas中识别趋势连续区间的首尾值及关联信息
提取Pandas中连续趋势区间的信息
步骤说明
- 标记连续趋势组:通过比较当前行与前一行的
Trend是否不同,生成分组ID,用于聚合连续的同趋势区间。 - 聚合趋势区间信息:按分组ID聚合,提取每个区间的起止日期、起止价格。
- 添加前趋势结束价:用
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
相关产品推荐
相关产品推荐

