STUMPY adalah pustaka Python yang kuat dan dapat diskalakan yang secara efisien menghitung sesuatu yang disebut profil matriks, yang merupakan cara akademis untuk mengatakan "untuk setiap rangkaian (hijau) dalam rangkaian waktu Anda, secara otomatis mengidentifikasi tetangga terdekatnya (abu-abu)":
Yang penting adalah setelah Anda menghitung profil matriks Anda (panel tengah di atas), profil tersebut kemudian dapat digunakan untuk berbagai tugas penambangan data deret waktu seperti:
Baik Anda seorang akademisi, ilmuwan data, pengembang perangkat lunak, atau penggemar deret waktu, STUMPY mudah dipasang dan tujuan kami adalah memungkinkan Anda mendapatkan wawasan deret waktu dengan lebih cepat. Lihat dokumentasi untuk informasi lebih lanjut.
Silakan lihat dokumentasi API kami untuk daftar lengkap fungsi yang tersedia dan lihat tutorial informatif kami untuk contoh kasus penggunaan yang lebih komprehensif. Di bawah ini, Anda akan menemukan cuplikan kode yang dengan cepat menunjukkan cara menggunakan STUMPY.
Penggunaan umum (data deret waktu 1 dimensi) dengan 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 )
Penggunaan terdistribusi untuk data deret waktu 1 dimensi dengan Dask Didistribusikan melalui 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 )
Penggunaan GPU untuk data deret waktu 1 dimensi dengan 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 )
Data deret waktu multidimensi dengan 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 )
Analisis data deret waktu multidimensi terdistribusi dengan 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 )
Rantai Rangkaian Waktu dengan Rantai Rangkaian Waktu Berlabuh (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 )
Segmentasi Semantik dengan Segmentasi Semantik Unipoten Cepat dan Berbiaya Rendah (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
)
Versi Python dan NumPy yang didukung ditentukan berdasarkan kebijakan penghentian NEP 29.
Pemasangan Conda (lebih disukai):
conda install -c conda-forge stumpy
Instal PyPI, dengan asumsi Anda telah menginstal numpy, scipy, dan numba:
python -m pip install stumpy
Untuk menginstal stumpy dari sumber, lihat petunjuk di dokumentasi.
Untuk sepenuhnya memahami dan menghargai algoritma dan aplikasi yang mendasarinya, Anda harus membaca publikasi aslinya. Untuk contoh lebih detail tentang cara menggunakan STUMPY, silakan lihat dokumentasi terbaru atau jelajahi tutorial praktis kami.
Kami menguji kinerja komputasi profil matriks yang tepat menggunakan versi kode yang dikompilasi Numba JIT pada data deret waktu yang dihasilkan secara acak dengan panjang yang bervariasi (yaitu, np.random.rand(n)
) bersama dengan sumber daya perangkat keras CPU dan GPU yang berbeda.
Hasil mentahnya ditampilkan dalam tabel di bawah sebagai Jam:Menit:Detik.Milidetik dan dengan ukuran jendela konstan m = 50. Perhatikan bahwa waktu proses yang dilaporkan ini mencakup waktu yang diperlukan untuk memindahkan data dari host ke semua Perangkat GPU. Anda mungkin perlu menggulir ke sisi kanan tabel untuk melihat semua waktu proses.
Saya | n = 2 saya | GPU-STOMP | tunggul.2 | STUMP.16 | BINGUNG.128 | BINGUNG.256 | GPU-STUMP.1 | GPU-STUMP.2 | GPU-STUMP.DGX1 | GPU-STUMP.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 | Tidak | Tidak |
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 | Tidak | Tidak |
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 | Tidak | 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 | Tidak | 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 | Tidak | 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 | Tidak | 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 | Tidak | 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 | Tidak | 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 | Tidak | 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 | Tidak | 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 | Tidak | Tidak | Tidak | 14:39:11.99 | 07:13:47.12 | 20:43:03.80 | 09:48:43.42 | 01:00:24.06 | 00:29:07.84 |
Tidak | 17729800 | 09:16:12.00 | Tidak | Tidak | 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 | Tidak | Tidak | Tidak | 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 | Tidak | Tidak | Tidak | 211:17:37.60 | 106:40:17.17 | 328:58:04.68 | 157:18:30.50 | 15:42:15.94 | 07:18:52.91 |
Tidak | 100000000 | 291:07:12.00 | Tidak | Tidak | Tidak | 234:51:35.39 | Tidak | Tidak | 35:03:44.61 | 16:22:40.81 |
27 | 134217728 | Tidak | Tidak | Tidak | Tidak | Tidak | Tidak | Tidak | 64:41:55.09 | 29:13:48.12 |
GPU-STOMP: Hasil ini direproduksi dari makalah Matrix Profile II asli - NVIDIA Tesla K80 (berisi 2 GPU) dan berfungsi sebagai tolok ukur kinerja untuk dibandingkan.
STUMP.2: stumpy.stump dieksekusi dengan Total 2 CPU - 2x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz yang diparalelkan dengan Numba pada satu server tanpa Dask.
STUMP.16: stumpy.stump dieksekusi dengan Total 16 CPU - 16x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz yang diparalelkan dengan Numba pada satu server tanpa Dask.
STUMPED.128: stumpy.stumped dieksekusi dengan Total 128 CPU - 8x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz prosesor x 16 server, diparalelkan dengan Numba, dan didistribusikan dengan Dask Distributed.
STUMPED.256: stumpy.stumped dieksekusi dengan Total 256 CPU - 8x Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz prosesor x 32 server, diparalelkan dengan Numba, dan didistribusikan dengan Dask Distributed.
GPU-STUMP.1: stumpy.gpu_stump dieksekusi dengan 1x GPU NVIDIA GeForce GTX 1080 Ti, 512 thread per blok, batas daya 200W, dikompilasi ke CUDA dengan Numba, dan diparalelkan dengan multiprosesor Python
GPU-STUMP.2: stumpy.gpu_stump dieksekusi dengan 2x GPU NVIDIA GeForce GTX 1080 Ti, 512 thread per blok, batas daya 200W, dikompilasi ke CUDA dengan Numba, dan diparalelkan dengan multiprosesor Python
GPU-STUMP.DGX1: stumpy.gpu_stump dieksekusi dengan 8x NVIDIA Tesla V100, 512 thread per blok, dikompilasi ke CUDA dengan Numba, dan diparalelkan dengan multiprosesing Python
GPU-STUMP.DGX2: stumpy.gpu_stump dieksekusi dengan 16x NVIDIA Tesla V100, 512 thread per blok, dikompilasi ke CUDA dengan Numba, dan diparalelkan dengan multiprosesing Python
Pengujian ditulis di direktori tests
dan diproses menggunakan PyTest dan memerlukan coverage.py
untuk analisis cakupan kode. Tes dapat dijalankan dengan:
./test.sh
STUMPY mendukung Python 3.9+ dan, karena penggunaan nama/pengidentifikasi variabel unicode, tidak kompatibel dengan Python 2.x. Mengingat ketergantungannya yang kecil, STUMPY mungkin bekerja pada versi Python yang lebih lama tetapi ini berada di luar cakupan dukungan kami dan kami sangat menyarankan agar Anda meningkatkan ke versi Python terbaru.
Pertama, silakan periksa diskusi dan isu di Github untuk melihat apakah pertanyaan Anda sudah terjawab di sana. Jika tidak ada solusi yang tersedia, jangan ragu untuk membuka diskusi atau isu baru dan penulis akan berusaha memberikan tanggapan dalam waktu yang cukup tepat waktu.
Kami menyambut kontribusi dalam bentuk apa pun! Bantuan dokumentasi, khususnya perluasan tutorial, selalu diterima. Untuk berkontribusi, harap fork proyek, buat perubahan, dan kirimkan permintaan penarikan. Kami akan melakukan yang terbaik untuk mengatasi masalah apa pun dengan Anda dan menggabungkan kode Anda ke cabang utama.
Jika Anda telah menggunakan basis kode ini dalam publikasi ilmiah dan ingin mengutipnya, silakan gunakan artikel Jurnal Perangkat Lunak Sumber Terbuka.
Hukum SM, (2019). STUMPY: Pustaka Python yang Kuat dan Skalabel untuk Penambangan Data Rangkaian Waktu . Jurnal Perangkat Lunak Sumber Terbuka, 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 }
}
Ya, Chin-Chia Michael, dkk. (2016) Profil Matriks I: Kesamaan Semua Pasangan Bergabung untuk Rangkaian Waktu: Pandangan Pemersatu yang Mencakup Motif, Perselisihan, dan Bentuk. ICDM:1317-1322. Link
Zhu, Yan, dkk. (2016) Matrix Profile II: Memanfaatkan Algoritma dan GPU Baru untuk Mendobrak Batasan Seratus Juta untuk Motif dan Gabungan Rangkaian Waktu. ICDM:739-748. Link
Ya, Chin-Chia Michael, dkk. (2017) Profil Matriks VI: Penemuan Motif Multidimensi yang Bermakna. ICDM:565-574. Link
Zhu, Yan, dkk. (2017) Profil Matriks VII: Rantai Rangkaian Waktu: Primitif Baru untuk Penambangan Data Rangkaian Waktu. ICDM:695-704. Link
Gharghabi, Shaghayegh, dkk. (2017) Profil Matriks VIII: Segmentasi Semantik Online Agnostik Domain pada Tingkat Kinerja Manusia Super. ICDM:117-126. Link
Zhu, Yan, dkk. (2017) Memanfaatkan Algoritma dan GPU Baru untuk Mendobrak Penghalang Perbandingan Berpasangan Sepuluh Kuadriliun untuk Motif dan Gabungan Rangkaian Waktu. KAIS:203-236. Link
Zhu, Yan, dkk. (2018) Profil Matriks XI: SCRIMP++: Penemuan Motif Rangkaian Waktu dengan Kecepatan Interaktif. ICDM:837-846. Link
Ya, Chin-Chia Michael, dkk. (2018) Gabungan Rangkaian Waktu, Motif, Perselisihan, dan Bentuk: Pandangan Pemersatu yang Memanfaatkan Profil Matriks. Disk Pengetahuan Min Data:83-123. Link
Gharghabi, Shaghayegh, dkk. (2018) "Profil Matriks XII: MPdist: Pengukuran Jarak Rangkaian Waktu Baru untuk Memungkinkan Penambangan Data dalam Skenario yang Lebih Menantang." ICDM:965-970. Link
Zimmerman, Zachary, dkk. (2019) Profil Matriks XIV: Menskalakan Penemuan Motif Rangkaian Waktu dengan GPU untuk Menembus Satu Triliun Perbandingan Berpasangan Sehari dan Selanjutnya. SoCC '19:74-86. Link
Akbarinia, Reza, dan Betrand Cloez. (2019) Perhitungan Profil Matriks Efisien Menggunakan Fungsi Jarak Berbeda. arXiv:1901.05708. Link
Kamgar, Kaveh, dkk. (2019) Profil Matriks XV: Memanfaatkan Motif Konsensus Deret Waktu untuk Menemukan Struktur dalam Kumpulan Deret Waktu. ICDM:1156-1161. Link