smif.convert package¶
Submodules¶
smif.convert.area module¶
Handles conversion between the sets of regions used in the SosModel
-
class
smif.convert.area.NamedShape(name, shape)¶ Bases:
tuple-
name¶ Alias for field number 0
-
shape¶ Alias for field number 1
-
-
class
smif.convert.area.RegionRegister[source]¶ Bases:
smif.convert.register.RegisterHolds the sets of regions used by the SectorModels and provides conversion between data values relating to compatible sets of regions.
-
convert(data, from_set_name, to_set_name)[source]¶ Convert a list of data points for a given set of regions to another set of regions.
Parameters:
-
get_entry(name)[source]¶ Returns the ResolutionSet of name
Parameters: name (str) – The unique identifier of a ResolutionSet in the register Returns: Return type: smif.convert.area.RegionSet
-
names¶ Names of registered region sets
Returns: sets Return type: list of str
-
-
class
smif.convert.area.RegionSet(set_name, fiona_shape_iter)[source]¶ Bases:
smif.convert.register.ResolutionSetHold a set of regions, spatially indexed for ease of lookup when constructing conversion matrices.
Parameters: - set_name (str) – Name to use as identifier for this set of regions
- fiona_shape_iter (iterable) – Iterable (probably a list or a reader handle) of fiona feature records e.g. the ‘features’ entry of a GeoJSON collection
-
data¶
-
name¶
smif.convert.interval module¶
Handles conversion between the set of time intervals used in the SosModel
There are three main classes, which are currently rather intertwined.
Interval represents an individual definition of a period
within a year.
This is specified using the ISO8601 period syntax and exposes
methods which use the isodate library to parse this into an internal hourly
representation of the period.
TimeIntervalRegister holds the definitions of time-interval sets
specified for the sector models at the SosModel
level.
This class exposes one public method,
add_interval_set() which allows the SosModel
to add an interval definition from a model configuration to the register.
Quantities¶
Quantities are associated with a duration, period or interval. For example 120 GWh of electricity generated during each week of February.:
Week 1: 120 GW
Week 2: 120 GW
Week 3: 120 GW
Week 4: 120 GW
Other examples of quantities:
- greenhouse gas emissions
- demands for infrastructure services
- materials use
- counts of cars past a junction
- costs of investments, operation and maintenance
Upscale: Divide¶
To convert to a higher temporal resolution, the values need to be apportioned across the new time scale. In the above example, the 120 GWh of electricity would be divided over the days of February to produce a daily time series of generation. For example:
1st Feb: 17 GWh
2nd Feb: 17 GWh
3rd Feb: 17 GWh
...
Downscale: Sum¶
To resample weekly values to a lower temporal resolution, the values would need to be accumulated. A monthly total would be:
Feb: 480 GWh
Remapping¶
Remapping quantities, as is required in the conversion from energy demand (hourly values over a year) to energy supply (hourly values for one week for each of four seasons) requires additional averaging operations. The quantities are averaged over the many-to-one relationship of hours to time-slices, so that the seasonal-hourly timeslices in the model approximate the hourly profiles found across the particular seasons in the year. For example:
hour 1: 20 GWh
hour 2: 15 GWh
hour 3: 10 GWh
...
hour 8592: 16 GWh
hour 8593: 12 GWh
hour 8594: 21 GWh
...
hour 8760: 43 GWh
To:
season 1 hour 1: 20+16+.../4 GWh # Denominator number hours in sample
season 1 hour 2: 15+12+.../4 GWh
season 1 hour 3: 10+21+.../4 GWh
...
Prices¶
Unlike quantities, prices are associated with a point in time. For example a spot price of £870/GWh. An average price can be associated with a duration, but even then, we are just assigning a price to any point in time within a range of times.
Upscale: Fill¶
Given a timeseries of monthly spot prices, converting these to a daily price can be done by a fill operation. E.g. copying the monthly price to each day.
From:
Feb: £870/GWh
To:
1st Feb: £870/GWh
2nd Feb: £870/GWh
...
Downscale: Average¶
On the other hand, going down scale, such as from daily prices to a monthly price requires use of an averaging function. From:
1st Feb: £870/GWh
2nd Feb: £870/GWh
...
To:
Feb: £870/GWh
Development Notes¶
- We could use
numpy.convolve()to compare time intervals as hourly arrays before adding them to the set of intervals
-
class
smif.convert.interval.Interval(name, list_of_intervals, base_year=2010)[source]¶ Bases:
objectA time interval
Parameters: - id (str) – The unique name of the Interval
- list_of_intervals (str) – A list of tuples of valid ISO8601 duration definition string denoting the time elapsed from the beginning of the year to the (beginning, end) of the interval
- base_year (int, default=2010) – The reference year used for conversion to a datetime tuple
Example
>>> a = Interval('id', ('PT0H', 'PT1H')) >>> a.interval = ('PT1H', 'PT2H') >>> repr(a) "Interval('id', [('PT0H', 'PT1H'), ('PT1H', 'PT2H')], base_year=2010)" >>> str(a) "Interval 'id' starts at hour 0 and ends at hour 1"
-
baseyear¶ The reference year
-
end¶ The end hour of the interval(s)
Returns: An integer or list of integers, representing the hour from the beginning of the year associated with the end of each of the intervals Return type: int or list
-
interval¶ The list of intervals
Setter appends a tuple or list of intervals to the list of intervals
-
class
smif.convert.interval.IntervalSet(name, data, base_year=2010)[source]¶ Bases:
smif.convert.register.ResolutionSetA collection of intervals
Parameters: -
data¶
-
name¶
-
-
class
smif.convert.interval.TimeIntervalRegister[source]¶ Bases:
smif.convert.register.RegisterHolds the set of time-intervals used by the SectorModels
-
convert(data, from_interval_set_name, to_interval_set_name)[source]¶ Convert some data to a time_interval type
Parameters: - data (
numpy.ndarray) – The timeseries to convert from from_interval to to_interval - from_interval_set_name (str) – The unique identifier of a interval type which matches the timeseries
- to_interval_set_name (str) – The unique identifier of a registered interval type
Returns: An array of the resampled timeseries values.
Return type: - data (
-
get_entry(name)[source]¶ Returns the ResolutionSet of name
Parameters: name (str) – The unique identifier of a ResolutionSet in the register Returns: Return type: smif.convert.interval.IntervalSet
-
register(interval_set)[source]¶ Add a time-interval definition to the set of intervals types
Detects duplicate references to the same annual-hours by performing a convolution of the two one-dimensional arrays of time-intervals.
Parameters: interval_set ( smif.convert.interval.IntervalSet) – A collection of intervals
-
smif.convert.register module¶
Register and ResolutionSet abstract classes to contain area and interval metadata.
smif.convert.unit module¶
Module contents¶
In this module, we implement the conversion across space and time
The SpaceTimeConvertor is instantiated with data to convert,
and the names of the four source and destination spatio-temporal resolutions.
The convert() method returns a new
numpy.ndarray for passing to a sector model.
-
class
smif.convert.SpaceTimeConvertor[source]¶ Bases:
objectHandles the conversion of time and space for a list of values
Parameters: - region_register (
smif.convert.area.RegionRegister) – A fully populated register of the modelled regions - interval_register (
smif.convert.interval.TimeIntervalRegister) – A fully populated register of the modelled intervals
Notes
Future development requires using a data object which allows multiple views upon the values across the three dimensions of time, space and units. This will then allow more efficient conversion across any one of these dimensions while holding the others constant. One option could be
collections.ChainMap.-
convert(data, from_spatial, to_spatial, from_temporal, to_temporal)[source]¶ Convert the data from set of regions and intervals to another
Parameters: - data (numpy.ndarray) – An array of values with dimensions regions x intervals
- from_spatial (str) – The name of the spatial resolution of the data
- to_spatial (str) – The name of the required spatial resolution
- from_temporal (str) – The name of the temporal resolution of the data
- to_temporal (str) – The name of the required temporal resolution
Returns: An array of data with dimensions regions x intervals
Return type:
- region_register (