在Python中实现滑动平均值可以通过多种方法,以下是几种常见的方法:
方法一:使用NumPy的`convolve`函数
```python
import numpy as np
def moving_average(data, window_size):
window = np.ones(int(window_size)) / float(window_size)
return np.convolve(data, window, 'same')
方法二:使用列表生成式
```python
def moving_average_list(lst, window_size):
return [sum(lst[i:i+window_size])/window_size for i in range(len(lst)-window_size+1)]
方法三:使用Pandas进行时间序列数据的滑动平均
```python
import pandas as pd
def moving_average_pandas(data, window_size):
return data.rolling(window=window_size).mean()
方法四:使用滑动窗口函数处理时间序列数据
```python
from pandas.tseries.offsets import Day
from pandas.tseries.resample import TimeGrouper
def sliding_window(data, window_size, freq='D'):
data = data.asfreq(freq)
grouped = data.groupby(TimeGrouper(freq=freq, closed='right', label='right'))
return grouped.mean()
方法五:使用NumPy的`cumsum`和切片操作
```python
def moving_average_cumsum(data, window_size):
cumsum_vec = np.cumsum(data)
return (cumsum_vec[window_size:] - cumsum_vec[:-window_size]) / window_size
示例使用
```python
生成随机数据
import numpy as np
import timeit
lst = np.random.random((10000,))
使用NumPy的convolve函数计算滑动平均值
start_time = timeit.default_timer()
ma_np = moving_average(lst, 5)
end_time = timeit.default_timer()
print(f"NumPy Convolve time: {end_time - start_time}")
使用列表生成式计算滑动平均值
start_time = timeit.default_timer()
ma_list = moving_average_list(lst, 5)
end_time = timeit.default_timer()
print(f"List Comprehension time: {end_time - start_time}")
以上方法都可以用来计算滑动平均值,你可以根据具体的需求和场景选择合适的方法。需要注意的是,平滑窗口大小(`window_size`)通常需要是奇数,以便在两端平滑处理。