如何用pandas/matplotlib查找折线向上穿越指定水平线的有效日期点
实现方案
1. 核心逻辑说明
- 首先识别所有向上穿越y=2的点位:即上一时刻
x值小于2,当前时刻x值大于等于2 - 给两次回落至0之间的区间标记为同一个上升周期,每个周期仅保留第一个穿越y=2的点位,自动过滤同周期内重复的穿越信号
2. 代码实现
首先完成信号计算与有效点筛选:
import pandas as pd import matplotlib.pyplot as plt # 1. 计算向上穿越2的信号 df['cross_up_2'] = (df['x'] >= 2) & (df['x'].shift(1) < 2) # 2. 计算回落至0的信号,用于划分上升周期 df['drop_to_0'] = (df['x'] <= 0) & (df['x'].shift(1) > 0) # 3. 给每个上升周期打唯一ID,两次回落0之间为同一个周期 df['cycle_id'] = df['drop_to_0'].cumsum().shift(1).fillna(0).astype(int) # 4. 每个周期仅保留第一个穿越点,按时间排序 valid_cross_points = df[df['cross_up_2']].groupby('cycle_id', as_index=False).head(1).sort_index() # 5. 取前6个符合要求的日期 target_dates = valid_cross_points.head(6).index.tolist()
如果需要可视化验证结果,可以在原有绘图逻辑基础上添加标记:
# 原有绘图逻辑 plt.plot(df.index, df['x'], c='blue', label='x') plt.axhline(y=2, c='purple', linestyle='--') plt.axhline(y=5, c='purple', linestyle='--') # 标记有效穿越点用于核对 plt.scatter(valid_cross_points.index, valid_cross_points['x'], c='red', s=50, label='有效穿越点') plt.legend() plt.show()
3. 结果输出
target_dates即为符合要求的6个日期索引,可直接打印查看。
内容的提问来源于stack exchange,提问作者Faiz
相关产品推荐
相关产品推荐

