-
Notifications
You must be signed in to change notification settings - Fork 0
/
signal_to_nodes.py
108 lines (86 loc) · 4.73 KB
/
signal_to_nodes.py
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import torch
import pandas as pd
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
def signal_to_nodes_WISDM(signal, window_size, overlap=0.5):
step = round(window_size * (1 - overlap)) # calculate step size for 50% overlap
signal.sort_values(by=['user', 'timestamp'], inplace=True) # sort the signal by 'user' and 'timestamp'
# Map activity labels to integer values
signal['activity'], labels_index = pd.factorize(signal['activity'])
# create windows for each activity type
nodes = []
nodes_labels = []
for activity in signal['activity'].unique():
activity_data = signal[signal['activity'] == activity]
activity_nodes = [activity_data[i:i + window_size] for i in
range(0, len(activity_data) - window_size + 1, step)]
if len(activity_nodes[-1]) < window_size:
# Calculate how many rows we need to add
rows_to_add = window_size - len(activity_nodes[-1])
# Get the last row of the last node
last_row = pd.DataFrame(activity_nodes[-1].iloc[-1]).transpose()
# Append last row to last node until it's of window_size length
for _ in range(rows_to_add):
activity_nodes[-1] = activity_nodes[-1].append(last_row, ignore_index=True)
activity_nodes_labels = [node['activity'].iloc[0] for node in activity_nodes]
nodes.extend(activity_nodes)
nodes_labels.extend(activity_nodes_labels)
# convert to torch tensors
nodes = torch.stack(
[torch.tensor(node.drop(['user', 'activity', 'timestamp'], axis=1).values) for node in nodes]).float().to(
device)
nodes_labels = torch.tensor(nodes_labels, dtype=torch.long, device=device)
return nodes, nodes_labels, labels_index
def signal_to_nodes_PAMAP2(signal, window_size, overlap=0.5):
step = round(window_size * (1 - overlap)) # calculate step size for 50% overlap
signal.sort_values(by=['id', 'timestamp'], inplace=True)
# create windows for each activity type
nodes = []
nodes_labels = []
for activity in signal['activity_id'].unique():
activity_data = signal[signal['activity_id'] == activity]
activity_nodes = [activity_data[i:i + window_size] for i in
range(0, len(activity_data) - window_size + 1, step)]
if len(activity_nodes[-1]) < window_size:
# Calculate how many rows we need to add
rows_to_add = window_size - len(activity_nodes[-1])
# Get the last row of the last node
last_row = pd.DataFrame(activity_nodes[-1].iloc[-1]).transpose()
# Append last row to last node until it's of window_size length
for _ in range(rows_to_add):
activity_nodes[-1] = activity_nodes[-1].append(last_row, ignore_index=True)
activity_nodes_labels = [node['activity_id'].iloc[0] for node in activity_nodes]
nodes.extend(activity_nodes)
nodes_labels.extend(activity_nodes_labels)
# convert to torch tensors
nodes = torch.stack(
[torch.tensor(node.drop(['id', 'activity_id', 'timestamp'], axis=1).values) for node in nodes]).float().to(
device)
nodes_labels = torch.tensor(nodes_labels, dtype=torch.long, device=device)
return nodes, nodes_labels
def signal_to_nodes_HARTH(signal, window_size, overlap=0.5):
step = round(window_size * (1 - overlap)) # calculate step size for 50% overlap
signal.sort_values(by=['timestamp'], inplace=True)
# create windows for each activity type
nodes = []
nodes_labels = []
for activity in signal['label'].unique():
activity_data = signal[signal['label'] == activity]
activity_nodes = [activity_data[i:i + window_size] for i in
range(0, len(activity_data) - window_size + 1, step)]
if len(activity_nodes[-1]) < window_size:
# Calculate how many rows we need to add
rows_to_add = window_size - len(activity_nodes[-1])
# Get the last row of the last node
last_row = pd.DataFrame(activity_nodes[-1].iloc[-1]).transpose()
# Append last row to last node until it's of window_size length
for _ in range(rows_to_add):
activity_nodes[-1] = activity_nodes[-1].append(last_row, ignore_index=True)
activity_nodes_labels = [node['label'].iloc[0] for node in activity_nodes]
nodes.extend(activity_nodes)
nodes_labels.extend(activity_nodes_labels)
# convert to torch tensors
nodes = torch.stack(
[torch.tensor(node.drop(['label', 'timestamp'], axis=1).values) for node in nodes]).float().to(
device)
nodes_labels = torch.tensor(nodes_labels, dtype=torch.long, device=device)
return nodes, nodes_labels