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

Pandas时间序列数据精简:如何在保留趋势的同时有效缩减数据点?

时间序列数据自适应缩减方案及专业术语解析

一、专业名称界定

你要的这种根据数据变化程度动态调整采样密度的缩减方法,专业上称为自适应采样(Adaptive Sampling),也可归类为数据简化(Data Simplification)。

区分你提到的两个术语:

  • Data Thinning:通常指固定间隔或随机剔除数据点,完全不考虑数据本身的变化趋势,属于无差别缩减,不符合你的需求。
  • Resampling:指按固定时间/数量间隔重新采样(比如将秒级数据降采样为分钟级),同样是规则化的采样,无法做到“变化剧烈处多保留、平稳处少保留”。

二、核心实现方法

1. Ramer-Douglas-Peucker(RDP)算法

这正是匹配你需求的经典算法,它通过几何简化的方式,自动识别并保留对整体趋势影响大的点,剔除偏离趋势误差小于阈值的冗余点,适合需要保留序列整体形状的场景。

Python实现示例:

from rdp import rdp
import pandas as pd

# 假设你的DataFrame包含时间戳(转为数值型,比如Unix时间戳)和目标参数列
df['timestamp_num'] = df['timestamp'].astype(int)
# 提取时间-参数的二维点数组
points = df[['timestamp_num', 'target_param']].values

# 设定epsilon阈值:值越小,保留的点越多(需根据数据波动幅度调整)
simplified_points = rdp(points, epsilon=1.2)

# 将简化后的点转回DataFrame,并匹配原数据的其他列
simplified_df = pd.DataFrame(simplified_points, columns=['timestamp_num', 'target_param'])
simplified_df = simplified_df.merge(df.drop_duplicates('timestamp_num'), on='timestamp_num', how='left')
simplified_df = simplified_df.drop('timestamp_num', axis=1)

2. 基于差分的自适应采样

如果更关注局部突变,可直接通过计算相邻点的变化幅度来筛选,同时搭配定期保留基准点,避免平稳段完全丢失趋势信息。

Python实现示例:

import pandas as pd

# 计算目标参数的相邻变化幅度
df['param_diff'] = df['target_param'].abs().diff()

# 设定筛选规则:
# - 变化幅度超过阈值的点保留
# - 每隔1000个点保留一个基准点(防止长时间平稳段无数据)
# - 强制保留首尾点
threshold = 0.8
filter_mask = (df['param_diff'] > threshold) | \
              (df.index % 1000 == 0) | \
              (df.index == 0) | \
              (df.index == len(df)-1)

# 生成简化后的DataFrame
simplified_df = df[filter_mask].drop('param_diff', axis=1)

三、方法选择建议

  • 若需严格保留序列的整体趋势形状(比如绘制趋势图、做模式识别),优先选RDP算法。
  • 若更关注局部突变点,且需要更灵活的筛选规则,选基于差分的自适应采样。
    两者都能实现“变化剧烈处多保留、平稳处少保留”的核心需求,可根据你的分析场景调整参数优化效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:43:08