چگونه مجموعه داده‌های سری زمانی را در پایتون هم‌گام کنیم

شکل ۱. همگام‌سازی مجموعه داده‌ها در پایتون
شکل ۱. همگام‌سازی مجموعه داده‌ها در پایتون
منتشر شده در towardsdatascience به تاریخ ۲۴ جولای ۲۰۲۱
لینک منبعHow to Synchronize Time Series Datasets in Python

مقدمه

یکی از دردناک‌ترین چیزهایی که فرد می‌تواند در یک شغل مرتبط با داده با آن مواجه شود، این است که باید با مجموعه داده‌های سری زمانی ناهم‌زمان سر و کار داشته باشد. اختلافات می‌تواند ناشی از تعداد زیادی از دلایل باشد- فاصله تنظیمات ذخیره، سیگنال‌های SCADA نادرست، و داده‌های خراب‌شده برای چند مورد. حتی یافتن چندین مغایرت در نقاط مختلف در یک مجموعه داده معمول است که نیاز به شناسایی و اصلاح هر یک به صورت جداگانه دارد. و در حالی که در آن هستید، ممکن است سهوا بخش همزمان دیگری را جبران کنید. خوشبختانه با کمک تکنیک جدید "تاب دادن زمان هوشمند" می‌توانیم به معنای واقعی کلمه یک اندازه متناسب با همه راه‌حل‌های مجموعه‌داده‌های غیرهماهنگ خود را اعمال کنیم.

تاب دادن زمان هوشمند

تاب دادن زمان هوشمند (DTW) به طور خلاصه تکنیکی است که انطباق بهینه بین دو دنباله داده را محاسبه می‌کند. به عبارت دیگر، شما کوتاه‌ترین مسیر را از یک مجموعه داده به مجموعه داده دیگر در هر زمانی پیدا می‌کنید. زیبایی این روش این است که به شما اجازه می‌دهد تا هر تعداد اصلاح مورد نیاز را برای مجموعه داده خود به کار ببرید تا مطمئن شوید که هر نقطه تا بالاترین درجه ممکن هماهنگ شده‌است. شما حتی می‌توانید آن را در مجموعه داده‌های با طول‌های مختلف اعمال کنید. و کاربردهای DTW بی‌پایان هستند، شما می‌توانید از آن برای داده‌های زمانی و غیر زمانی مانند شاخص‌های مالی، شاخص‌های بازار سهام، صوت محاسباتی و غیره استفاده کنید. تنها نکته این است که اطمینان حاصل کنید داده‌های شما هیچ مقدار صفر یا از دست رفته‌ای ندارند که بتواند کارهای DTW را خراب کند.

شکل ۲: اجرای اندازه‌گیری فاصله اقلیدسی DTW.
شکل ۲: اجرای اندازه‌گیری فاصله اقلیدسی DTW.

اندازه‌گیری فاصله مورد استفاده برای یافتن کوتاهترین مسیر بین نقاط مربوطه می‌تواند هر یک از موارد ارائه شده توسط ماژول اندازه‌گیری فاصلهScipy باشد. اگرچه در بیشتر موارد، فاصله اقلیدسی ترفندهای بزرگی را برای شما رقم می‌زند، اما ممکن است بخواهید با دیگران آزمایش کنید.

پیاده‌سازی

برای پیاده‌سازی نسخه خودمان از DTW، از کتابخانه fastdtw در پایتون استفاده خواهیم کرد. نوآوری این بسته این است که پیچیدگی تابع تاب‌دهی را ساده می‌کند، در نتیجه پیچیدگی را از O (n²) به O (n) کاهش می‌دهد که یک تفاوت محسوس را در زمان اجرا نشان می‌دهد.

لطفا با آناکوندا و یا هر راهنمای پایتون دل‌خواه خود ادامه دهید و اتصالات را همانطور که در زیر نشان‌داده شده‌است، نصب کنید:

pip install fastdtw

پس از آن، تمام بسته‌های مورد نیاز را وارد کنید:

import numpy as np
import pandas as pd
import streamlit as st
import plotly.express as px
from sklearn.metrics import r2_score

مجموعه داده‌های خود را وارد کرده و قبل از اجرای همگام‌سازی هر مقدار صفر را پر کنید:

df = pd.read_csv('dataset.csv')df['Power'] = pd.to_numeric(df['Power'],errors='coerce')
df['Voltage'] = pd.to_numeric(df['Voltage'],errors='coerce')x = np.array(df['Power'].fillna(0))
y = np.array(df['Voltage'].fillna(0))

سپس به اجرای همگام‌سازی ادامه دهید:

distance, path = fastdtw(x, y, dist=euclidean)

نتیجه مسیر همگام‌سازی مشابه موارد زیر خواهد بود:

path = [(0, 0), (0, 1), (0, 2), (1, 3), (2, 4),...]

هر نقطه از مجموعه داده مرجع با یک یا چند نقطه در مجموعه داده هدف تطبیق داده خواهد شد، یعنی ردیف ۰ داده مرجع را می توان با نقاط ۰، ۱، یا ۲ داده هدف تطبیق داد.

حالا که شما مسیر تاب داده شده را دارید، می‌توانید با ایجاد یک چارچوب داده با نتایج همگام شده به شرح زیر ادامه دهید:

result = []for i in range(0,len(path)):
result.append([df['DateTime'].iloc[path[i][0]],
df['Power'].iloc[path[i][0]],
df['Voltage'].iloc[path[i][1]]])df_sync = pd.DataFrame(data=result,columns=['DateTime','Power','Voltage']).dropna()
df_sync = df_sync.drop_duplicates(subset=['DateTime'])
df_sync = df_sync.sort_values(by='DateTime')
df_sync = df_sync.reset_index(drop=True)df_sync.to_csv('C:/Users/.../synchronized_dataset.csv',index=False)

سرانجام، می‌توانید با استفاده از ماژولr2_score Sklearn‌، یک امتیاز همبستگی را برای مقایسه همبستگی یا سطح همگام‌سازی قبل و بعد از همگام‌سازی محاسبه کنید:

correlation = r2_score(df['Power'],df['Voltage'])

تجسم داده‌ها

برای ترسیم و تجسم داده‌های همزمان شده شما، ما از دو کتابخانه مورد علاقه من برای تجسم داده‌ها و ارائه آن به عنوان یک برنامه استفاده می‌کنیم- Plotly و Streamlit.

شما می‌توانید از تابع زیر برای ایجاد یک نمودار سری زمانی استفاده کنید. لطفا اطمینان حاصل کنید که مهرهای زمانی شما در فرمت صحیحdd-mm-yyyy hh: mm هستند، یا به جای آن تابع را برای تنظیم با داده‌های خود تغییر دهید.

برای تجسم و نمایش نمودار، سند خود را با تایپ دستورهای زیر در اعلان Anaconda اجرا کنید:

cd C:/Users/.../local_directory
streamlit run synchronization.py

و در آنجا شما تصویری از داده‌های خود قبل و بعد از هماهنگی دارید:

نتیجه‌گیری

تاب دادن زمان هوشمند احتمالا موثرترین راه‌حل برای همگام‌سازی سریع و مناسب داده‌های سری زمانی است. اگرچه بدون عیب نیست و در واقع کاستی‌هایی مانند تطبیق ضعیف شرایط مرزی دارد، اما جامع‌ترین راه حلی است که تا کنون در معرض آن قرار گرفته‌ام. شما به هیچ وجه محدود به داده‌های خطی نیستید و در واقع می‌توانید داده‌های غیر خطی را با ابعاد مختلف همگام کنید.

این متن با استفاده از ربات ترجمه مقالات علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.