--- title: timeseries keywords: fastai sidebar: home_sidebar summary: "Módulo com implementação de algoritmos para detecção de **anomalias em series temporais**." description: "Módulo com implementação de algoritmos para detecção de **anomalias em series temporais**." ---
{% raw %}
{% endraw %} {% raw %}
{% endraw %} {% raw %}
{% endraw %} {% raw %}

factory_atype[source]

factory_atype(atype='mad')

{% endraw %}

Moving Average

{% raw %}
{% endraw %} {% raw %}

moving_average[source]

moving_average(ts, window=12, atype='mad')

Detecção de anomalias com base no Moving Average da serie tempora(ts). ts = numpy array - serie temporal window_size = [2..n] - Tamanho da janela atype = ['mad', 'tukey'] - algoritmo para detecção de anomalias

{% endraw %} {% raw %}
{% endraw %} {% raw %}

moving_average_score[source]

moving_average_score(ts, window=12, atype='mad')

Detecção de anomalias com base no Moving Average da serie tempora(ts). ts = numpy array - serie temporal window_size = [2..n] - Tamanho da janela atype = ['mad', 'tukey'] - algoritmo para detecção de anomalias

{% endraw %}

Twitter

O algoritmo popularizado pelo Twitter é um conjunto como o Seasonal Hybrid ESD (S-H-ESD) que funciona em cima do Generalized ESD test para detecção de anomalias. S-H-ESD pode ser utilizado tanto para detecção local ou global de anomalias. O método envolvi decompor a serie temporal e utilizar métodos robustos para detecção de anomalias(MAD).

Já existe a implementação fornecida pelo Twitter na linguagem R, a seguir temos a implementação do algoritmo feita em Python.

Artigo: https://arxiv.org/pdf/1704.07706.pdf

Obs: Implementacao esta atualmente utilizando o MAD ao inves do ESD ##TODO

{% raw %}
{% endraw %} {% raw %}

twitter[source]

twitter(x, m=3.0, period=None, seasonal=45, only_low_values=False)

Retorna os index dos valores que são anomalias input precisa ser um Serie com DateTimeIndex

{% endraw %} {% raw %}
{% endraw %} {% raw %}

twitter_score[source]

twitter_score(x, m=3.0, period=None, seasonal=45)

Retorna os index dos valores que são anomalias input precisa ser um Serie com index temporal

{% endraw %}

Teste

{% raw %}
df = pd.read_csv('./dados/rec-center-hourly.csv', parse_dates=[0])
df.set_index('datetime', inplace=True)
df.head()
kw_energy_consumption
datetime
2010-07-02 00:00:00 21.2
2010-07-02 01:00:00 16.4
2010-07-02 02:00:00 4.7
2010-07-02 03:00:00 4.7
2010-07-02 04:00:00 4.6
{% endraw %} {% raw %}
ts = df['kw_energy_consumption']
ts.plot(figsize=(20, 5));
{% endraw %} {% raw %}
24*7 # Week seasonality 24*7
168
{% endraw %} {% raw %}
anomalies = twitter(df['kw_energy_consumption'], period=168, only_low_values=True)
anomalies.head(), len(anomalies)
(datetime
 2010-07-21 01:00:00     4.6
 2010-09-03 05:00:00    12.3
 2010-09-04 06:00:00     9.6
 2010-09-10 05:00:00    14.4
 2010-09-13 05:00:00     9.9
 Name: kw_energy_consumption, dtype: float64,
 40)
{% endraw %} {% raw %}
plot_anomalies(ts, anomalies, s=100);
{% endraw %} {% raw %}
plot_anomalies(ts['2010-10-4':'2010-10-5'], anomalies['2010-10-4':'2010-10-5'], s=100);
plot_anomalies(ts['2010-10-4':'2010-10-5'], anomalies['2010-10-4':'2010-10-5'], s=100);
{% endraw %}