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

如何移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:05:19