Pythonic方法提取DataFrame中完整波峰/波谷区域
高效提取最近的完整波峰/波谷数据
核心思路
通过识别数据穿越0的临界点,快速锁定完整波峰/波谷的区间,全程基于向量运算实现,彻底替代低效的循环迭代。
实现步骤与代码
定位穿越0的临界点
利用数据点的符号变化(正/负/0),找出所有数据穿越0的位置,这些位置是划分完整波动区间的关键节点。匹配目标区间
根据最新数据的正负性,选取最后一组已完成的对应波动区间:
- 最新数据为负时,取“从正/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
相关产品推荐
相关产品推荐

