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

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

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

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])

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

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

Что вы подразумеваете под «максимальным количеством изменений»? Конечно, в случайной последовательности каждая точка представляет собой изменение по сравнению с предыдущей точкой, поэтому каждая область имеет одинаковое количество изменений.

tom10 31.10.2018 05:05

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

Bhaskar Dhariyal 31.10.2018 14:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
508
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот один подход, который выполняет большинство операций в 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)

Другие вопросы по теме