コード例 #1
0
def test_persistence_scalar_index(powerplant_metadata, uniform_data,
                                  interval_label, expected_index, expected_ghi,
                                  expected_ac, obsscale):
    # ac_capacity is 200 from above
    observation = default_observation(powerplant_metadata,
                                      interval_length='5min',
                                      interval_label='beginning')
    observation_ac = default_observation(powerplant_metadata,
                                         interval_length='5min',
                                         interval_label='beginning',
                                         variable='ac_power')

    data = uniform_data * obsscale
    tz = data.index.tzinfo
    data_start = pd.Timestamp('20190404 1200', tz=tz)
    data_end = pd.Timestamp('20190404 1300', tz=tz)
    forecast_start = pd.Timestamp('20190404 1300', tz=tz)
    forecast_end = pd.Timestamp('20190404 1400', tz=tz)
    interval_length = pd.Timedelta('30min')

    load_data = partial(load_data_base, data)
    fx = persistence.persistence_scalar_index(observation, data_start,
                                              data_end, forecast_start,
                                              forecast_end, interval_length,
                                              interval_label, load_data)
    expected_index = pd.DatetimeIndex(expected_index, tz=tz)
    expected = pd.Series(expected_ghi, index=expected_index)
    assert_series_equal(fx, expected, check_names=False)

    fx = persistence.persistence_scalar_index(observation_ac, data_start,
                                              data_end, forecast_start,
                                              forecast_end, interval_length,
                                              interval_label, load_data)
    expected = pd.Series(expected_ac, index=expected_index)
    assert_series_equal(fx, expected, check_names=False)
コード例 #2
0
def test_persistence_scalar_index_instant_obs_fx(site_metadata,
                                                 powerplant_metadata,
                                                 uniform_data):
    # instantaneous obs and fx
    interval_length = pd.Timedelta('30min')
    interval_label = 'instant'
    observation = default_observation(site_metadata,
                                      interval_length='5min',
                                      interval_label=interval_label)
    observation_ac = default_observation(powerplant_metadata,
                                         interval_length='5min',
                                         interval_label=interval_label,
                                         variable='ac_power')
    data = uniform_data
    tz = data.index.tzinfo
    load_data = partial(load_data_base, data)
    data_start = pd.Timestamp('20190404 1200', tz=tz)
    data_end = pd.Timestamp('20190404 1259', tz=tz)
    forecast_start = pd.Timestamp('20190404 1300', tz=tz)
    forecast_end = pd.Timestamp('20190404 1359', tz=tz)
    fx = persistence.persistence_scalar_index(observation, data_start,
                                              data_end, forecast_start,
                                              forecast_end, interval_length,
                                              interval_label, load_data)
    expected_index = pd.DatetimeIndex(['20190404 1300', '20190404 1330'],
                                      tz=tz)
    expected_values = [96.59022431746838, 91.99405501672328]
    expected = pd.Series(expected_values, index=expected_index)
    assert_series_equal(fx, expected, check_names=False)

    fx = persistence.persistence_scalar_index(observation_ac, data_start,
                                              data_end, forecast_start,
                                              forecast_end, interval_length,
                                              interval_label, load_data)
    expected_values = [99.32046515783028, 98.34762206379594]
    expected = pd.Series(expected_values, index=expected_index)
    assert_series_equal(fx, expected, check_names=False)

    # instant obs and fx, but with offset added to starts instead of ends
    data_start = pd.Timestamp('20190404 1201', tz=tz)
    data_end = pd.Timestamp('20190404 1300', tz=tz)
    forecast_start = pd.Timestamp('20190404 1301', tz=tz)
    forecast_end = pd.Timestamp('20190404 1400', tz=tz)
    fx = persistence.persistence_scalar_index(observation, data_start,
                                              data_end, forecast_start,
                                              forecast_end, interval_length,
                                              interval_label, load_data)
    expected_index = pd.DatetimeIndex(['20190404 1300', '20190404 1330'],
                                      tz=tz)
    expected_values = [96.55340033645147, 91.89662922267517]
    expected = pd.Series(expected_values, index=expected_index)
    assert_series_equal(fx, expected, check_names=False)
コード例 #3
0
def test_persistence_scalar(site_metadata, interval_label, closed, end):
    # interval beginning obs
    observation = default_observation(site_metadata,
                                      interval_length='5min',
                                      interval_label=interval_label)
    tz = 'America/Phoenix'
    data_index = pd.date_range(start='20190404',
                               end='20190406',
                               freq='5min',
                               tz=tz)
    data = pd.Series(100., index=data_index)
    data_start = pd.Timestamp('20190404 1200', tz=tz)
    data_end = pd.Timestamp('20190404 1300', tz=tz)
    forecast_start = pd.Timestamp('20190404 1300', tz=tz)
    forecast_end = pd.Timestamp(end, tz=tz)
    interval_length = pd.Timedelta('5min')

    load_data = partial(load_data_base, data)

    fx = persistence.persistence_scalar(observation,
                                        data_start,
                                        data_end,
                                        forecast_start,
                                        forecast_end,
                                        interval_length,
                                        interval_label,
                                        load_data=load_data)

    expected_index = pd.date_range(start='20190404 1300',
                                   end=end,
                                   freq='5min',
                                   tz=tz,
                                   closed=closed)
    expected = pd.Series(100., index=expected_index)
    assert_series_equal(fx, expected)
コード例 #4
0
def test_persistence_probabilistic_no_data(site_metadata, interval_label,
                                           axis):

    tz = 'UTC'
    interval_length = '5min'
    observation = default_observation(site_metadata,
                                      interval_length=interval_length,
                                      interval_label=interval_label)

    data_start = pd.Timestamp('20190513 1200', tz=tz)
    data_end = pd.Timestamp('20190513 1230', tz=tz)
    closed = datamodel.CLOSED_MAPPING[interval_label]

    data = pd.Series([], index=pd.DatetimeIndex([], tz=tz), dtype=float)
    forecast_start = pd.Timestamp('20190513 1230', tz=tz)
    forecast_end = pd.Timestamp('20190513 1300', tz=tz)
    interval_length = pd.Timedelta('5min')
    load_data = partial(load_data_base, data)

    expected_index = pd.date_range(start=forecast_start,
                                   end=forecast_end,
                                   freq=interval_length,
                                   closed=closed)

    forecasts = persistence.persistence_probabilistic(
        observation, data_start, data_end, forecast_start, forecast_end,
        interval_length, interval_label, load_data, axis, [0.0, 25.0, 50.0])
    assert isinstance(forecasts, list)
    for i, fx in enumerate(forecasts):
        pd.testing.assert_index_equal(fx.index,
                                      expected_index,
                                      check_categorical=False)

        pd.testing.assert_series_equal(
            fx, pd.Series(None, index=expected_index, dtype=float))
コード例 #5
0
def test_persistence_scalar_index_invalid_times_interval(
        site_metadata, interval_label, data_start, data_end, forecast_start,
        forecast_end):
    data = pd.Series(100., index=[0])
    load_data = partial(load_data_base, data)
    tz = 'America/Phoenix'
    interval_length = pd.Timedelta('30min')

    # base times to mess with
    data_start = pd.Timestamp(data_start, tz=tz)
    data_end = pd.Timestamp(data_end, tz=tz)
    forecast_start = pd.Timestamp(forecast_start, tz=tz)
    forecast_end = pd.Timestamp(forecast_end, tz=tz)

    # interval average obs with invalid starts/ends
    observation = default_observation(site_metadata,
                                      interval_length='5min',
                                      interval_label=interval_label)
    errtext = "with interval_label beginning or ending"
    with pytest.raises(ValueError) as excinfo:
        persistence.persistence_scalar_index(observation, data_start, data_end,
                                             forecast_start, forecast_end,
                                             interval_length, interval_label,
                                             load_data)
    assert errtext in str(excinfo.value)
コード例 #6
0
def test_persistence_interval_missing_data(site_metadata):
    # interval beginning obs
    observation = default_observation(site_metadata,
                                      interval_length='5min',
                                      interval_label='ending')
    tz = 'America/Phoenix'
    data_index = pd.date_range(start='20190404T1200',
                               end='20190406',
                               freq='5min',
                               tz=tz)
    # each element of data is equal to the hour value of its label
    end = '20190406 0000'
    data = pd.Series(data_index.hour, index=data_index, dtype=float)
    data = data.shift(1)
    data_start = pd.Timestamp('20190404 0000', tz=tz)
    data_end = pd.Timestamp(end, tz=tz) - pd.Timedelta('1d')
    forecast_start = pd.Timestamp('20190405 0000', tz=tz)
    interval_length = pd.Timedelta('60min')

    load_data = partial(load_data_base, data)

    expected_index = pd.date_range(start='20190405 0000',
                                   end=end,
                                   freq='60min',
                                   tz=tz,
                                   closed='right')
    expected_vals = [None] * 12 + list(range(12, 24))
    expected = pd.Series(expected_vals, index=expected_index, dtype=float)
    fx = persistence.persistence_interval(observation, data_start, data_end,
                                          forecast_start, interval_length,
                                          'ending', load_data)
    assert_series_equal(fx, expected)
コード例 #7
0
def test_get_data_start_end_labels_obs_longer_than_1h(site_metadata):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('2h'))
    forecast = default_forecast(site_metadata, run_length=pd.Timedelta('5min'))
    run_time = pd.Timestamp('20190422T1945Z')
    # obs interval cannot be longer than 1 hr
    with pytest.raises(ValueError) as excinfo:
        utils.get_data_start_end(observation, forecast, run_time)
    assert 'observation.interval_length <= 1h' in str(excinfo.value)
コード例 #8
0
def test_get_data_start_end_labels_subhourly_window_limit(site_metadata):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='beginning')
    forecast = default_forecast(
        site_metadata,
        run_length=pd.Timedelta('5min'),  # test subhourly limit on window
        interval_label='beginning')
    run_time = pd.Timestamp('20190422T1945Z')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time)
    assert data_start == pd.Timestamp('20190422T1940Z')
    assert data_end == pd.Timestamp('20190422T1945Z')
コード例 #9
0
def test_get_data_start_end_labels_1h_window_limit(site_metadata):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='beginning')
    forecast = default_forecast(
        site_metadata,
        run_length=pd.Timedelta('12h'),  # test 1 hr limit on window
        interval_label='beginning')
    # ensure data no later than run time
    run_time = pd.Timestamp('20190422T1945Z')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time)
    assert data_start == pd.Timestamp('20190422T1845Z')
    assert data_end == pd.Timestamp('20190422T1945Z')
コード例 #10
0
def test_get_data_start_end_labels_obs_avg_fx_instant(site_metadata):
    run_time = pd.Timestamp('20190422T1945Z')
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='ending')
    forecast = default_forecast(site_metadata,
                                issue_time_of_day=dt.time(hour=5),
                                lead_time_to_start=pd.Timedelta('1h'),
                                interval_length=pd.Timedelta('5min'),
                                run_length=pd.Timedelta('1d'),
                                interval_label='instant')
    with pytest.raises(ValueError) as excinfo:
        utils.get_data_start_end(observation, forecast, run_time)
    assert 'made from interval average obs' in str(excinfo.value)
コード例 #11
0
def test_persistence_probabilistic_timeofday_timezone(site_metadata, data_end,
                                                      forecast_start):

    obs_values = [0] * 11 + [20] * 11
    axis, constant_values, expected_values = 'x', [10, 20], [50, 100]

    interval_label = "beginning"
    interval_length = '1h'
    observation = default_observation(site_metadata,
                                      interval_length=interval_length,
                                      interval_label=interval_label)

    # all observations at 9am each day
    data_start = data_end - pd.Timedelta("{}D".format(len(obs_values)))
    closed = datamodel.CLOSED_MAPPING[interval_label]
    index = pd.date_range(start=data_start,
                          end=data_end,
                          freq='1D',
                          closed=closed)
    data = pd.Series(obs_values, index=index, dtype=float)

    # forecast 9am
    forecast_end = forecast_start + pd.Timedelta("1h")
    interval_length = pd.Timedelta('1h')

    load_data = partial(load_data_base, data)

    expected_index = pd.date_range(start=forecast_start,
                                   end=forecast_end,
                                   freq=interval_length,
                                   closed=closed)

    # if forecast without timezone, then use obs timezone
    if data.index.tzinfo is not None and forecast_start.tzinfo is None:
        expected_index = expected_index.tz_localize(data.index.tzinfo)

    forecasts = persistence.persistence_probabilistic_timeofday(
        observation, data_start, data_end, forecast_start, forecast_end,
        interval_length, interval_label, load_data, axis, constant_values)
    assert isinstance(forecasts, list)
    for i, fx in enumerate(forecasts):
        pd.testing.assert_index_equal(fx.index,
                                      expected_index,
                                      check_categorical=False)

        pd.testing.assert_series_equal(
            fx, pd.Series(expected_values[i],
                          index=expected_index,
                          dtype=float))
コード例 #12
0
def test_get_data_start_end_labels_obs_instant_fx_avg_intraday(site_metadata):
    run_time = pd.Timestamp('20190422T1945Z')
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='instant')
    forecast = default_forecast(site_metadata,
                                issue_time_of_day=dt.time(hour=5),
                                lead_time_to_start=pd.Timedelta('1h'),
                                interval_length=pd.Timedelta('5min'),
                                run_length=pd.Timedelta('15min'),
                                interval_label='ending')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time)
    assert data_start == pd.Timestamp('20190422T193001Z')
    assert data_end == pd.Timestamp('20190422T1945Z')
コード例 #13
0
def test_get_data_start_end_labels_obs_fx_instant_mismatch(site_metadata):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='instant')
    forecast = default_forecast(
        site_metadata,
        issue_time_of_day=dt.time(hour=5),
        lead_time_to_start=pd.Timedelta('1h'),
        interval_length=pd.Timedelta('1h'),  # interval_length must be equal
        run_length=pd.Timedelta('1d'),
        interval_label='instant')  # if interval_label also instant
    run_time = pd.Timestamp('20190422T1945Z')
    with pytest.raises(ValueError) as excinfo:
        utils.get_data_start_end(observation, forecast, run_time)
    assert 'with identical interval length' in str(excinfo.value)
コード例 #14
0
def test_persistence_probabilistic_timeofday_resample(site_metadata,
                                                      obs_values, axis,
                                                      constant_values,
                                                      expected_values):

    tz = 'UTC'
    interval_label = "beginning"
    observation = default_observation(site_metadata,
                                      interval_length='30min',
                                      interval_label=interval_label)

    # all observations at 9am each day
    data_end = pd.Timestamp('20190513T0900', tz=tz)
    data_start = data_end - pd.Timedelta("{}D".format(len(obs_values) / 2))
    closed = datamodel.CLOSED_MAPPING[interval_label]
    index = pd.date_range(start=data_start,
                          end=data_end,
                          freq='30min',
                          closed=closed)
    index = index[index.hour == 9]

    data = pd.Series(obs_values, index=index, dtype=float)

    # forecast 9am
    forecast_start = pd.Timestamp('20190514T0900', tz=tz)
    forecast_end = pd.Timestamp('20190514T1000', tz=tz)
    interval_length = pd.Timedelta('1h')

    load_data = partial(load_data_base, data)

    expected_index = pd.date_range(start=forecast_start,
                                   end=forecast_end,
                                   freq=interval_length,
                                   closed=closed)

    forecasts = persistence.persistence_probabilistic_timeofday(
        observation, data_start, data_end, forecast_start, forecast_end,
        interval_length, interval_label, load_data, axis, constant_values)
    assert isinstance(forecasts, list)
    for i, fx in enumerate(forecasts):
        pd.testing.assert_index_equal(fx.index,
                                      expected_index,
                                      check_categorical=False)

        pd.testing.assert_series_equal(
            fx, pd.Series(expected_values[i],
                          index=expected_index,
                          dtype=float))
コード例 #15
0
def test_get_data_start_end_labels_obs_fx_instant(site_metadata):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='instant')
    forecast = default_forecast(
        site_metadata,
        issue_time_of_day=dt.time(hour=5),
        lead_time_to_start=pd.Timedelta('1h'),
        interval_length=pd.Timedelta('5min'),  # interval_length must be equal
        run_length=pd.Timedelta('1d'),
        interval_label='instant')  # if interval_label also instant
    run_time = pd.Timestamp('20190422T1945Z')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time)
    assert data_start == pd.Timestamp('20190421T0000Z')
    assert data_end == pd.Timestamp('20190421T235959Z')
コード例 #16
0
def test_get_data_start_end_labels_obs_instant_fx_avg(site_metadata):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='instant')
    forecast = default_forecast(site_metadata,
                                issue_time_of_day=dt.time(hour=23),
                                lead_time_to_start=pd.Timedelta('1h'),
                                interval_length=pd.Timedelta('5min'),
                                run_length=pd.Timedelta('1d'),
                                interval_label='beginning')
    run_time = pd.Timestamp('20190422T1945Z')
    issue_time = pd.Timestamp('20190422T2300Z')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time, issue_time)
    assert data_start == pd.Timestamp('20190421T0000Z')
    assert data_end == pd.Timestamp('20190421T235959Z')
コード例 #17
0
def test_get_data_start_end_labels_obs_longer_than_1h_day_ahead(site_metadata):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('2h'),
                                      interval_label='beginning')
    forecast = default_forecast(
        site_metadata,
        issue_time_of_day=dt.time(hour=5),
        lead_time_to_start=pd.Timedelta('1h'),
        interval_length=pd.Timedelta('1h'),
        run_length=pd.Timedelta('1d'),  # day ahead
        interval_label='beginning')
    run_time = pd.Timestamp('20190422T1945Z')
    # day ahead doesn't care about obs interval length
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time)
    assert data_start == pd.Timestamp('20190421T0000Z')
    assert data_end == pd.Timestamp('20190422T0000Z')
コード例 #18
0
def test_persistence_interval(site_metadata, obs_interval_label,
                              interval_label, closed, end):
    # interval beginning obs
    observation = default_observation(site_metadata,
                                      interval_length='5min',
                                      interval_label=obs_interval_label)
    tz = 'America/Phoenix'
    data_index = pd.date_range(start='20190404',
                               end='20190406',
                               freq='5min',
                               tz=tz)
    # each element of data is equal to the hour value of its label
    data = pd.Series(data_index.hour, index=data_index, dtype=float)
    if obs_interval_label == 'ending':
        # e.g. timestamp 12:00:00 should be equal to 11
        data = data.shift(1).fillna(0)
    data_start = pd.Timestamp('20190404 0000', tz=tz)
    data_end = pd.Timestamp(end, tz=tz) - pd.Timedelta('1d')
    forecast_start = pd.Timestamp('20190405 0000', tz=tz)
    interval_length = pd.Timedelta('60min')

    load_data = partial(load_data_base, data)

    expected_index = pd.date_range(start='20190405 0000',
                                   end=end,
                                   freq='60min',
                                   tz=tz,
                                   closed=closed)
    expected_vals = list(range(0, 24))
    expected = pd.Series(expected_vals, index=expected_index, dtype=float)

    # handle permutations of parameters that should fail
    if data_end.minute == 59 and obs_interval_label != 'instant':
        expectation = pytest.raises(ValueError)
    elif data_end.minute == 0 and obs_interval_label == 'instant':
        expectation = pytest.raises(ValueError)
    else:
        expectation = does_not_raise()

    with expectation:
        fx = persistence.persistence_interval(observation, data_start,
                                              data_end, forecast_start,
                                              interval_length, interval_label,
                                              load_data)
        assert_series_equal(fx, expected)
コード例 #19
0
def test_check_persistence_compatibility(obs_kw, fx_kw, index, site_metadata):
    obs_dict = {
        'interval_label': 'ending',
        'interval_value_type': 'interval_mean',
        'interval_length': pd.Timedelta('30min')
    }
    fx_dict = {
        'interval_label': 'ending',
        'interval_value_type': 'interval_mean',
        'interval_length': pd.Timedelta('1h'),
        'run_length': pd.Timedelta('12h')
    }
    obs_dict.update(obs_kw)
    fx_dict.update(fx_kw)
    obs = default_observation(site_metadata, **obs_dict)
    fx = default_forecast(site_metadata, **fx_dict)
    with pytest.raises(ValueError):
        utils.check_persistence_compatibility(obs, fx, index)
コード例 #20
0
def test_get_data_start_end_time_tz(site_metadata, variable, rl, issue, run,
                                    expected_start, expected_end):
    observation = default_observation(site_metadata,
                                      variable=variable,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='ending')
    forecast = default_forecast(site_metadata,
                                variable=variable,
                                issue_time_of_day=dt.time(hour=23),
                                lead_time_to_start=pd.Timedelta('1h'),
                                interval_length=pd.Timedelta('1h'),
                                run_length=pd.Timedelta(rl),
                                interval_label='beginning')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    pd.Timestamp(run),
                                                    pd.Timestamp(issue))
    assert data_start == pd.Timestamp(expected_start)
    assert data_end == pd.Timestamp(expected_end)
コード例 #21
0
def test_get_data_start_end_time_dayahead(site_metadata, rl, rt, lt,
                                          expected_start, expected_end):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='beginning')

    run_time = pd.Timestamp(rt)
    issue_time = pd.Timestamp('20190410T2300Z')
    forecast = default_forecast(site_metadata,
                                issue_time_of_day=dt.time(hour=23),
                                lead_time_to_start=pd.Timedelta(lt),
                                interval_length=pd.Timedelta('1h'),
                                run_length=pd.Timedelta(rl),
                                interval_label='beginning')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time, issue_time)
    assert data_start == pd.Timestamp(expected_start)
    assert data_end == pd.Timestamp(expected_end)
コード例 #22
0
def test_persistence_scalar_index_invalid_times_invalid_label(site_metadata):
    data = pd.Series(100., index=[0])
    load_data = partial(load_data_base, data)
    tz = 'America/Phoenix'
    interval_length = pd.Timedelta('30min')

    interval_label = 'invalid'
    observation = default_observation(site_metadata, interval_length='5min')
    object.__setattr__(observation, 'interval_label', interval_label)
    data_start = pd.Timestamp('20190404 1200', tz=tz)
    data_end = pd.Timestamp('20190404 1300', tz=tz)
    forecast_start = pd.Timestamp('20190404 1300', tz=tz)
    forecast_end = pd.Timestamp('20190404 1400', tz=tz)
    with pytest.raises(ValueError) as excinfo:
        persistence.persistence_scalar_index(observation, data_start, data_end,
                                             forecast_start, forecast_end,
                                             interval_length, interval_label,
                                             load_data)
    assert "invalid interval_label" in str(excinfo.value)
コード例 #23
0
def test_get_data_start_end_labels_obs_fx_instant(site_metadata, lead, issue,
                                                  it):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='instant')
    # interval length of forecast and obs must be equal if interval label is
    # instant
    forecast = default_forecast(site_metadata,
                                issue_time_of_day=dt.time(hour=it),
                                lead_time_to_start=pd.Timedelta(lead),
                                interval_length=pd.Timedelta('5min'),
                                run_length=pd.Timedelta('1d'),
                                interval_label='instant')
    issue_time = pd.Timestamp(issue)
    run_time = issue_time - pd.Timedelta('75min')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time, issue_time)
    assert data_start == pd.Timestamp('20190421T0000Z')
    assert data_end == pd.Timestamp('20190421T235959Z')
コード例 #24
0
def test_get_forecast_start_end_time_weekahead(site_metadata, variable,
                                               expected_start, expected_end):
    observation = default_observation(site_metadata,
                                      variable=variable,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='beginning')

    run_time = pd.Timestamp('20190410T0630Z')
    forecast = default_forecast(site_metadata,
                                variable=variable,
                                issue_time_of_day=dt.time(hour=10),
                                lead_time_to_start=pd.Timedelta('1h'),
                                interval_length=pd.Timedelta('1h'),
                                run_length=pd.Timedelta('1d'),
                                interval_label='beginning')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time)
    assert data_start == pd.Timestamp(expected_start)
    assert data_end == pd.Timestamp(expected_end)
コード例 #25
0
def test_persistence_scalar_index_invalid_times_instant(site_metadata):
    data = pd.Series(100., index=[0])
    load_data = partial(load_data_base, data)
    tz = 'America/Phoenix'
    interval_label = 'instant'
    observation = default_observation(site_metadata,
                                      interval_length='5min',
                                      interval_label=interval_label)
    # instant obs that cover the whole interval - not allowed!
    data_start = pd.Timestamp('20190404 1200', tz=tz)
    data_end = pd.Timestamp('20190404 1300', tz=tz)
    forecast_start = pd.Timestamp('20190404 1300', tz=tz)
    forecast_end = pd.Timestamp('20190404 1400', tz=tz)
    interval_length = pd.Timedelta('30min')
    with pytest.raises(ValueError):
        persistence.persistence_scalar_index(observation, data_start, data_end,
                                             forecast_start, forecast_end,
                                             interval_length, interval_label,
                                             load_data)
コード例 #26
0
def test_get_data_start_end_time_weekahead_not_midnight(site_metadata):
    variable = 'net_load'
    observation = default_observation(site_metadata,
                                      variable=variable,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='beginning')

    run_time = pd.Timestamp('20190410T1030Z')
    issue_time = pd.Timestamp('20190410T1200Z')
    # fx from 2019-04-11 12:00
    forecast = default_forecast(site_metadata,
                                variable=variable,
                                issue_time_of_day=dt.time(hour=12),
                                lead_time_to_start=pd.Timedelta('1d'),
                                interval_length=pd.Timedelta('1h'),
                                run_length=pd.Timedelta('1d'),
                                interval_label='beginning')
    data_start, data_end = utils.get_data_start_end(observation, forecast,
                                                    run_time, issue_time)
    assert data_start == pd.Timestamp('20190404T1200Z')
    assert data_end == pd.Timestamp('20190405T1200Z')
コード例 #27
0
def test_run_persistence_weekahead(session, site_metadata, mocker):
    variable = 'net_load'
    observation = default_observation(site_metadata,
                                      variable=variable,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='beginning')

    run_time = pd.Timestamp('20190110T1945Z')
    forecast = default_forecast(site_metadata,
                                variable=variable,
                                issue_time_of_day=dt.time(hour=23),
                                lead_time_to_start=pd.Timedelta('1h'),
                                interval_length=pd.Timedelta('1h'),
                                run_length=pd.Timedelta('1d'),
                                interval_label='beginning')
    issue_time = pd.Timestamp('20190111T2300Z')
    mocker.spy(main.persistence, 'persistence_interval')
    out = main.run_persistence(session, observation, forecast, run_time,
                               issue_time)
    assert isinstance(out, pd.Series)
    assert len(out) == 24
    assert main.persistence.persistence_interval.call_count == 1
コード例 #28
0
def obs_5min_begin(site_metadata):
    observation = default_observation(site_metadata,
                                      interval_length=pd.Timedelta('5min'),
                                      interval_label='beginning')
    return observation
コード例 #29
0
def test_persistence_scalar_index_low_solar_elevation(site_metadata,
                                                      powerplant_metadata):

    interval_label = 'beginning'
    observation = default_observation(site_metadata,
                                      interval_length='5min',
                                      interval_label=interval_label)
    observation_ac = default_observation(powerplant_metadata,
                                         interval_length='5min',
                                         interval_label=interval_label,
                                         variable='ac_power')

    # at ABQ Baseline, solar apparent zenith for these points is
    # 2019-05-13 12:00:00+00:00     91.62
    # 2019-05-13 12:05:00+00:00     90.09
    # 2019-05-13 12:10:00+00:00     89.29
    # 2019-05-13 12:15:00+00:00     88.45
    # 2019-05-13 12:20:00+00:00     87.57
    # 2019-05-13 12:25:00+00:00     86.66

    tz = 'UTC'
    data_start = pd.Timestamp('20190513 1200', tz=tz)
    data_end = pd.Timestamp('20190513 1230', tz=tz)
    index = pd.date_range(start=data_start,
                          end=data_end,
                          freq='5min',
                          closed='left')

    # clear sky 5 min avg (from 1 min avg) GHI is
    # [0., 0.10932908, 1.29732454, 4.67585122, 10.86548521, 19.83487399]
    # create data series that could produce obs / clear of
    # 0/0, 1/0.1, -1/1.3, 5/5, 10/10, 20/20
    # average without limits is (10 - 1 + 1 + 1 + 1) / 5 = 2.4
    # average with element limits of [0, 2] = (2 + 0 + 1 + 1 + 1) / 5 = 1

    data = pd.Series([0, 1, -1, 5, 10, 20.], index=index)
    forecast_start = pd.Timestamp('20190513 1230', tz=tz)
    forecast_end = pd.Timestamp('20190513 1300', tz=tz)
    interval_length = pd.Timedelta('5min')
    load_data = partial(load_data_base, data)

    expected_index = pd.date_range(start=forecast_start,
                                   end=forecast_end,
                                   freq='5min',
                                   closed='left')

    # clear sky 5 min avg GHI is
    # [31.2, 44.5, 59.4, 75.4, 92.4, 110.1]
    expected_vals = [31.2, 44.5, 59.4, 75.4, 92.4, 110.1]
    expected = pd.Series(expected_vals, index=expected_index)

    fx = persistence.persistence_scalar_index(observation, data_start,
                                              data_end, forecast_start,
                                              forecast_end, interval_length,
                                              interval_label, load_data)
    assert_series_equal(fx, expected, check_less_precise=1, check_names=False)

    expected = pd.Series([0.2, 0.7, 1.2, 1.6, 2., 8.9], index=expected_index)
    fx = persistence.persistence_scalar_index(observation_ac, data_start,
                                              data_end, forecast_start,
                                              forecast_end, interval_length,
                                              interval_label, load_data)
    assert_series_equal(fx, expected, check_less_precise=1, check_names=False)