from pywind.elexon.api import DERBMDATA
[docs]class BalancingPeriodData(object):
""" Class that holds the volume and cashflow totals for a single station/period. """
def __init__(self):
self.bid_cashflow = 0.0
self.bid_volume = 0.0
self.offer_cashflow = 0.0
self.offer_volume = 0.0
[docs] def add_data(self, element, item):
if element == 'ipbav':
self.bid_volume = item['total']
elif element == 'ipoav':
self.offer_volume = item['total']
elif element == 'ipbc':
self.bid_cashflow = item['total']
elif element == 'ipoc':
self.offer_cashflow = item['total']
@property
def bid_rate(self):
if self.bid_volume == 0:
return 0
return self.bid_cashflow / self.bid_volume
@property
def offer_rate(self):
if self.offer_volume == 0:
return 0
return self.offer_cashflow / self.offer_volume
[docs]class BalancingUnitData(object):
""" Class to hold information about a single station for multiple periods """
def __init__(self, item):
self.unit = item['ngcbmunitname']
self.lead = item['leadpartyname']
self.type = item['bmunitid'][0]
self.periods = {}
[docs] def add_data(self, element, item):
period = self.periods.setdefault(item['settlementperiod'],
BalancingPeriodData())
period.add_data(element, item)
[docs]class BalancingData(object):
""" Parent class to hold data from the :mod:DERBMDATA API. """
def __init__(self, api_key):
self.api = DERBMDATA(api_key)
self.units = {}
[docs] def get_data(self, **params):
if self.api.get_data(**params) is False:
return False
for element in self.api.multi:
for item in self.api.multi[element]:
if item['total'] == 0:
continue
unit = self.units.setdefault(item['ngcbmunitname'],
BalancingUnitData(item))
unit.add_data(element, item)
return True