پیش بینی سری زمانی با تکنیک های تجزیه و تحلیل سیگنال تصادفی

ساخت وبلاگ

در سایر پست های وبلاگ ، ما دیده ایم که چگونه می توانیم از تکنیک های تجزیه و تحلیل سیگنال تصادفی برای طبقه بندی سری زمان و سیگنال ها استفاده کنیم ، و همچنین چگونه می توانیم از تبدیل موجک برای طبقه بندی و سایر کارهای مرتبط با ماشین استفاده کنیم.

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

طبق تجزیه و تحلیل فوریه ، هر عملکردی مهم نیست که چقدر می توان از نظر ضرایب فوریه آن ، یعنی طیف فرکانس آن ، کاملاً پیچیده توصیف کرد. بنابراین هنگامی که می دانیم طیف فرکانس چگونه به نظر می رسد ، می توانیم از آن برای پیش بینی سری زمان در آینده استفاده کنیم.

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

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

  • مجموعه داده های مسافر هوایی
  • مجموعه داده انتشار کربن
  • مجموعه داده های فروش فروشگاه Rossman

این مجموعه داده ها نماینده دنیای واقعی هستند و نمونه های معمولی هستند که دانشمند داده ممکن است با آن روبرو شود.

محتوای این وبلاگ پست عبارتند از:

  • 1. معرفی
    • 1. 2 بارگیری سه مجموعه داده
    • 2. 1 سری زمانی به نظر می رسد و از آن تشکیل شده است؟
    • 2. 2 تجزیه یک سری زمانی در مؤلفه های آن
      • 2. 2. 1 تجزیه یک سری زمانی به روند و اجزای فصلی با استفاده از statsmodels
      • 2. 2. 2 تجزیه یک سری زمانی به روند و اجزای فصلی با فیلترهای SCIPY.
      • 2. 2. 3 تجزیه یک سری زمانی به روند و اجزای فصلی با پاندا.
      • 2. 2. 4 تجزیه یک سری زمانی به روند و فصلی با استفاده از np. polyfit ()
      • 2. 2. 5 تجزیه یک سری زمانی به روند و اجزای فصلی با NUMPY.
      • 3. 1 آشنایی با طیف فرکانس و FFT
      • 3. 2 ساخت طیف فرکانس از دامنه زمان
      • 3. 3 بازسازی سری زمان از طیف فرکانس
      • 3. 4 بازسازی سری زمان از طیف فرکانس با استفاده از تبدیل معکوس فوریه
      • 3. 5 بازسازی سری زمانی از دامنه فرکانس با استفاده از عملکرد خود ما و فیلتر کردن فرکانس ها
      • 4. 1 پیش بینی سری زمانی در مجموعه داده های فروش فروشگاه Rossman.
      • 4. 2 پیش بینی سری زمانی در مجموعه داده انتشار کربن.

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

      1. 2 بارگیری سه مجموعه داده

      وارد کردن سیستم عامل وارد کردن numpy به عنوان np واردات پاندا به عنوان PD DateTime را به عنوان dt وارد کنید از Scipyواردات سیگنال savgol_filter واردات Matplotlib. pyplot به عنوان plt از matplotlib. font_manager fontproperties fontp = fontproperties () قلمset_size ("کوچک") df_air = pd. read_csv ('./data/airpassengers. csv' ، parse_dates = ['ماه'] ، date_parser = lambda x: pd. to_datetime (x ، format = '٪ y- ٪ m' ، errors = 'comerce')) df_air = df_air. set_index ("ماه") DF_ROSSMAN = PD. read_csv ('./data/rossma-store-sales/train. csv' parse_dates = ['date'] ، date_parser = lambda x: pd. to_datetime (x ، format = '٪ y- ٪ m- ٪ d' ، خطاها = 'coRce')) DF_ROSSMAN = DF_ROSSMAN. dropna (زیر مجموعه = ['فروشگاه' ، 'Date']) df_carbon = pd. read_csv ('./data/carbon_emissions. csv' ، parse_dates = ['yyyymm'] ، date_parser = lambda x: pd. to_datetime (x ، format = '٪ y ٪ m' ، errors = 'corce')) df_carbon ['مقدار'] = pd. to_numeric (df_carbon ['مقدار'] ، خطاها = 'CoRce') df_carbon = df_carbon. dropna (زیر مجموعه = ['yyyymm' ، 'مقدار'] ، چگونه = 'هر')

      df_carbon. loc [: ، 'توضیحات'] = df_carbon ['توضیحات']. اعمال کنید (lambda x: x. تقسیم ('،') [0]. جایگزین ("انتشار CO2" ، ''))

      نمایش (df_air. سر (2)) نمایش (df_carbon. سر (2)) نمایش (DF_ROSSMAN. سر (2))

      بیایید با بارگذاری سه مجموعه داده ، تمیز کردن آنها در صورت لزوم و به سرعت تجسم چگونگی ظاهر سریال در مجموعه داده ها.

      همانطور که می بینیم ، اولین مجموعه داده نسبتاً ساده است و فقط یک ستون تاریخ و یک ستون با داده های سری زمانی دارد. مجموعه داده دوم و سوم شامل یک ستون تاریخ است ، اما بسته به نوع منبع کربن (که در ستون توضیحات نشان داده شده است) یا تعداد فروشگاه ها ، مقادیر سری زمانی در هر تاریخ است.

      DF_ROSSMAN_ = DF_ROSSMAN [DF_ROSSMAN ['فروشگاه'] == 1023]. sort_values (["تاریخ"]) شکل ، axarr = plt. زیرمجموعه ها (figsize = (12 ، 10) ، nRows = 3) df_air ['#Passengers']. طرح (نوع = 'خط' ، ax = axarr [0])

      snsLineplot (data = df_carbon ، x = 'Yyyymm' ، y = 'مقدار' ، hue = 'توضیحات' ، ax = axarr [1])

      snsLinePlot (data = df_rossman_ ، x = 'date' ، y = 'sales' ، ax = axarr [2]) Axarr [1]. افسانه (loc = 'بالا سمت چپ ") Axarr [0]. set_title ("مجموعه داده های مسافر هوا" ، فونت اندازه = 14) Axarr [1]. set_title ("مجموعه داده انتشار کربن" ، فونت اندازه = 14) Axarr [2]. set_title ('Rossman Store DataSet Sales (فروشگاه 1023) ، FontSize = 14) Axarr [0]. set_xlabel ('Date' ، FontSize = 14) Axarr [1]. set_xlabel ('Date' ، FontSize = 14) Axarr [2]. set_xlabel ('Date' ، FontSize = 14) Axarr [0]. set_ylabel ('#passengers' ، fontsize = 14) Axarr [1]. set_ylabel ("انتشار کربن" ، فونت اندازه = 14) Axarr [2]. set_ylabel ("فروش" ، فونت اندازه = 14) pltTRIME_LAYOUT () pltنمایش ()

      این سه مجموعه داده ای است که ما در این پست وبلاگ با آنها کار خواهیم کرد. نیازی به جزئیات نیست زیرا آنها فقط به عنوان نمونه خدمت می کنند.

      2. مقدمه به سری زمان

      2. 1 سری زمانی به نظر می رسد و از آن تشکیل شده است؟

      در شکل 1 در بالا ، ما قبلاً دیده ایم که چگونه یک مجموعه داده سری زمانی از نظر بصری به نظر می رسد. این یک مجموعه داده است که در یک محور مبتنی بر زمان فهرست بندی می شود ، به این معنی که متغیر مستقل X تاریخ و/یا زمان را نشان می دهد و متغیر وابسته Y مقدار چیزی را در آن مقطع نشان می دهد. x-axis از نقاط به همان اندازه فاصله در زمان تشکیل شده است. این می تواند یک امتیاز در سال ، یک امتیاز در هر ماه ، روز ، دقیقه ، دوم ، میلی ثانیه و غیره باشد. چند بار از این نقاط فاصله دارند ، وضوح داده را به نام می نامند. بنابراین اگر یک مجموعه داده وضوح دوم داشته باشد ، شامل یک اندازه گیری در ثانیه است و اگر دارای وضوح میلی ثانیه باشد ، شامل یک اندازه گیری در هر 1/1000 ثانیه است.

      وضوح معمولاً توسط سازنده مجموعه داده از پیش تعیین می شود و به عواملی مانند نرخ نمونه برداری از دستگاه ضبط بستگی دارد. به عنوان مثال، برای این رقابت Kaggle، هدف شناسایی عیوب در خطوط برق بود که در مقیاس زمانی بسیار کوچک رخ می دهد. بنابراین سیگنال با نرخ نمونه برداری بالا 40 مگاهرتز ثبت شد. مجموعه داده نهایی حاوی سیگنال هایی با 800000 نمونه در مدت زمان 20 میلی ثانیه بود. اکثر فرآیندها در مقیاس زمانی بسیار بزرگتر، در بازه زمانی چند ساعت، روز یا سال رخ می دهند و نیازی به داشتن چنین وضوح بالایی نخواهد بود.

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

      علاوه بر وضوح، ما همچنین باید بدانیم که اجزای مختلف یک مجموعه داده سری زمانی چیست. یک سری زمانی شامل موارد زیر است:

      • روند: این حرکت بزرگ / جهانی به سمت بالا یا نزولی در سری زمانی در یک دوره زمانی طولانی است. در اصطلاح مهندسی به این جزء DC سیگنال نیز می گویند.
      • فصلی: این چرخه فصلی کوتاه مدت است که چندین بار تکرار می شود. این نشان دهنده تغییرات فصلی است. برخی از کسب و کارها / فرآیندها بسیار فصلی هستند در حالی که برخی دیگر اینگونه نیستند. هر چه یک فرآیند فصلی تر باشد، پیش بینی رفتار ویژگی آسان تر می شود. در مهندسی به این جزء AC یک سیگنال نیز می گویند.
      • نویز یا بی نظمی: بخش هایی از سری زمانی که نمی توان آنها را به روند اجزای فصلی نسبت داد و نتیجه تغییرات تصادفی داده ها است.

      2. 2 تجزیه یک سری زمانی به اجزای آن

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

      در پایتون روشهای مختلفی وجود دارد که می توانیم یک سیگنال سری زمانی را به اجزای مختلف آن تجزیه کنیم. برخی از بسته های تخصصی مانند statsmodels وجود دارد که می توانید از آنها استفاده کنید ، اما قطعاً این تنها یا بهترین راه برای تجزیه سری زمانی نیست. همانطور که در پایان این بخش خواهیم دید ، وظیفه تجزیه سری زمانی تقریباً به پایین می رود تا میانگین (نورد) را از سری زمانی کم کند. یعنی روند با میانگین نورد سری زمان محاسبه می شود. این یک کار به اندازه کافی ساده است و می توان آن را از بسیاری جهات دیگر انجام داد:

      • همانطور که گفتیم ، می توانیم با استفاده از کتابخانه statsmodels ، یک سری زمانی را به روند و فصلی تجزیه کنیم.
      • ما می توانیم با استفاده از فیلترهای SCIPY روند یک سری زمانی را محاسبه کنیم.
      • ما می توانیم روند را با کتابخانه Pandas محاسبه کنیم.
      • ما می توانیم از np. polyfit () استفاده کنیم تا یک خط روند خطی / درجه دوم را از طریق داده های سری زمانی قرار دهیم.
      • ما می توانیم با استفاده از کتابخانه Numpy ، میانگین نورد را محاسبه کنیم.

      2. 2. 1 تجزیه یک سری زمانی به روند و اجزای فصلی با استفاده از statsmodels

      در زیر ما مجموعه داده های Air Passengers را در مؤلفه روند آن و مؤلفه فصلی آن با استفاده از Python Package Statsmodels تجزیه خواهیم کرد.

مقالات آموزش فارکس...
ما را در سایت مقالات آموزش فارکس دنبال می کنید

برچسب : نویسنده : بهزاد فراهانی بازدید : <-PostHit-> تاريخ : پنجشنبه 9 شهريور 1402 ساعت: 13:07