Описание параметров

ИмяОписаниеПример 
"forecast" : {







"id" :id модуля1000
"state" : {





"get" :Получить расчет прогнозирования1
"run" :Запуск расчета прогноза3
"idle" :Проверка готовности расчета4
"stop" :Отмена расчета5
}

Обязательные действия

Команды


Описание методов и расчётов моделей прогнозирования

Модуль прогнозирования служит для экстраполяции значений по строкам рабочей области.

Краткое описание

Для прогнозирования необходимо, чтобы слева и сверху были вынесены размерности. У верхней размерности должно быть не менее 5 элементов (10 для полной функциональности). В случае если слева или сверху вынесено больше одной размерности, расчет будет производиться только по крайним из них.

В вычислениях участвуют выделенные факты. Если ни один из фактов не выделен, то данные будут рассчитываться для всех видимых фактов, кроме вычислимых.

Реализовано 6 алгоритмов экстраполяции: линейная регрессия, фильтр Калмана, экспоненциальное сглаживание, MA, AR, ARIMA.

Порядок работы прогнозирования

  1. Вначале производится тестирование алгоритмов на имеющихся данных, генерируются последние n элементов строки каждым из алгоритмов, и считается ошибка между полученным результатом и реальными данными. n = min( 10, size / 10 ).
  2. Данные тестов усредняются и для каждого из фактов выбирается алгоритм, показавший наименьшую ошибку.
  3. Берется уже полная строка данных. В ней ищется наличие сезонной составляющей. Если она была найдена, то она удаляется и сохраняется отдельно.
  4. Данные, очищенные от сезонной компоненты сглаживаются и результат отдается одному из алгоритмов, выбранному на шаге 2.
  5. Алгоритм экстраполирует данные на K шагов (задается пользователем) и возвращает полученный результат.
  6. К полученным данным добавляется сезонная составляющая, сохраненная на шаге 3.
  7. После того как шаги 3-6 будут применены ко всем строкам из рабочей области, итоговый результат записывается в куб в виде новых элементов верхней размерности.
  8. Имена новых элементов задаются по следующему принципу: для даты, времени и числовых типов берется разница между последним и предпоследним элементом и добавляется к имени последнего элемента; для строковых размерностей имена новых элементов выглядят как "Прогноз #K", K = 1, 2, 3, ...

Точка входа - ForecastModule::get_forecast_internal

API

Описание методов

Линейная регрессия

Фильтр Калмана

Экспоненциальное сглаживание

Модель скользящего среднего

Авторегрессионная модель

ARIMA

ForecastModel

Класс ForecastModel отвечает за разложение ряда на компоненты и постобработку данных.

Описание построено на примере работы с рядом следующего вида:

Существует 2 типа моделей данных:

  • мультипликативная,  F = T*S*E;
  • аддитивная,  F = T + S + E

Здесь  F - исходный ряд,  T - тренд,  S - сезонная компонента,  E - случайная ошибка. Если исходный ряд стационарный, то используется аддитивная модель, в противном случае - мультипликативная.


В первую очередь пытаемся найти и выделить сезонную компоненту ( std::pair<index_type, bool> ForecastModel::find_season_period() ). Для этого находим поэлементную разницу между членами ряда ( void ForecastModel::series_diff( const real_vector &data, real_vector &diff_data, index_type diff ) const ) и строим автокорреляционную функцию (АКФ) по ним.

Исходя из АКФ находим, что есть периодическая компонента с периодом 12. Модель явно мультипликативная ( ForecastModel::ModelType ForecastModel::choose_model( const real_vector &data, const index_type season_period ) ), поэтому сглаживаем исходный ряд скользящей средней с шагом, равным периоду, и поэлементно делим его на сглаженный ряд, чтобы выделить сезонную компоненту ( void vector_ratio( const real_vector &a, const real_vector &b, real_vector &res, index_type a_from, index_type b_from ) ). После этого усредняем сезонную составляющую по ее периоду ( void ForecastModel::calculate_season_component( const real_vector &vec, const index_type season_period ) ).

Поделив исходный ряд на усредненную сезонную составляющую, получим данные без учета сезонности, т.е.  T*E ( void ForecastModel::remove_season_component() ).

Еще раз применив скользящую среднюю к  T*E получим тренд. Поделив его на данные без сезонности  - получим вектор ошибок ( virtual void ForecastAlgorithm::preprocess( const real_vector &, const MovingAverage & ) = 0 ).


Далее к полученному тренду применяется один из методов экстраполяции ( void ForecastModel::get_forecast( real_vector &forecast, index_type duration ) ). На результат экстраполяции накладывается сезонная компонента ( void ForecastModel::add_season_values( real_vector &data_without_season ) ) - это и является конечным результатом работы.

MovingAverageModel (расчет коэффициентов)

Расчет коэффициентов для модели скользящего среднего описан в этой статье (раздел 2.3 Vocariance recursion method):

Реализовано в функции MovingAverageModel::estimate_coefficients.

AutoregressiveModel (расчет коэффициентов)

Для расчета коэффицентов авторегрессионной модели реализовано 2 алгоритма: Юла-Валкера и Барга. Описаны в следующих статьях:

Реализовано в функции AutoregressiveModel::estimate_yule_walker.



Общие ошибки

Код ошибки

Текст ошибки

Описание

"code": 601

"message": "forecast_not_enough_left_dimensions"Для расчета требуется минимум  1 левая размерность
"code": 602"message": "forecast_not_enough_top_dimensions"Для расчета требуется не менее 5 элементов сверху
"code": 604"message": "forecast_calculation_error"Прочие ошибки расчетов
"code": 605"message": "forecast_not_enought_data"Для расчета требуется не менее 5 элементов сверху
"code": 606"message": "forecast_calculated_fact_error"Из фактов есть только вычислимые
"code": 607"message": "forecast_add_to_cube_error"Ошибка при добавление результата в сферу
  • Нет меток