如何移除Pandas时间序列中满足平稳条件的区间行?
用Pandas删除DataFrame中近似平稳的连续区间行
核心思路
不用逐行遍历,利用Pandas的滚动窗口(rolling)功能,计算连续x个样本的最值差,判断是否处于允许的偏差范围内,再标记并删除整个平稳区间的行。
代码实现
1. 准备示例数据
import pandas as pd import numpy as np # 构造包含平稳区间的示例DataFrame df = pd.DataFrame({ 'value': [1.0, 1.1, 0.9, 2.0, 3.0, 3.2, 2.9, 3.1, 4.0, 5.0, 5.0, 5.0] })
2. 定义参数
x = 3 # 需要检测的连续样本数 epsilon = 0.3 # 允许的偏差范围(最值差不超过此值即视为近似平稳)
3. 计算平稳区间标记
# 计算每个滚动窗口内的最大值和最小值 window_max = df['value'].rolling(window=x).max() window_min = df['value'].rolling(window=x).min() # 窗口内最值差 window_diff = window_max - window_min # 标记窗口内满足条件的位置 mask = window_diff <= epsilon # 扩展标记:将窗口内的所有x个样本都标记为待删除 for i in range(x-1): mask = mask | mask.shift(-i) # 处理shift产生的NaN,将其设为False(不标记) mask = mask.fillna(False)
4. 过滤数据
# 保留未被标记的行 df_filtered = df[~mask]
扩展说明
- 处理多列场景:如果需要同时检查多列的平稳性,可对每列单独生成标记,再根据需求取交集或并集:
cols = ['value1', 'value2'] final_mask = pd.Series([False]*len(df), index=df.index) for col in cols: window_max = df[col].rolling(window=x).max() window_min = df[col].rolling(window=x).min() window_diff = window_max - window_min mask_col = window_diff <= epsilon for i in range(x-1): mask_col = mask_col | mask_col.shift(-i) mask_col = mask_col.fillna(False) final_mask = final_mask | mask_col # 只要一列满足就删除;若需多列都满足则替换为& df_filtered = df[~final_mask] - 性能优化:避免使用
rolling.apply(),直接用rolling.max()和rolling.min()计算,效率更高,适合处理大数据量。
内容的提问来源于stack exchange,提问作者Jonas Grindalen
相关产品推荐
相关产品推荐

