comparison python/indicators.py @ 287:66691c06928c

first version of indicator LCSS
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Sun, 27 Jan 2013 00:51:48 -0500
parents fa95796a76b3
children 93d851d0d21e
comparison
equal deleted inserted replaced
286:fa95796a76b3 287:66691c06928c
32 self.timeInterval = moving.TimeInterval(instants[0], instants[-1]) 32 self.timeInterval = moving.TimeInterval(instants[0], instants[-1])
33 else: 33 else:
34 self.timeInterval = moving.TimeInterval() 34 self.timeInterval = moving.TimeInterval()
35 self.maxValue = maxValue 35 self.maxValue = maxValue
36 36
37 def __len__(self):
38 return len(self.values)
39
37 def empty(self): 40 def empty(self):
38 return len(self.values) == 0 41 return len(self.values) == 0
39 42
40 def __getitem__(self, i): 43 def __getitem__(self, i):
41 'Returns ith value' 44 'Returns ith value in time interval'
45 if i in self.values.keys():
46 return self.values[i]
47 else:
48 return None
49
50 def getIthValue(self, i):
42 sortedKeys = sorted(self.values.keys()) 51 sortedKeys = sorted(self.values.keys())
43 if 0<=i<len(sortedKeys): 52 if 0<=i<len(sortedKeys):
44 return self.values[sortedKeys[i]] 53 return self.values[sortedKeys[i]]
45 else: 54 else:
46 return None 55 return None
47
48 def valueAtInstant(self, i):
49 if i in self.values.keys():
50 return self.values[i]
51 else:
52 return None
53
54 def __len__(self):
55 return len(self.values)
56 56
57 def __iter__(self): 57 def __iter__(self):
58 self.iterInstantNum = 0 # index in the interval or keys of the dict 58 self.iterInstantNum = 0 # index in the interval or keys of the dict
59 return self 59 return self
60 60
62 if self.iterInstantNum >= len(self.values):#(self.timeInterval and self.iterInstantNum>=self.timeInterval.length())\ 62 if self.iterInstantNum >= len(self.values):#(self.timeInterval and self.iterInstantNum>=self.timeInterval.length())\
63 # or (self.iterInstantNum >= self.values) 63 # or (self.iterInstantNum >= self.values)
64 raise StopIteration 64 raise StopIteration
65 else: 65 else:
66 self.iterInstantNum += 1 66 self.iterInstantNum += 1
67 return self.__getitem__(self.iterInstantNum-1) 67 return self.getIthValue(self.iterInstantNum-1)
68 68
69 def getTimeInterval(self): 69 def getTimeInterval(self):
70 return self.timeInterval 70 return self.timeInterval
71 71
72 def getValues(self): 72 def getValues(self):
73 return self.values.values() 73 return [self.__getitem__(t) for t in self.timeInterval]
74 74
75 def getAngleValues(self): 75 def getAngleValues(self):
76 '''if the indicator is a function of an angle, 76 '''if the indicator is a function of an angle,
77 transform it to an angle (eg cos) 77 transform it to an angle (eg cos)
78 (no transformation otherwise)''' 78 (no transformation otherwise)'''
96 96
97 def computeDLCSS(indicator1, indicator2, threshold, delta = float('inf'), method= 'min'): 97 def computeDLCSS(indicator1, indicator2, threshold, delta = float('inf'), method= 'min'):
98 ''' compute the distance between two indicators using LCSS 98 ''' compute the distance between two indicators using LCSS
99 two common methods are used: min or mean of the indicators length''' 99 two common methods are used: min or mean of the indicators length'''
100 from utils import LCSS 100 from utils import LCSS
101 lcss = LCSS(indicator1, indicator2, threshold, lambda x,y:abs(x-y), delta) 101
102 def distance(x, y): # lambda x,y:abs(x-y)
103 if x == None or y == None:
104 return float('inf')
105 else:
106 return abs(x-y)
107
108 lcss = LCSS(indicator1.getValues(), indicator2.getValues(), threshold, distance, delta)
102 if method == 'min': 109 if method == 'min':
103 denominator = min(len(indicator1), len(indicator2)) 110 denominator = min(len(indicator1), len(indicator2))
104 elif method == 'mean': 111 elif method == 'mean':
105 denominator = float(len(indicator1) + len(indicator2))/2 112 denominator = float(len(indicator1) + len(indicator2))/2
106 else: 113 else: