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

Pythonic方法提取DataFrame中完整波峰/波谷区域

高效提取最近的完整波峰/波谷数据

核心思路

通过识别数据穿越0的临界点,快速锁定完整波峰/波谷的区间,全程基于向量运算实现,彻底替代低效的循环迭代。

实现步骤与代码

  1. 定位穿越0的临界点
    利用数据点的符号变化(正/负/0),找出所有数据穿越0的位置,这些位置是划分完整波动区间的关键节点。

  2. 匹配目标区间
    根据最新数据的正负性,选取最后一组已完成的对应波动区间:

  • 最新数据为负时,取“从正/0进入负区间→再回到0/正”的完整区间,即最近的波谷;
  • 最新数据为正时,取“从负/0进入正区间→再回到0/负”的完整区间,即最近的波峰。

完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 示例数据
data = pd.DataFrame(
    [1, 2, 3, 4, 3.7, 3.5, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -6.3, -6, -5.9, -5.3, -5, -4, -3, -2, 0, 1, 2, 4, 5, 3,
     2, 1, -1, -2], columns=['T'])

# 1. 计算符号序列并识别穿越0的临界点
signs = np.sign(data['T'])
# 找出符号发生变化的位置(含0与非0的切换)
cross_points = signs.ne(signs.shift()).dropna()
cross_indices = cross_points[cross_points].index.tolist()

# 2. 根据最新数据符号提取目标区间
latest_sign = signs.iloc[-1]
target_df = pd.DataFrame()

if latest_sign < 0:
    # 提取最近的完整波谷
    start_idx = cross_indices[-2] + 1
    end_idx = cross_indices[-1] - 1
    target_df = data.loc[start_idx:end_idx]
elif latest_sign > 0:
    # 提取最近的完整波峰
    start_idx = cross_indices[-2] + 1
    end_idx = cross_indices[-1] - 1
    target_df = data.loc[start_idx:end_idx]

# 验证结果
print("提取的完整波谷数据:")
print(target_df['T'].tolist())

# 可视化对比
plt.plot(data, label='原始数据')
plt.plot(target_df, label='提取的完整波谷', linewidth=3, color='orange')
plt.axhline(y=0.0, color='r', linestyle='-')
plt.legend()
plt.show()

补充说明

  • 该方法依赖Pandas与NumPy的向量运算,处理数百行数据的效率远高于循环迭代;
  • 临界点识别覆盖了所有穿越0的场景,确保区间划分准确;
  • 若数据存在特殊边界(如开头无初始穿越点),可在cross_indices生成后补充判断逻辑。

内容的提问来源于stack exchange,提问作者user176301

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:40:27