docstr: Fast Fourier Transform Model
  
  This model performs forecasting on a TimeSeries instance using FFT, subsequent frequency filtering
  (controlled by the `nr_freqs_to_keep` argument) and  inverse FFT, combined with the option to detrend
  the data (controlled by the `trend` argument) and to crop the training sequence to full seasonal periods
  Note that if the training series contains any NaNs (missing values), these will be filled using
  :func:`darts.utils.missing_values.fill_missing_values()`.
  
  Parameters
  ----------
  nr_freqs_to_keep
      The total number of frequencies that will be used for forecasting.
  required_matches
      The attributes of pd.Timestamp that will be used to create a training sequence that is cropped at the
      beginning such that the first timestamp of the training sequence and the first prediction point have
      matching phases. If the series has a yearly seasonality, include `month`, if it has a monthly
      seasonality, include `day`, etc. If not set, or explicitly set to None, the model tries to find the
      pd.Timestamp attributes that are relevant for the seasonality automatically.
  trend
      If set, indicates what kind of detrending will be applied before performing DFT.
      Possible values: 'poly', 'exp' or None, for polynomial trend, exponential trend or no trend, respectively.
  trend_poly_degree
      The degree of the polynomial that will be used for detrending, if `trend='poly'`.
  
  Examples
  --------
  Automatically detect the seasonal periods, uses the 10 most significant frequencies for
  forecasting and expect no global trend to be present in the data:
  
  >>> FFT(nr_freqs_to_keep=10)
  
  Assume the provided TimeSeries instances will have a monthly seasonality and an exponential
  global trend, and do not perform any frequency filtering:
  
  >>> FFT(required_matches={'month'}, trend='exp')
  
  Simple usage example, using one of the dataset available in darts
  
  >>> from darts.datasets import AirPassengersDataset
  >>> from darts.models import FFT
  >>> series = AirPassengersDataset().load()
  >>> # increase the number of frequency and use a polynomial trend of degree 2
  >>> model = FFT(
  >>>     nr_freqs_to_keep=20,
  >>>     trend= "poly",
  >>>     trend_poly_degree=2
  >>> )
  >>> model.fit(series)
  >>> pred = model.predict(6)
  >>> pred.values()
  array([[471.79323146],
         [494.6381425 ],
         [504.5659999 ],
         [515.82463265],
         [520.59404623],
         [547.26720705]])
  
  .. note::
      `FFT example notebook <https://unit8co.github.io/darts/examples/03-FFT-examples.html>`_ presents techniques
      that can be used to improve the forecasts quality compared to this simple usage example.
docstr_tok: ["Fast","Fourier","Transform","Model","This","model","performs","forecasting","on","a","TimeSeries","instance","using","FFT",",","subsequent","frequency","filtering","(","controlled","by","the","`","nr_freqs_to_keep","`","argument",")","and","inverse","FFT",",","combined","with","the","option","to","detrend","the","data","(","controlled","by","the","`","trend","`","argument",")","and","to","crop","the","training","sequence","to","full","seasonal","periods","Note","that","if","the","training","series","contains","any","NaNs","(","missing","values",")",",","these","will","be","filled","using",":","func",":","`","darts.utils.missing_values.fill_missing_values","(",")","`",".","Parameters","--","--","--","--","--","nr_freqs_to_keep","The","total","number","of","frequencies","that","will","be","used","for","forecasting",".","required_matches","The","attributes","of","pd.Timestamp","that","will","be","used","to","create","a","training","sequence","that","is","cropped","at","the","beginning","such","that","the","first","timestamp","of","the","training","sequence","and","the","first","prediction","point","have","matching","phases",".","If","the","series","has","a","yearly","seasonality",",","include","`","month","`",",","if","it","has","a","monthly","seasonality",",","include","`","day","`",",","etc",".","If","not","set",",","or","explicitly","set","to","None",",","the","model","tries","to","find","the","pd.Timestamp","attributes","that","are","relevant","for","the","seasonality","automatically",".","trend","If","set",",","indicates","what","kind","of","detrending","will","be","applied","before","performing","DFT",".","Possible","values",":","'poly","'",",","'exp","'","or","None",",","for","polynomial","trend",",","exponential","trend","or","no","trend",",","respectively",".","trend_poly_degree","The","degree","of","the","polynomial","that","will","be","used","for","detrending",",","if","`","trend='poly","'","`",".","Examples","--","--","--","--","Automatically","detect","the","seasonal","periods",",","uses","the","10","most","significant","frequencies","for","forecasting","and","expect","no","global","trend","to","be","present","in","the","data",":",">",">",">","FFT","(","nr_freqs_to_keep=10",")","Assume","the","provided","TimeSeries","instances","will","have","a","monthly","seasonality","and","an","exponential","global","trend",",","and","do","not","perform","any","frequency","filtering",":",">",">",">","FFT","(","required_matches=","{","'month","'","}",",","trend='exp","'",")","Simple","usage","example",",","using","one","of","the","dataset","available","in","darts",">",">",">","from","darts.datasets","import","AirPassengersDataset",">",">",">","from","darts.models","import","FFT",">",">",">","series","=","AirPassengersDataset","(",")",".load","(",")",">",">",">","#","increase","the","number","of","frequency","and","use","a","polynomial","trend","of","degree","2",">",">",">","model","=","FFT","(",">",">",">","nr_freqs_to_keep=20",",",">",">",">","trend=","``","poly","''",",",">",">",">","trend_poly_degree=2",">",">",">",")",">",">",">","model.fit","(","series",")",">",">",">","pred","=","model.predict","(","6",")",">",">",">","pred.values","(",")","array","(","[","[","471.79323146","]",",","[","494.6381425","]",",","[","504.5659999","]",",","[","515.82463265","]",",","[","520.59404623","]",",","[","547.26720705","]","]",")","..","note",":",":","`","FFT","example","notebook","<","https",":","\/\/unit8co.github.io\/darts\/examples\/03-FFT-examples.html",">","`","_","presents","techniques","that","can","be","used","to","improve","the","forecasts","quality","compared","to","this","simple","usage","example","."]
code: def __init__(
      self,
      nr_freqs_to_keep: Optional[int] = 10,
      required_matches: Optional[set] = None,
      trend: Optional[str] = None,
      trend_poly_degree: int = 3,
  ):
      """Fast Fourier Transform Model
  
      This model performs forecasting on a TimeSeries instance using FFT, subsequent frequency filtering
      (controlled by the `nr_freqs_to_keep` argument) and  inverse FFT, combined with the option to detrend
      the data (controlled by the `trend` argument) and to crop the training sequence to full seasonal periods
      Note that if the training series contains any NaNs (missing values), these will be filled using
      :func:`darts.utils.missing_values.fill_missing_values()`.
  
      Parameters
      ----------
      nr_freqs_to_keep
          The total number of frequencies that will be used for forecasting.
      required_matches
          The attributes of pd.Timestamp that will be used to create a training sequence that is cropped at the
          beginning such that the first timestamp of the training sequence and the first prediction point have
          matching phases. If the series has a yearly seasonality, include `month`, if it has a monthly
          seasonality, include `day`, etc. If not set, or explicitly set to None, the model tries to find the
          pd.Timestamp attributes that are relevant for the seasonality automatically.
      trend
          If set, indicates what kind of detrending will be applied before performing DFT.
          Possible values: 'poly', 'exp' or None, for polynomial trend, exponential trend or no trend, respectively.
      trend_poly_degree
          The degree of the polynomial that will be used for detrending, if `trend='poly'`.
  
      Examples
      --------
      Automatically detect the seasonal periods, uses the 10 most significant frequencies for
      forecasting and expect no global trend to be present in the data:
  
      >>> FFT(nr_freqs_to_keep=10)
  
      Assume the provided TimeSeries instances will have a monthly seasonality and an exponential
      global trend, and do not perform any frequency filtering:
  
      >>> FFT(required_matches={'month'}, trend='exp')
  
      Simple usage example, using one of the dataset available in darts
  
      >>> from darts.datasets import AirPassengersDataset
      >>> from darts.models import FFT
      >>> series = AirPassengersDataset().load()
      >>> # increase the number of frequency and use a polynomial trend of degree 2
      >>> model = FFT(
      >>>     nr_freqs_to_keep=20,
      >>>     trend= "poly",
      >>>     trend_poly_degree=2
      >>> )
      >>> model.fit(series)
      >>> pred = model.predict(6)
      >>> pred.values()
      array([[471.79323146],
             [494.6381425 ],
             [504.5659999 ],
             [515.82463265],
             [520.59404623],
             [547.26720705]])
  
      .. note::
          `FFT example notebook <https://unit8co.github.io/darts/examples/03-FFT-examples.html>`_ presents techniques
          that can be used to improve the forecasts quality compared to this simple usage example.
      """
      super().__init__()
      self.nr_freqs_to_keep = nr_freqs_to_keep
      self.required_matches = required_matches
      self.trend = trend
      self.trend_poly_degree = trend_poly_degree
  
imports: from typing import Callable, Optional
  import numpy
  import pandas
  from statsmodels.tsa.stattools import acf
  from darts.logging import get_logger
  from darts.models.forecasting.forecasting_model import LocalForecastingModel
  from darts.timeseries import TimeSeries
  from darts.utils.missing_values import fill_missing_values
label_desc: Use image node_id 1 to create a new FFT object from inherited base classes: LocalForecastingModel with example: obj = FFT(nr_freqs_to_keep, required_matches, trend, trend_poly_degree)