数据处理-scipy中值滤波、pandas重采样
2020-02-23 本文已影响0人
洗洗睡吧i
1. scipy中值滤波
使用scipy中的signal.medfilt对数组进行中值滤波。
方法: scipy.signal.medfilt
- 滤波器的kernel_size必须是奇数
- 输出数组的size与输入的数组一致
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中内置了重采样的功能,可以灵活的自定义各种频率以及统计函数。
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
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