Pandas中自动提取时序序列下跌点、峰值点的数值与日期
时序关键拐点自动提取实现方案
替代手动日期切片的核心思路
原来手动切区间取极值的逻辑,本质是在人工划分的趋势段落里找局部反转点。自动化实现不需要人工定区间,只要做三步:
- 对原始时序做平滑去噪,过滤短期波动带来的伪拐点
- 用内置的极值检测算法,批量识别全序列内所有的波峰、波谷位置
- 按照三类目标点位的出现顺序、相对位置规则,从所有检测到的极值里匹配对应目标
可直接复用的代码
除原有pandas依赖外,需要安装scipy提供的极值检测能力,执行pip install scipy即可完成安装。代码逻辑完全兼容原有数据读取流程,无需重写基础部分:
import pandas as pd import numpy as np from scipy.signal import find_peaks # 原有数据读取逻辑完全保留 df = pd.read_csv(r"D:\Data\2015_20.csv", parse_dates=["Date"]) df = df[["Date", "Mean"]] df = df.set_index("Date").sort_index() # 强制按日期排序,避免数据乱序干扰检测 # 补全缺失日期,避免时间轴错位 df = df.resample('D').asfreq().interpolate() # 对原始序列做平滑,消除短期毛刺 smooth_window = 7 # 根据数据颗粒度调整:日频取7,周频取4,月频取2 df['smoothed_mean'] = df['Mean'].rolling(window=smooth_window, center=True).mean().bfill().ffill() # 批量识别全序列波谷(下跌段的拐点) prominence = 0.5 # 有效拐点的最小波动幅度,检测结果偏多就调大,漏检就调小 valley_pos, _ = find_peaks(-df['smoothed_mean'], prominence=prominence) valley_dates = df.index[valley_pos] valley_vals = df['smoothed_mean'].iloc[valley_pos] # 批量识别全序列波峰(上涨/下跌转折的拐点) peak_pos, _ = find_peaks(df['smoothed_mean'], prominence=prominence) peak_dates = df.index[peak_pos] peak_vals = df['smoothed_mean'].iloc[peak_pos] # 按规则匹配三类目标点位 # 1. 首个下跌拐点:序列中最早出现的波谷 p1_date = valley_dates[0] p1_val = valley_vals.iloc[0] # 2. 阶段性峰值:首个下跌拐点之后,序列达到的最高波峰 post_p1_peaks = peak_dates[peak_dates > p1_date] post_p1_vals = peak_vals[peak_dates > p1_date] p2_idx = post_p1_vals.argmax() p2_date = post_p1_peaks[p2_idx] p2_val = post_p1_vals.iloc[p2_idx] # 3. 峰值后再度下跌的拐点:阶段性峰值之后出现的第一个波峰 post_p2_peaks = peak_dates[peak_dates > p2_date] post_p2_vals = peak_vals[peak_dates > p2_date] p3_date = post_p2_peaks[0] p3_val = post_p2_vals.iloc[0] # 输出结果,对齐原有打印格式 print("首个下跌拐点: 日期={}, 数值={:.2f}".format(p1_date.date(), p1_val)) print("阶段性峰值拐点: 日期={}, 数值={:.2f}".format(p2_date.date(), p2_val)) print("峰值后下跌拐点: 日期={}, 数值={:.2f}".format(p3_date.date(), p3_val))
调优指南
- 如果检测到的拐点数量远多于实际需要的关键节点,就把
prominence参数调大,过滤掉波动幅度小的无效拐点 - 如果关键拐点被漏检,就适当减小
prominence的取值,一般这个值取全序列标准差的1/3~1/5比较合适 - 如果长期趋势被过度平滑,就减小
rolling的窗口长度,保留更多趋势细节
内容的提问来源于stack exchange,提问作者user286076
相关产品推荐
相关产品推荐

