Table Of Contents
Table Of Contents

Source code for gluonts.time_feature._base

# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License").
# You may not use this file except in compliance with the License.
# A copy of the License is located at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# or in the "license" file accompanying this file. This file is distributed
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language governing
# permissions and limitations under the License.

from typing import List

# Third-party imports
import numpy as np
import pandas as pd
from pandas.tseries import offsets
from pandas.tseries.frequencies import to_offset

# First-party imports
from gluonts.core.component import validated


[docs]class TimeFeature: """ Base class for features that only depend on time. """ @validated() def __init__(self, normalized: bool = True): self.normalized = normalized def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: pass def __repr__(self): return self.__class__.__name__ + "()"
[docs]class MinuteOfHour(TimeFeature): """ Minute of hour encoded as value between [-0.5, 0.5] """ def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: if self.normalized: return index.minute / 59.0 - 0.5 else: return index.minute.map(float)
[docs]class HourOfDay(TimeFeature): """ Hour of day encoded as value between [-0.5, 0.5] """ def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: if self.normalized: return index.hour / 23.0 - 0.5 else: return index.hour.map(float)
[docs]class DayOfWeek(TimeFeature): """ Hour of day encoded as value between [-0.5, 0.5] """ def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: if self.normalized: return index.dayofweek / 6.0 - 0.5 else: return index.dayofweek.map(float)
[docs]class DayOfMonth(TimeFeature): """ Day of month encoded as value between [-0.5, 0.5] """ def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: if self.normalized: return index.day / 30.0 - 0.5 else: return index.day.map(float)
[docs]class DayOfYear(TimeFeature): """ Day of year encoded as value between [-0.5, 0.5] """ def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: if self.normalized: return index.dayofyear / 364.0 - 0.5 else: return index.dayofyear.map(float)
[docs]class MonthOfYear(TimeFeature): """ Month of year encoded as value between [-0.5, 0.5] """ def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: if self.normalized: return index.month / 11.0 - 0.5 else: return index.month.map(float)
[docs]class WeekOfYear(TimeFeature): """ Week of year encoded as value between [-0.5, 0.5] """ def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: if self.normalized: return index.weekofyear / 51.0 - 0.5 else: return index.weekofyear.map(float)
[docs]def time_features_from_frequency_str(freq_str: str) -> List[TimeFeature]: """ Returns a list of time features that will be appropriate for the given frequency string. Parameters ---------- freq_str Frequency string of the form [multiple][granularity] such as "12H", "5min", "1D" etc. """ features_by_offsets = { offsets.YearOffset: [], offsets.MonthOffset: [MonthOfYear], offsets.Week: [DayOfMonth, WeekOfYear], offsets.Day: [DayOfWeek, DayOfMonth, DayOfYear], offsets.BusinessDay: [DayOfWeek, DayOfMonth, DayOfYear], offsets.Hour: [HourOfDay, DayOfWeek, DayOfMonth, DayOfYear], offsets.Minute: [ MinuteOfHour, HourOfDay, DayOfWeek, DayOfMonth, DayOfYear, ], } offset = to_offset(freq_str) for offset_type, feature_classes in features_by_offsets.items(): if isinstance(offset, offset_type): return [cls() for cls in feature_classes] supported_freq_msg = f""" Unsupported frequency {freq_str} The following frequencies are supported: Y - yearly alias: A M - monthly W - weekly D - daily B - business days H - hourly T - minutely alias: min """ raise RuntimeError(supported_freq_msg)