Демистификация выбросов временных рядов 2/4

Раскрытие тайн временных рядов разоблачение выбросов (часть 2/4)

Распутывая выбросы во временных рядах социальных медиа в футболе

Что случилось вчера?

После того, как Морелли, Заппа и я раздали кофе всем, мы возвращаемся к тому, что случилось вчера:

Разгадывая выбросы во временных рядах: 1/4

Ровелла и бунтарские данные

pub.towardsai.net

Мы начали с твитов, связанных с #ровелла, временным рядом, плотно усыпанным выбросами, и точно определили их, используя всего две основные информационные характеристики: среднее и стандартное отклонение.

import pandas as pdimport numpy as nplink = 'https://raw.githubusercontent.com/ianni-phd/Datasets/main/rovella_tweets.csv'tweets = pd.read_csv(link, sep=';', decimal=',', index_col='date', parse_dates=['date'])tweets_series = tweets['target']

Затем мы безжалостно их отрезали, словно пилой.

Cutting-points work: 3 2 1… go! — Author
# ОПРЕДЕЛЕНИЕ функцииdef detect_outliers_zscore(ts, thres=3, points_not_to_touch=60, max_window=40, outliers_param=0.9):    '''    param ts                  : Временной ряд с индексом дат    param thres               : Порог больше 3 для более строгого обнаружения выбросов    param points_not_to_touch : Точки, которые вы не изменяете в начале ряда    param max_window          : Окно, рассматриваемое для вычисления локального максимума    param outliers_param      : [0, 1] меньше, если я хочу следовать выбросам    '''    ts_reworked = ts.copy(deep=True)    outliers = []    dates = []    for i, d in zip(ts, ts.index):        ts_so_far = ts[ts.index <= d]        ts_so_far = ts_so_far.iloc[points_not_to_touch:]        ts_so_far = ts_so_far[~ts_so_far.index.isin(dates)]        length_so_far = ts_so_far.shape[0]        mean = np.mean(ts_so_far)        std = np.std(ts_so_far)        max_so_far = np.max(ts_so_far.iloc[:-max_window])                surplus = (outliers_param * (i - max_so_far))...