diff --git a/firanka/series/series.py b/firanka/series/series.py index 331827a41ecdfe10ce69b4ed141fd77fe3b2665c..ae7372b8649dd7e1ed0f6f14111cc900c42f30d7 100644 --- a/firanka/series/series.py +++ b/firanka/series/series.py @@ -19,12 +19,14 @@ class Series(object): def __getitem__(self, item): """ Return a value for given index, or a subslice of this series - :param item: a float, or a slice + :param item: a float, or a slice, or a Range :return: Series instance or a value :raises NotInDomainError: index not in domain """ - if isinstance(item, slice): - item = Range(item) + if isinstance(item, (Range, slice)): + if isinstance(item, slice): + item = Range(item) + if item not in self.domain: raise NotInDomainError('slicing beyond series domain') @@ -63,14 +65,14 @@ class Series(object): if len(points) == 0: return DiscreteSeries([]) - domain = domain or Range(min(points), max(points), True, True) + points = list(sorted(points)) + + domain = domain or Range(points[0], points[-1], True, True) if domain not in self.domain: raise NotInDomainError('points not inside this series!') - data = [(i, self[i]) for i in points] - data.sort() - return DiscreteSeries(data, domain) + return DiscreteSeries([(i, self[i]) for i in points], domain) def join(self, series, fun): """ @@ -98,7 +100,7 @@ class AppliedSeries(Series): self.series = series def _get_for(self, item): - return self.fun(self._get_for(item)) + return self.fun(self.series._get_for(item)) class TranslatedSeries(Series): diff --git a/tests/test_series/test_series.py b/tests/test_series/test_series.py index 98e95c08527303ce869177b2ed063c4125d8acc4..232d557a8b5bad3f32db76ee6c887da1ef3d3a15 100644 --- a/tests/test_series/test_series.py +++ b/tests/test_series/test_series.py @@ -92,7 +92,6 @@ class TestDiscreteSeries(unittest.TestCase): class TestFunctionBasedSeries(unittest.TestCase): def test_slice(self): series = FunctionBasedSeries(lambda x: x, '<0;2>') - sp = series[0.5:1.5] self.assertEqual(sp[0.5], 0.5) @@ -102,6 +101,11 @@ class TestFunctionBasedSeries(unittest.TestCase): self.assertEqual(sp.domain.start, 0.5) self.assertEqual(sp.domain.stop, 1.5) + def test_apply(self): + PTS = [-1,-2,-3,1,2,3] + series = FunctionBasedSeries(lambda x: x, '<-5;5>').apply(lambda x: x*2) + + self.assertEqual(series.eval_points(PTS), [x*2 for x in PTS]) class TestModuloSeries(unittest.TestCase): def test_base(self):