0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Tsmoothie:使用多种平滑技术平滑化时序数据

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 09:28 次阅读

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

图片

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

图片

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

图片

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

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

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

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

1.准备

开始之前,你要确保Pythonpip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

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

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

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

上滑查看更多代码

# Origin: https://github.com/cerlymarco/MEDIUM_NoteBook/blob/master/Anomaly_Detection_RealTime/Anomaly_Detection_RealTime.ipynb
import numpyas np
import matplotlib.pyplotas plt
from celluloidimport Camera
from collectionsimport defaultdict
from functoolsimport partial
from tqdmimport tqdm

from tsmoothie.utils_funcimport sim_randomwalk, sim_seasonal_data
from tsmoothie.smootherimport *


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 axin range(n_series)]
series = defaultdict(partial(np.ndarray, shape=(n_series,1), dtype='float32'))

for iin 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 sin range(n_series):
pltargs = {k:v[s,:]for k,vin 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')


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

图片

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

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

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

图片

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2655

    浏览量

    47287
  • 数据
    +关注

    关注

    8

    文章

    6796

    浏览量

    88730
  • 代码
    +关注

    关注

    30

    文章

    4719

    浏览量

    68211
  • 平滑
    +关注

    关注

    0

    文章

    2

    浏览量

    6302
收藏 人收藏

    评论

    相关推荐

    用于光谱色散平滑技术的双通调制器实验研究

    在惯性约束聚变中,辐照的均匀性直接影响到内爆实验的效果,通常结合各种空间、时间平滑技术提高光束的均匀性。光谱色散平滑技术正是一种常用的时间平滑
    发表于 06-02 10:05

    基于FPGA的图像平滑处理

    作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。而对滤波处理的要求也有两条,一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。平滑滤波是低频增强的空间
    发表于 07-05 13:51

    关于时序数据库的内容

    简介: 这是一篇无法一口气读完的、文字过万[正文字数14390]的长文,这是一个无法中途不上厕所就看完的、关于时序数据库的视频[时长111分钟]分享的文字整理..大家好,很开心能够和大家一起交流时序数据
    发表于 07-12 08:00

    什么是时序数据库?

    本文根据演讲视频以及PPT整理而成。本文将主要围绕以下四个方面进行分享:时序数据时序数据时序数据库的演变时序数据库对比总结一、时序数据
    发表于 07-12 08:35

    空时谱估计-空间平滑技术

    空时谱估计-3-空间平滑技术,有需要的下来看看
    发表于 08-05 17:32 0次下载

    一个新的保边平滑函数

    为了弥补活动轮廓算法对自然图像存在欠、过分割现象,根据图像不同区域对分割贡献各异,设计了一个新的保边平滑函数。该函数对不同区域自适应选择扩散方式;结合水平集建立了改进全变分保边平滑分割模型,同时依
    发表于 01-16 18:37 0次下载
    一个新的保边<b class='flag-5'>平滑</b>函数

    TableStore时序数据存储 - 架构篇

    库及同一套技术架构。 时序数据模型在定义时序数据模型之前,我们先对时序数据做一个抽象的表述。个体或群体(WHO):描述产生数据的物体,可以是
    发表于 08-08 16:17 561次阅读
    TableStore<b class='flag-5'>时序数据</b>存储 - 架构篇

    时序数据库的前世今生

      时序数据库忽然火了起来。Facebook开源了beringei时序数据库,基于PostgreSQL打造的时序数据库TimeScaleDB也开源了。时序数据库作为物联网方向一个非常重
    的头像 发表于 12-17 17:51 3534次阅读

    别克平滑度测定仪的技术参数具体是怎样的

    别克平滑度测定仪 纸张平滑度测定仪 产品用途及适用范围:  纸张平滑度测定仪(无汞)(以下简称平滑仪)的各项技术要求和检测方法符合国际标准I
    发表于 06-03 15:43 721次阅读

    华为时序数据库为智慧健康养老行业贡献应用之道

    随着 IoT 技术的快速发展,物联网设备产生的数据呈爆炸式增长。这些数据通常随时间产生,称之为时序数据。这样的一种专门用于管理时序数据
    的头像 发表于 11-07 15:10 5839次阅读

    华为PB级时序数据库Gauss DB,助力海量数据处理

      近年来,时序数据的应用更为广泛,包括物联网、金融领域、监控领域、医学领域、农业生产领域等各方面,都在大量使用时序数据,通过数据来研究对象的趋势性、规律性、异常性;并且在 5G 与人工智能的浪潮下
    的头像 发表于 10-15 19:15 1086次阅读
    华为PB级<b class='flag-5'>时序数据</b>库Gauss DB,助力海量<b class='flag-5'>数据</b>处理

    物联网场景海量时序数据存储与处理的关键技术

    时序数据是随时间不断产生的一系列数据,例如持续监控的气象变化数据、股市交易记录、应用监控数据等,通常一个时序数据点可以由
    发表于 12-27 11:58 2220次阅读

    涂鸦推出NekoDB时序数据库,助力全球客户实现低成本部署

    随着IoT技术逐渐成熟,众多设备产出的数据呈现指数级增长。企业亟需用行之有效的方式管理海量时序数据。由此,各类时序数据库开始成为市场宠儿。与市场需求相悖的是,
    的头像 发表于 07-24 10:08 2051次阅读
    涂鸦推出NekoDB<b class='flag-5'>时序数据</b>库,助力全球客户实现低成本部署

    时序数据库是什么?时序数据库的特点

    时序数据库是一种在处理时间序列数据方面具有高效和专门化能力的数据库。它主要用于存储和处理时间序列数据,比如传感器数据、监控
    的头像 发表于 04-26 16:02 583次阅读

    PWM技术如何实现电机的平滑启动和停止

    PWM(脉冲宽度调制)技术在电机控制中实现平滑启动和停止的功能,主要通过精确调节电机输入电压或电流的波形来实现。这种技术能够显著减少电机在启动和停止过程中的机械冲击和振动,从而延长电机寿命并提高系统的稳定性。以下将详细阐述PWM
    的头像 发表于 08-12 17:53 927次阅读