0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Tsmoothie:使用多種平滑技術(shù)平滑化時(shí)序數(shù)據(jù)

科技綠洲 ? 來(lái)源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-30 09:28 ? 次閱讀

在處理數(shù)據(jù)的時(shí)候,我們經(jīng)常會(huì)遇到一些非連續(xù)的散點(diǎn)時(shí)間序列數(shù)據(jù):

圖片

有些時(shí)候,這樣的散點(diǎn)數(shù)據(jù)是不利于我們進(jìn)行數(shù)據(jù)的聚類和預(yù)測(cè)的。因此我們需要把它們平滑化,如下圖所示:

圖片

如果我們將散點(diǎn)及其范圍區(qū)間都去除,平滑后的效果如下:

圖片

這樣的時(shí)序數(shù)據(jù)是不是看起來(lái)舒服多了?此外,使用平滑后的時(shí)序數(shù)據(jù)去做聚類或預(yù)測(cè)或許有令人驚艷的效果,因?yàn)樗コ艘恍┢钪挡⒓?xì)化了數(shù)據(jù)的分布范圍。

如果我們自己開(kāi)發(fā)一個(gè)這樣的平滑工具,會(huì)耗費(fèi)不少的時(shí)間。因?yàn)槠交募夹g(shù)有很多種,你需要一個(gè)個(gè)地去研究,找到最合適的技術(shù)并編寫(xiě)代碼,這是一個(gè)非常耗時(shí)的過(guò)程。平滑技術(shù)包括但不限于:

  • 指數(shù)平滑
  • 具有各種窗口類型(常數(shù)、漢寧、漢明、巴特利特、布萊克曼)的卷積平滑
  • 傅立葉變換的頻譜平滑
  • 多項(xiàng)式平滑
  • 各種樣條平滑(線性、三次、自然三次)
  • 高斯平滑
  • 二進(jìn)制平滑

所幸,有大佬已經(jīng)為我們實(shí)現(xiàn)好了時(shí)間序列的這些平滑技術(shù),并在GitHub上開(kāi)源了這份模塊的代碼——它就是 Tsmoothie 模塊。

1.準(zhǔn)備

開(kāi)始之前,你要確保Pythonpip已經(jīng)成功安裝在電腦上,如果沒(méi)有,可以訪問(wèn)這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。

**(可選1) **如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn):Python 編程的最好搭檔—VSCode 詳細(xì)指南。

請(qǐng)選擇以下任一種方式輸入命令安裝依賴

  1. Windows 環(huán)境 打開(kāi) Cmd (開(kāi)始-運(yùn)行-CMD)。
  2. MacOS 環(huán)境 打開(kāi) Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install tsmoothie

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

2.Tsmoothie 基本使用

為了嘗試Tsmoothie的效果,我們需要生成隨機(jī)數(shù)據(jù):

import numpy as np
import matplotlib.pyplot as plt
from tsmoothie.utils_func import sim_randomwalk
from tsmoothie.smoother import LowessSmoother

# 生成 3 個(gè)長(zhǎng)度為200的隨機(jī)數(shù)據(jù)組
np.random.seed(123)
data = sim_randomwalk(n_series=3, timesteps=200,
                      process_noise=10, measure_noise=30)

然后使用Tsmoothie執(zhí)行平滑化:

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

通過(guò) smoother.smooth_data 你就可以獲取平滑后的數(shù)據(jù):

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

繪制效果圖:

# 生成范圍區(qū)間
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的極端異常值檢測(cè)

事實(shí)上,基于smoother生成的范圍區(qū)域,我們可以進(jìn)行異常值的檢測(cè):

圖片

可以看到,在藍(lán)色范圍以外的點(diǎn),都屬于異常值。我們可以輕易地將這些異常值標(biāo)紅或記錄,以便后續(xù)的處理。

_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)

假設(shè)藍(lán)色范圍interval的最大值為up、最小值為low,如果存在 data > up 或 data < low 則表明此數(shù)據(jù)是異常點(diǎn)。

使用以下代碼通過(guò)滾動(dòng)數(shù)據(jù)點(diǎn)進(jìn)行平滑化和異常檢測(cè),就能保存得到上方的GIF動(dòng)圖。

上滑查看更多代碼

# 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')


注意,異常點(diǎn)并非都是負(fù)面作用,在不同的應(yīng)用場(chǎng)景下,它們可能代表了不同的意義。

圖片

比如在股票中,它或許可以代表著震蕩行情中某種趨勢(shì)反轉(zhuǎn)的信號(hào)。

或者在家庭用電量分析中,它可能代表著某個(gè)時(shí)刻的用電峰值,根據(jù)這個(gè)峰值我們可以此時(shí)此刻開(kāi)啟了什么樣的電器。

所以異常點(diǎn)的作用需要根據(jù)不同應(yīng)用場(chǎng)景進(jìn)行不同的分析,才能找到它真正的價(jià)值。

圖片

總而言之,Tsmoothie 不僅可以使用多種平滑技術(shù)平滑化我們的時(shí)序數(shù)據(jù),讓我們的模型訓(xùn)練更加有效,還可以根據(jù)平滑結(jié)果找出數(shù)據(jù)中的離群點(diǎn),是我們做數(shù)據(jù)分析和研究的一個(gè)好幫手,非常有價(jià)值。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2618

    瀏覽量

    47043
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6722

    瀏覽量

    88344
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4674

    瀏覽量

    67813
  • 平滑
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6300
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    用于光譜色散平滑技術(shù)的雙通調(diào)制器實(shí)驗(yàn)研究

    在慣性約束聚變中,輻照的均勻性直接影響到內(nèi)爆實(shí)驗(yàn)的效果,通常結(jié)合各種空間、時(shí)間平滑技術(shù)提高光束的均勻性。光譜色散平滑技術(shù)正是一種常用的時(shí)間平滑
    發(fā)表于 06-02 10:05

    基于FPGA的圖像平滑處理

    作為圖像識(shí)別的特征模式;另一個(gè)是為適應(yīng)圖像處理的要求,消除圖像數(shù)字化時(shí)所混入的噪聲。而對(duì)濾波處理的要求也有兩條,一是不能損壞圖像的輪廓及邊緣等重要信息;二是使圖像清晰視覺(jué)效果好。平滑濾波是低頻增強(qiáng)的空間
    發(fā)表于 07-05 13:51

    關(guān)于時(shí)序數(shù)據(jù)庫(kù)的內(nèi)容

    簡(jiǎn)介: 這是一篇無(wú)法一口氣讀完的、文字過(guò)萬(wàn)[正文字?jǐn)?shù)14390]的長(zhǎng)文,這是一個(gè)無(wú)法中途不上廁所就看完的、關(guān)于時(shí)序數(shù)據(jù)庫(kù)的視頻[時(shí)長(zhǎng)111分鐘]分享的文字整理..大家好,很開(kāi)心能夠和大家一起交流時(shí)序數(shù)據(jù)
    發(fā)表于 07-12 08:00

    什么是時(shí)序數(shù)據(jù)庫(kù)?

    本文根據(jù)演講視頻以及PPT整理而成。本文將主要圍繞以下四個(gè)方面進(jìn)行分享:時(shí)序數(shù)據(jù)時(shí)序數(shù)據(jù)庫(kù)時(shí)序數(shù)據(jù)庫(kù)的演變時(shí)序數(shù)據(jù)庫(kù)對(duì)比總結(jié)一、時(shí)序數(shù)據(jù)
    發(fā)表于 07-12 08:35

    空時(shí)譜估計(jì)-空間平滑技術(shù)

    空時(shí)譜估計(jì)-3-空間平滑技術(shù),有需要的下來(lái)看看
    發(fā)表于 08-05 17:32 ?0次下載

    一個(gè)新的保邊平滑函數(shù)

    為了彌補(bǔ)活動(dòng)輪廓算法對(duì)自然圖像存在欠、過(guò)分割現(xiàn)象,根據(jù)圖像不同區(qū)域?qū)Ψ指钬暙I(xiàn)各異,設(shè)計(jì)了一個(gè)新的保邊平滑函數(shù)。該函數(shù)對(duì)不同區(qū)域自適應(yīng)選擇擴(kuò)散方式;結(jié)合水平集建立了改進(jìn)全變分保邊平滑分割模型,同時(shí)依
    發(fā)表于 01-16 18:37 ?0次下載
    一個(gè)新的保邊<b class='flag-5'>平滑</b>函數(shù)

    TableStore時(shí)序數(shù)據(jù)存儲(chǔ) - 架構(gòu)篇

    庫(kù)及同一套技術(shù)架構(gòu)。?時(shí)序數(shù)據(jù)模型在定義時(shí)序數(shù)據(jù)模型之前,我們先對(duì)時(shí)序數(shù)據(jù)做一個(gè)抽象的表述。個(gè)體或群體(WHO):描述產(chǎn)生數(shù)據(jù)的物體,可以是
    發(fā)表于 08-08 16:17 ?528次閱讀
    TableStore<b class='flag-5'>時(shí)序數(shù)據(jù)</b>存儲(chǔ) - 架構(gòu)篇

    時(shí)序數(shù)據(jù)庫(kù)的前世今生

    ? 時(shí)序數(shù)據(jù)庫(kù)忽然火了起來(lái)。Facebook開(kāi)源了beringei時(shí)序數(shù)據(jù)庫(kù),基于PostgreSQL打造的時(shí)序數(shù)據(jù)庫(kù)TimeScaleDB也開(kāi)源了。時(shí)序數(shù)據(jù)庫(kù)作為物聯(lián)網(wǎng)方向一個(gè)非常重
    的頭像 發(fā)表于 12-17 17:51 ?3490次閱讀

    別克平滑度測(cè)定儀的技術(shù)參數(shù)具體是怎樣的

    別克平滑度測(cè)定儀 紙張平滑度測(cè)定儀 產(chǎn)品用途及適用范圍:? 紙張平滑度測(cè)定儀(無(wú)汞)(以下簡(jiǎn)稱平滑儀)的各項(xiàng)技術(shù)要求和檢測(cè)方法符合國(guó)際標(biāo)準(zhǔn)I
    發(fā)表于 06-03 15:43 ?688次閱讀

    華為時(shí)序數(shù)據(jù)庫(kù)為智慧健康養(yǎng)老行業(yè)貢獻(xiàn)應(yīng)用之道

    隨著 IoT 技術(shù)的快速發(fā)展,物聯(lián)網(wǎng)設(shè)備產(chǎn)生的數(shù)據(jù)呈爆炸式增長(zhǎng)。這些數(shù)據(jù)通常隨時(shí)間產(chǎn)生,稱之為時(shí)序數(shù)據(jù)。這樣的一種專門(mén)用于管理時(shí)序數(shù)據(jù)
    的頭像 發(fā)表于 11-07 15:10 ?5779次閱讀

    華為PB級(jí)時(shí)序數(shù)據(jù)庫(kù)Gauss DB,助力海量數(shù)據(jù)處理

    ??近年來(lái),時(shí)序數(shù)據(jù)的應(yīng)用更為廣泛,包括物聯(lián)網(wǎng)、金融領(lǐng)域、監(jiān)控領(lǐng)域、醫(yī)學(xué)領(lǐng)域、農(nóng)業(yè)生產(chǎn)領(lǐng)域等各方面,都在大量使用時(shí)序數(shù)據(jù),通過(guò)數(shù)據(jù)來(lái)研究對(duì)象的趨勢(shì)性、規(guī)律性、異常性;并且在 5G 與人工智能的浪潮下
    的頭像 發(fā)表于 10-15 19:15 ?1042次閱讀
    華為PB級(jí)<b class='flag-5'>時(shí)序數(shù)據(jù)</b>庫(kù)Gauss DB,助力海量<b class='flag-5'>數(shù)據(jù)</b>處理

    物聯(lián)網(wǎng)場(chǎng)景海量時(shí)序數(shù)據(jù)存儲(chǔ)與處理的關(guān)鍵技術(shù)

    時(shí)序數(shù)據(jù)是隨時(shí)間不斷產(chǎn)生的一系列數(shù)據(jù),例如持續(xù)監(jiān)控的氣象變化數(shù)據(jù)、股市交易記錄、應(yīng)用監(jiān)控數(shù)據(jù)等,通常一個(gè)時(shí)序數(shù)據(jù)點(diǎn)可以由
    發(fā)表于 12-27 11:58 ?2137次閱讀

    涂鴉推出NekoDB時(shí)序數(shù)據(jù)庫(kù),助力全球客戶實(shí)現(xiàn)低成本部署

    隨著IoT技術(shù)逐漸成熟,眾多設(shè)備產(chǎn)出的數(shù)據(jù)呈現(xiàn)指數(shù)級(jí)增長(zhǎng)。企業(yè)亟需用行之有效的方式管理海量時(shí)序數(shù)據(jù)。由此,各類時(shí)序數(shù)據(jù)庫(kù)開(kāi)始成為市場(chǎng)寵兒。與市場(chǎng)需求相悖的是,
    的頭像 發(fā)表于 07-24 10:08 ?2016次閱讀
    涂鴉推出NekoDB<b class='flag-5'>時(shí)序數(shù)據(jù)</b>庫(kù),助力全球客戶實(shí)現(xiàn)低成本部署

    時(shí)序數(shù)據(jù)庫(kù)是什么?時(shí)序數(shù)據(jù)庫(kù)的特點(diǎn)

    時(shí)序數(shù)據(jù)庫(kù)是一種在處理時(shí)間序列數(shù)據(jù)方面具有高效和專門(mén)化能力的數(shù)據(jù)庫(kù)。它主要用于存儲(chǔ)和處理時(shí)間序列數(shù)據(jù),比如傳感器數(shù)據(jù)、監(jiān)控
    的頭像 發(fā)表于 04-26 16:02 ?537次閱讀

    PWM技術(shù)如何實(shí)現(xiàn)電機(jī)的平滑啟動(dòng)和停止

    PWM(脈沖寬度調(diào)制)技術(shù)在電機(jī)控制中實(shí)現(xiàn)平滑啟動(dòng)和停止的功能,主要通過(guò)精確調(diào)節(jié)電機(jī)輸入電壓或電流的波形來(lái)實(shí)現(xiàn)。這種技術(shù)能夠顯著減少電機(jī)在啟動(dòng)和停止過(guò)程中的機(jī)械沖擊和振動(dòng),從而延長(zhǎng)電機(jī)壽命并提高系統(tǒng)的穩(wěn)定性。以下將詳細(xì)闡述PWM
    的頭像 發(fā)表于 08-12 17:53 ?501次閱讀