DHEIVER remeajayi commited on
Commit
246c955
·
0 Parent(s):

Duplicate from keras-io/timeseries-anomaly-detection-autoencoders

Browse files

Co-authored-by: Reme Ajayi <[email protected]>

Files changed (6) hide show
  1. .gitattributes +27 -0
  2. README.md +13 -0
  3. app.py +80 -0
  4. art_daily_jumpsup.csv +0 -0
  5. requirements.txt +3 -0
  6. scaler.json +1 -0
.gitattributes ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ftz filter=lfs diff=lfs merge=lfs -text
6
+ *.gz filter=lfs diff=lfs merge=lfs -text
7
+ *.h5 filter=lfs diff=lfs merge=lfs -text
8
+ *.joblib filter=lfs diff=lfs merge=lfs -text
9
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
10
+ *.model filter=lfs diff=lfs merge=lfs -text
11
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
12
+ *.onnx filter=lfs diff=lfs merge=lfs -text
13
+ *.ot filter=lfs diff=lfs merge=lfs -text
14
+ *.parquet filter=lfs diff=lfs merge=lfs -text
15
+ *.pb filter=lfs diff=lfs merge=lfs -text
16
+ *.pt filter=lfs diff=lfs merge=lfs -text
17
+ *.pth filter=lfs diff=lfs merge=lfs -text
18
+ *.rar filter=lfs diff=lfs merge=lfs -text
19
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
20
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
21
+ *.tflite filter=lfs diff=lfs merge=lfs -text
22
+ *.tgz filter=lfs diff=lfs merge=lfs -text
23
+ *.wasm filter=lfs diff=lfs merge=lfs -text
24
+ *.xz filter=lfs diff=lfs merge=lfs -text
25
+ *.zip filter=lfs diff=lfs merge=lfs -text
26
+ *.zstandard filter=lfs diff=lfs merge=lfs -text
27
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Timeseries Anomaly Detection
3
+ emoji: 🌍
4
+ colorFrom: blue
5
+ colorTo: indigo
6
+ sdk: gradio
7
+ sdk_version: 3.0.1
8
+ app_file: app.py
9
+ pinned: false
10
+ duplicated_from: keras-io/timeseries-anomaly-detection-autoencoders
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from huggingface_hub import from_pretrained_keras
3
+ import pandas as pd
4
+ import numpy as np
5
+ import json
6
+ from matplotlib import pyplot as plt
7
+
8
+ f = open('scaler.json')
9
+ scaler = json.load(f)
10
+
11
+ TIME_STEPS = 288
12
+
13
+ # Generated training sequences for use in the model.
14
+ def create_sequences(values, time_steps=TIME_STEPS):
15
+ output = []
16
+ for i in range(len(values) - time_steps + 1):
17
+ output.append(values[i : (i + time_steps)])
18
+ return np.stack(output)
19
+
20
+
21
+ def normalize_data(data):
22
+ df_test_value = (data - scaler["mean"]) / scaler["std"]
23
+ return df_test_value
24
+
25
+ def plot_test_data(df_test_value):
26
+ fig, ax = plt.subplots()
27
+ df_test_value.plot(legend=False, ax=ax)
28
+ return fig
29
+
30
+ def get_anomalies(df_test_value):
31
+ # Create sequences from test values.
32
+ x_test = create_sequences(df_test_value.values)
33
+ model = from_pretrained_keras("keras-io/timeseries-anomaly-detection")
34
+
35
+ # Get test MAE loss.
36
+ x_test_pred = model.predict(x_test)
37
+ test_mae_loss = np.mean(np.abs(x_test_pred - x_test), axis=1)
38
+ test_mae_loss = test_mae_loss.reshape((-1))
39
+
40
+ # Detect all the samples which are anomalies.
41
+ anomalies = test_mae_loss > scaler["threshold"]
42
+ return anomalies
43
+
44
+ def plot_anomalies(df_test_value, data, anomalies):
45
+ # data i is an anomaly if samples [(i - timesteps + 1) to (i)] are anomalies
46
+ anomalous_data_indices = []
47
+ for data_idx in range(TIME_STEPS - 1, len(df_test_value) - TIME_STEPS + 1):
48
+ if np.all(anomalies[data_idx - TIME_STEPS + 1 : data_idx]):
49
+ anomalous_data_indices.append(data_idx)
50
+ df_subset = data.iloc[anomalous_data_indices]
51
+ fig, ax = plt.subplots()
52
+ data.plot(legend=False, ax=ax)
53
+ df_subset.plot(legend=False, ax=ax, color="r")
54
+ return fig
55
+
56
+ def master(file):
57
+ # read file
58
+ data = pd.read_csv(file, parse_dates=True, index_col="timestamp")
59
+ df_test_value = normalize_data(data)
60
+ # plot input test data
61
+ plot1 = plot_test_data(df_test_value)
62
+ # predict
63
+ anomalies = get_anomalies(df_test_value)
64
+ #plot anomalous data points
65
+ plot2 = plot_anomalies(df_test_value, data, anomalies)
66
+ return plot2
67
+
68
+ outputs = gr.Plot()
69
+
70
+
71
+ iface = gr.Interface(master,
72
+ gr.inputs.File(label="csv file"),
73
+ outputs=outputs,
74
+ examples=["art_daily_jumpsup.csv"], title="Timeseries Anomaly Detection Using an Autoencoder",
75
+ description = "Anomaly detection of timeseries data.",
76
+ article = "Space by: <a href=\"https://www.linkedin.com/in/olohireme-ajayi/\">Reme Ajayi</a> <br> Keras Example by <a href=\"https://github.com/pavithrasv/\"> Pavithra Vijay</a>")
77
+
78
+
79
+
80
+ iface.launch()
art_daily_jumpsup.csv ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ pandas
2
+ numpy
3
+ tensorflow
scaler.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"mean": 42.43835333580657, "std": 28.07712228126252, "threshold": 0.1001741920131276}