def test_set_interval(): ts = TimeSeries() nose.tools.assert_raises(KeyError, ts.get, 0) nose.tools.assert_raises(KeyError, ts.set_interval, 2, 4, 5) ts[1.2] = 1 ts[3] = 0 ts[6] = 2 assert ts[0] == 1 assert ts[5.5] == 0 assert ts[7] == 2 ts[2:4] = 5 assert ts.items() == [(1.2, 1), (2, 5), (4, 0), (6, 2)] ts[3:5] = 4 assert ts.items() == [(1.2, 1), (2, 5), (3, 4), (5, 0), (6, 2)] tsc = TimeSeries(ts) ts.set_interval(3, 4, 4) assert ts.items() == [(1.2, 1), (2, 5), (3, 4), (4, 4), (5, 0), (6, 2)] tsc.set_interval(3, 4, 4, compact=True) assert tsc.items() == [(1.2, 1), (2, 5), (3, 4), (5, 0), (6, 2)]
def test_difference(): a = TimeSeries(data=[(0, 0), (2, 2)], default=0) b = TimeSeries(data=[(1, 1), (3, 2)], default=0) c = a - b nose.tools.eq_(list(c.items()), [(0, 0), (1, -1), (2, 1), (3, 0)])
def test_mean(): ts = TimeSeries([[1, 2], [2, 3], [6, 1], [8, 4]], domain=Domain(0, 9)) assert ts.mean() == 22. / 9 ts = TimeSeries([[1, 2], [2, 3], [6, 1], [8, 4]], domain=Domain([1, 2], [3, 5], [6, 8])) nose.tools.assert_raises(NotImplementedError, ts.mean)
def test_init_data(): ts = TimeSeries([(1, 2), (2, 3), (6, 1), (8, 4)]) assert ts[0] == 2 assert ts[1] == 2 assert ts[1.5] == 2 assert ts[6] == 1 assert ts[7] == 1 assert ts[8] == 4 assert ts[10] == 4 ts = TimeSeries([[1, 2], [2, 3], [6, 1], [8, 4]]) assert ts[0] == 2 assert ts[1] == 2 assert ts[1.5] == 2 assert ts[6] == 1 assert ts[7] == 1 assert ts[8] == 4 assert ts[10] == 4 ts = TimeSeries({1: 2, 2: 3, 6: 1, 8: 4}) assert ts[0] == 2 assert ts[1] == 2 assert ts[1.5] == 2 assert ts[6] == 1 assert ts[7] == 1 assert ts[8] == 4 assert ts[10] == 4
def test_set_domain(): ts = TimeSeries() assert ts.domain == Domain([-inf, inf]) ts.domain = None assert ts.domain == Domain([-inf, inf]) ts.domain = [-inf, 5] assert ts.domain == Domain([-inf, 5]) ts.domain = [5, inf] assert ts.domain == Domain([5, inf]) ts.domain = [-inf, inf] assert ts.domain == Domain([-inf, inf]) ts.domain = [2, 5] assert ts.domain == Domain([2, 5]) ts.domain = [[2, 5], [9, 10]] assert ts.domain == Domain([2, 5], [9, 10]) ts = TimeSeries(data=[(1, 2), (2, 3), (6, 1), (8, 4)]) nose.tools.assert_raises(ValueError, setattr, ts, 'domain', [1.5, 7]) nose.tools.assert_raises(ValueError, setattr, ts, 'domain', [0, 7]) nose.tools.assert_raises(ValueError, setattr, ts, 'domain', [1.5, 9])
def test_mask(): start = datetime.datetime(2015, 3, 1) # v. simple a = TimeSeries() a.set(start, 1) a.set(datetime.datetime(2015, 4, 2), 0) a.set(datetime.datetime(2015, 4, 3), 1) a.set(datetime.datetime(2015, 4, 4), 0) end = datetime.datetime(2015, 4, 5) mask = TimeSeries(default=False) mask[datetime.datetime(2015, 4, 1)] = True mask[datetime.datetime(2015, 4, 3)] = False # not normalized distribution = a.distribution( start=start, end=end, normalized=False, mask=mask, ) assert distribution[0] == 24 * 60 * 60 # one day assert distribution[1] == 24 * 60 * 60 # normalized distribution = a.distribution( start=start, end=end, mask=mask, ) assert distribution[0] == 0.5 assert distribution[1] == 0.5
def test_distribution_empty(): ts = TimeSeries() mask = TimeSeries(default=0) mask[0] = 1 mask[2] = 0 # distribution with default args and no default value on empty # TimeSeries doesn't know what to do nose.tools.assert_raises(ValueError, ts.distribution) # distribution with start and end, but no default value on empty # TimeSeries doesn't know what to do nose.tools.assert_raises(ValueError, ts.distribution, 0, 10) # no matter what is passed in to distribution, if the default # value is not set on an empty TimeSeries this should be an error nose.tools.assert_raises(ValueError, ts.distribution, mask=mask) ts = TimeSeries(default=0) # no mask or start/end on empty TimeSeries, don't know what to do nose.tools.assert_raises(ValueError, ts.distribution) # start and end or mask given, is fine distribution = ts.distribution(0, 10) assert distribution[0] == 1.0 distribution = ts.distribution(mask=mask) assert distribution[0] == 1.0
def test_iterperiods(): # timeseries with a default value and no points returns one period # with the default value from -infinity to infinity, or ts = TimeSeries(default=0) assert list(ts.iterperiods()) == [(-inf, inf, 0)] # timeseries with no default value and no points raises error ts = TimeSeries() with nose.tools.assert_raises(KeyError): list(ts.iterperiods()) ts = TimeSeries() ts.set(datetime.datetime(2015, 3, 1), 1) ts.set(datetime.datetime(2015, 3, 2), 0) ts.set(datetime.datetime(2015, 3, 3), 1) ts.set(datetime.datetime(2015, 3, 4), 2) answer = [ (datetime.datetime(2015, 3, 1), datetime.datetime(2015, 3, 2), 1), (datetime.datetime(2015, 3, 2), datetime.datetime(2015, 3, 3), 0), (datetime.datetime(2015, 3, 3), datetime.datetime(2015, 3, 4), 1)] result = [] for (t0, t1, v0) in ts.iterperiods( start=datetime.datetime(2015, 3, 1), end=datetime.datetime(2015, 3, 4) ): result.append((t0, t1, v0)) assert answer == result answer = [ (datetime.datetime(2015, 3, 1), datetime.datetime(2015, 3, 2), 1), (datetime.datetime(2015, 3, 3), datetime.datetime(2015, 3, 4), 1), ] result = [] for (t0, t1, v0) in ts.iterperiods( start=datetime.datetime(2015, 3, 1), end=datetime.datetime(2015, 3, 4), value=1, ): result.append((t0, t1, v0)) assert answer == result def filter(t0, t1, value): return True if not value else False answer = [ (datetime.datetime(2015, 3, 2), datetime.datetime(2015, 3, 3), 0), ] result = [] for (t0, t1, v0) in ts.iterperiods( start=datetime.datetime(2015, 3, 1), end=datetime.datetime(2015, 3, 4), value=filter, ): result.append((t0, t1, v0)) assert answer == result
def test_merge(): ts_a = TimeSeries(default=None) ts_b = TimeSeries(default=None) ts_a[0] = None ts_b[0] = True ts_merge = TimeSeries.merge([ts_a, ts_b]) assert True in ts_merge[0] assert None in ts_merge[0]
def test_merge(): ts_a = TimeSeries() ts_b = TimeSeries() # ts_a[0] = None ts_b[0] = True ts_merge = TimeSeries.merge([ts_a, ts_b]) assert True in ts_merge[0] assert None in ts_merge[0] ts_c = TimeSeries.merge([]) assert list(ts_c.items()) == []
def test_sample(): # Check using int ts = TimeSeries([[1, 2], [2, 3], [6, 1], [8, 4]], domain=Domain(1, 9)) assert dict(ts.sample(1)) == {i: ts[i] for i in range(1, 10)} assert dict( ts.sample(0.5)) == {1 + i / 2.: ts[1 + i / 2.] for i in range(0, 17)} ts = TimeSeries( [[1, 2], [2, 3], [6, 1], [8, 4]], domain=Domain([1, 2], [3, 5], [6, 8]), ) nose.tools.assert_raises(NotImplementedError, ts.sample, 0.5)
def test_single_merges(): # a single empty time series ts = TimeSeries() assert TimeSeries.merge([ts]) == TimeSeries(default=[None]) # multiple empty time series ts_a = TimeSeries() ts_b = TimeSeries() assert TimeSeries.merge([ts_a, ts_b]) == \ TimeSeries(default=[None, None]) # test a single time series with only one measurement ts = TimeSeries() ts[21] = 42 merged = TimeSeries.merge([ts]) assert list(merged.items()) == [(21, [42])] # test an empty time series and a time series with one measurement ts_a = TimeSeries() ts_a[21] = 42 ts_b = TimeSeries() ts = TimeSeries.merge([ts_a, ts_b]) assert ts[20] == [None, None] assert ts[23] == [42, None] # test an empty time series and a time series with one entry ts_a = TimeSeries() ts_a[21] = 42 ts_a[22] = 41 ts_a[23] = 40 ts_b = TimeSeries() ts_b[20] = 1 ts_b[22] = 2 ts_b[24] = 3 merged = TimeSeries.merge([ts_a, ts_b]) assert list(merged.items()) == [ (20, [None, 1]), (21, [42, 1]), (22, [41, 2]), (23, [40, 2]), (24, [40, 3]), ]
def test_remove_points_from_interval(): ts = TimeSeries(default=0) ts[0] = 0 ts[1] = 2 ts[3] = 1 ts[4] = 0 assert ts[5] == 0 del ts[3.5:4.5] assert ts[5] == 1 ts[4] = 0 del ts[3:4.5] assert ts[5] == 2 ts[3] = 1 ts[4] = 0 del ts[3.5:4] assert ts[5] == 0
def example_dictlike(): # test overwriting keys l = TimeSeries() l[datetime.datetime(2010, 1, 1)] = 5 l[datetime.datetime(2010, 1, 2)] = 4 l[datetime.datetime(2010, 1, 3)] = 3 l[datetime.datetime(2010, 1, 7)] = 2 l[datetime.datetime(2010, 1, 4)] = 1 l[datetime.datetime(2010, 1, 4)] = 10 l[datetime.datetime(2010, 1, 4)] = 5 l[datetime.datetime(2010, 1, 1)] = 1 l[datetime.datetime(2010, 1, 7)] = 1.2 l[datetime.datetime(2010, 1, 8)] = 1.3 l[datetime.datetime(2010, 1, 12)] = 1.3 # do some wackiness with a bunch of points dt = datetime.datetime(2010, 1, 12) for i in range(1000): dt += datetime.timedelta(hours=random.random()) l[dt] = math.sin(i / float(math.pi)) dt -= datetime.timedelta(hours=500) dt -= datetime.timedelta(minutes=30) for i in range(1000): dt += datetime.timedelta(hours=random.random()) l[dt] = math.cos(i / float(math.pi)) # what does this get? print >> sys.stderr, l[datetime.datetime(2010, 1, 3, 23, 59, 59)] # output the time series for i, j in l: print(i.isoformat(), j)
def test_scalar_ops(): a = TimeSeries() a.set(datetime.datetime(2015, 3, 1), 1) a.set(datetime.datetime(2015, 3, 2), 0) a.set(datetime.datetime(2015, 3, 3), 3) a.set(datetime.datetime(2015, 3, 4), 2) ts_half = a.multiply(0.5) ts_bool = a.to_bool(invert=False) ts_threshold = a.threshold(value=1.1) # test before domain, should give default value assert ts_half[datetime.datetime(2015, 2, 24)] is None assert ts_bool[datetime.datetime(2015, 2, 24)] == None assert ts_threshold[datetime.datetime(2015, 2, 24)] == None # test values throughout series assert ts_half[datetime.datetime(2015, 3, 1, 6)] == 0.5 assert ts_bool[datetime.datetime(2015, 3, 1, 6)] == True assert ts_threshold[datetime.datetime(2015, 3, 1, 6)] == False assert ts_half[datetime.datetime(2015, 3, 2, 6)] == 0 assert ts_bool[datetime.datetime(2015, 3, 2, 6)] == False assert ts_threshold[datetime.datetime(2015, 3, 2, 6)] == False assert ts_half[datetime.datetime(2015, 3, 3, 6)] == 1.5 assert ts_bool[datetime.datetime(2015, 3, 3, 6)] == True assert ts_threshold[datetime.datetime(2015, 3, 3, 6)] == True # test after domain, should give last value assert ts_half[datetime.datetime(2015, 3, 4, 18)] == 1 assert ts_bool[datetime.datetime(2015, 3, 4, 18)] == True assert ts_threshold[datetime.datetime(2015, 3, 4, 18)] == True
def test_domain(): ts = TimeSeries() assert ts.domain == Domain([-inf, inf]) ts.domain = None assert ts.domain == Domain([-inf, inf]) ts.domain = [-inf, 5] assert ts.domain == Domain([-inf, 5]) ts.domain = [5, inf] assert ts.domain == Domain([5, inf]) ts.domain = [-inf, inf] assert ts.domain == Domain(-inf, inf) ts.domain = [2, 5] assert ts.domain == Domain([2, 5]) ts.domain = [[2, 5], [9, 10]] assert ts.domain == Domain([[2, 5], [9, 10]]) ts.domain = [[-inf, 1], [2, 5], [9, 10]] assert ts.domain == Domain([[-inf, 1], [2, 5], [9, 10]]) ts.domain = [[2, 5], [9, 10], [11, inf]] assert ts.domain == Domain([[2, 5], [9, 10], [11, inf]]) ts.domain = [[-inf, 1], [2, 5], [9, 10], [11, inf]] assert ts.domain == Domain([[-inf, 1], [2, 5], [9, 10], [11, inf]])
def example_arrow(): l = TimeSeries() l[arrow.Arrow(2010, 1, 1)] = 0 l[arrow.Arrow(2010, 1, 3, 10)] = 1 l[arrow.Arrow(2010, 1, 5)] = 0 l[arrow.Arrow(2010, 1, 8)] = 1 l[arrow.Arrow(2010, 1, 17)] = 0 l[arrow.Arrow(2010, 1, 19)] = 1 l[arrow.Arrow(2010, 1, 23)] = 0 l[arrow.Arrow(2010, 1, 26)] = 1 l[arrow.Arrow(2010, 1, 28)] = 0 l[arrow.Arrow(2010, 1, 31)] = 1 l[arrow.Arrow(2010, 2, 5)] = 0 for time, value in l: print(time.naive.isoformat(), 0.1 * value + 1.1) print('') start = arrow.Arrow(2010, 1, 1) end = arrow.Arrow(2010, 2, 5) unit = {'hours': 25} for start, end in span_range(start, end, unit): print(start.naive.isoformat(), l.mean(start, end)) print('') for start, end in span_range(start, end, unit): print(start.naive.isoformat(), -0.2) print(start.naive.isoformat(), 1.2)
def example_mean(): l = TimeSeries() l[datetime.datetime(2010, 1, 1)] = 0 l[datetime.datetime(2010, 1, 3, 10)] = 1 l[datetime.datetime(2010, 1, 5)] = 0 l[datetime.datetime(2010, 1, 8)] = 1 l[datetime.datetime(2010, 1, 17)] = 0 l[datetime.datetime(2010, 1, 19)] = 1 l[datetime.datetime(2010, 1, 23)] = 0 l[datetime.datetime(2010, 1, 26)] = 1 l[datetime.datetime(2010, 1, 28)] = 0 l[datetime.datetime(2010, 1, 31)] = 1 l[datetime.datetime(2010, 2, 5)] = 0 for time, value in l: print(time.isoformat(), 0.1 * value + 1.1) print('') timestep = {'hours': 25} start = datetime.datetime(2010, 1, 1) while start <= datetime.datetime(2010, 2, 5): end = start + datetime.timedelta(**timestep) print(start.isoformat(), l.mean(start, end)) start = end print('') start = datetime.datetime(2010, 1, 1) while start <= datetime.datetime(2010, 2, 5): end = start + datetime.timedelta(**timestep) print(start.isoformat(), -0.2) print(start.isoformat(), 1.2) start = end
def add_annotation(self, file: os.PathLike, **kwargs): self.file_list.append(file) # setup default kwargs # if self.ordinal: kwargs.update({'value_transform': lambda cls: self.order.get(cls)}) if not kwargs.get('time_transform', None): kwargs.update({'time_transform': lambda t: float(t)}) if not kwargs.get('skip_header', None): kwargs.update({'skip_header': False}) if not os.path.isfile(file): raise FileNotFoundError(f'File {file} not found.') if os.path.getsize(file): ts = TimeSeries.from_csv(file, **kwargs).slice(self.start_time, self.end_time) meta = pd.read_csv(file, names=COLUMNS.keys()) meta.drop(meta[meta['time'] < self.start_time].index) meta.drop(meta[meta['time'] > self.end_time].index) else: ts = TimeSeries() meta = pd.DataFrame() self.metadata.append(meta) self.series.append(ts) self._data = self._report()
def test_mask(): start = datetime.datetime(2015, 3, 1) # v. simple a = TimeSeries() a.set(start, 1) a.set(datetime.datetime(2015, 3, 2), 0) a.set(datetime.datetime(2015, 3, 3), 1) a.set(datetime.datetime(2015, 3, 4), 0) end = datetime.datetime(2015, 3, 5) mask = Domain(datetime.datetime(2015, 3, 1), datetime.datetime(2015, 3, 3)) # not normalized distribution = a.distribution( start=start, end=end, normalized=False, mask=mask, ) assert distribution[0] == 24 * 60 * 60 # one day assert distribution[1] == 24 * 60 * 60 # normalized distribution = a.distribution( start=start, end=end, mask=mask, ) assert distribution[0] == 0.5 assert distribution[1] == 0.5
def example_dictlike(): # test overwriting keys ts = TimeSeries() ts[datetime.datetime(2010, 1, 1)] = 5 ts[datetime.datetime(2010, 1, 2)] = 4 ts[datetime.datetime(2010, 1, 3)] = 3 ts[datetime.datetime(2010, 1, 7)] = 2 ts[datetime.datetime(2010, 1, 4)] = 1 ts[datetime.datetime(2010, 1, 4)] = 10 ts[datetime.datetime(2010, 1, 4)] = 5 ts[datetime.datetime(2010, 1, 1)] = 1 ts[datetime.datetime(2010, 1, 7)] = 1.2 ts[datetime.datetime(2010, 1, 8)] = 1.3 ts[datetime.datetime(2010, 1, 12)] = 1.3 # do some wackiness with a bunch of points dt = datetime.datetime(2010, 1, 12) for i in range(1000): dt += datetime.timedelta(hours=random.random()) ts[dt] = math.sin(i / float(math.pi)) dt -= datetime.timedelta(hours=500) dt -= datetime.timedelta(minutes=30) for i in range(1000): dt += datetime.timedelta(hours=random.random()) ts[dt] = math.cos(i / float(math.pi)) # output the time series for i, j in ts: print(i.isoformat(), j)
def test_distribution_set(): time_series = TimeSeries() time_series[1.2] = {'broccoli'} time_series[1.4] = {'broccoli', 'orange'} time_series[1.7] = {'broccoli', 'orange', 'banana'} time_series[2.2] = {'orange', 'banana'} time_series[3.5] = {'orange', 'banana', 'beets'}
def test_distribution(): start = datetime.datetime(2015, 3, 1) # v. simple a = TimeSeries() a.set(start, 1) a.set(datetime.datetime(2015, 3, 2), 0) a.set(datetime.datetime(2015, 3, 3), 1) a.set(datetime.datetime(2015, 3, 4), 0) end = datetime.datetime(2015, 3, 5) # not normalized distribution = a.distribution( start=start, end=end, normalized=False, ) assert distribution[0] == 24 * 60 * 60 * 2 # two days assert distribution[1] == 24 * 60 * 60 * 2 # normalized distribution = a.distribution(start=start, end=end) assert distribution[0] == 0.5 assert distribution[1] == 0.5
def from_pandas(df, compact=True): '''TODO''' domain = Domain(df.index[0], df.index[-1]) data = {col: TimeSeries(df[col].T, domain=domain) for col in df.columns} if compact: for val in data.values(): val.compact() return data
def test_exists(): ts = TimeSeries([(-5, 0), (0, 23), (5, None)]) ts_exists = ts.exists() assert ts_exists[-10] is False assert ts_exists[-2] is True assert ts_exists[3] is True assert ts_exists[10] is False
def example_sum(): a = TimeSeries() a.set(datetime.datetime(2015, 3, 1), 1) a.set(datetime.datetime(2015, 3, 2), 0) a.set(datetime.datetime(2015, 3, 3), 1) a.set(datetime.datetime(2015, 3, 5), 0) a.set(datetime.datetime(2015, 3, 6), 0) b = TimeSeries() b.set(datetime.datetime(2015, 3, 1), 0) b.set(datetime.datetime(2015, 3, 2, 12), 1) b.set(datetime.datetime(2015, 3, 3, 13, 13), 0) b.set(datetime.datetime(2015, 3, 4), 1) b.set(datetime.datetime(2015, 3, 5), 0) b.set(datetime.datetime(2015, 3, 5, 12), 1) b.set(datetime.datetime(2015, 3, 5, 19), 0) c = TimeSeries() c.set(datetime.datetime(2015, 3, 1, 17), 0) c.set(datetime.datetime(2015, 3, 1, 21), 1) c.set(datetime.datetime(2015, 3, 2, 13, 13), 0) c.set(datetime.datetime(2015, 3, 4, 18), 1) c.set(datetime.datetime(2015, 3, 5, 4), 0) # output the three time series for i, ts in enumerate([a, b, c]): for (t0, v0), (t1, v1) in ts.iterintervals(1): print(t0.isoformat(), i) print(t1.isoformat(), i) print('') for (t0, v0), (t1, v1) in ts.iterintervals(0): print(t0.isoformat(), i) print(t1.isoformat(), i) print('') # output the sum # for dt, i in sum([a, b, c]): # print dt.isoformat(), i # print '' for dt, i in TimeSeries.merge([a, b, c], operation=sum): print(dt.isoformat(), i)
def make_random_timeseries(): length = random.randint(1, 10) result = TimeSeries() t = 0 for i in range(length): t += random.randint(0, 5) x = random.randint(0, 5) result[t] = x return result
def test_none_handling(): ts = TimeSeries() ts[1] = (0, 1) ts[2] = (None, 0) ts[3] = (2, 0) # print(ts.distribution(normalized=False)) assert (ts.distribution()[(0, 1)] == 0.5) assert (ts.distribution()[(None, 0)] == 0.5)
def test_set_interval_datetime(): ts = TimeSeries(default=400) ts[datetime(2012, 1, 4, 12)] = 5 ts[datetime(2012, 1, 9, 18)] = 10 ts[datetime(2012, 1, 8):datetime(2012, 1, 10)] = 100 assert ts.items() == [(datetime(2012, 1, 4, 12, 0), 5), (datetime(2012, 1, 8, 0, 0), 100), (datetime(2012, 1, 10, 0, 0), 10)]
def test_moving_average(): ts = TimeSeries([[1, 2], [2, 3], [6, 1], [8, 4]], domain=Domain(1, 9)) ts2 = TimeSeries( [[1, 2], [2, 3], [6, 1], [8, 4]], domain=Domain(1 - 1, 9 + 1), ) assert dict(ts.moving_average( 1, 2)) == {i: ts2.mean(i - 1, i + 1) for i in range(1, 10)} assert dict(ts.moving_average(0.5, 2)) == { 1 + i / 2.: ts2.mean(1 + i / 2. - 1, 1 + i / 2. + 1) for i in range(0, 17) } ts = TimeSeries([[1, 2], [2, 3], [6, 1], [8, 4]], domain=Domain([1, 2], [3, 5], [6, 8])) nose.tools.assert_raises(NotImplementedError, ts.moving_average, 1, 0.5)