Имя | Описание | Пример | ||
---|---|---|---|---|
"forecast" : { | ||||
"id" : | id модуля | 1000 | ||
"state" : { | ||||
"get" : | Получить расчет прогнозирования | 1 | ||
"run" : | Запуск расчета прогноза | 3 | ||
"idle" : | Проверка готовности расчета | 4 | ||
"stop" : | Отмена расчета | 5 | ||
} |
Модуль прогнозирования служит для экстраполяции значений по строкам рабочей области. Краткое описаниеДля прогнозирования необходимо, чтобы слева и сверху были вынесены размерности. У верхней размерности должно быть не менее 5 элементов (10 для полной функциональности). В случае если слева или сверху вынесено больше одной размерности, расчет будет производиться только по крайним из них. В вычислениях участвуют выделенные факты. Если ни один из фактов не выделен, то данные будут рассчитываться для всех видимых фактов, кроме вычислимых. Реализовано 6 алгоритмов экстраполяции: линейная регрессия, фильтр Калмана, экспоненциальное сглаживание, MA, AR, ARIMA. Порядок работы прогнозирования
Точка входа - ForecastModule::get_forecast_internal APIОписание методовForecastModelКласс ForecastModel отвечает за разложение ряда на компоненты и постобработку данных. Описание построено на примере работы с рядом следующего вида: Существует 2 типа моделей данных:
Здесь В первую очередь пытаемся найти и выделить сезонную компоненту ( 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 ) ). Поделив исходный ряд на усредненную сезонную составляющую, получим данные без учета сезонности, т. е. Еще раз применив скользящую среднюю к Далее к полученному тренду применяется один из методов экстраполяции ( 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" | Ошибка при добавление результата в сферу |