def test_timeseries_resample(self): t_start = dt.datetime(2017, 1, 1) t_end = dt.datetime(2018, 1, 1) index = pd.date_range(t_start, t_end, freq='T', closed='left') data = range(len(index)) quality = [i % 2 for i in range(len(index))] ts0 = Timeseries(index=index, data=data, quality=quality) ts0.set_update_timestamp(index) ts1 = deepcopy(ts0) ts1.resample('month', 'first') assert len(ts1.dataframe) == 12 assert isclose(ts1.dataframe.data[0], 0) assert isclose(ts1.dataframe.data[1], 44640) assert isclose(ts1.dataframe.data[-1], 480960) assert np.all(np.isclose(ts1.dataframe.quality, 0.5)) ts2 = deepcopy(ts0) ts2.resample('day', 'max') assert len(ts2.dataframe) == 365 assert isclose(ts2.dataframe.data[0], 1439) assert isclose(ts2.dataframe.data[1], 2879) assert isclose(ts2.dataframe.data[-1], 525599) ts3 = deepcopy(ts0) ts3.resample('30min', 'sum') assert len(ts3.dataframe) == len(index) / 30 for i in range(len(ts3.dataframe)): assert isclose( ts3.dataframe.data[i], sum(range(30 * i, 30 * (i + 1))))
def test_timeseries_tsdump(self): timestamp_l = [ dt.datetime(2017, 1, 1) + dt.timedelta(n) for n in range(5) ] value_l = [0, 1, 2, 3, 4] quality_l = [1, 1, 0.5, None, 0.69] update_ts_l = [dt.datetime.now()] * 5 ts = Timeseries(index=timestamp_l, data=value_l, quality=quality_l) ts.set_update_timestamp(update_ts_l) assert np.isnan(ts.dataframe['quality'][3]) ts_list = tsdump(ts) assert len(ts_list) == 5 assert all(len(v) == 4 for v in ts_list) assert [v['timestamp'] for v in ts_list] == timestamp_l assert [v['value'] for v in ts_list] == value_l assert [v['update_ts'] for v in ts_list] == update_ts_l assert [v['quality'] for v in ts_list] == quality_l
def test_timeseries_init_dataframe(self): t_start = dt.datetime(2017, 1, 1) t_end = dt.datetime(2017, 1, 6) index = pd.date_range(t_start, t_end, freq='D', closed='left') # index column must be a pandas.DatetimeIndex with pytest.raises(TimeseriesInvalidIndexTypeError): Timeseries(index=range(5), data=range(5)) # quality can not be set without data with pytest.raises(TimeseriesMissingColumnError): Timeseries(index=index, quality=np.random.rand(len(index))) # data can not be set without index with pytest.raises(TimeseriesMissingColumnError): Timeseries(data=range(len(index))) # validate dataframe ts = Timeseries(index=index, data=range(len(index))) # no custom column allowed ts.dataframe['dummy'] = range(len(index)) with pytest.raises(TimeseriesInvalidColumnsError): ts.validate() # droping a column unvalidates timeseries ts.dataframe.drop(columns=['dummy', 'data'], inplace=True) with pytest.raises(TimeseriesMissingColumnError): ts.validate() # repr timeseries ts_data = range(len(index)) ts = Timeseries(index=index, data=ts_data) assert repr(ts) == ( '<Timeseries>(count={}, start={}, end={}, min={}, max={})'.format( len(index), min(index), max(index), float(min(ts_data)), float(max(ts_data)))) # quality defaults to 1 ts = Timeseries(index=index, data=range(len(index))) assert (ts.dataframe['quality'] == 1).all() # update_ts can only be set using set_update_timestamp method ts = Timeseries( index=index, data=range(len(index)), quality=np.random.rand(len(index))) assert pd.isnull(ts.dataframe['update_ts']).all() # update with a pandas.Series ts.set_update_timestamp(index) assert ts.dataframe.at[index[0], 'update_ts'] == index.values[0] # update with a datetime t_update = dt.datetime.now() ts.set_update_timestamp(t_update) assert ts.dataframe.at[index[0], 'update_ts'] == t_update ts.validate() assert ts.dataframe.at[index[0], 'update_ts'] == t_update # update with a list of datetimes t_update = [dt.datetime.now()] * len(index) ts.set_update_timestamp(t_update) assert ts.dataframe.at[index[0], 'update_ts'] == t_update[0] ts.validate() assert ts.dataframe.at[index[0], 'update_ts'] == t_update[0] # data length must be equal to index length with pytest.raises(ValueError): Timeseries(index=index, data=range(len(index)+1))