Files
OpenBB/openbb_terminal/forecast/anom_model.py
Colin Delahunty ee34a1f278 Feature/add isort linter (#4114)
* Fixed isort

* Fixed issues

* FIxed linters

---------

Co-authored-by: James Maslek <jmaslek11@gmail.com>
2023-02-04 21:24:47 -05:00

61 lines
1.5 KiB
Python

# pylint: disable=too-many-arguments
"""Quantile Anomaly Detection Model"""
__docformat__ = "numpy"
import logging
from typing import List, Tuple, Union
import pandas as pd
from darts import TimeSeries
from darts.ad import KMeansScorer, QuantileDetector
from openbb_terminal.decorators import log_start_end
from openbb_terminal.forecast import helpers
logger = logging.getLogger(__name__)
@log_start_end(log=logger)
def get_anomaly_detection_data(
data: Union[pd.Series, pd.DataFrame],
target_column: str = "close",
train_split: float = 0.6,
) -> Tuple[List[TimeSeries], List[TimeSeries], List[TimeSeries]]:
"""Get Quantile Anomaly Detection Data
Parameters
----------
data: Union[pd.Series, pd.DataFrame]
Input Data
-------
target_column: str
Target column to forecast. Defaults to "close".
train_split: (float, optional)
Train/val split. Defaults to 0.85.
Returns
-------
Tuple[
List[TimeSeries],
List[TimeSeries],
List[TimeSeries],
]
"""
use_scalers = False
_, ticker_series = helpers.get_series(data, target_column, is_scaler=use_scalers)
# split dataset into train and val
train, val = ticker_series.split_before(train_split)
scorer = KMeansScorer(k=2, window=5)
scorer.fit(train)
anom_score = scorer.score(val)
detector = QuantileDetector(high_quantile=0.99)
detector.fit(scorer.score(train))
binary_anom = detector.detect(anom_score)
return ticker_series, anom_score, binary_anom