From ee445af1e42249617a74c9db2b8e89e6399ba11b Mon Sep 17 00:00:00 2001 From: Kashif Rasul Date: Mon, 15 Jul 2019 10:32:01 +0200 Subject: [PATCH] added tune feature --- pts/feature/__init__.py | 9 ++++ pts/feature/time_feature.py | 98 +++++++++++++++++++++++++++++++++++++ pts/feature/transform.py | 0 3 files changed, 107 insertions(+) create mode 100644 pts/feature/__init__.py create mode 100644 pts/feature/time_feature.py create mode 100644 pts/feature/transform.py 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