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

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

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

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

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

  • 指数平滑

  • 具有各种窗口类型(常数、汉宁、汉明、巴特利特、布莱克曼)的卷积平滑

  • 傅立叶变换的频谱平滑

  • 多项式平滑

  • 各种样条平滑(线性、三次、自然三次)

  • 高斯平滑

  • 二进制平滑

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

下面就让我们来试一下 tsmoothie.

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,需要先进行安装。

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

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

1. Windows 环境 打开 Cmd (开始-运行-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
3. 如果你用的是 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
# ....... ....... ....... ....... ....... ]]

绘制效果图:

# 生成范围区间
low, up = smoother.get_intervals('prediction_interval')plt.figure(figsize=(18,5))for i in range(3):plt.subplot(1,3,i+1)plt.plot(smoother.smooth_data[i], linewidth=3, color='blue')plt.plot(smoother.data[i], '.k')plt.title(f"timeseries {i+1}"); plt.xlabel('time')plt.fill_between(range(len(smoother.data[i])), low[i], up[i], alpha=0.3)

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

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

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

_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 则表明此数据是异常点。

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

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

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

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

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

我们的文章到此就结束啦。

对比Excel系列图书累积销量达15w册,让你轻松掌握数据分析技能,感兴趣的同学可以直接在各大电商平台搜索书名了解:

这个神奇的库,可以将数据平滑化并找到异常点相关推荐

  1. Java平滑处理什么意思_为何要进行数据平滑处理?

    平滑处理,可使分类器的学习更加准确,我们会首先把label给.这一步很容易会被忽略,导致模型的结果总是达不到一定标准. 使用最有逼格的 log1p, 也就是 log(x+1),避免了复值的问题. PS ...

  2. oracle tns 代理配置_OGG实现Oracle到MySQL数据平滑迁移

    技术分享 | 使用OGG实现Oracle到MySQL数据平滑迁移 - 爱可生开源社区​opensource.actionsky.com 一.OGG概述 OGG全称为Oracle GoldenGate, ...

  3. python画画用哪库好_数据可视化哪款工具更好用?对比7款Python 数据图表工具的性能...

    更多腾讯海量技术文章,请关注云加社区:https://cloud.tencent.com/developer/column 作者:CDA数据分析师 摘要:Python 的科学栈相当成熟,各种应用场景都 ...

  4. 系统学习NLP(四)--数据平滑

    转子:https://blog.csdn.net/fuermolei/article/details/81353746 在自然语言处理中,经常要计算单词序列(句子)出现的概率估计.但是,算法训练的时候 ...

  5. 自然语言处理之数据平滑方法

    在自然语言处理中,经常要计算单词序列(句子)出现的概率估计.但是,算法训练的时候,预料库中不可能包含所有可能出现的序列,因此为了防止对训练样本中为出现的新序列概率估计值为零,人们发明了不少可以改善估计 ...

  6. R包库安装及数据加载:一次安装多个R包、一次加载多个R包

    R包库安装及数据加载:一次安装多个R包.一次加载多个R包 目录 R包库安装及数据加载 R包安装 一次安装多个R包 加载需要的R包

  7. 三维数据平滑处理_你该如何正确的处理思看科技三维扫描仪得到的数据?

    其他行业至少在三维扫描领域没有说过,无论设备的精度有多高,被扫描产品的3D数据都会不可避免地引入数据误差,尤其是靠近锐利边缘和边界的测量数据.可能会导致点周围的曲面补丁偏离原始曲面,因此通常需要通过以 ...

  8. 05丨数据同步:主从库如何实现数据一致

    文章目录 1. 主从库数据同步介绍 2. 主从库间如何进行第一次同步 3.主从级联模式分担全量复制时的主库压力 4.主从库间网络断了怎么办? 1. 主从库数据同步介绍   Redis 具有高可靠性有两 ...

  9. 怎么进行数据平滑滤波_气相色谱数据处理方法 EWG1990仪器学习网

    2018/12/29 作者/EWG1990仪器学习网 本节涉及气相色谱仪的几种常用检测器(TCD.FID.ECD.FPD.NPD等)的数据采集和数据分析,这类信号不包含质谱.光谱类的辅助信息,其关键在 ...

最新文章

  1. Java字节码instrument研究
  2. Spring boot + Redis
  3. linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统
  4. TSP问题遗传算法通用Matlab程序
  5. VC++ 使用导入位图创建工具栏
  6. 利用PostMan 模拟上传/下载文件(亲测)
  7. 如何启用nodejs request模块的调试模式
  8. FreeNOS的启动
  9. 開發MOSS2007 Masterpage的一些經驗
  10. 谈CRM产品设计的指导思想
  11. git merge 回退_Git 基础学习总结2(学不会你锤我)
  12. 列出最少8种开源软件_您的公司可以支持和维持开源的8种方式
  13. Kubernetes 学习总结(23)—— 2022 年 Kubernetes 的 5 个趋势
  14. php网站接入微信支付,PHP接入微信H5支付的方法示例
  15. 51Nod 1182
  16. 五、Python复习教程(重点)-爬虫框架实战
  17. 数字集群通信知识与应用
  18. 综合布线系统在计算机信息系统中属于,计算机信息系统综合布线问题
  19. 关于png图片在AndroidStudio上显示有白色边框的解决办法
  20. P2P技术详解(一):NAT详解——详细原理、P2P简介(转)

热门文章

  1. @change=“change()“与@change=“change“的区别
  2. 消灭星星网页版java代码,javascript实现消灭星星小游戏简单版
  3. SSH服务--Linux学习笔记
  4. SECD machine
  5. SpringCloud之RestTemplate,几种常见的请求方式
  6. 基于小程序的Token身份权限体系
  7. Linux中进行用户UID测试导致系统报错
  8. 随便写写2014创业记(二)
  9. Android学习——数据存储
  10. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)...