This repository was archived by the owner on Jul 5, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathWindowing.py
More file actions
80 lines (63 loc) · 1.85 KB
/
Windowing.py
File metadata and controls
80 lines (63 loc) · 1.85 KB
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
from collections import deque
inf = float('inf')
class AbstractWindowOperation(object):
__slots__ = ('dq', 'maxlen', 'cnt')
def __init__(self, maxlen):
self.dq = deque()
self.maxlen = maxlen
self.cnt = 0
def add(self, item):
if len(self.dq) >= self.maxlen:
self.dq.popleft()
self.dq.append(item)
self.cnt += 1
def estimate(self):
raise Exception("implement in subclass")
class AverageWindow(AbstractWindowOperation):
def __init__(self, maxlen=5):
super().__init__(maxlen)
def estimate(self):
return sum(self.dq)/len(self.dq)
class SlopeWindow(AbstractWindowOperation):
""" remember we're adding to the Y's here
"""
def __init__(self, maxlen=5):
super().__init__(maxlen)
def estimate(self):
if self.cnt < 2:
return inf
xs = list(range(self.cnt - len(self.dq) + 1, self.cnt + 1))
xbar = sum(xs)/len(xs)
ybar = sum(self.dq)/len(self.dq)
numer = 0
denom = 0
for x, y in zip(xs, self.dq):
numer += (x-xbar) * (y-ybar)
denom += (x-xbar) * (x-xbar)
if denom == 0:
return inf
#print(xs, self.dq, xbar, ybar, numer, denom)
return numer / denom
def testAverage():
import random
l = list(range(1, 12))
aw = AverageWindow(11)
for _ in range(10):
random.shuffle(l)
for i in l:
aw.add(i)
avg = aw.calculate()
#print(avg)
assert abs(avg - 6.0) < 0.000001
def testSlope():
sw = SlopeWindow(10)
yval = 50
decr = 2
for _ in range(10):
for _ in range(10):
sw.add(yval)
yval -= decr
slope = sw.calculate()
#print(slope)
assert abs(slope + decr) < 0.000001
decr /= 2