# !/usr/bin/env python3
# -*- coding:utf-8 -*-
import abc
from typing import Union, List, Optional
import pandas as pd
import numpy as np
import chinese_calendar
from paddlets.transform.base import BaseTransform
from paddlets.datasets.tsdataset import TimeSeries, TSDataset
from paddlets.logger import Logger, raise_if_not, raise_if, raise_log
from paddlets.logger.logger import log_decorator
logger = Logger(__name__)
def _cal_year(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
int: year
"""
return x.year
def _cal_month(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
int: month of year
"""
return x.month
def _cal_day(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
int: day of month
"""
return x.day
def _cal_hour(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
int: hour of day
"""
return x.hour
def _cal_weekday(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
int: day of weekday
"""
return x.dayofweek
def _cal_quarter(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
int: quarter of year
"""
return x.quarter
def _cal_dayofyear(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
int: day of year
"""
return x.dayofyear
def _cal_weekofyear(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
int: week of year
"""
return x.weekofyear
def _cal_holiday(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
float: holiday
"""
return float(chinese_calendar.is_holiday(x))
def _cal_workday(
x: np.datetime64,
):
"""
Args:
x(np.datetime64): time
Returns
float: workday
"""
return float(chinese_calendar.is_workday(x))
#THe method of date transform
CAL_DATE_METHOD = {
'year': _cal_year,
'month': _cal_month,
'day': _cal_day,
'hour': _cal_hour,
'weekday': _cal_weekday,
'quarter': _cal_quarter,
'dayofyear': _cal_dayofyear,
'weekofyear': _cal_weekofyear,
'is_holiday': _cal_holiday,
'is_workday': _cal_workday
}
[docs]class TimeFeatureGenerator(BaseTransform):
"""
Transform time index into specific time features
Args:
feature_cols(str): Name of feature columns to transform. Currently supported arg values are: year, month, day, weekday, hour, quarter, dayofyear, weekofyear, is_holiday, and is_workday. These time features will be generated by default
extend_points(int): Extra time points need to be appended to the tail of the existing target time series.
Only used when two scenarios are matched simultaneously: 1.the known covariates is None 2.the :func:`predict` method is called.
The reason is that the :func:`predict` method usually requires the tail index of the future target; this index can be calculated from the known cov time series.
If known cov is None, this future target tail index needs to be manually extended in this transform and appended to the target.
Returns:
None
"""
def __init__(self,
feature_cols: Optional[List[str]] = ['year', 'month', 'day', 'weekday', 'hour', 'quarter', 'dayofyear', 'weekofyear', 'is_holiday', 'is_workday'],
extend_points: int = 0,
):
super(TimeFeatureGenerator, self).__init__()
self.feature_cols = feature_cols
self.extend_points = extend_points
[docs] @log_decorator
def fit_one(self, dataset: TSDataset):
"""
This transformer does not need to be fitted.
Args:
dataset(TSDataset): Dataset to be fitted.
Returns:
TimeFeatureGenerator
"""
return self