STUMPY هي مكتبة بايثون قوية وقابلة للتطوير والتي تحسب بكفاءة ما يسمى ملف تعريف المصفوفة، وهي مجرد طريقة أكاديمية لقول "لكل سلسلة فرعية (خضراء) ضمن سلسلتك الزمنية، قم تلقائيًا بتحديد أقرب جار لها (رمادي)":
المهم هو أنه بمجرد قيامك بحساب ملف تعريف المصفوفة الخاص بك (اللوحة الوسطى أعلاه) يمكن استخدامه بعد ذلك لمجموعة متنوعة من مهام التنقيب عن البيانات في السلاسل الزمنية مثل:
سواء كنت أكاديميًا، أو عالم بيانات، أو مطور برامج، أو متحمسًا للسلاسل الزمنية، فإن 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 الموزع عبر 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 لبيانات السلاسل الزمنية أحادية البعد باستخدام 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 install -c conda-forge stumpy
تثبيت PyPI، بافتراض أن لديك numpy وscipy وnumba مثبتًا:
python -m pip install stumpy
لتثبيت Stumpy من المصدر، راجع الإرشادات الموجودة في الوثائق.
من أجل فهم وتقدير الخوارزميات والتطبيقات الأساسية بشكل كامل، من الضروري أن تقرأ المنشورات الأصلية. للحصول على مثال أكثر تفصيلاً حول كيفية استخدام STUMPY، يرجى الرجوع إلى أحدث الوثائق أو استكشاف البرامج التعليمية العملية لدينا.
لقد اختبرنا أداء حساب ملف تعريف المصفوفة الدقيق باستخدام نسخة Numba JIT المجمعة من الكود على بيانات سلاسل زمنية تم إنشاؤها عشوائيًا بأطوال مختلفة (على سبيل المثال، np.random.rand(n)
) جنبًا إلى جنب مع موارد أجهزة وحدة المعالجة المركزية ووحدة معالجة الرسومات المختلفة.
يتم عرض النتائج الأولية في الجدول أدناه كالساعات: الدقائق: الثواني. ميلي ثانية وبحجم نافذة ثابت قدره m = 50. لاحظ أن أوقات التشغيل المبلغ عنها تتضمن الوقت الذي يستغرقه نقل البيانات من المضيف إلى كافة جهاز (أجهزة) GPU. قد تحتاج إلى التمرير إلى الجانب الأيمن من الجدول لرؤية جميع أوقات التشغيل.
أنا | ن = 2 ط | GPU-STOMP | الجذع.2 | الجذع.16 | متعثر.128 | متعثر.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 | نان | نان |
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 (تحتوي على وحدتي معالجة رسوميات) وهي بمثابة معيار الأداء للمقارنة.
STUMP.2: تم تنفيذ stumpy.stump باستخدام وحدتي CPU إجمالاً - معالجات Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20 جيجا هرتز المتوازية مع Numba على خادم واحد بدون Dask.
STUMP.16: تم تنفيذ stumpy.stump بإجمالي 16 وحدة معالجة مركزية - 16x معالجات Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20 جيجا هرتز المتوازية مع Numba على خادم واحد بدون Dask.
STUMPED.128: تم تنفيذ stumpy.stumped بإجمالي 128 وحدة معالجة مركزية - 8x معالجات Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20 جيجا هرتز × 16 خادمًا، بالتوازي مع Numba، وموزعة مع Dask Distributed.
STUMPED.256: تم تنفيذ stumpy.stumped بإجمالي 256 وحدة معالجة مركزية - 8x معالجات Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20 جيجا هرتز × 32 خادمًا، بالتوازي مع Numba، وموزعة مع Dask Distributed.
GPU-STUMP.1: stumpy.gpu_stump تم تنفيذه باستخدام 1x NVIDIA GeForce GTX 1080 Ti GPU، 512 مؤشر ترابط لكل كتلة، حد طاقة 200 واط، تم تجميعها إلى CUDA مع Numba، ومتوازية مع معالجة Python المتعددة
GPU-STUMP.2: stumpy.gpu_stump تم تنفيذه باستخدام 2x NVIDIA GeForce GTX 1080 Ti GPU، 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
py لتحليل تغطية التعليمات البرمجية. يمكن تنفيذ الاختبارات باستخدام:
./test.sh
يدعم STUMPY إصدار Python 3.9+، ونظرًا لاستخدام أسماء/معرفات متغيرات Unicode، فهو غير متوافق مع Python 2.x. نظرًا للتبعيات الصغيرة، قد يعمل STUMPY على الإصدارات الأقدم من Python ولكن هذا خارج نطاق دعمنا ونوصي بشدة بالترقية إلى أحدث إصدار من Python.
أولاً، يرجى مراجعة المناقشات والمشكلات على Github لمعرفة ما إذا كان قد تمت الإجابة على سؤالك هناك بالفعل. إذا لم يكن هناك حل متاح، فلا تتردد في فتح مناقشة أو قضية جديدة وسيحاول المؤلفون الرد في الوقت المناسب بشكل معقول.
نحن نرحب بالمساهمات بأي شكل من الأشكال! نرحب دائمًا بالمساعدة في التوثيق، وخاصة توسيع البرامج التعليمية. للمساهمة، يرجى تفرع المشروع وإجراء التغييرات وإرسال طلب سحب. سنبذل قصارى جهدنا لحل أي مشكلات معك ودمج الكود الخاص بك في الفرع الرئيسي.
إذا كنت قد استخدمت قاعدة التعليمات البرمجية هذه في منشور علمي وترغب في الاستشهاد بها، فيرجى استخدام مقالة مجلة البرامج مفتوحة المصدر.
قانون SM، (2019). Stumpy: مكتبة بايثون قوية وقابلة للتطوير لاستخراج بيانات السلاسل الزمنية . مجلة البرمجيات مفتوحة المصدر، 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) ملف تعريف المصفوفة الأول: تشابه جميع الأزواج ينضم إلى السلاسل الزمنية: عرض موحد يتضمن الزخارف والخلافات والأشكال الصغيرة. ICDM:1317-1322. وصلة
تشو، يان، وآخرون. (2016) ملف تعريف المصفوفة II: استغلال خوارزمية جديدة ووحدات معالجة الرسومات لكسر حاجز مائة مليون لزخارف السلاسل الزمنية وروابطها. ICDM:739-748. وصلة
نعم، تشين شيا مايكل، وآخرون. (2017) ملف المصفوفة السادس: اكتشاف هادف متعدد الأبعاد. ICDM:565-574. وصلة
تشو، يان، وآخرون. (2017) ملف المصفوفة السابع: سلاسل السلاسل الزمنية: بدائية جديدة لاستخراج بيانات السلاسل الزمنية. ICDM:695-704. وصلة
الغرغابي، شغايغ، وآخرون. (2017) ملف تعريف المصفوفة الثامن: التقسيم الدلالي عبر الإنترنت غير الملائم للمجال عند مستويات الأداء فوق طاقة البشر. ICDM:117-126. وصلة
تشو، يان، وآخرون. (2017) استغلال خوارزمية جديدة ووحدات معالجة الرسومات لكسر حاجز المقارنات الزوجية العشرة كوادريليون لزخارف السلاسل الزمنية وروابطها. قيس:203-236. وصلة
تشو، يان، وآخرون. (2018) ملف تعريف المصفوفة XI: SCRIMP++: اكتشاف فكرة السلاسل الزمنية بسرعات تفاعلية. ICDM:837-846. وصلة
نعم، تشين شيا مايكل، وآخرون. (2018) انضمام السلاسل الزمنية والزخارف والخلافات والأشكال الصغيرة: رؤية موحدة تستغل ملف تعريف المصفوفة. قرص معرفة البيانات الدقيقة: 83-123. وصلة
الغرغابي، شغايغ، وآخرون. (2018) "ملف تعريف المصفوفة XII: MPdist: قياس مسافة سلسلة زمنية جديدة للسماح بالتنقيب عن البيانات في سيناريوهات أكثر تحديًا." اي سي دي ام: 965-970. وصلة
زيمرمان، زاكاري، وآخرون. (2019) ملف تعريف المصفوفة XIV: توسيع نطاق اكتشاف فكرة السلاسل الزمنية باستخدام وحدات معالجة الرسومات لكسر كوينتيليون مقارنات زوجية في اليوم وما بعده. SoCC '19: 74-86. وصلة
أكبرينيا ورضا وبيتراند كلويز. (2019) حساب ملف تعريف المصفوفة الفعال باستخدام وظائف المسافة المختلفة. أرخايف:1901.05708. وصلة
كامغار، كافيه، وآخرون. (2019) ملف تعريف المصفوفة الخامس عشر: استغلال زخارف إجماع السلاسل الزمنية للعثور على هيكل في مجموعات السلاسل الزمنية. ICDM:1156-1161. وصلة