Skip to content
Snippets Groups Projects
Commit 4ee5a588 authored by Piotr Maślanka's avatar Piotr Maślanka
Browse files

what timeproviders?

parent d1d6e4e4
No related branches found
No related tags found
No related merge requests found
...@@ -149,9 +149,3 @@ Or you can check for strict inclusion ...@@ -149,9 +149,3 @@ Or you can check for strict inclusion
```python ```python
Range('<-1;1>') in Range('<-2;2>') Range('<-1;1>') in Range('<-2;2>')
``` ```
## TimeProviders
**EXPERIMENTAL**
Can be imported from _sai.timeproviders_.
...@@ -5,6 +5,7 @@ import logging ...@@ -5,6 +5,7 @@ import logging
import copy import copy
from .series import Series, DiscreteSeries from .series import Series, DiscreteSeries
from .ranges import Range from .ranges import Range
from sortedcontainers import SortedList
""" """
Update knowledge of current discrete series Update knowledge of current discrete series
...@@ -43,11 +44,10 @@ class DiscreteSeriesBuilder(object): ...@@ -43,11 +44,10 @@ class DiscreteSeriesBuilder(object):
:return: a new DiscreteSeries instance :return: a new DiscreteSeries instance
""" """
new_data = [] new_data = SortedList()
cp_new_data = copy.copy(self.new_data) cp_new_data = copy.copy(self.new_data)
# Update # Update - series.data is sorted, so no worries :)
for k, v in self.series.data: for k, v in self.series.data:
if k in cp_new_data: if k in cp_new_data:
v = cp_new_data.pop(k) v = cp_new_data.pop(k)
...@@ -55,6 +55,6 @@ class DiscreteSeriesBuilder(object): ...@@ -55,6 +55,6 @@ class DiscreteSeriesBuilder(object):
# Add those that remained # Add those that remained
for k,v in cp_new_data.items(): for k,v in cp_new_data.items():
new_data.append((k,v)) new_data.add((k,v))
return DiscreteSeries(new_data, self.domain) return DiscreteSeries(new_data, self.domain)
# coding=UTF-8
from __future__ import print_function, absolute_import, division
from .ranges import Range
from .series import Series
class BijectionMapping(object):
def __init__(self, user2float, float2user):
"""
:param user2float: callable/1 => float, mapping from your time system to floats
:param float2user: callable/float => 1, mapping from float to your time systen
"""
self.user2float = user2float
self.float2user = float2user
def to_float(self, user):
return self.user2float(user)
def to_user(self, flt):
return self.float2user(flt)
class TimeProvidedSeries(Series):
"""
If your time is something else than simple floats, this will help you out
"""
def __init__(self, series, mapping, *args, **kwargs):
"""
:param series: series to overlay
"""
super(TimeProvidedSeries, self).__init__(series.domain, *args,
**kwargs)
self.mapping = mapping
self.series = series
def _withmap(self, series):
return TimeProvidedSeries(series, self.mapping)
def __getitem__(self, item):
if isinstance(item, slice):
item = slice(
float('-inf') if slice.start is None else self.to_float(
slice.start),
float('+inf') if slice.stop is None else self.to_float(
slice.stop), )
return self._withmap(self.series[item])
elif isinstance(item, Range):
return self._withmap(self.series[item])
else:
return self.series[self.mapping.to_float(item)]
def _get_for(self, item):
return self.series[self.l2f(item)]
def join(self, series, fun):
return TimeProvidedSeries(self.series.join(series, fun), self.mapping)
# coding=UTF-8
from __future__ import print_function, absolute_import, division
import unittest
from firanka.series import DiscreteSeries
from firanka.timeproviders import TimeProvidedSeries, BijectionMapping
class TestTimeproviders(unittest.TestCase):
def test_base(self):
map = BijectionMapping(
lambda hhmm: hhmm[0] * 60 + hhmm[1],
lambda t: (t // 60, t % 60)
)
ser = DiscreteSeries([(0, 17), (60, 20), (120, 18)])
ts = TimeProvidedSeries(ser, map)
self.assertEqual(ts[(2, 0)], 18)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment