본문 바로가기
Software coding skill(python, web등)

Python - Time series data Anomaly detection tool

by 호빵님 2020. 7. 24.
반응형

python에서 사용할 수 있는 시계열 데이터를 위한, 이상치 검출 라이브러리 패키지를 소개한다. 기본적인 통계적 이상치 검출을 포함한 이상치 검출을 위한 여러가지 함수들을 제공한다.

 

아래 예제는 전압 시계열 데이터에서 일정치 이상 전압의 감소율이 증가했던 구간을 찾는 코드이다.

이처럼 이미 정의된 이상치 검출 방법말고도, 사용자가 정의한 anomaly detection함수를 이용해서 이상치 구간을 찾을 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# -*- coding: utf-8 -*-
"""
Created on Mon Apr  6 13:42:51 2020
 
@author: lgken
"""
import pandas as pd
from adtk.data import validate_series
from adtk.visualization import plot
from adtk.detector import ThresholdAD
from adtk.detector import CustomizedDetectorHD
import time
import numpy as np
 
 
 
#현재 시간 저장
currenttime = time.time()
 
#시계열 데이터 로드
df = pd.read_csv('./Voltage_timeseriesdata.csv', squeeze=True, encoding='euc-kr')
 
#anomaly detection plot의 x축으로 쓰일 date time시간 index데이터 계산
#dataframe index로 plot의 x축값이 설정되는데, 여기서는 코드 실행 시각을 시작시간으로 해서 x축 날짜 시간을 계산했다.
 
#현재 시간을 시계열 데이터
df['TotTime(sec)'= df['TotTime(sec)'].astype('float64'+ currenttime
#초 단위 datetime 설정
df['TotTime(sec)'= pd.to_datetime(df["TotTime(sec)"], unit='s')
#시간 기준을 서울로 설정
df['TotTime(sec)'= df['TotTime(sec)'].dt.tz_localize('UTC').dt.tz_convert('Asia/Seoul')
 
df=df.set_index('TotTime(sec)')
 
 
s2 = df[['Voltage(V)']]
 
#전압값 비교 타임 인터벌
dt=10
 
#사용자 정의 anomaly detection 함수
def myDetectionFunc(df):
    df['dvdt'= (df['Voltage(V)'- df['Voltage(V)'].shift(dt))
    print(df['dvdt'])
    df['dvdt_prev'= (df['Voltage(V)'].shift(dt) - df['Voltage(V)'].shift(2*dt))
    print(df['dvdt_prev'])
    df['dvdt2'= (df['dvdt']-df['dvdt_prev'])
    print(df['dvdt2'])
    df['check'= np.where((df['dvdt'<= -0.01), 10)
    print(df['check'])
    
    return (df['check'])
 
 
s2 = validate_series(s2)
 
#사용자 커스텀 detection함수를 detector로 설정
customized_detector = CustomizedDetectorHD(detect_func=myDetectionFunc)
anomalies = customized_detector.detect(s2)
 
#anomaly 위치 표시 plot설정
plot(s2, anomaly=anomalies, ts_linewidth=0.5, ts_markersize=0.7, anomaly_color='red', anomaly_alpha=0.3, curve_group=['Voltage(V)'], anomaly_tag='span');
 
 
cs

전압의 이상 감소율 구간 검출 및 표시

 

 

https://www.arundo.com/arundo_tech_blog/adtk-open-source-time-series-anomaly-detection-in-python

 

ADTK: Open-Source Time Series Anomaly Detection in Python

We recently released the open-source version of Anomaly Detection Toolkit and hope it will promote best practices in solving real-world anomaly detection problems.

www.arundo.com

매뉴얼

https://arundo-adtk.readthedocs-hosted.com/en/stable/

 

Anomaly Detection Toolkit (ADTK) — ADTK 0.6.2 documentation

© Copyright 2019-2020, Arundo Analytics, Inc. Revision 73bfb30b.

arundo-adtk.readthedocs-hosted.com

 

반응형