% первая часть
\section{Обзор средств разработки и библиотек}
\subsection{Язык программирования Python}
Python — это высокоуровневый язык программирования общего назначения с динамической строгой типизацией и автоматическим управлением памятью. Ориентирован на повышение производительности разработчика, читаемости кода и его качества, а также на обеспечение переносимости написанных на нём программ. Он является полностью объектно-ориентированным в том плане, что всё является объектами, даже значения, относящиеся к элементарным типам, наподобие чисел и строк, а также сами типы данных \cite{prohor}. Необычной особенностью данного языка является выделение блоков кода пробельными отступами. Согласно стандарту, для выделения блоков необходимо использовать четыре пробела \cite{prohor}. Синтаксис ядра минималистичен, за счёт чего на практике редко возникает необходимость обращаться к документации. Сам же язык известен как интерпретируемый и используется в том числе для написания скриптов. Недостатками языка являются зачастую более низкая скорость работы и более высокое потребление памяти написанных на нём программ по сравнению с аналогичным кодом, написанным на компилируемых языках, таких как Си или C++.
Python представляет из себя мультипарадигмальный язык программирования. Он поддерживает объектно-ориентированное программирование, императивное, структурное, процедурное, метапрограммирование и функциональное программирование. Задачи обобщённого программирования решаются за счёт динамической типизации. Аспектно-ориентированное программирование частично поддерживается через декораторы, более полноценная поддержка обеспечивается дополнительными фреймворками. Такие методики как контрактное и логическое программирование можно реализовать с помощью библиотек или расширений. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений с глобальной блокировкой интерпретатора (GIL), высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.
Стандартная библиотека включает большой набор полезных переносимых функций, начиная от функционала для работы с текстом и заканчивая средствами для написания сетевых приложений. Дополнительные возможности, такие как математическое моделирование, работа с оборудованием, написание веб-приложений или разработка игр, могут реализовываться посредством обширного количества сторонних библиотек, а также интеграцией библиотек, написанных на Си или C++, при этом и сам интерпретатор Python может интегрироваться в проекты, написанные на этих языках. Существует и специализированный репозиторий программного обеспечения, написанного на Python, — PyPI. Данный репозиторий предоставляет средства для простой установки пакетов в операционную систему и стал стандартом де-факто для Python. По состоянию на 2019 год в нём содержалось более 175 тысяч пакетов.
Python стал одним из самых популярных языков, он используется в анализе данных, машинном обучении, DevOps и веб-разработке, а также в других сферах, включая разработку игр. За счёт читабельности, простого синтаксиса и отсутствия необходимости в компиляции язык хорошо подходит для обучения программированию, позволяя концентрироваться на изучении алгоритмов, концептов и парадигм. Отладка же и экспериментирование в значительной степени облегчаются тем фактом, что язык является интерпретируемым. Применяется язык многими крупными компаниями, такими как Google или Facebook. По состоянию на октябрь 2021 года Python занимает первое место в рейтинге TIOBE популярности языков программирования с показателем 11,27\%. «Языком года» по версии TIOBE Python объявлялся в 2007, 2010, 2018 и 2020 годах.
\subsection{Библиотека Pandas}
Pandas — программная библиотека на языке Python для обработки и анализа данных. Работа pandas с данными строится поверх библиотеки NumPy, являющейся инструментом более низкого уровня. Предоставляет специальные структуры данных и операции для манипулирования числовыми таблицами и временными рядами \cite{plas}.
Основная область применения — обеспечение работы в рамках среды Python не только для сбора и очистки данных, но для задач анализа и моделирования данных, без переключения на более специфичные для статобработки языки.
Основные возможности библиотеки:
\begin{itemize}
\item объект DataFrame для манипулирования индексированными массивами двумерных данных;
\item инструменты для обмена данными между структурами в памяти и файлами различных форматов;
\item встроенные средства совмещения данных и способы обработки отсутствующей информации;
\item переформатирование наборов данных, в том числе создание сводных таблиц;
\item срез данных по значениям индекса, расширенные возможности индексирования, выборка из больших наборов данных;
\item вставка и удаление столбцов данных;
\item возможности группировки позволяют выполнять трёхэтапные операции типа «разделение, изменение, объединение»;
\item слияние и объединение наборов данных;
\item иерархическое индексирование позволяет работать с данными высокой размерности в структурах меньшей размерности;
\item работа с временными рядами: формирование временных периодов и изменение интервалов и так далее.
\end{itemize}
\subsection{Библиотека NumPy}
NumPy (сокращенно от Numerical Python)— библиотека с открытым исходным кодом для языка программирования Python. Возможности:
\begin{itemize}
\item поддержка многомерных массивов (включая матрицы);
\item поддержка высокоуровневых математических функций, предназначенных для работы с многомерными массивами.
\end{itemize}
Математические алгоритмы, реализованные на интерпретируемых языках (например, Python), часто работают гораздо медленнее тех же алгоритмов, реализованных на компилируемых языках (например, Фортран, Си, Java). Библиотека NumPy предоставляет реализации вычислительных алгоритмов (в виде функций и операторов), оптимизированные для работы с многомерными массивами. В результате любой алгоритм, который может быть выражен в виде последовательности операций над массивами (матрицами) и реализованный с использованием NumPy, работает так же быстро, как эквивалентный код, выполняемый в MATLAB.
\subsection{Библиотека Statsmodels}
Statsmodels предоставляет набор методов статистического тестирования и моделирования, а также инструменты, предназначенные для анализа временных рядов. Также может быть использована для прогнозирования.
Для визуализации результатов расчётов часто применяется библиотека Matplotlib.
\subsection{Библиотека Matplotlib}
Matplotlib — библиотека на языке программирования Python для визуализации данных двумерной и трёхмерной графикой. Получаемые изображения могут быть использованы в качестве иллюстраций в публикациях.
Matplotlib написан и поддерживался в основном Джоном Хантером и распространяется на условиях BSD-подобной лицензии \cite{albon}. Генерируемые в различных форматах изображения могут быть использованы в интерактивной графике, в научных публикациях, графическом интерфейсе пользователя, веб-приложениях, где требуется построение диаграмм.
Matplotlib является гибким, легко конфигурируемым пакетом, который вместе с NumPy, SciPy и IPython предоставляет возможности, подобные MATLAB. В настоящее время пакет работает с несколькими графическими библиотеками, включая wxWindows и PyGTK.
Пакет поддерживает многие виды графиков и диаграмм:
\begin{itemize}
\item графики (line plot);
\item диаграммы разброса (scatter plot);
\item столбчатые диаграммы (bar chart) и гистограммы (histogram);
\item круговые диаграммы (pie chart);
\item ствол-лист диаграммы (stem plot);
\item контурные графики (contour plot);
\item поля градиентов (quiver);
\item спектральные диаграммы (spectrogram).
\end{itemize}
\subsection{Анализ временных рядов}
Анализ временных рядов – совокупность статистических методов для выявления составляющих временного ряда и его прогнозирования.
Временной ряд – последовательность статистических данных, собранных в разные моменты времени, о значении каких-либо параметров исследуемого процесса~\cite{nielsen}. Каждое значение временного ряда называется уровнем временного ряда. Во временном ряде каждому уровню должно быть указанно время измерения или номер измерения по порядку. Методы анализа временных рядов существенно отличаются от методов анализа данных простой выборки. При анализе временного ряда исследователя интересуют не только статистические характеристики временного ряда, но и учитывается взаимосвязь измерений со временем.
Временные ряды, как правило, возникают в результате измерения некоторого показателя. Это могут быть как характеристики технических систем, так и показатели природных, социально-экономических явлений и процессов. Например, динамика курса валюты или курса акции, при анализе которых пытаются определить основное направление развития. Или, например, анализ динамики продаж компании с целью планирования остатков на складе.
Основная цель анализа временного ряда – построить прогноз его значений на будущие периоды. А основные задачи анализа временного ряда – понять, под воздействием каких компонент формируется значение временного ряда, и построить математическую модель для каждой компоненты или их совокупности. Любой временной ряд можно разложить на следующие составляющие: тренд, сезонную составляющую, циклическую составляющую и случайную составляющую. Первые три компоненты образуют неслучайную составляющую временного ряда. Случайная составляющая присутствует в любом временном ряде. А а вот присутствие в структуре временного ряда компонент неслучайной составляющей не обязательно.
Подходы к моделированию временного ряда можно разделить на два направления:
\begin{itemize}
\item моделирование неслучайной составляющей в совокупности;
\item разложение временного ряда на составляющие компоненты и моделирование значений каждой компоненты в отдельности.
\end{itemize}
Статистические методы прогнозирования делятся на алгоритмические методы и аналитические методы. К алгоритмическим методам относят методы простой и взвешенной скользящей средней. К аналитическим методам относят методы прогнозной экстраполяции на основе кривых роста в виде функций времени. В случае наличия сезонной или циклической компоненты во временном ряду проводят анализ периодических колебаний или спектральный анализ временного ряда.