这个神奇的库,可以将数据平滑化并找到异常点
在處理數據的時候,我們經常會遇到一些非連續的散點時間序列數據:
有些時候,這樣的散點數據是不利于我們進行數據的聚類和預測的。因此我們需要把它們平滑化,如下圖所示:
如果我們將散點及其范圍區間都去除,平滑后的效果如下:
這樣的時序數據是不是看起來舒服多了?此外,使用平滑后的時序數據去做聚類或預測或許有令人驚艷的效果,因為它去除了一些偏差值并細化了數據的分布范圍。
如果我們自己開發一個這樣的平滑工具,會耗費不少的時間。因為平滑的技術有很多種,你需要一個個地去研究,找到最合適的技術并編寫代碼,這是一個非常耗時的過程。平滑技術包括但不限于:
指數平滑
具有各種窗口類型(常數、漢寧、漢明、巴特利特、布萊克曼)的卷積平滑
傅立葉變換的頻譜平滑
多項式平滑
各種樣條平滑(線性、三次、自然三次)
高斯平滑
二進制平滑
所幸,有大佬已經為我們實現好了時間序列的這些平滑技術,并在GitHub上開源了這份模塊的代碼——它就是 tsmoothie。
下面就讓我們來試一下 tsmoothie.
1.準備
開始之前,你要確保Python和pip已經成功安裝在電腦上,如果沒有,需要先進行安裝。
如果你用Python的目的是數據分析,可以直接安裝Anaconda,它內置了Python和pip.
請選擇以下任一種方式輸入命令安裝依賴:
1. Windows 環境 打開 Cmd (開始-運行-CMD)。
2. MacOS 環境 打開 Terminal (command+空格輸入Terminal)。
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
(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冊,讓你輕松掌握數據分析技能,感興趣的同學可以直接在各大電商平臺搜索書名了解:
總結
以上是生活随笔為你收集整理的这个神奇的库,可以将数据平滑化并找到异常点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖音限流怎么看的出来
- 下一篇: 数据分析面试必考的AB-Test知识点整