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

2020-02-23  本文已影响0人  洗洗睡吧i

1. scipy中值滤波

使用scipy中的signal.medfilt对数组进行中值滤波。

方法: scipy.signal.medfilt

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

上一篇下一篇

猜你喜欢

热点阅读