当前位置: 首页 > 后端技术 > Python

这个神奇的库可以平滑数据,找出异常点

时间:2023-03-25 23:57:26 Python

在处理数据的时候,我们经常会遇到一些不连续的散乱时间序列数据:有时候,这样散乱的数据不利于我们对数据进行聚类和预测。因此,我们需要对它们进行平滑处理,如下图所示:如果去掉散点和它们的范围区间,平滑后的效果是这样的:这个时序数据看起来是不是舒服很多?此外,使用平滑的时间序列数据进行聚类或预测可能会有惊人的结果,因为它去除了一些偏差值并细化了数据的分布范围。如果我们自己开发这样的平滑工具,会花费很多时间。因为平滑的技巧很多,需要一个一个研究,找到最合适的技巧,然后写代码,这是一个非常耗时的过程。平滑技术包括但不限于:指数平滑各种窗口类型的卷积平滑(常数、Hanning、Hamming、Bartlett、Blackman)频谱平滑傅立叶变换多项式平滑各种样条平滑(线性、三次、自然三次)高斯平滑二元平滑幸运的是,一些大佬已经为我们实现了这些时间序列的平滑技术,并在GitHub上开源了这个模块的代码——它就是Tsmoothie模块。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。(方案一)如果使用Python进行数据分析,可以直接安装Anaconda,Anaconda内置了Python和pip。(方案二)另外,推荐大家使用VSCode编辑器,优点很多。请选择以下方式之一输入命令安装依赖项:Windows环境打开Cmd(开始-运行-CMD)。MacOS环境打开Terminal(command+空格进入Terminal)。如果您使用的是VSCode编辑器或Pycharm,则可以直接使用界面底部的Terminal。pipinstalltsmoothie(PS)Tsmoothie仅支持Python3.6及以上版本。2.Tsmoothie的基本使用为了尝试Tsmoothie的效果,我们需要生成随机数据:importnumpyasnpiimportmatplotlib.pyplotaspltfromtsmoothie.utils_funcimportsim_randomwalkfromtsmoothie.smoothieimportLowessSmoother#生成3组随机数据长度为200np.random.seed(123)data=sim_randomwalk(n_series=3,timesteps=200,process_noise=10,measure_noise=30)然后用Tsmoothie进行平滑:#Smoothsmoother=LowessSmoother(smooth_fraction=0.1,iterations=1sm)data)通过smoother.smooth_data你就可以获取平滑后的数据:print(smoother.smooth_data)#[[5.214629283.078980760.93933646-1.19847767-3.32294934#-5.40678762-7.42425709-9.36150892-11.23591897-13.05271523#..........在范围区域,我们可以检测异常值:可以看出,蓝色范围之外的点都是异常值。我们可以很容易地标记或记录这些异常值,以供后续处理。_low,_up=smoother.get_intervals('sigma_interval',n_sigma=2)series['low']=np.hstack([series['low'],_low[:,[-1]]])series['向上']=np.hstack([series['up'],_up[:,[-1]]])is_anomaly=np.logical_or(series['original'][:,-1]>series['up'][:,-1],series['original'][:,-1]up或data0:not_zeros=pltargs['ano_id'][pltargs['ano_id']!=0]-1ax.scatter(not_zeros,pltargs['original'][1:][not_zeros],c='red',alpha=1.)np.random.seed(42)n_series,timesteps=3,200data=sim_randomwalk(n_series=n_series,timesteps=timesteps,process_noise=10,measure_noise=30)window_len=20fig=plt.figure(figsize=(18,10))camera=Camera(fig)axes=[plt.subplot(n_series,1,ax+1)foraxinrange(n_series)]series=defaultdict(partial(np.ndarray,shape=(n_series,1),dtype='float32'))foriintqdm(范围(时间步长+1),总计=(时间步长+1)):如果i>window_len:smoother=ConvolutionSmoother(window_len=window_len,window_type='ones')smoother.smooth(系列['原始'][:,-window_len:])系列['smooth']=np.hstack([系列['smooth'],smoother.smooth_data[:,[-1]]])_low,_up=smoother.get_intervals('sigma_interval',n_sigma=2)系列['低']=np.hstack([系列['低'],_low[:,[-1]]])系列['向上']=np.hstack([系列['向上'],_up[:,[-1]]])is_anomaly=np.logical_or(系列['原始'][:,-1]>series['up'][:,-1],series['original'][:,-1]继续series['original']=np.hstack([series['original'],data[:,[i]]])print('CREATINGGIF...')#可能需要几秒钟camera._photos=[camera._photos[-1]]+camera._photosanimation=camera.animate()animation.save('animation1.gif',codec="gif",writer='imagemagick')plt.close(fig)print('DONE')注意不是所有的异常点都是负数,在不同的应用场景中,它们可能代表不同的含义例如,在股票中,它可能代表市场波动中某种趋势反转的信号。或者在家庭用电分析中,它可能代表某一时刻的用电峰值。根据这个峰值,我们就可以知道此时打开了什么样的电器。因此,异常点的作用需要根据不同的应用场景进行分析,才能找到其真正的价值。总而言之,Tsmoothie不仅可以使用多种平滑技术对我们的时间序列数据进行平滑处理,让我们的模型训练更加有效,还可以根据平滑结果发现数据中的异常值,是我们做任务的好工具数据分析和研究的好帮手,非常有价值。这是我们文章的结尾。如果喜欢今天的Python实战教程,可以关注公众号:Python编程学习圈,了解更多编程技巧。