python库Tsmoothie模块数据平滑化异常点抓取


Posted in Python onJune 10, 2022

前言

在处理数据的时候,我们经常会遇到一些非连续的散点时间序列数据:

python库Tsmoothie模块数据平滑化异常点抓取

有些时候,这样的散点数据是不利于我们进行数据的聚类和预测的。因此我们需要把它们平滑化,如下图所示:

python库Tsmoothie模块数据平滑化异常点抓取

如果我们将散点及其范围区间都去除,平滑后的效果如下:

python库Tsmoothie模块数据平滑化异常点抓取

这样的时序数据是不是看起来舒服多了?此外,使用平滑后的时序数据去做聚类或预测或许有令人惊艳的效果,因为它去除了一些偏差值并细化了数据的分布范围。

如果我们自己开发一个这样的平滑工具,会耗费不少的时间。因为平滑的技术有很多种,你需要一个个地去研究,找到最合适的技术并编写代码,这是一个非常耗时的过程。平滑技术包括但不限于:

  • 指数平滑
  • 具有各种窗口类型(常数、汉宁、汉明、巴特利特、布莱克曼)的卷积平滑
  • 傅立叶变换的频谱平滑
  • 多项式平滑
  • 各种样条平滑(线性、三次、自然三次)
  • 高斯平滑
  • 二进制平滑

所幸,有大佬已经为我们实现好了时间序列的这些平滑技术,并在GitHub上开源了这份模块的代码——它就是 Tsmoothie 模块。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点。

请选择以下任一种方式输入命令安装依赖:

  • Windows 环境 打开 Cmd (开始-运行-CMD)。
  • MacOS 环境 打开 Terminal (command+空格输入Terminal)。
  • 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install tsmoothie

(PS) Tsmoothie 仅支持Python 3.6 及以上的版本。

2.Tsmoothie 基本使用

为了尝试Tsmoothie的效果,我们需要生成随机数据:

import numpy as np
import matplotlib.pyplot as plt
from tsmoothie.utils_func import sim_randomwalk
from tsmoothie.smoother import LowessSmoother
# 生成 3 个长度为200的随机数据组
np.random.seed(123)
data = sim_randomwalk(n_series=3, timesteps=200,
                      process_noise=10, measure_noise=30)

然后使用Tsmoothie执行平滑化:

# 平滑
smoother = LowessSmoother(smooth_fraction=0.1, iterations=1)
smoother.smooth(data)

通过 smoother.smooth_data 你就可以获取平滑后的数据:

print(smoother.smooth_data)
# [[ 5.21462928 3.07898076 0.93933646 -1.19847767 -3.32294934
# -5.40678762 -7.42425709 -9.36150892 -11.23591897 -13.05271523
# ....... ....... ....... ....... ....... ]]

绘制效果图:

python库Tsmoothie模块数据平滑化异常点抓取

3.基于Tsmoothie的极端异常值检测

事实上,基于smoother生成的范围区域,我们可以进行异常值的检测:

python库Tsmoothie模块数据平滑化异常点抓取

可以看到,在蓝色范围以外的点,都属于异常值。我们可以轻易地将这些异常值标红或记录,以便后续的处理。

_low, _up = smoother.get_intervals('sigma_interval', n_sigma=2)
series['low'] = np.hstack([series['low'], _low[:,[-1]]])
series['up'] = np.hstack([series['up'], _up[:,[-1]]])
is_anomaly = np.logical_or(
    series['original'][:,-1] > series['up'][:,-1],
    series['original'][:,-1] < series['low'][:,-1]
).reshape(-1,1)

假设蓝色范围interval的最大值为up、最小值为low,如果存在 data > up 或 data < low 则表明此数据是异常点。

使用以下代码通过滚动数据点进行平滑化和异常检测,就能保存得到上方的GIF动图。

上滑查看更多代码

# Origin: https://github.com/cerlymarco/MEDIUM_NoteBook/blob/master/Anomaly_Detection_RealTime/Anomaly_Detection_RealTime.ipynb
import numpy as np
import matplotlib.pyplot as plt
from celluloid import Camera
from collections import defaultdict
from functools import partial
from tqdm import tqdm
from tsmoothie.utils_func import sim_randomwalk, sim_seasonal_data
from tsmoothie.smoother import *
def plot_history(ax, i, is_anomaly, window_len, color='blue', **pltargs):
    posrange = np.arange(0,i)
    ax.fill_between(posrange[window_len:],
                    pltargs['low'][1:], pltargs['up'][1:],
                    color=color, alpha=0.2)
    if is_anomaly:
        ax.scatter(i-1, pltargs['original'][-1], c='red')
    else:
        ax.scatter(i-1, pltargs['original'][-1], c='black')
    ax.scatter(i-1, pltargs['smooth'][-1], c=color)
    ax.plot(posrange, pltargs['original'][1:], '.k')
    ax.plot(posrange[window_len:],
            pltargs['smooth'][1:], color=color, linewidth=3)
    if 'ano_id' in pltargs.keys():
        if pltargs['ano_id'].sum()>0:
            not_zeros = pltargs['ano_id'][pltargs['ano_id']!=0] -1
            ax.scatter(not_zeros, pltargs['original'][1:][not_zeros],
                       c='red', alpha=1.)
np.random.seed(42)
n_series, timesteps = 3, 200
data = sim_randomwalk(n_series=n_series, timesteps=timesteps,
                      process_noise=10, measure_noise=30)
window_len = 20
fig = plt.figure(figsize=(18,10))
camera = Camera(fig)
axes = [plt.subplot(n_series,1,ax+1) for ax in range(n_series)]
series = defaultdict(partial(np.ndarray, shape=(n_series,1), dtype='float32'))
for i in tqdm(range(timesteps+1), total=(timesteps+1)):
    if i>window_len:
        smoother = ConvolutionSmoother(window_len=window_len, window_type='ones')
        smoother.smooth(series['original'][:,-window_len:])
        series['smooth'] = np.hstack([series['smooth'], smoother.smooth_data[:,[-1]]])
        _low, _up = smoother.get_intervals('sigma_interval', n_sigma=2)
        series['low'] = np.hstack([series['low'], _low[:,[-1]]])
        series['up'] = np.hstack([series['up'], _up[:,[-1]]])
        is_anomaly = np.logical_or(
            series['original'][:,-1] > series['up'][:,-1],
            series['original'][:,-1] < series['low'][:,-1]
        ).reshape(-1,1)
        if is_anomaly.any():
            series['ano_id'] = np.hstack([series['ano_id'], is_anomaly*i]).astype(int)
        for s in range(n_series):
            pltargs = {k:v[s,:] for k,v in series.items()}
            plot_history(axes[s], i, is_anomaly[s], window_len,
                         **pltargs)
        camera.snap()
    if i>=timesteps:
        continue
    series['original'] = np.hstack([series['original'], data[:,[i]]])
print('CREATING GIF...') # it may take a few seconds
camera._photos = [camera._photos[-1]] + camera._photos
animation = camera.animate()
animation.save('animation1.gif', codec="gif", writer='imagemagick')
plt.close(fig)
print('DONE')

注意,异常点并非都是负面作用,在不同的应用场景下,它们可能代表了不同的意义。

python库Tsmoothie模块数据平滑化异常点抓取

比如在股票中,它或许可以代表着震荡行情中某种趋势反转的信号。

或者在家庭用电量分析中,它可能代表着某个时刻的用电峰值,根据这个峰值我们可以此时此刻开启了什么样的电器。

所以异常点的作用需要根据不同应用场景进行不同的分析,才能找到它真正的价值。

python库Tsmoothie模块数据平滑化异常点抓取

总而言之,Tsmoothie 不仅可以使用多种平滑技术平滑化我们的时序数据,让我们的模型训练更加有效,还可以根据平滑结果找出数据中的离群点,是我们做数据分析和研究的一个好帮手,非常有价值。

以上就是python库Tsmoothie模块数据平滑化异常点抓取的详细内容,更多关于python Tsmoothie异常点抓取的资料请关注三水点靠木其它相关文章!


Tags in this post...

Python 相关文章推荐
Python实现简单字典树的方法
Apr 29 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
Python去除字符串前后空格的几种方法
Mar 04 Python
python模块常用用法实例详解
Oct 17 Python
python实现画循环圆
Nov 23 Python
python实现ip地址的包含关系判断
Feb 07 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
Python如何定义接口和抽象类
Jul 28 Python
Django通过设置CORS解决跨域问题
Nov 26 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 Python
使用Django框架创建项目
Jun 10 #Python
Python实现信息管理系统
Jun 05 #Python
python实现学员管理系统(面向对象版)
Jun 05 #Python
python实现学生信息管理系统(面向对象)
Jun 05 #Python
Python使用pyecharts控件绘制图表
Jun 05 #Python
Python使用openpyxl模块处理Excel文件
Jun 05 #Python
Python中requests库的用法详解
Jun 05 #Python
You might like
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
ES6 更易于继承的类语法的使用
2019/02/11 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
基于并发服务器几种实现方法(总结)
2017/12/29 Python
Python中str.join()简单用法示例
2018/03/20 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
Python函数参数操作详解
2018/08/03 Python
python实现批量命名照片
2020/06/18 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
建筑工程自我鉴定
2013/10/18 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
市场营销调查计划书
2014/05/02 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
文明家庭事迹材料
2014/12/20 职场文书
科技馆观后感
2015/06/08 职场文书
python - timeit 时间模块
2021/04/06 Python
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js
Python中的socket网络模块介绍
2022/07/23 Python