数据处理-scipy中值滤波、pandas重采样

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