Прогнозирование временных рядов с минутным интервалом с использованием аримы для python - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в машинном обучении для временных рядов, мне нужно разработать проект, в котором мои данные состоят из минут, может кто-нибудь помочь мне создать этот алгоритм?

Набор данных: Каждое значение представляет одну минуту сбора (9:00, 9:01 ...), сбор длится 10 минут и был выполнен за 2 месяца, то есть 10 значений для января и 10 значений для месяца Февраль.

enter image description here

Полные данные

Цель: Я хотел бы получить свой результат быть прогнозом на следующие 10 минут для месяца марта, например:

2020-03-01 9:00:00
2020-03-01 9:01:00
2020-03-01 9:02:00
2020-03-01 9:03:00

Тренинг: Тренинг должен содержать январь и февраль в качестве ориентира для прогнозирования, принимая с учетом того, что это временной ряд

сезонный:

enter image description here

Прогноз:

Текущая проблема: кажется, что текущий прогноз не верен, предыдущие данные до По-видимому, они не действительны в качестве временного ряда, поскольку, как видно на изображении сезонности, набор данных показан в виде прямой линии. Прогноз представлен зеленой линией на рисунке ниже, а исходные данные - синей линией, однако, как мы видим, ось даты идет до 2020-11-01, она должна go до 2020-03-01, кроме того, исходные данные образуют прямоугольник на графике

enter image description here

script.py

# -*- coding: utf-8 -*-

try:
    import pandas as pd
    import numpy as np
    import pmdarima as pm
    #%matplotlib inline
    import matplotlib.pyplot as plt
    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    from statsmodels.tsa.arima_model import ARIMA
    from statsmodels.tsa.seasonal import seasonal_decompose
    from dateutil.parser import parse
except ImportError as e:
    print("[FAILED] {}".format(e))

class operationsArima():

    @staticmethod
    def ForecastingWithArima():

        try:

            # Import
            data = pd.read_csv('minute.csv', parse_dates=['date'], index_col='date')

            # Plot
            fig, axes = plt.subplots(2, 1, figsize=(10,5), dpi=100, sharex=True)

            # Usual Differencing
            axes[0].plot(data[:], label='Original Series')
            axes[0].plot(data[:].diff(1), label='Usual Differencing')
            axes[0].set_title('Usual Differencing')
            axes[0].legend(loc='upper left', fontsize=10)
            print("[OK] Generated axes")

            # Seasonal
            axes[1].plot(data[:], label='Original Series')
            axes[1].plot(data[:].diff(11), label='Seasonal Differencing', color='green')
            axes[1].set_title('Seasonal Differencing')
            plt.legend(loc='upper left', fontsize=10)
            plt.suptitle('Drug Sales', fontsize=16)
            plt.show()

            # Seasonal - fit stepwise auto-ARIMA
            smodel = pm.auto_arima(data, start_p=1, start_q=1,
                                    test='adf',
                                    max_p=3, max_q=3, m=11,
                                    start_P=0, seasonal=True,
                                    d=None, D=1, trace=True,
                                    error_action='ignore',
                                    suppress_warnings=True,
                                    stepwise=True)

            smodel.summary()
            print(smodel.summary())
            print("[OK] Generated model")

            # Forecast
            n_periods = 11
            fitted, confint = smodel.predict(n_periods=n_periods, return_conf_int=True)
            index_of_fc = pd.date_range(data.index[-1], periods = n_periods, freq='MS')

            # make series for plotting purpose
            fitted_series = pd.Series(fitted, index=index_of_fc)
            lower_series = pd.Series(confint[:, 0], index=index_of_fc)
            upper_series = pd.Series(confint[:, 1], index=index_of_fc)
            print("[OK] Generated series")

            # Plot
            plt.plot(data)
            plt.plot(fitted_series, color='darkgreen')
            plt.fill_between(lower_series.index,
                            lower_series,
                            upper_series,
                            color='k', alpha=.15)

            plt.title("ARIMA - Final Forecast - Drug Sales")
            plt.show()
            print("[SUCESS] Generated forecast")

        except Exception as e:

            print("[FAILED] Caused by: {}".format(e))

if __name__ == "__main__":
    flow = operationsArima()
    flow.ForecastingWithArima() # Init script

Sumary:

                                SARIMAX Results                                 
================================================================================
Dep. Variable:                        y   No. Observations:                   22
Model:             SARIMAX(0, 1, 0, 11)   Log Likelihood                     nan
Date:                  Mon, 13 Apr 2020   AIC                                nan
Time:                          21:19:10   BIC                                nan
Sample:                               0   HQIC                               nan
                                   - 22                                         
Covariance Type:                    opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
intercept           0   5.33e-13          0      1.000   -1.05e-12    1.05e-12
sigma2          1e-10   5.81e-10      0.172      0.863   -1.04e-09    1.24e-09
===================================================================================
Ljung-Box (Q):                         nan   Jarque-Bera (JB):                  nan
Prob(Q):                               nan   Prob(JB):                          nan
Heteroskedasticity (H):                nan   Skew:                              nan
Prob(H) (two-sided):                   nan   Kurtosis:                          nan
===================================================================================

1 Ответ

1 голос
/ 14 апреля 2020

Я вижу здесь пару проблем: поскольку у вас есть два коротких 1-минутных частотных временных ряда с разделением по месяцам, нормально наблюдать прямую линию в синей линии, которую вы упоминаете. Кроме того, зеленая линия выглядит как исходные данные, что означает, что прогноз модели точно такой же, как и у исходных данных.

Наконец, я не думаю, что будет хорошей идеей соединить два отдельных временные ряды ...

...