86 lines
2.4 KiB
Python
86 lines
2.4 KiB
Python
|
# standard imports
|
|||
|
import logging
|
|||
|
import datetime
|
|||
|
|
|||
|
logg = logging.getLogger().getChild(__name__)
|
|||
|
|
|||
|
class GasAggregator:
|
|||
|
|
|||
|
def __init__(self, capacity):
|
|||
|
self.avg = 0
|
|||
|
self.count = 0
|
|||
|
self.timestamp = datetime.datetime.utcnow()
|
|||
|
self.buffer_cursor = 0
|
|||
|
self.buffer_capacity = capacity
|
|||
|
self.buffer = [None] * self.buffer_capacity
|
|||
|
self.initial = False
|
|||
|
self.aggr = 0
|
|||
|
self.local_aggr = 0
|
|||
|
self.local_count = 0
|
|||
|
self.local_high = 0
|
|||
|
self.local_low = 0
|
|||
|
|
|||
|
|
|||
|
def put(self, v):
|
|||
|
self.local_aggr += v
|
|||
|
self.local_count += 1
|
|||
|
if self.local_low == 0:
|
|||
|
self.local_low = v
|
|||
|
if v > self.local_high:
|
|||
|
self.local_high = v
|
|||
|
elif v < self.local_low:
|
|||
|
self.local_low = v
|
|||
|
self.count += 1
|
|||
|
|
|||
|
|
|||
|
def process(self):
|
|||
|
if self.local_count == 0:
|
|||
|
logg.info('skipping 0 tx block')
|
|||
|
return False
|
|||
|
v = int(self.local_aggr / self.local_count)
|
|||
|
logg.info('calculated new block average {} from {} tx samples, low {} high {}'.format(v, self.local_count, self.local_low, self.local_high))
|
|||
|
self.local_aggr = 0
|
|||
|
self.local_count = 0
|
|||
|
if not self.initial:
|
|||
|
for i in range(self.buffer_capacity):
|
|||
|
self.buffer[i] = v
|
|||
|
self.initial = True
|
|||
|
else:
|
|||
|
self.buffer[self.buffer_cursor] = v
|
|||
|
self.buffer_cursor += 1
|
|||
|
self.buffer_cursor %= self.buffer_capacity
|
|||
|
|
|||
|
self.aggr = self.avg * self.count
|
|||
|
self.aggr += v
|
|||
|
self.avg = int(self.aggr / self.count)
|
|||
|
logg.info('added {} to aggregate {} new average {} from {} samples'.format(v, self.aggr, self.avg, self.count))
|
|||
|
return True
|
|||
|
|
|||
|
|
|||
|
def get(self, n=0):
|
|||
|
if n == 0:
|
|||
|
n = self.capacity
|
|||
|
|
|||
|
cursor = self.buffer_cursor
|
|||
|
aggr = 0
|
|||
|
i = 0
|
|||
|
while i < n:
|
|||
|
v = self.buffer[cursor]
|
|||
|
aggr += v
|
|||
|
cursor -= 1
|
|||
|
if cursor < 0:
|
|||
|
cursor = self.buffer_capacity - 1
|
|||
|
i += 1
|
|||
|
|
|||
|
return int(aggr / n)
|
|||
|
|
|||
|
|
|||
|
def block_callback(self, block, tx):
|
|||
|
logg.info('synced {}'.format(block))
|
|||
|
if self.process():
|
|||
|
|
|||
|
v = self.get(10)
|
|||
|
logg.info('last 6 average now {}'.format(v))
|
|||
|
v = self.get(360)
|
|||
|
logg.info('last 360 average now {}'.format(v))
|