1. scipy中值滤波
使用scipy中的signal.medfilt对数组进行中值滤波。
方法: scipy.signal.medfilt
- 滤波器的kernel_size必须是奇数
- 输出数组的size与输入的数组一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import scipy.signal as signal import matplotlib.pyplot as plt import numpy as np import pandas as pd
n = 51 y = np.sin(np.linspace(0, 10, n)) + np.random.rand(n) y_med = signal.medfilt(y, kernel_size=5)
plt.figure() plt.plot(y, 'r--', label='y') plt.plot(y_med, 'b-.', label='y_med') plt.legend() plt.show()
|
signal.medfilt还可以对矩阵(图像)进行滤波处理,以消除噪音。
ref: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.medfilt.html
2. pandas重采样
(1) pandas可对时间序列进行重采样
对带有时间序列的DataFrame,pandas中内置了重采样的功能,可以灵活的自定义各种频率以及统计函数。
1 2 3 4 5 6 7 8 9 10 11 12 13
| n = 51 index = pd.date_range('2019-01-01 00:00:00', periods=n, freq='S') y = np.sin(np.linspace(0, 10, n)) + np.random.rand(n)
dt = pd.DataFrame({'value': y}, index=index) dt = dt.resample('5S').mean() print(dt.head())
plt.figure() plt.plot(index, y, 'r--', label='y') plt.plot(dt.index, dt['value'], 'b-.', label='y_resample') plt.legend() plt.show()
|
(2) 对非时间序列的重采样
引入时间差序列: timedelta_range
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| n = 51 t = np.linspace(0, 10, n) x = np.sin(t) + np.random.rand(n)
index = pd.timedelta_range(0, periods=n, freq='s') dt = pd.DataFrame({'key': np.arange(n), 'value': x}, index=index) dt = dt.resample('5s').mean() print(dt.head())
plt.figure() plt.plot(np.arange(n), x, 'r--', label='x') plt.plot(dt['key'], dt['value'], 'b-.', label='x_resample') plt.legend() plt.show()
|
ref:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html