-
Notifications
You must be signed in to change notification settings - Fork 5
/
datasetlib.py
156 lines (106 loc) · 4.13 KB
/
datasetlib.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import pickle
import pandas as pd
IQ_SIGNALS_COLUMN_DATAFRAME_NAME = 'IQ signals'
MODULATION_LABEL_COLUMN_DATAFRAME_NAME = 'Modulation_Label'
SNR_COLUMN_DATAFRAME_NAME = 'SNR'
def load_dataset(dataset_filename):
"""
Opens the dataset file, and returns it as a list of tuples.
Args:
dataset_filename: relative/absolute path to RML2016.10a_dict.pkl dataset.
Returns:
List of tuples (signal, modulation, snr) with data from dataset.
"""
dataset = []
with (open(dataset_filename, "rb")) as dataset_file:
data = dataset_file.read()
data_dict = pickle.loads(data, encoding='bytes') # unpickle data
keys = data_dict.keys()
# for each key in dataset keys
for key in keys:
# extract modulation label and snr
modulation, snr = key[0].decode("utf-8"), key[1]
# for each I/Q signal couple sample
for signal in data_dict[key]:
# save the tuple (signal, modulation_label, snr) in the list
signal_tuple = (signal, modulation, snr)
dataset.append(signal_tuple)
return dataset
def load_dataset_dataframe(dataset_filename, dataset=None):
"""
Opens the dataset file, and returns it as a pandas DataFrame.
Args:
dataset_filename: relative/absolute path to RML2016.10a_dict.pkl dataset.
dataset: list of tuples (signal, modulation, snr) with data from dataset.
Returns:
pandas DataFrame containing dataset.
"""
if dataset is None:
dataset = load_dataset(dataset_filename)
dataset_dataframe = pd.DataFrame(data=dataset)
# pandas aesthetics
dataset_dataframe.columns = [
IQ_SIGNALS_COLUMN_DATAFRAME_NAME,
MODULATION_LABEL_COLUMN_DATAFRAME_NAME,
SNR_COLUMN_DATAFRAME_NAME
]
return dataset_dataframe
def filter_dataset_for_high_snr_only(dataset_df, snr_lower_bound):
"""
Filters the given dataset_df pandas dataframe selecting the rows with at least snr_lower_bound SNR.
Args:
dataset_df: dataset pandas dataframe.
snr_lower_bound: SNR lower bound for filtering.
Returns:
pandas DataFrame containing dataset.
"""
return dataset_df[dataset_df[SNR_COLUMN_DATAFRAME_NAME] >= snr_lower_bound]
def signals(dataset_dataframe):
"""
All the elements of I/Q signal column in dataset, as a List.
Args:
dataset_dataframe: pandas DataFrame containing dataset.
Returns:
list of I/Q signals.
"""
return dataset_dataframe[IQ_SIGNALS_COLUMN_DATAFRAME_NAME].tolist()
def labels(dataset_dataframe):
"""
All the elements of labels column in dataset, as a List.
Args:
dataset_dataframe: pandas DataFrame containing dataset.
Returns:
list of labels.
"""
return dataset_dataframe[MODULATION_LABEL_COLUMN_DATAFRAME_NAME].tolist()
def snrs(dataset_dataframe):
"""
All the elements of SNR column in dataset, as a List.
Args:
dataset_dataframe: pandas DataFrame containing dataset.
Returns:
list of SNRs.
"""
return dataset_dataframe[SNR_COLUMN_DATAFRAME_NAME].tolist()
def mods(dataset_dataframe):
"""
Unique elements of Label column in dataset, as a List.
Args:
dataset_dataframe: pandas DataFrame containing dataset.
Returns:
list of unique labels.
"""
result = dataset_dataframe[MODULATION_LABEL_COLUMN_DATAFRAME_NAME].unique().tolist()
result.sort()
return result
def unique_snrs(dataset_dataframe):
"""
Unique elements of SNR column in dataset, as a List.
Args:
dataset_dataframe: pandas DataFrame containing dataset.
Returns:
list of unique SNRs.
"""
result = dataset_dataframe[SNR_COLUMN_DATAFRAME_NAME].unique().tolist()
result.sort()
return result