Как выделить область с максимальным количеством изменений на графике временного ряда? - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь поиграть с данными временного ряда. Я хотел бы построить область с максимальным количеством изменений на основе определенного интервала.

Я написал некоторый пример кода, но не могу продвинуться в выделении региона.

import pandas as pd
import numpy as np
import seaborn as sns


f = pd.DataFrame(np.random.randint(0,50,size=(300, 1)))
sns.tsplot(f[0])

enter image description here

Я хочу выделить регион с максимальными изменениями, скажем, с размером окна 30.

1 Ответ

0 голосов
/ 01 ноября 2018

Вот один подход, который выполняет большинство операций в numpy, а затем отображает регион с помощью matplotlib.axvspan :

f = pd.DataFrame(np.random.randint(0,50,size=(300, 1))) # dataframe
y = f[0].values      # working vector in numpy

thr = 5 # criterion for counting as a change
chunk_size = 30 # window length
chunks = np.array_split(y, y.shape[0]/chunk_size) # split into 30-element chunks    
# compute how many elements differ from one element to the next
diffs_by_chunk = [(np.abs(np.ediff1d(chunk)) > thr).sum() for chunk in chunks]
ix = np.argmax(diffs_by_chunk) # chunk with most differences

sns.tsplot(f[0])
plt.axvspan(ix * chunk_size, (ix+1) * chunk_size, alpha=0.5)

highlight changes

С базовой линией однородных случайных данных трудно связать это с вариантом использования, но могут быть полезны альтернативные критерии для того, что максимизировать, например, просто глядя на сумму абсолютных изменений, а не на число, которое превышает порог:

diffs_by_chunk = [(np.abs(np.ediff1d(chunk))).sum() for chunk in chunks] # criterion #2

Также было бы возможно показать несколько регионов, которые имеют достаточно различий:

for i, df in enumerate(diffs_by_chunk):
    if df >= 25:
        sns.mpl.pyplot.axvspan(i*chunk_size, (i+1)*chunk_size, alpha=0.5)
...