۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

پیش بینی سری های زمانی با ARMA و InfluxDB

مدل‌های میانگین متحرک اتورگرسیو چندین مزیت از جمله سادگی دارند. در اینجا نحوه استفاده از مدل ARMA با InfluxDB آورده شده است.

مدل‌های میانگین متحرک اتورگرسیو چندین مزیت از جمله سادگی دارند. در اینجا نحوه استفاده از مدل ARMA با InfluxDB آورده شده است.

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

در این آموزش، نحوه استفاده از بسته statsmodels Python را برای پیش بینی می آموزیم. داده با استفاده از مدل ARMA و InfluxDB، پایگاه داده سری زمانی منبع باز. این آموزش نحوه استفاده از کتابخانه کلاینت InfluxDB Python برای پرس و جو داده ها از InfluxDB و تبدیل داده ها به Pandas DataFrame برای آسان‌تر کردن کار با داده‌های سری زمانی. سپس پیش‌بینی خود را انجام می‌دهیم.

من همچنین مزایای ARMA را با جزئیات بیشتر بررسی خواهم کرد.

نیازها

این آموزش بر روی یک سیستم macOS با Python 3 نصب شده از طریق Homebrew اجرا شد. توصیه می‌کنم ابزارهای اضافی مانند virtualenv، pyenv، یا conda-env برای ساده سازی نصب پایتون و کلاینت. در غیر این صورت، شرایط کامل در اینجا آمده است:

  • influxdb-client = 1.30.0
  • پاندا = ۱.۴.۳
  • influxdb-client >= ۱.۳۰.۰
  • پانداها >= ۱.۴.۳
  • matplotlib >= ۳.۵.۲
  • sklearn >= ۱.۱.۱

این آموزش همچنین فرض می‌کند که شما یک حساب سطح رایگان InfluxDB cloud دارید و یک سطل ایجاد کرد و یک توکن ایجاد کرد. می‌توانید یک سطل را به‌عنوان یک پایگاه داده یا بالاترین سطح سلسله مراتبی سازمان داده‌ها در نظر بگیرید. InfluxDB. برای این آموزش ما یک سطل به نام NOAA ایجاد خواهیم کرد.

ARMA چیست؟

ARMA مخفف میانگین متحرک رگرسیون خودکار است. این یک تکنیک پیش‌بینی است که ترکیبی از مدل‌های AR (خود رگرسیون) و مدل‌های MA (میانگین متحرک) است. پیش‌بینی AR یک مدل افزودنی خطی است. پیش‌بینی‌ها مجموع مقادیر گذشته ضربدر یک ضریب مقیاس به اضافه باقیمانده‌ها هستند. برای کسب اطلاعات بیشتر در مورد ریاضیات پشت مدل‌های AR، پیشنهاد می‌کنم این مقاله را بخوانید< /a>.

مدل میانگین متحرک مجموعه‌ای از میانگین‌ها است. انواع مختلفی از میانگین های متحرک از جمله فرم های ساده، تجمعی و وزنی وجود دارد. مدل‌های ARMA تکنیک‌های AR و MA را برای ایجاد پیش‌بینی ترکیب می‌کنند. خواندن این پست را برای کسب اطلاعات بیشتر در مورد مدل‌های AR، MA، و ARMA توصیه می‌کنم. امروز ما از عملکرد ARMA statsmodels برای انجام پیش بینی.

آنچه کاربران SQL باید در مورد داده های سری زمانی بدانند

مفروضات مدل‌های AR، MA، و ARMA

اگر به دنبال استفاده از مدل‌های AR، MA، و ARMA هستید، ابتدا باید مطمئن شوید که داده‌های شما الزامات مدل‌ها را برآورده می‌کند: ثابت بودن. برای ارزیابی اینکه آیا داده های سری زمانی شما ثابت هستند یا خیر، باید بررسی کنید که میانگین و کوواریانس ثابت می مانند. خوشبختانه ما می توانیم از InfluxDB و زبان Flux برای به دست آوردن یک مجموعه داده و ثابت نگه داشتن داده ها استفاده کنیم. .

این آماده‌سازی داده‌ها را در بخش بعدی انجام خواهیم داد.

شار برای تفاوت سری های زمانی و آماده سازی داده

Flux زبان برنامه نویسی داده برای InfluxDB است. برای پیش بینی خود، از Air استفاده می کنیم مجموعه داده نمونه حسگر که با InfluxDB از جعبه خارج می شود. این مجموعه داده حاوی داده های دما از چندین سنسور است. ما در حال ایجاد یک پیش‌بینی دما برای یک سنسور هستیم. داده ها به این شکل هستند:

arma influxdb 01

از کد Flux زیر برای وارد کردن مجموعه داده و فیلتر برای یک بار استفاده کنید سری.

 
import "join"
import "influxdata/influxdb/sample"
//dataset is regular time series at 10 second intervals
data = sample.data(set: "airSensor")
  |> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")

در مرحله بعد می‌توانیم سری زمانی خود را با تفاوت میانگین متحرک به طور ضعیف ثابت کنیم. تفاوت تکنیکی برای حذف هر گونه روند یا شیب از داده های ما است. ما از تفاوت میانگین متحرک برای این مرحله آماده سازی داده ها استفاده خواهیم کرد. ابتدا میانگین متحرک داده های خود را پیدا می کنیم.

arma influxdb 02

داده‌های دمای هوای خام (آبی) در مقابل میانگین متحرک (صورتی).

در مرحله بعد، میانگین متحرک را از سری زمانی واقعی خود پس از پیوستن داده‌های خام و داده‌های MA به یکدیگر کم می‌کنیم.

arma influxdb 03

داده‌های متفاوت ثابت هستند.

در اینجا کل اسکریپت Flux استفاده شده برای انجام این تفاوت وجود دارد:

 
import "join"
import "influxdata/influxdb/sample"
//dataset is regular time series at 10 second intervals
data = sample.data(set: "airSensor")
  |> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")
//   |> yield(name: "temp data")

MA = data
  |> movingAverage(n:6)
//   |> yield(name: "MA")

differenced = join.time(left: data, right: MA, as: (l, r) => ({l with MA: r._value}))
|> map(fn: (r) => ({r with _value: r._value - r.MA}))
|> yield(name: "stationary data")

لطفاً توجه داشته باشید که این رویکرد چرخه روند را تخمین می‌زند. تجزیه سری اغلب با رگرسیون خطی نیز انجام می شود.

بررسی: YugabyteDB به PostgreSQL افتخار می کند

آرما و پیش بینی های سری زمانی با پایتون

اکنون که داده‌های خود را آماده کرده‌ایم، می‌توانیم یک پیش‌بینی ایجاد کنیم. برای استفاده از روش ARMA باید مقدار p و مقدار q داده های خود را شناسایی کنیم. مقدار p ترتیب مدل AR ما را مشخص می کند. مقدار q ترتیب مدل MA را مشخص می کند. برای تبدیل تابع ARIMA statsmodels به تابع ARMA، مقدار d را ۰ ارائه می کنیم. مقدار d تعداد تفاوت های غیر فصلی مورد نیاز برای ایستایی است. از آنجایی که فصلی نداریم، نیازی به تفاوت نداریم.

ابتدا داده های خود را با کتابخانه کلاینت Python InfluxDB پرس و جو می کنیم. سپس DataFrame را به آرایه تبدیل می کنیم. سپس مدل خود را متناسب می کنیم و در نهایت یک پیش بینی انجام می دهیم.

 
# query data with the Python InfluxDB Client Library and remove the trend through differencing
client = InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="NyP-HzFGkObUBI4Wwg6Rbd-_SdrTMtZzbFK921VkMQWp3bv_e9BhpBi6fCBr_0-6i0ev32_XWZcmkDPsearTWA==", org="0437f6d51b579000")
# write_api = client.write_api(write_options=SYNCHRONOUS)
query_api = client.query_api()
df = query_api.query_data_frame('import "join"'
'import "influxdata/influxdb/sample"'
'data = sample.data(set: "airSensor")'
  '|> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")'
'MA = data'
  '|> movingAverage(n:6)'
'join.time(left: data, right: MA, as: (l, r) => ({l with MA: r._value}))'
'|> map(fn: (r) => ({r with _value: r._value - r.MA}))'
'|> keep(columns:["_value", "_time"])'
'|> yield(name:"differenced")'
)
df = df.drop(columns=['table', 'result'])
y = df["_value"].to_numpy()
date = df["_time"].dt.tz_localize(None).to_numpy()
y = pd.Series(y, index=date)
model = sm.tsa.arima.ARIMA(y, order=(1,0,2))
result = model.fit()

آزمون Ljung-Box و تست Durbin-Watson

آزمون Ljung-Box می‌تواند برای تأیید اینکه مقادیری که برای p,q برای برازش مدل ARMA استفاده کرده‌اید خوب هستند استفاده شود. این آزمون خودهمبستگی باقیمانده ها را بررسی می کند. اساساً این فرضیه صفر را آزمایش می کند که باقی مانده ها به طور مستقل توزیع شده اند. هنگام استفاده از این آزمون، هدف شما تأیید فرضیه صفر یا نشان دادن این است که باقیمانده ها در واقع به طور مستقل توزیع شده اند. ابتدا باید مدل خود را با مقادیر p و q انتخابی مطابقت دهید، همانطور که در بالا انجام دادیم. سپس از تست Ljung-Box برای تعیین اینکه آیا آن مقادیر انتخاب شده قابل قبول هستند یا خیر استفاده کنید. تست یک مقدار p Ljung-Box را برمی گرداند. اگر این مقدار p بزرگتر از ۰.۰۵ باشد، فرضیه صفر را با موفقیت تأیید کرده اید و مقادیر انتخابی شما خوب هستند.

پس از برازش مدل و اجرای آزمایش با پایتون…

print(sm.stats.acorr_ljungbox(res.resid, lags=[5], return_df=True))

برای آزمایش ۰.۵۸۹۶۴۸ یک مقدار p دریافت می کنیم.

<جدول>

lb_stat   lb_pvalue ۵  ۳.۷۲۵۰۰۲   ۰.۵۸۹۶۴۸

این تأیید می کند که مقادیر p,q ما در طول برازش مدل قابل قبول هستند.

همچنین می‌توانید از آزمون دوربین واتسون برای آزمایش همبستگی خودکار استفاده کنید. در حالی که تست Ljung-Box برای خود همبستگی با هر تاخیری، آزمون دوربین-واتسون فقط از تاخیری برابر با ۱ استفاده می کند. مقدار نزدیک به ۲ را هدف بگیرید.

print(sm.stats.durbin_watson(result.resid.values))

در اینجا مقدار زیر را دریافت می کنیم که با آزمایش قبلی مطابقت دارد و تأیید می کند که مدل ما خوب است.

آیا از جستجوی جداگانه Slack، GitHub و Google Drive خسته شده اید؟ همه این کارها را به یکباره در SQL انجام دهید

۲.۰۰۱۱۳۰۹۳۵۷۷۱۶۴۱۴

اسکریپت پیش بینی کامل ARMA با Python و Flux

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

 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from influxdb_client import InfluxDBClient
from datetime import datetime as dt
import statsmodels.api as sm
from statsmodels.tsa.arima.model import ARIMA
# query data with the Python InfluxDB Client Library and remove the trend through differencing
client = InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="NyP-HzFGkObUBI4Wwg6Rbd-_SdrTMtZzbFK921VkMQWp3bv_e9BhpBi6fCBr_0-6i0ev32_XWZcmkDPsearTWA==", org="0437f6d51b579000")
# write_api = client.write_api(write_options=SYNCHRONOUS)
query_api = client.query_api()
df = query_api.query_data_frame('import "join"'
'import "influxdata/influxdb/sample"'
'data = sample.data(set: "airSensor")'
  '|> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")'
'MA = data'
  '|> movingAverage(n:6)'
'join.time(left: data, right: MA, as: (l, r) => ({l with MA: r._value}))'
'|> map(fn: (r) => ({r with _value: r._value - r.MA}))'
'|> keep(columns:["_value", "_time"])'
'|> yield(name:"differenced")'
)
df = df.drop(columns=['table', 'result'])
y = df["_value"].to_numpy()
date = df["_time"].dt.tz_localize(None).to_numpy()
y = pd.Series(y, index=date)
model = sm.tsa.arima.ARIMA(y, order=(1,0,2))
result = model.fit()
fig, ax = plt.subplots(figsize=(10, 8))
fig = plot_predict(result, ax=ax)
legend = ax.legend(loc="upper left")
print(sm.stats.durbin_watson(result.resid.values))
print(sm.stats.acorr_ljungbox(result.resid, lags=[5], return_df=True))
plt.show()

arma influxdb 04

خط نهایی

امیدوارم این پست وبلاگ به شما انگیزه دهد که از ARMA و InfluxDB برای پیش بینی استفاده کنید. توصیه می‌کنم به مخزن زیر نگاهی بیندازید، که شامل مثال‌هایی برای نحوه کار با هر دو الگوریتم است. در اینجا توضیح داده شده و InfluxDB برای پیش بینی و انجام تشخیص ناهنجاری.

Anais Dotis-Georgiou یک مدافع توسعه دهنده برای InfluxData با اشتیاق به زیباسازی داده ها با استفاده از تجزیه و تحلیل داده ها، هوش مصنوعی و یادگیری ماشینی. او ترکیبی از تحقیقات، اکتشاف و مهندسی را به کار می گیرد تا داده هایی را که جمع آوری می کند به چیزی مفید، ارزشمند و زیبا تبدیل کند. هنگامی که او پشت صفحه نیست، می توانید او را در بیرون از خانه در حال کشیدن نقاشی، کشش، سوار شدن یا تعقیب توپ فوتبال بیابید.

New Tech Forum مکانی برای کاوش و بحث در مورد فناوری سازمانی نوظهور در عمق و وسعت بی سابقه ای فراهم می کند. انتخاب ذهنی است، بر اساس انتخاب ما از فناوری هایی که معتقدیم مهم هستند و برای خوانندگان InfoWorld بیشترین علاقه را دارند. InfoWorld وثیقه بازاریابی را برای انتشار نمی پذیرد و حق ویرایش تمام محتوای ارائه شده را برای خود محفوظ می دارد. همه سوالات را به newtechforum@infoworld.com ارسال کنید.