提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
轨迹数据大多是由GPS设备从原始的嘈杂环境中采样而来,对 GPS 轨迹数据进行平滑滤波处理的主要目的是消除或减少由于信号采集和信号传输的过程中含有的不确定性和波动,从而减少噪声影响和提高精度和可靠性。
车辆轨迹数据的基本格式如下:
collect_time | id | lon | lat |
---|---|---|---|
时间 | 车辆标识 | 经度 | 纬度 |
本文提供了两种对时序经纬度的轨迹数据进行平滑滤波的python方法实现。
一、滑动平均滤波
1.基本介绍
滑动滤波器(Moving Average Filter)是一种常见的信号处理技术,用于平滑时间序列数据或信号。它的基本原理是利用窗口内的数据点进行加权平均,从而减少噪声和突发波动,得到更平滑的输出。
滑动滤波方法大致可分为:简单滑动平均、加权滑动平均、指数加权移动平均。其原理基本相同,区别在于:简单滑动平均的窗口中所有数据的权重相同,加权滑动平均的窗口中不同数据所占权重由用户指定,指数加权移动平均的窗口中不同数据所占权重由历史数据计算而来。
这里不介绍各种滑动滤波方法的具体数学原理,只提供简单滑动平均的实现代码。如有需要使用其他的滑动平均方法,可以自行搜索其数学原理,互联网上有海量的解释文章,进而对代码稍作更改即可。
2.代码
moving_average_with_padding函数使用了pandas和numpy库。输入数据data为pandas的series格式,表示需要平滑的那一列数据;输入数据window_size为整数格式,表示滑动窗口的大小。
对于大小为window_size的当前窗口,窗口位于最中间的数据用整个窗口的均值来代替,接着窗口向右移动一格,如此计算直至边界条件。
需要注意的是,整个数据集最左边的window_size // 2个数据是没有被平滑处理的,整个数据集最右边的window_size - left_window_size - 1个数据也是没有被平滑处理的。这是滑动窗口法自身的缺陷,因此代码单独平滑处理了左边缘和右边缘的数据。
# 定义平均滑动窗口函数
def moving_average_with_padding(data, window_size):
smoothed = np.zeros_like(data)
weights = np.repeat(1.0, window_size) / window_size
left_window_size = window_size // 2
right_window_size = window_size - left_window_size - 1
# 平滑左边缘数据
for i in range(left_window_size):
smoothed[i] = np.mean(data[:i + 1])
# 平滑右边缘数据
for i in range(len(data) - right_window_size, len(data)):
smoothed[i] = np.mean(data[i:i + right_window_size])
# 应用滑动平均
for i in range(left_window_size, len(data) - right_window_size):
smoot