%
% Шаблон для НИР версия 2021
%
\documentclass[a4paper,12pt]{article}
\usepackage{vkriate}
% Настройки для окружений с подчеркиваниями для подписей и пр.
\setFRMfontencoding{T2A}
\setFRMdfontencoding{T2A}
% thanks to A.Starikov
\setFRMfontfamily{cmr}
\setFRMdfontfamily{ptm}
\setFRMdfontsize{10pt}
% задает длину поля для подписи на титульной странице
\newFRMfield{xtitlesign}{32mm}
% поле для факультета или кафедры
\newFRMfield{fcath}{65mm}
%имя файла с библиографией в формате BibTex
\addbibresource{rbiblio.bib}
\begin{document}
% счетчики страниц, рисунков, таблиц
\regtotcounter{page}
\regtotcounter{figure}
\regtotcounter{table}
\renewcommand{\refname}{\centerline{СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ}}
\renewcommand{\contentsname}{\centerline{СОДЕРЖАНИЕ}}
%\renewcommand{\refname}{Список источников} % По умолчанию "Список литературы" (article)
%\renewcommand{\bibname}{Литература} % По умолчанию "Литература" (book и report)
% титульная страница
\thispagestyle{empty}
\begin{center} \small
\textbf{МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ}\\
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ОБРАЗОВАНИЯ\\
«Национальный исследовательский ядерный университет «МИФИ»\\
\textbf{Обнинский институт атомной энергетики} – \\
филиал федерального государственного автономного образовательного учреждения высшего\\
образования «Национальный исследовательский ядерный университет «МИФИ»\\
(ИАТЭ НИЯУ МИФИ)
\end{center}
%\vfill
\medskip
% Направление подготовки следует уточнять,
% магистры и бакалавры могут иметь разные наименования
\begin{center}
\begin{tabular}{rl}
Отделение & \useFRMfield{fcath}[\large Интеллектуальные кибернетические системы] \\
Направление подготовки & \useFRMfield{fcath}[\large Информационные системы и технологии] \\
\end{tabular}
\end{center}
\vfill
\large
\begin{center}
Научно-исследовательская работа \\
\medskip
\textbf{\Large
Разработка сценариев анализа динамики метеопараметров
}
\end{center}
\vspace{1cm}
\begin{tabular*}{\textwidth}{lcr}
Студент группы ИС-Б18 & \useFRMfield{xtitlesign} & Липинский Я. Д.\\
& & \\
Руководитель & & \\
к.т.н., доцент отд. ИКС & \useFRMfield{xtitlesign} & Мирзеабасов О. А.
\end{tabular*}
\vfill
\large
\begin{center}
Обнинск, 2022 г
\end{center}
\onehalfspacing
\pagebreak
% реферат
\thispagestyle{empty}
\section*{\centering РЕФЕРАТ}
% возможно, кол-во источников придется вставлять вручную
Работа \total{page} стр., \total{table} табл., \total{figure} рис. , \totalmycitecounts ист.
ЯЗЫК ПРОГРАММИРОВАНИЯ PYTHON, АНАЛИЗ ВРЕМЕННЫХ РЯДОВ, МЕТЕОДАННЫЕ, ВРЕМЕННЫЕ РЯДЫ, NUMPY, STATSMODELS, PANDAS.
Научно-исследовательская работа посвящена разработке сценариев анализа динамики метеопараметров. Конечная цель работы – создание сценария на языке Python для обработки и визуализации динамики температуры и осадков.
Процесс разработки включает в себя изучение методов декомпозиции временных рядов, языка прогаммирования Python, библиотеки Statsmodels, предоставляющей набор методов статистического тестирования и моделирования, библиотеки Pandas для обработки и анализа данных.
\pagebreak
\thispagestyle{empty}
\section*{\centering ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ}
DataFrame (датафрейм) – распределенная коллекция данных в виде именованных столбцов, аналогично таблице в реляционной базе данных.
NumPy - Numerical Python
БД - База Данных
ВМО - Всемирная Метеорологическая Организация
\pagebreak
\thispagestyle{empty}
% титульная страница - номер 1, остальные страницы до Содержания не нумеруются
\tocloftpagestyle{empty}
\tableofcontents
% если нужно добавить "Стр." над номерами страниц - раскомментируйте следующую команду
%\addtocontents{toc}{~\hfill\textbf{Стр.}\par}
\pagebreak
\setcounter{page}{3}
\section*{\centering ВВЕДЕНИЕ}
\addcontentsline{toc}{section}{ВВЕДЕНИЕ}
\input{intro} % текст введения в файле intro.tex
\pagebreak
%\input{Post_zad}
\pagebreak
\input{part1} % первая глава - в файле part1.tex
\pagebreak
\input{part2} % вторая глава - в файле part2.tex
\pagebreak
% если есть еще разделы - сохраните их в соответствующих файлах и раскомментируйте строки ниже, при необходимости добавьте еще
%\input{part3} % третья глава - в файле part3.tex
%\pagebreak
%\input{part4} % четвертая глава - в файле part4.tex
%\pagebreak
%\input{part5} % пятая глава - в файле part5.tex
%\pagebreak
\section*{\centering ЗАКЛЮЧЕНИЕ}
\addcontentsline{toc}{section}{ЗАКЛЮЧЕНИЕ}
В ходе проделанной работы был создан сценарий на языке Python для обработки и визуализации динамики температуры и осадков. Были выполнены следующие задачи:
\begin{itemize}
\item изучены методы декомпозиции временных рядов;
\item изучены пакеты Python для работы с временными рядами;
\item подготовлены данные по динамике температуры и осадкам;
\item разработан сценарий Python для декомпозиции и визуализации подготовленных данных.
\end{itemize}
% оформление библиографии - вариант с БД
\pagebreak
\addcontentsline{toc}{section}{СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ}
% ВАЖНО: для корректного отображения в списке литературы ссылок на англ.языке в bibtex-описание источника следует добавить поле
% langid = {english}
\printbibliography
\pagebreak
\renewcommand{\appendixpagename}{\centering Приложения}
\begin{appendices}
\renewcommand{\thesection}{\Asbuk{section}}
\makeatletter
\renewcommand{\theProgram}{\thesection.\@arabic\c@Program}
\makeatother
% каждое приложение задается следующей командой, нумерация - русскими буквами
\section{\centering }
% независимая нумерация листингов в каждом приложении
\setcounter{Program}{0}
\begin{MyCode}
import os
import sys
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sys import argv
from statsmodels.tsa.seasonal import seasonal_decompose
from pandas.plotting import register_matplotlib_converters
script, data1, data2 = argv
city1 = data1.replace(".txt", "")
city2 = data2.replace(".txt", "")
register_matplotlib_converters()
original_stdout = sys.stdout
# Считывание и обработка датасетов.
print("Считывание и обработка данных.")
data1 = pd.read_csv(data1, sep=";", header=None)
data1.columns = ["index", "year", "month", "day", "temp_quality", "temp_min", "temp_avg", "temp_max", "precipitation"]
data2 = pd.read_csv(data2, sep=";", header=None)
data2.columns = ["index", "year", "month", "day", "temp_quality", "temp_min", "temp_avg", "temp_max", "precipitation"]
df1 = pd.DataFrame({'year': data1["year"],
'month': data1["month"],
'day': data1["day"]})
df1["date"] = pd.to_datetime(df1)
df1["temp_avg"] = data1["temp_avg"]
df1["precipitation"] = pd.to_numeric(data1["precipitation"],
errors='coerce')
df2 = pd.DataFrame({'year': data2["year"],
'month': data2["month"],
'day': data2["day"]})
df2["date"] = pd.to_datetime(df2)
df2["temp_avg"] = data2["temp_avg"]
df2["precipitation"] = pd.to_numeric(data2["precipitation"],
errors='coerce')
# Стилизация графиков.
sns.set_style("darkgrid")
plt.rc("figure", figsize=(12, 9))
plt.rc("font", size=13)
plt.rc("lines", markersize=5)
plt.rc("lines", linewidth=3)
# Создание папки для хранения графиков.
if not os.path.exists("Result"):
os.makedirs("Result")
# Построения графика среднегодовой температуры города 1.
print("Построения графика среднегодовой температуры города " + city1 + ".")
result1 = df1.groupby('year').mean()
plt.plot(result1.index, result1['temp_avg'])
plt.title("Среднегодовая температура (" + city1 + ")")
plt.xlabel('Год')
plt.ylabel('Температура (цельсии)')
z = np.polyfit(result1.index, result1['temp_avg'], 1)
p = np.poly1d(z)
plt.plot(result1.index, p(result1.index), "r--")
plt.savefig('Result/' + city1 + '_Temperature_Plot.png')
plt.clf()
# Построения графика количества осадков за год города 1.
print("Построения графика количества осадков за год города " + city1 + ".")
plt.plot(result1.index, result1['precipitation'])
plt.title("Количество осадков за год (" + city1 + ")")
plt.xlabel('Год')
plt.ylabel('Количество осадков')
z = np.polyfit(result1.index, result1['precipitation'], 1)
p = np.poly1d(z)
plt.plot(result1.index, p(result1.index), "r--")
plt.savefig('Result/' + city1 + '_Precipitations_Plot.png')
plt.clf()
# Построения графика среднегодовой температуры города 2.
print("Построения графика среднегодовой температуры города " + city2 + ".")
result2 = df2.groupby('year').mean()
plt.plot(result2.index, result2['temp_avg'])
plt.title("Среднегодовая температура (" + city2 + ")")
plt.xlabel('Год')
plt.ylabel('Температура (цельсии)')
z = np.polyfit(result2.index, result2['temp_avg'], 1)
p = np.poly1d(z)
plt.plot(result2.index, p(result2.index), "r--")
plt.savefig('Result/' + city2 + '_Temperature_Plot.png')
plt.clf()
# Построения графика количества осадков за год города 2.
print("Построения графика количества осадков за год города " + city2 + ".")
plt.plot(result2.index, result2['precipitation'])
plt.title("Количество осадков за год (" + city2 + ")")
plt.xlabel('Год')
plt.ylabel('Количество осадков')
z = np.polyfit(result2.index, result2['precipitation'], 1)
p = np.poly1d(z)
plt.plot(result2.index, p(result2.index), "r--")
plt.savefig('Result/' + city2 + '_Precipitations_Plot.png')
plt.clf()
# Построения графика корреляции среднегодовой температуры двух городов.
print("Построения графика корреляции среднегодовой температуры двух городов.")
plt.plot(result1.index, result1['temp_avg'],
label="Среднегодовая температура в городе " + city1)
plt.plot(result2.index, result2['temp_avg'],
label="Среднегодовая температура в городе " + city2)
plt.title("Среднегодовая температура в городах " + city1 + " и " + city2)
plt.xlabel('Год')
plt.ylabel('Температура (цельсии)')
plt.legend()
plt.savefig('Result/Correlation_Temperature_Plot.png')
print("Расчёт корреляции среднегодовой температуры двух городов.")
corr1 = np.corrcoef(result1['temp_avg'], result2['temp_avg'])
with open('Result/Temperature_Correlation.txt', 'w') as f:
sys.stdout = f
print('Матрица корреляции температур:\n')
print(corr1)
sys.stdout = original_stdout
plt.clf()
# Построения графика корреляции количества осадков за год двух городов.
print("Построения графика корреляции количества осадков за год двух городов.")
plt.plot(result1.index, result1['precipitation'],
label="Среднегодовые осадки в городе " + city1)
plt.plot(result2.index, result2['precipitation'],
label="Среднегодовые осадки в городе " + city2)
plt.title("Среднегодовые осадки в городах " + city1 + " и " + city2)
plt.xlabel('Год')
plt.ylabel('Количество осадков')
plt.legend()
plt.savefig('Result/Correlation_Precipitations_Plot.png')
print("Расчёт корреляции количества осадков за год двух городов.")
corr2 = np.corrcoef(result1['precipitation'], result2['precipitation'])
with open('Result/Precipitations_Correlation.txt', 'w') as f:
sys.stdout = f
print('Матрица корреляции осадков:\n')
print(corr2)
sys.stdout = original_stdout
plt.clf()
# Построения диаграммы размаха среднегодовой температуры города 1.
print("Построения диаграммы размаха среднегодовой температуры города " + city1 + ".")
sns.boxplot(data=df1, x='month', y='temp_avg')
plt.xlabel('Месяц')
plt.ylabel('Температура (цельсии)')
plt.title('Температура в городе ' + city1)
plt.savefig('Result/' + city1 + '_Temperature_Boxplot.png')
plt.clf()
# Построения диаграммы размаха среднегодовой температуры города 2.
print("Построения диаграммы размаха среднегодовой температуры города " + city2 + ".")
sns.boxplot(data=df2, x='month', y='temp_avg')
plt.xlabel('Месяц')
plt.ylabel('Температура (цельсии)')
plt.title('Температура в городе ' + city2)
plt.savefig('Result/' + city2 + '_Temperature_Boxplot.png')
plt.clf()
# Декомпозиция данных по температуре города 1.
print("Декомпозиция данных по температуре города " + city1 + ".")
result = seasonal_decompose(result1['temp_avg'], model='additive', period=12)
result.plot()
plt.savefig('Result/' + city1 + '_Temperature_Decomposition.png')
plt.clf()
# Декомпозиция данных по осадкам города 1.
print("Декомпозиция данных по осадкам города " + city1 + ".")
result = seasonal_decompose(result1['precipitation'], model='additive', period=12)
result.plot()
plt.savefig('Result/' + city1 + '_Precipitations_Decomposition.png')
plt.clf()
# Декомпозиция данных по температуре города 2.
print("Декомпозиция данных по температуре города " + city2 + ".")
result = seasonal_decompose(result2['temp_avg'], model='additive', period=12)
result.plot()
plt.savefig('Result/' + city2 + '_Temperature_Decomposition.png')
plt.clf()
# Декомпозиция данных по осадкам города 2.
print("Декомпозиция данных по осадкам города " + city2 + ".")
result = seasonal_decompose(result2['precipitation'], model='additive', period=12)
result.plot()
plt.savefig('Result/' + city2 + '_Precipitations_Decomposition.png')
plt.clf()
print("\nРабота успешно завершена!")
\end{MyCode}
\begin{Program}
\caption{Код реализации скрипта}\label{app1}
\end{Program}
\end{appendices}
\end{document}