Working with the SAX package
Now that we have the SAX package at hand, it is time to use it by developing various utilities, starting with a utility that computes the SAX representations of the subsequences of a time series.
Computing the SAX representations of the subsequences of a time series
In this subsection, we will develop a utility that computes the SAX representations for all the subsequences of a time series and also presents their normalized forms. The name of the utility is ts2PAA.py
and contains the following code:
#!/usr/bin/env python3 import sys import numpy as np import pandas as pd from sax import sax def main(): if len(sys.argv) != 5: print("TS1 sliding_window cardinality segments") sys.exit() file = sys.argv[1] sliding = int(sys.argv[2]) cardinality = int(sys.argv[3]) segments = int(sys.argv[4]) if sliding % segments != 0: print("sliding MODULO segments != 0...") sys.exit() if sliding <= 0: print("Sliding value is not allowed:", sliding) sys.exit() if cardinality <= 0: print("Cardinality Value is not allowed:", cardinality) sys.exit() # Read Sequence as Pandas ts = pd.read_csv(file, names=['values'], compression='gzip') # Convert to NParray ts_numpy = ts.to_numpy() length = len(ts_numpy) PAA_representations = [] # Split sequence into subsequences for i in range(length - sliding + 1): t1_temp = ts_numpy[i:i+sliding] # Generate SAX for each subsequence tempSAXword = sax.createPAA(t1_temp, cardinality, segments) SAXword = tempSAXword.split("_")[:-1] print(SAXword, end = ' ') PAA_representations.append(SAXword) print("[", end = ' ') for i in t1_temp.tolist(): for k in i: print("%.2f" % k, end = ' ') print("]", end = ' ') print("[", end = ' ') for i in sax.normalize(t1_temp).tolist(): for k in i: print("%.2f" % k, end = ' ') print("]") if __name__ == '__main__': main()
The ts2PAA.py
script takes a time series, breaks it into subsequences, and computes the normalized version of each subsequence using sax.normalize()
.
The output of ts2PAA.py
is as follows (some output is omitted for brevity):
$ ./ts2PAA.py ts1.gz 8 4 2 ['01', '10'] [ 5.22 23.44 14.14 6.75 4.31 27.94 6.61 21.73 ] [ -0.97 1.10 0.04 -0.80 -1.07 1.61 -0.81 0.90 ] ['01', '10'] [ 23.44 14.14 6.75 4.31 27.94 6.61 21.73 11.43 ] [ 1.07 -0.05 -0.94 -1.24 1.62 -0.96 0.87 -0.38 ] ['10', '01'] [ 14.14 6.75 4.31 27.94 6.61 21.73 11.43 7.15 ] [ 0.21 -0.73 -1.05 1.97 -0.75 1.18 -0.14 -0.68 ] ['01', '10'] [ 6.75 4.31 27.94 6.61 21.73 11.43 7.15 15.85 ] [ -0.76 -1.07 1.93 -0.77 1.14 -0.16 -0.70 0.40 ] ['01', '10'] [ 4.31 27.94 6.61 21.73 11.43 7.15 15.85 29.96 ] [ -1.22 1.32 -0.97 0.66 -0.45 -0.91 0.02 1.54 ] ['10', '01'] [ 27.94 6.61 21.73 11.43 7.15 15.85 29.96 6.00 ] [ 1.34 -1.02 0.65 -0.49 -0.96 0.00 1.56 -1.08 ] . . .
The previous output shows the SAX representation, the original subsequence, and the normalized version of the subsequence for all the subsequences of a time series. Each subsequence is on a separate line.
Using Python packages
Most of the chapters that follow will need the SAX package we developed here. For reasons of simplicity, we will copy the SAX package implementation into all directories that use that package. This might not be the best practice on production systems where we want a single copy of each software or package, but it is the best practice when learning and experimenting.
So far, we have learned how to use the basic functionality of the sax
package.
The next section presents a utility that counts the SAX representations of the subsequences of a time series and prints the results.