# FourierFeatures#

class FourierFeatures(sp_list: List[Union[int, float]], fourier_terms_list: List[int], freq: = None, keep_original_columns: = True)[source]#

Fourier Features for time series seasonality.

Fourier Series terms can be used as explanatory variables for the cases of multiple seasonal periods and or complex / long seasonal periods [1], [2]. For every seasonal period, $$sp$$ and fourier term $$k$$ pair there are 2 fourier terms sin_sp_k and cos_sp_k:

• sin_sp_k = $$sin(\frac{2 \pi k t}{sp})$$

• cos_sp_k = $$cos(\frac{2 \pi k t}{sp})$$

Where $$t$$ is the number of time steps elapsed from the beginning of the time series.

The output of the trasform is a pandas DataFrame that includes the fourier terms as additional columns with the naming convention stated above (sin_sp_k and cos_sp_k). For instance for sp_list = [12, 3] and fourier_terms_list = [2, 1] the transformed series will have the additional columns: “cos_12_1”, “sin_12_1”, “cos_12_2”, “sin_12_2”, “cos_3_1”, “sin_3_1”

The implementation is based on the fourier function from the R forecast package [3]

Parameters:
sp_listList[Union[int, float]]

list of seasonal periods

fourier_terms_listList[int]

list of number of fourier terms (K) for each seasonal period. Each K matches to the sp (seasonal period) of the sp_list. For example, if sp_list = [7, 365] and fourier_terms_list = [3, 9], the seasonal frequency of 7 will have 3 fourier terms and the seasonal frequency of 365 will have 9 fourier terms.

freqstr, optional, default = None

Only used when X has a pd.DatetimeIndex without a specified frequency. Specifies the frequency of the index of your data. The string should match a pandas offset alias: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases

keep_original_columnsboolean, optional, default=True

Keep original columns in X passed to .transform()

Attributes:
is_fitted

Whether fit has been called.

References

[1]

Hyndsight - Forecasting with long seasonal periods: https://robjhyndman.com/hyndsight/longseasonality/

[2]

Hyndman, R.J., & Athanasopoulos, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3. Accessed on August 14th 2022.

Examples

>>> from aeon.transformations.series.fourier import FourierFeatures
>>> transformer = FourierFeatures(sp_list=[12], fourier_terms_list=[4])
>>> y_hat = transformer.fit_transform(y)


Methods

 Check if the estimator has been fitted. Obtain a clone of the object with same hyper-parameters. clone_tags(estimator[, tag_names]) clone/mirror tags from another estimator as dynamic override. create_test_instance([parameter_set]) Construct Estimator instance if possible. create_test_instances_and_names([parameter_set]) Create list of all test instances and a list of names for them. fit(X[, y]) Fit transformer to X, optionally to y. fit_transform(X[, y]) Fit to data, then transform it. get_class_tag(tag_name[, tag_value_default]) Get tag value from estimator class (only class tags). Get class tags from estimator class and all its parent classes. get_fitted_params([deep]) Get fitted parameters. Get parameter defaults for the object. Get parameter names for the object. get_params([deep]) Get parameters for this estimator. get_tag(tag_name[, tag_value_default, ...]) Get tag value from estimator class and dynamic tag overrides. Get tags from estimator class and dynamic tag overrides. get_test_params([parameter_set]) Return testing parameter settings for the estimator. inverse_transform(X[, y]) Inverse transform X and return an inverse transformed version. Check if the object is composite. load_from_path(serial) Load object from file location. load_from_serial(serial) Load object from serialized memory container. Reset the object to a clean post-init state. save([path]) Save serialized self to bytes-like object or to (.zip) file. set_params(**params) Set the parameters of this object. set_tags(**tag_dict) Set dynamic tags to given values. transform(X[, y]) Transform X and return a transformed version. update(X[, y, update_params]) Update transformer with X, optionally y.
classmethod get_test_params(parameter_set='default')[source]#

Return testing parameter settings for the estimator.

Parameters:
parameter_setstr, default=”default”

Name of the set of test parameters to return, for use in tests. If no special parameters are defined for a value, will return “default” set. There are currently no reserved values for transformers.

Returns:
paramsdict or list of dict, default = {}

Parameters to create testing instances of the class Each dict are parameters to construct an “interesting” test instance, i.e., MyClass(**params) or MyClass(**params[i]) creates a valid test instance. create_test_instance uses the first (or only) dictionary in params

check_is_fitted()[source]#

Check if the estimator has been fitted.

Raises:
NotFittedError

If the estimator has not been fitted yet.

clone()[source]#

Obtain a clone of the object with same hyper-parameters.

A clone is a different object without shared references, in post-init state. This function is equivalent to returning sklearn.clone of self. Equal in value to type(self)(**self.get_params(deep=False)).

Returns:
instance of type(self), clone of self (see above)
clone_tags(estimator, tag_names=None)[source]#

clone/mirror tags from another estimator as dynamic override.

Parameters:
estimatorestimator inheriting from :class:BaseEstimator
tag_namesstr or list of str, default = None

Names of tags to clone. If None then all tags in estimator are used as tag_names.

Returns:
Self

Reference to self.

Notes

Changes object state by setting tag values in tag_set from estimator as dynamic tags in self.

classmethod create_test_instance(parameter_set='default')[source]#

Construct Estimator instance if possible.

Parameters:
parameter_setstr, default=”default”

Name of the set of test parameters to return, for use in tests. If no special parameters are defined for a value, will return “default” set.

Returns:
instanceinstance of the class with default parameters

Notes

get_test_params can return dict or list of dict. This function takes first or single dict that get_test_params returns, and constructs the object with that.

classmethod create_test_instances_and_names(parameter_set='default')[source]#

Create list of all test instances and a list of names for them.

Parameters:
parameter_setstr, default=”default”

Name of the set of test parameters to return, for use in tests. If no special parameters are defined for a value, will return “default” set.

Returns:
objslist of instances of cls

i-th instance is cls(**cls.get_test_params()[i])

nameslist of str, same length as objs

i-th element is name of i-th instance of obj in tests convention is {cls.__name__}-{i} if more than one instance otherwise {cls.__name__}

parameter_setstr, default=”default”

Name of the set of test parameters to return, for use in tests. If no special parameters are defined for a value, will return “default” set.

fit(X, y=None)[source]#

Fit transformer to X, optionally to y.

State change:

Changes state to “fitted”.

Writes to self: _is_fitted : flag is set to True. _X : X, coerced copy of X, if remember_data tag is True

possibly coerced to inner type or update_data compatible type by reference, when possible

model attributes (ending in “_”) : dependent on estimator

Parameters:
XSeries or Panel, any supported mtype
Data to fit transform to, of python type as follows:

Series: pd.Series, pd.DataFrame, or np.ndarray (1D or 2D) Panel: pd.DataFrame with 2-level MultiIndex, list of pd.DataFrame,

nested pd.DataFrame, or pd.DataFrame in long/wide format

subject to aeon mtype format specifications, for further details see

examples/AA_datatypes_and_datasets.ipynb

ySeries or Panel, default=None

Additional data, e.g., labels for transformation

Returns:
selfa fitted instance of the estimator
fit_transform(X, y=None)[source]#

Fit to data, then transform it.

Fits the transformer to X and y and returns a transformed version of X.

State change:

Changes state to “fitted”.

Writes to self: _is_fitted : flag is set to True. _X : X, coerced copy of X, if remember_data tag is True

possibly coerced to inner type or update_data compatible type by reference, when possible

model attributes (ending in “_”) : dependent on estimator

Parameters:
XSeries or Panel, any supported mtype
Data to be transformed, of python type as follows:

Series: pd.Series, pd.DataFrame, or np.ndarray (1D or 2D) Panel: pd.DataFrame with 2-level MultiIndex, list of pd.DataFrame,

nested pd.DataFrame, or pd.DataFrame in long/wide format

subject to aeon mtype format specifications, for further details see

examples/AA_datatypes_and_datasets.ipynb

ySeries or Panel, default=None

Additional data, e.g., labels for transformation

Returns:
transformed version of X
type depends on type of X and scitype:transform-output tag:
X | tf-output | type of return |

|----------|————–|------------------------| | Series | Primitives | pd.DataFrame (1-row) | | Panel | Primitives | pd.DataFrame | | Series | Series | Series | | Panel | Series | Panel | | Series | Panel | Panel |

instances in return correspond to instances in X
combinations not in the table are currently not supported
Explicitly, with examples:
if X is Series (e.g., pd.DataFrame) and transform-output is Series

then the return is a single Series of the same mtype Example: detrending a single series

if X is Panel (e.g., pd-multiindex) and transform-output is Series
then the return is Panel with same number of instances as X

(the transformer is applied to each input Series instance)

Example: all series in the panel are detrended individually

if X is Series or Panel and transform-output is Primitives

then the return is pd.DataFrame with as many rows as instances in X Example: i-th row of the return has mean and variance of the i-th series

if X is Series and transform-output is Panel

then the return is a Panel object of type pd-multiindex Example: i-th instance of the output is the i-th window running over X

classmethod get_class_tag(tag_name, tag_value_default=None)[source]#

Get tag value from estimator class (only class tags).

Parameters:
tag_namestr

Name of tag value.

tag_value_defaultany type

Returns:
tag_value

Value of the tag_name tag in self. If not found, returns tag_value_default.

classmethod get_class_tags()[source]#

Get class tags from estimator class and all its parent classes.

Returns:
collected_tagsdict

Dictionary of tag name : tag value pairs. Collected from _tags class attribute via nested inheritance. NOT overridden by dynamic tags set by set_tags or mirror_tags.

get_fitted_params(deep=True)[source]#

Get fitted parameters.

State required:

Requires state to be “fitted”.

Parameters:
deepbool, default=True

Whether to return fitted parameters of components.

• If True, will return a dict of parameter name : value for this object, including fitted parameters of fittable components (= BaseEstimator-valued parameters).

• If False, will return a dict of parameter name : value for this object, but not include fitted parameters of components.

Returns:
fitted_paramsdict with str-valued keys

Dictionary of fitted parameters, paramname : paramvalue keys-value pairs include:

• always: all fitted parameters of this object, as via get_param_names values are fitted parameter value for that key, of this object

• if deep=True, also contains keys/value pairs of component parameters parameters of components are indexed as [componentname]__[paramname] all parameters of componentname appear as paramname with its value

• if deep=True, also contains arbitrary levels of component recursion, e.g., [componentname]__[componentcomponentname]__[paramname], etc

classmethod get_param_defaults()[source]#

Get parameter defaults for the object.

Returns:
default_dict: dict with str keys

keys are all parameters of cls that have a default defined in __init__ values are the defaults, as defined in __init__

classmethod get_param_names()[source]#

Get parameter names for the object.

Returns:
param_names: list of str, alphabetically sorted list of parameter names of cls
get_params(deep=True)[source]#

Get parameters for this estimator.

Parameters:
deepbool, default=True

If True, will return the parameters for this estimator and contained subobjects that are estimators.

Returns:
paramsdict

Parameter names mapped to their values.

get_tag(tag_name, tag_value_default=None, raise_error=True)[source]#

Get tag value from estimator class and dynamic tag overrides.

Parameters:
tag_namestr

Name of tag to be retrieved

tag_value_defaultany type, optional; default=None

raise_errorbool

Returns:
tag_value

Value of the tag_name tag in self. If not found, returns an error if raise_error is True, otherwise it returns tag_value_default.

Raises:
ValueError if raise_error is True i.e. if tag_name is not in self.get_tags(
).keys()
get_tags()[source]#

Get tags from estimator class and dynamic tag overrides.

Returns:
collected_tagsdict

Dictionary of tag name : tag value pairs. Collected from _tags class attribute via nested inheritance and then any overrides and new tags from _tags_dynamic object attribute.

inverse_transform(X, y=None)[source]#

Inverse transform X and return an inverse transformed version.

Currently it is assumed that only transformers with tags

“scitype:transform-input”=”Series”, “scitype:transform-output”=”Series”,

have an inverse_transform.

State required:

Requires state to be “fitted”.

Accesses in self: _is_fitted : must be True _X : optionally accessed, only available if remember_data tag is True fitted model attributes (ending in “_”) : accessed by _inverse_transform

Parameters:
XSeries or Panel, any supported mtype
Data to be inverse transformed, of python type as follows:

Series: pd.Series, pd.DataFrame, or np.ndarray (1D or 2D) Panel: pd.DataFrame with 2-level MultiIndex, list of pd.DataFrame,

nested pd.DataFrame, or pd.DataFrame in long/wide format

subject to aeon mtype format specifications, for further details see

examples/AA_datatypes_and_datasets.ipynb

ySeries or Panel, default=None

Additional data, e.g., labels for transformation

Returns:
inverse transformed version of X

of the same type as X, and conforming to mtype format specifications

is_composite()[source]#

Check if the object is composite.

A composite object is an object which contains objects, as parameters. Called on an instance, since this may differ by instance.

Returns:
composite: bool, whether self contains a parameter which is BaseObject
property is_fitted[source]#

Whether fit has been called.

Parameters:
serialresult of ZipFile(path).open(“object)
Returns:
deserialized self resulting in output at path, of cls.save(path)

Load object from serialized memory container.

Parameters:
serial1st element of output of cls.save(None)
Returns:
deserialized self resulting in output serial, of cls.save(None)
reset()[source]#

Reset the object to a clean post-init state.

Equivalent to sklearn.clone but overwrites self. After self.reset() call, self is equal in value to type(self)(**self.get_params(deep=False))

Detail behaviour: removes any object attributes, except:

hyper-parameters = arguments of __init__ object attributes containing double-underscores, i.e., the string “__”

runs __init__ with current values of hyper-parameters (result of get_params)

Not affected by the reset are: object attributes containing double-underscores class and object methods, class attributes

save(path=None)[source]#

Save serialized self to bytes-like object or to (.zip) file.

Behaviour: if path is None, returns an in-memory serialized self if path is a file location, stores self at that location as a zip file

saved files are zip files with following contents: _metadata - contains class of self, i.e., type(self) _obj - serialized self. This class uses the default serialization (pickle).

Parameters:
pathNone or file location (str or Path)

if None, self is saved to an in-memory object if file location, self is saved to that file location. If:

path=”estimator” then a zip file estimator.zip will be made at cwd. path=”/home/stored/estimator” then a zip file estimator.zip will be stored in /home/stored/.

Returns:
if path is None - in-memory serialized self
if path is file location - ZipFile with reference to the file
set_params(**params)[source]#

Set the parameters of this object.

The method works on simple estimators as well as on nested objects. The latter have parameters of the form <component>__<parameter> so that it’s possible to update each component of a nested object.

Parameters:
**paramsdict

BaseObject parameters

Returns:
selfreference to self (after parameters have been set)
set_tags(**tag_dict)[source]#

Set dynamic tags to given values.

Parameters:
tag_dictdict

Dictionary of tag name : tag value pairs.

Returns:
Self

Reference to self.

Notes

Changes object state by settting tag values in tag_dict as dynamic tags in self.

transform(X, y=None)[source]#

Transform X and return a transformed version.

State required:

Requires state to be “fitted”.

Accesses in self: _is_fitted : must be True _X : optionally accessed, only available if remember_data tag is True fitted model attributes (ending in “_”) : must be set, accessed by _transform

Parameters:
XSeries or Panel, any supported mtype
Data to be transformed, of python type as follows:

Series: pd.Series, pd.DataFrame, or np.ndarray (1D or 2D) Panel: pd.DataFrame with 2-level MultiIndex, list of pd.DataFrame,

nested pd.DataFrame, or pd.DataFrame in long/wide format

subject to aeon mtype format specifications, for further details see

examples/AA_datatypes_and_datasets.ipynb

ySeries or Panel, default=None

Additional data, e.g., labels for transformation

Returns:
transformed version of X
type depends on type of X and scitype:transform-output tag:
| transform | |
X | -output | type of return |

|----------|————–|------------------------| | Series | Primitives | pd.DataFrame (1-row) | | Panel | Primitives | pd.DataFrame | | Series | Series | Series | | Panel | Series | Panel | | Series | Panel | Panel |

instances in return correspond to instances in X
combinations not in the table are currently not supported
Explicitly, with examples:
if X is Series (e.g., pd.DataFrame) and transform-output is Series

then the return is a single Series of the same mtype Example: detrending a single series

if X is Panel (e.g., pd-multiindex) and transform-output is Series
then the return is Panel with same number of instances as X

(the transformer is applied to each input Series instance)

Example: all series in the panel are detrended individually

if X is Series or Panel and transform-output is Primitives

then the return is pd.DataFrame with as many rows as instances in X Example: i-th row of the return has mean and variance of the i-th series

if X is Series and transform-output is Panel

then the return is a Panel object of type pd-multiindex Example: i-th instance of the output is the i-th window running over X

update(X, y=None, update_params=True)[source]#

Update transformer with X, optionally y.

State required:

Requires state to be “fitted”.

Accesses in self: _is_fitted : must be True _X : accessed by _update and by update_data, if remember_data tag is True fitted model attributes (ending in “_”) : must be set, accessed by _update

Writes to self: _X : updated by values in X, via update_data, if remember_data tag is True fitted model attributes (ending in “_”) : only if update_params=True

type and nature of update are dependent on estimator

Parameters:
XSeries or Panel, any supported mtype
Data to fit transform to, of python type as follows:

Series: pd.Series, pd.DataFrame, or np.ndarray (1D or 2D) Panel: pd.DataFrame with 2-level MultiIndex, list of pd.DataFrame,

nested pd.DataFrame, or pd.DataFrame in long/wide format

subject to aeon mtype format specifications, for further details see

examples/AA_datatypes_and_datasets.ipynb

ySeries or Panel, default=None

Additional data, e.g., labels for transformation

update_paramsbool, default=True

whether the model is updated. Yes if true, if false, simply skips call. argument exists for compatibility with forecasting module.

Returns:
selfa fitted instance of the estimator