diff --git a/pts/feature/__init__.py b/pts/feature/__init__.py new file mode 100644 index 0000000..76c2123 --- /dev/null +++ b/pts/feature/__init__.py @@ -0,0 +1,9 @@ +from pts.feature.time_feature import ( + MinuteOfHour, + HourOfDay, + DayOfWeek, + DayOfMonth, + DayOfYear, + MonthOfYear, + WeekOfYear, +) diff --git a/pts/feature/time_feature.py b/pts/feature/time_feature.py new file mode 100644 index 0000000..25dbaf0 --- /dev/null +++ b/pts/feature/time_feature.py @@ -0,0 +1,98 @@ +import numpy as np +import pandas as pd + +from abc import ABC, abstractmethod + + +class TimeFeature(ABC): + def __init__(self, normalized: bool = True): + self.normalized = normalized + + @abstractmethod + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + pass + + +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) + + +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) + + +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) + + +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) + + +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) + + +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) + + +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) + diff --git a/pts/feature/transform.py b/pts/feature/transform.py new file mode 100644 index 0000000..e69de29