コード例 #1
0
    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))))
コード例 #2
0
    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
コード例 #3
0
    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))