STUMPY — это мощная и масштабируемая библиотека Python, которая эффективно вычисляет то, что называется матричным профилем, что представляет собой всего лишь академический способ сказать: «Для каждой (зеленой) подпоследовательности в вашем временном ряду автоматически идентифицируйте ее соответствующего ближайшего соседа (серого цвета)»:
Важно то, что после того, как вы вычислили профиль матрицы (средняя панель выше), его можно затем использовать для различных задач интеллектуального анализа данных временных рядов, таких как:
Независимо от того, являетесь ли вы ученым, специалистом по данным, разработчиком программного обеспечения или энтузиастом временных рядов, STUMPY прост в установке, и наша цель — позволить вам быстрее получить представление о временных рядах. Дополнительную информацию смотрите в документации.
Полный список доступных функций см. в документации по API, а более подробные примеры использования — в наших информативных руководствах. Ниже вы найдете фрагменты кода, которые быстро демонстрируют, как использовать STUMPY.
Типичное использование (одномерные данные временных рядов) с STUMP:
import stumpy
import numpy as np
if __name__ == "__main__" :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile = stumpy . stump ( your_time_series , m = window_size )
Распределенное использование одномерных данных временных рядов с помощью Dask Distributed через STUMPED:
import stumpy
import numpy as np
from dask . distributed import Client
if __name__ == "__main__" :
with Client () as dask_client :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile = stumpy . stumped ( dask_client , your_time_series , m = window_size )
Использование графического процессора для одномерных данных временных рядов с помощью GPU-STUMP:
import stumpy
import numpy as np
from numba import cuda
if __name__ == "__main__" :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
all_gpu_devices = [ device . id for device in cuda . list_devices ()] # Get a list of all available GPU devices
matrix_profile = stumpy . gpu_stump ( your_time_series , m = window_size , device_id = all_gpu_devices )
Многомерные данные временных рядов с помощью MSTUMP:
import stumpy
import numpy as np
if __name__ == "__main__" :
your_time_series = np . random . rand ( 3 , 1000 ) # Each row represents data from a different dimension while each column represents data from the same dimension
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile , matrix_profile_indices = stumpy . mstump ( your_time_series , m = window_size )
Распределенный многомерный анализ данных временных рядов с помощью Dask Distributed MSTUMPED:
import stumpy
import numpy as np
from dask . distributed import Client
if __name__ == "__main__" :
with Client () as dask_client :
your_time_series = np . random . rand ( 3 , 1000 ) # Each row represents data from a different dimension while each column represents data from the same dimension
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile , matrix_profile_indices = stumpy . mstumped ( dask_client , your_time_series , m = window_size )
Цепочки временных рядов с привязанными цепочками временных рядов (ATSC):
import stumpy
import numpy as np
if __name__ == "__main__" :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile = stumpy . stump ( your_time_series , m = window_size )
left_matrix_profile_index = matrix_profile [:, 2 ]
right_matrix_profile_index = matrix_profile [:, 3 ]
idx = 10 # Subsequence index for which to retrieve the anchored time series chain for
anchored_chain = stumpy . atsc ( left_matrix_profile_index , right_matrix_profile_index , idx )
all_chain_set , longest_unanchored_chain = stumpy . allc ( left_matrix_profile_index , right_matrix_profile_index )
Семантическая сегментация с помощью быстрой и недорогой унипотентной семантической сегментации (FLUSS):
import stumpy
import numpy as np
if __name__ == "__main__" :
your_time_series = np . random . rand ( 10000 )
window_size = 50 # Approximately, how many data points might be found in a pattern
matrix_profile = stumpy . stump ( your_time_series , m = window_size )
subseq_len = 50
correct_arc_curve , regime_locations = stumpy . fluss ( matrix_profile [:, 1 ],
L = subseq_len ,
n_regimes = 2 ,
excl_factor = 1
)
Поддерживаемые версии Python и NumPy определяются в соответствии с политикой прекращения поддержки NEP 29.
Установка Conda (предпочтительно):
conda install -c conda-forge stumpy
Установка PyPI, предполагая, что у вас установлены numpy, scipy и numba:
python -m pip install stumpy
Чтобы установить stumpy из исходников, смотрите инструкции в документации.
Чтобы полностью понять и оценить основные алгоритмы и приложения, вам необходимо прочитать оригинальные публикации. Более подробный пример использования STUMPY можно найти в последней документации или в наших практических руководствах.
Мы протестировали производительность вычисления точного профиля матрицы с использованием JIT-скомпилированной версии кода Numba на случайно сгенерированных данных временных рядов различной длины (т. е. np.random.rand(n)
) вместе с различными аппаратными ресурсами ЦП и ГП.
Необработанные результаты отображаются в таблице ниже в формате Часы:Минуты:Секунды.Миллисекунды с постоянным размером окна m = 50. Обратите внимание, что эти сообщаемые времена выполнения включают время, необходимое для перемещения данных с хоста на все Устройство(а) графического процессора. Возможно, вам придется прокрутить таблицу до правой части, чтобы увидеть все среды выполнения.
я | п = 2 я | GPU-СТОМП | ПЕНЬ.2 | ПЕНЬ.16 | В ПЕРЕМЕЩЕНИИ.128 | В ПЕРЕМЕЩЕНИИ.256 | ГПУ-ПЕНЬ.1 | ГПУ-ПЕНЬ.2 | GPU-ПЕНЬ.DGX1 | GPU-ПЕНЬ.DGX2 |
---|---|---|---|---|---|---|---|---|---|---|
6 | 64 | 00:00:10.00 | 00:00:00.00 | 00:00:00.00 | 00:00:05.77 | 00:00:06.08 | 00:00:00.03 | 00:00:01.63 | НЭН | НЭН |
7 | 128 | 00:00:10.00 | 00:00:00.00 | 00:00:00.00 | 00:00:05.93 | 00:00:07.29 | 00:00:00.04 | 00:00:01.66 | НЭН | НЭН |
8 | 256 | 00:00:10.00 | 00:00:00.00 | 00:00:00.01 | 00:00:05.95 | 00:00:07.59 | 00:00:00.08 | 00:00:01.69 | 00:00:06.68 | 00:00:25.68 |
9 | 512 | 00:00:10.00 | 00:00:00.00 | 00:00:00.02 | 00:00:05.97 | 00:00:07.47 | 00:00:00.13 | 00:00:01.66 | 00:00:06.59 | 00:00:27.66 |
10 | 1024 | 00:00:10.00 | 00:00:00.02 | 00:00:00.04 | 00:00:05.69 | 00:00:07.64 | 00:00:00.24 | 00:00:01.72 | 00:00:06.70 | 00:00:30.49 |
11 | 2048 | НЭН | 00:00:00.05 | 00:00:00.09 | 00:00:05.60 | 00:00:07.83 | 00:00:00.53 | 00:00:01.88 | 00:00:06.87 | 00:00:31.09 |
12 | 4096 | НЭН | 00:00:00.22 | 00:00:00.19 | 00:00:06.26 | 00:00:07.90 | 00:00:01.04 | 00:00:02.19 | 00:00:06.91 | 00:00:33.93 |
13 | 8192 | НЭН | 00:00:00.50 | 00:00:00.41 | 00:00:06.29 | 00:00:07.73 | 00:00:01.97 | 00:00:02.49 | 00:00:06.61 | 00:00:33.81 |
14 | 16384 | НЭН | 00:00:01.79 | 00:00:00.99 | 00:00:06.24 | 00:00:08.18 | 00:00:03.69 | 00:00:03.29 | 00:00:07.36 | 00:00:35.23 |
15 | 32768 | НЭН | 00:00:06.17 | 00:00:02.39 | 00:00:06.48 | 00:00:08.29 | 00:00:07.45 | 00:00:04.93 | 00:00:07.02 | 00:00:36.09 |
16 | 65536 | НЭН | 00:00:22.94 | 00:00:06.42 | 00:00:07.33 | 00:00:09.01 | 00:00:14.89 | 00:00:08.12 | 00:00:08.10 | 00:00:36.54 |
17 | 131072 | 00:00:10.00 | 00:01:29.27 | 00:00:19.52 | 00:00:09.75 | 00:00:10.53 | 00:00:29.97 | 00:00:15.42 | 00:00:09.45 | 00:00:37.33 |
18 | 262144 | 00:00:18.00 | 00:05:56.50 | 00:01:08.44 | 00:00:33.38 | 00:00:24.07 | 00:00:59.62 | 00:00:27.41 | 00:00:13.18 | 00:00:39.30 |
19 | 524288 | 00:00:46.00 | 00:25:34.58 | 00:03:56.82 | 00:01:35.27 | 00:03:43.66 | 00:01:56.67 | 00:00:54.05 | 00:00:19.65 | 00:00:41.45 |
20 | 1048576 | 00:02:30.00 | 01:51:13.43 | 00:19:54.75 | 00:04:37.15 | 00:03:01.16 | 00:05:06.48 | 00:02:24.73 | 00:00:32.95 | 00:00:46.14 |
21 | 2097152 | 00:09:15.00 | 09:25:47.64 | 03:05:07.64 | 00:13:36.51 | 00:08:47.47 | 00:20:27.94 | 00:09:41.43 | 00:01:06.51 | 00:01:02.67 |
22 | 4194304 | НЭН | 36:12:23.74 | 10:37:51.21 | 00:55:44.43 | 00:32:06.70 | 01:21:12.33 | 00:38:30.86 | 00:04:03.26 | 00:02:23.47 |
23 | 8388608 | НЭН | 143:16:09.94 | 38:42:51.42 | 03:33:30.53 | 02:00:49.37 | 05:11:44.45 | 02:33:14.60 | 00:15:46.26 | 00:08:03.76 |
24 | 16777216 | НЭН | НЭН | НЭН | 14:39:11.99 | 07:13:47.12 | 20:43:03.80 | 09:48:43.42 | 01:00:24.06 | 00:29:07.84 |
НЭН | 17729800 | 09:16:12.00 | НЭН | НЭН | 15:31:31.75 | 07:18:42.54 | 23:09:22.43 | 10:54:08.64 | 01:07:35.39 | 00:32:51.55 |
25 | 33554432 | НЭН | НЭН | НЭН | 56:03:46.81 | 26:27:41.29 | 83:29:21.06 | 39:17:43,82 | 03:59:32.79 | 01:54:56.52 |
26 | 67108864 | НЭН | НЭН | НЭН | 211:17:37,60 | 106:40:17.17 | 328:58:04.68 | 157:18:30.50 | 15:42:15.94 | 07:18:52.91 |
НЭН | 100000000 | 291:07:12.00 | НЭН | НЭН | НЭН | 234:51:35.39 | НЭН | НЭН | 35:03:44.61 | 16:22:40.81 |
27 | 134217728 | НЭН | НЭН | НЭН | НЭН | НЭН | НЭН | НЭН | 64:41:55.09 | 29:13:48.12 |
GPU-STOMP: эти результаты воспроизведены из оригинального документа Matrix Profile II — NVIDIA Tesla K80 (содержит 2 графических процессора) и служат эталоном производительности для сравнения.
STUMP.2: stumpy.stump выполняется с использованием 2 процессоров. Всего - 2 процессора Intel(R) Xeon(R) E5-2650 v4 @ 2,20 ГГц, распараллеленных с Numba на одном сервере без Dask.
STUMP.16: stumpy.stump выполняется с использованием 16 процессоров. Всего — 16 процессоров Intel(R) Xeon(R) E5-2650 v4 @ 2,20 ГГц, распараллеленных с Numba на одном сервере без Dask.
STUMPED.128: stumpy.stumped выполняется с использованием 128 процессоров. Всего — 8 процессоров Intel(R) Xeon(R) E5-2650 v4 @ 2,20 ГГц x 16 серверов, распараллеленных с помощью Numba и распространяемых с помощью Dask Distributed.
STUMPED.256: stumpy.stumped выполняется с использованием 256 процессоров. Всего — 8 процессоров Intel(R) Xeon(R) E5-2650 v4 @ 2,20 ГГц x 32 сервера, распараллеленных с помощью Numba и распространяемых с помощью Dask Distributed.
GPU-STUMP.1: stumpy.gpu_stump выполняется с помощью 1 графического процессора NVIDIA GeForce GTX 1080 Ti, 512 потоков на блок, ограничение мощности 200 Вт, скомпилировано в CUDA с помощью Numba и распараллелено с помощью многопроцессорной обработки Python
GPU-STUMP.2: stumpy.gpu_stump выполняется с использованием двух графических процессоров NVIDIA GeForce GTX 1080 Ti, 512 потоков на блок, ограничение мощности 200 Вт, скомпилировано в CUDA с помощью Numba и распараллелено с помощью многопроцессорной обработки Python
GPU-STUMP.DGX1: stumpy.gpu_stump выполняется с помощью 8x NVIDIA Tesla V100, 512 потоков на блок, скомпилирован в CUDA с помощью Numba и распараллелен с помощью многопроцессорной обработки Python.
GPU-STUMP.DGX2: stumpy.gpu_stump выполняется с помощью 16x NVIDIA Tesla V100, 512 потоков на блок, скомпилирован в CUDA с помощью Numba и распараллелен с помощью многопроцессорной обработки Python.
Тесты пишутся в tests
и обрабатываются с помощью PyTest. Для анализа покрытия кода требуется coverage.py
. Тесты могут быть выполнены с помощью:
./test.sh
STUMPY поддерживает Python 3.9+ и из-за использования имен/идентификаторов переменных в Юникоде несовместим с Python 2.x. Учитывая небольшие зависимости, STUMPY может работать на более старых версиях Python, но это выходит за рамки нашей поддержки, и мы настоятельно рекомендуем вам выполнить обновление до самой последней версии Python.
Сначала проверьте обсуждения и проблемы на Github, чтобы узнать, есть ли там уже ответ на ваш вопрос. Если решение недоступно, не стесняйтесь открыть новое обсуждение или проблему, и авторы постараются ответить достаточно своевременно.
Мы приветствуем вклад в любой форме! Всегда приветствуется помощь с документацией, особенно с расширением учебных пособий. Чтобы внести свой вклад, сделайте форк проекта, внесите изменения и отправьте запрос на включение. Мы сделаем все возможное, чтобы решить любые проблемы вместе с вами и объединить ваш код с основной веткой.
Если вы использовали эту кодовую базу в научной публикации и хотите процитировать ее, воспользуйтесь статьей в Журнале программного обеспечения с открытым исходным кодом.
Закон СМ, (2019). STUMPY: мощная и масштабируемая библиотека Python для анализа данных временных рядов . Журнал программного обеспечения с открытым исходным кодом, 4 (39), 1504.
@article { law2019stumpy ,
author = { Law, Sean M. } ,
title = { {STUMPY: A Powerful and Scalable Python Library for Time Series Data Mining} } ,
journal = { {The Journal of Open Source Software} } ,
volume = { 4 } ,
number = { 39 } ,
pages = { 1504 } ,
year = { 2019 }
}
Да, Чин-Чиа Майкл и др. (2016) Матричный профиль I: соединения по сходству всех пар для временных рядов: объединяющее представление, включающее мотивы, разногласия и фигурки. ИКДМ: 1317-1322. Связь
Чжу, Ян и др. (2016) Матричный профиль II: использование нового алгоритма и графических процессоров для преодоления стомиллионного барьера для мотивов и соединений временных рядов. ICDM: 739-748. Связь
Да, Чин-Чиа Майкл и др. (2017) Матричный профиль VI: обнаружение значимых многомерных мотивов. ИКДМ: 565-574. Связь
Чжу, Ян и др. (2017) Матричный профиль VII: Цепочки временных рядов: новый примитив для анализа данных временных рядов. ICDM: 695-704. Связь
Гаргаби, Шагайег и др. (2017) Матричный профиль VIII: доменно-агностическая онлайн-семантическая сегментация на сверхчеловеческих уровнях производительности. МКДМ: 117-126. Связь
Чжу, Ян и др. (2017) Использование нового алгоритма и графических процессоров для преодоления барьера в десять квадриллионов парных сравнений для мотивов и соединений временных рядов. КАИС: 203-236. Связь
Чжу, Ян и др. (2018) Матричный профиль XI: SCRIMP++: обнаружение мотивов временных рядов на интерактивных скоростях. ИКДМ: 837-846. Связь
Да, Чин-Чиа Майкл и др. (2018) Соединения временных рядов, мотивы, разногласия и фигурки: объединяющий взгляд, использующий профиль матрицы. Диск с минимальными данными: 83-123. Связь
Гаргаби, Шагайег и др. (2018) «Матричный профиль XII: MPdist: новая мера расстояния временных рядов, позволяющая осуществлять интеллектуальный анализ данных в более сложных сценариях». ИКДМ: 965-970. Связь
Циммерман, Закари и др. (2019) Матричный профиль XIV: масштабирование обнаружения мотивов временных рядов с помощью графических процессоров для разрыва квинтиллиона парных сравнений в день и далее. SoCC '19:74-86. Связь
Акбариния, Реза и Бетран Клоэ. (2019) Эффективное вычисление профиля матрицы с использованием различных функций расстояния. arXiv: 1901.05708. Связь
Камгар, Каве и др. (2019) Матричный профиль XV: использование консенсусных мотивов временных рядов для поиска структуры в наборах временных рядов. ИКДМ: 1156-1161. Связь