重新采样时间序列/频谱数据以减少维度[Python:SciPy]

2019年3月26日

当您想在Python的DataFrame中稀疏时间序列/频谱数据时,这是一种方法。

使用“ pandas.DataFrame.resample”,必须使用参数设置时间(例如D(每天)和W(每周))。如果要稀疏没有日期和时间列的时间序列数据或频谱数据,则可以使用以下方法。

什么是时间序列/频谱数据?

沿某个轴以固定间隔观察时间序列/频谱数据。数据系列适用。例如,股票价格和吸收光谱的变化。

时间序列数据示例 光谱数据示例
・温度和降水条件的转变
・交通状况的变化
・每日销售
・股价变动
・比特币价格的变化
・语音数据
-化合物吸收光谱(IR,UV)
・天体的光谱

尽管每种分类都不同,但是数据具有以下相似的特征。

  1. 与测量点相邻的点取近似值
  2. 长期(大范围)内包括噪声

参照: https://kotobank.jp/word/%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF-1329677 https://datachemeng.com/preprocessspectratimeseriesdata/

重新采样时间序列/频谱数据

在基于时间序列/频谱数据创建预测模型时,如果使用所有测量点的数据,则会创建大量特征。由于这导致过度拟合,因此通过下采样进行尺寸减小对于提高泛化性能是有效的。

使用方法:SciPy(scipy.signal)

用于数学,科学和工程的开源软件Ware生态系统(各种高级科学计算库)。

它可以执行比NumPy更高级的数值算术处理,并且可以轻松地根据物理常数,稀疏矩阵和概率分布执行数值积分,信号处理,优化,统计等。

scipy.signal是与scipy中的波形处理相关的模块。

  • scipy.signal.decimate

从scipy导入信号将numpy作为np导入#创建基础的40点波形数据x = np.linspace(0,10,40,端点= False)y = np.cos(-x ** 2/6)#下采样到基于数据的20点x_down = np.linspace(0,10,20,端点= False)y_down = signal.decimate(y,2)#下采样到2/1#在图形上绘制结果%matplotlib内联plt.plot (x,y,'.-',label ='data')plt.plot(x_down,y_down,'rs-',label ='down-sampled',alpha = 0.5)plt.legend()plt.show( )
使用scipy.signal.decimate进行下采样
使用scipy.signal.decimate进行下采样

scipy.signal.decimate执行抗混叠处理和下采样(抗混叠处理是为了消除以固定间隔从连续数据中采样时消除失真的处理)。重新采样的方式与减少数据点的方式类似。

另请参见:https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.signal.decimate.html

  • scipy.signal.resample

#创建40个基本波形数据x = np.linspace(0,10,40,端点= False)y = np.cos(-x ** 2/6)#基于数据的2.5倍上采样到100点x_up = np .linspace(0,10,100,端点= False)y_up = signal.resample(y,100)#根据数据x_down = np下采样到一半20点。 signal.resample(y,0)#将结果绘制在图形导入matplotlib.pyplot上,作为plt%matplotlib内联plt.plot(x,y,'。 ,'go-',label ='up-sampled',alpha = 10)plt.legend()plt.show()plt.plot(x,y,'.-',label ='data')plt.plot (x_down,y_down,'rs-',label ='down-sampled',alpha = 20)plt.legend()plt.show()
scipy.signal.resample处理的波形数据
scipy.signal.resample处理的波形数据

由于scipy.signal.resample是使用傅立叶变换进行重采样的,因此它基于信号是周期性的假设。如果不满足周期性要求(例如在上述数据的末尾),则该值将显着偏离。

顺便说一句,scipy.signal.resample也可以进行上采样。
蓝线是原始数据点,绿色是上采样后的图,红色是下采样后的图。

 

kaggle语音分析比赛中也有一个用法示例,因此将很有帮助。

另请参见:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.resample.html

适用于DataFrame

行是每个测量点,列是每个样本数据帧。

将pandas导入为pd#创建要存储在数据框中的数据y1 = np.cos(-x ** 2/6)* 1/2 y2 = np.cos(x)* 1/3 df1 = pd.DataFrame( {{'y':y,'y1':y1,'y2':y2})#下采样df1_down = signal.decimate(df1,2,轴= 0)df1_down = pd.DataFrame(df1_down,列= ['y_down ','y1_down','y2_down'],index = np.linspace(0,10,20,endpoint = False))#显示降采样的数据并打印打印(df1.head(10))打印(df1_down.head)( 10))df1.plot(种类='line',标记='。')df1_down.plot(种类='line',标记='。')
df1.head(10)df1_down.head(10)
 df1.head(10)df1_down.head(10)
下采样前后的数据点
下采样前下采样后

即使您从原始的40个点降采样为1个点(即2/20),也可以高精度地保持该波形,并且即使将其用作功能部件,也似乎几乎没有信息丢失。

一个数据框的示例,其中每个样本的行和每个测量点的列
当行是每个样本,列是每个测量点时

如果上面的行是每个样本,而列是每个测量点的数据框(所谓的有序数据),则参数axis=1如果是这样,那没关系。