File NIR_otchet.tex changed (mode: 100644) (index 98b9584..7689b88) |
63 |
63 |
\large |
\large |
64 |
64 |
|
|
65 |
65 |
\begin{center} |
\begin{center} |
66 |
|
Производственная практика: научно-исследовательская работа \\ |
|
|
66 |
|
Научно-исследовательская работа \\ |
67 |
67 |
|
|
68 |
68 |
\medskip |
\medskip |
69 |
69 |
|
|
70 |
70 |
\textbf{\Large |
\textbf{\Large |
71 |
|
Исследование корреляций динамики метеопараметров в близких точках наблюдений |
|
|
71 |
|
Разработка сценариев анализа динамики метеопараметров |
72 |
72 |
} |
} |
73 |
73 |
|
|
74 |
74 |
\end{center} |
\end{center} |
|
79 |
79 |
Студент группы ИС-Б18 & \useFRMfield{xtitlesign} & Липинский Я. Д.\\ |
Студент группы ИС-Б18 & \useFRMfield{xtitlesign} & Липинский Я. Д.\\ |
80 |
80 |
& & \\ |
& & \\ |
81 |
81 |
Руководитель & & \\ |
Руководитель & & \\ |
82 |
|
к.т.н., доцент отд.ИКС & \useFRMfield{xtitlesign} & Мирзеабасов О. А. |
|
|
82 |
|
к.т.н., доцент отд. ИКС & \useFRMfield{xtitlesign} & Мирзеабасов О. А. |
83 |
83 |
\end{tabular*} |
\end{tabular*} |
84 |
84 |
|
|
85 |
85 |
|
|
|
87 |
87 |
\large |
\large |
88 |
88 |
|
|
89 |
89 |
\begin{center} |
\begin{center} |
90 |
|
Обнинск, 2021 г |
|
|
90 |
|
Обнинск, 2022 г |
91 |
91 |
\end{center} |
\end{center} |
92 |
92 |
|
|
93 |
93 |
\onehalfspacing |
\onehalfspacing |
|
102 |
102 |
% возможно, кол-во источников придется вставлять вручную |
% возможно, кол-во источников придется вставлять вручную |
103 |
103 |
Работа \total{page} стр., \total{table} табл., \total{figure} рис. , \totalmycitecounts ист. |
Работа \total{page} стр., \total{table} табл., \total{figure} рис. , \totalmycitecounts ист. |
104 |
104 |
|
|
105 |
|
ЯЗЫК ПРОГРАММИРОВАНИЯ PYTHON, АНАЛИЗ ВРЕМЕННЫХ РЯДОВ, МЕТЕОДАННЫЕ, ВРЕМЕННЫЕ РЯДЫ, NUMPY, SCIPY, PANDAS. |
|
|
105 |
|
ЯЗЫК ПРОГРАММИРОВАНИЯ PYTHON, АНАЛИЗ ВРЕМЕННЫХ РЯДОВ, МЕТЕОДАННЫЕ, ВРЕМЕННЫЕ РЯДЫ, NUMPY, STATSMODELS, PANDAS. |
106 |
106 |
|
|
107 |
|
Научно-исследовательская работа посвящена исследованию корреляций динамики метеопараметров в близких точках наблюдений. Конечная цель работы – изучение динамики метеопараметров для нескольких выбранных точек наблюдений в рамках одного региона. |
|
|
107 |
|
Научно-исследовательская работа посвящена разработке сценариев анализа динамики метеопараметров. Конечная цель работы – создание сценария на языке Python для обработки и визуализации динамики температуры и осадков. |
108 |
108 |
|
|
109 |
|
Процесс разработки включает в себя изучение языка прогаммирования Python, библиотеки, реализующей математические алгоритмы, NumPy, библиотеки, предназначенной для выполнения научных и инженерных расчётов, SciPy и библиотеки Pandas для обработки и анализа данных. |
|
|
109 |
|
Процесс разработки включает в себя изучение методов декомпозиции временных рядов, языка прогаммирования Python, библиотеки Statsmodels, предоставляющей набор методов статистического тестирования и моделирования, библиотеки Pandas для обработки и анализа данных. |
110 |
110 |
|
|
111 |
111 |
\pagebreak |
\pagebreak |
112 |
112 |
\thispagestyle{empty} |
\thispagestyle{empty} |
|
... |
... |
NumPy - Numerical Python |
160 |
160 |
\section*{\centering ЗАКЛЮЧЕНИЕ} |
\section*{\centering ЗАКЛЮЧЕНИЕ} |
161 |
161 |
\addcontentsline{toc}{section}{ЗАКЛЮЧЕНИЕ} |
\addcontentsline{toc}{section}{ЗАКЛЮЧЕНИЕ} |
162 |
162 |
|
|
163 |
|
В ходе проделанной работы был проведен разведочный анализ и визуализация данных по температуре и осадкам в двух точках наблюдения. Были выполнены следующие задачи: |
|
|
163 |
|
В ходе проделанной работы был создан сценарий на языке Python для обработки и визуализации динамики температуры и осадков. Были выполнены следующие задачи: |
164 |
164 |
|
|
165 |
165 |
\begin{itemize} |
\begin{itemize} |
166 |
|
\item изучение языка программирования Python и ознакомление с пакетами numpy, scipy, pandas; |
|
|
166 |
|
\item изучены методы декомпозиции временных рядов; |
167 |
167 |
|
|
168 |
|
\item ознакомление с организацией доступа к метеоданным; |
|
|
168 |
|
\item изучены пакеты Python для работы с временными рядами; |
169 |
169 |
|
|
170 |
|
\item выбор региона и точек наблюдения, загрузка данных; |
|
|
170 |
|
\item подготовлены данные по динамике температуры и осадкам; |
171 |
171 |
|
|
172 |
|
\item сравнение динамики температур и осадков в разных точках наблюдения. |
|
|
172 |
|
\item разработан сценарий Python для декомпозиции и визуализации подготовленных данных. |
173 |
173 |
\end{itemize} |
\end{itemize} |
174 |
174 |
|
|
175 |
175 |
% оформление библиографии - вариант с БД |
% оформление библиографии - вариант с БД |
|
... |
... |
NumPy - Numerical Python |
182 |
182 |
|
|
183 |
183 |
\pagebreak |
\pagebreak |
184 |
184 |
|
|
185 |
|
%\renewcommand{\appendixpagename}{\centering Приложения} |
|
|
185 |
|
\renewcommand{\appendixpagename}{\centering Приложения} |
186 |
186 |
|
|
187 |
187 |
|
|
188 |
188 |
\begin{appendices} |
\begin{appendices} |
189 |
|
%\renewcommand{\thesection}{\Asbuk{section}} |
|
190 |
|
%\makeatletter |
|
191 |
|
%\renewcommand{\theProgram}{\thesection.\@arabic\c@Program} |
|
192 |
|
%\makeatother |
|
|
189 |
|
\renewcommand{\thesection}{\Asbuk{section}} |
|
190 |
|
\makeatletter |
|
191 |
|
\renewcommand{\theProgram}{\thesection.\@arabic\c@Program} |
|
192 |
|
\makeatother |
193 |
193 |
|
|
194 |
194 |
% каждое приложение задается следующей командой, нумерация - русскими буквами |
% каждое приложение задается следующей командой, нумерация - русскими буквами |
195 |
|
%\section{\centering } |
|
|
195 |
|
\section{\centering } |
196 |
196 |
% независимая нумерация листингов в каждом приложении |
% независимая нумерация листингов в каждом приложении |
197 |
197 |
\setcounter{Program}{0} |
\setcounter{Program}{0} |
198 |
|
|
|
199 |
|
|
|
|
198 |
|
\begin{MyCode} |
|
199 |
|
import os |
|
200 |
|
import sys |
|
201 |
|
import pandas as pd |
|
202 |
|
import numpy as np |
|
203 |
|
import matplotlib.pyplot as plt |
|
204 |
|
import seaborn as sns |
|
205 |
|
from sys import argv |
|
206 |
|
from statsmodels.tsa.seasonal import seasonal_decompose |
|
207 |
|
from pandas.plotting import register_matplotlib_converters |
|
208 |
|
|
|
209 |
|
script, data1, data2 = argv |
|
210 |
|
|
|
211 |
|
city1 = data1.replace(".txt", "") |
|
212 |
|
city2 = data2.replace(".txt", "") |
|
213 |
|
|
|
214 |
|
register_matplotlib_converters() |
|
215 |
|
|
|
216 |
|
original_stdout = sys.stdout |
|
217 |
|
|
|
218 |
|
# Считывание и обработка датасетов. |
|
219 |
|
print("Считывание и обработка данных.") |
|
220 |
|
data1 = pd.read_csv(data1, sep=";", header=None) |
|
221 |
|
data1.columns = ["index", "year", "month", "day", "temp_quality", "temp_min", "temp_avg", "temp_max", "precipitation"] |
|
222 |
|
data2 = pd.read_csv(data2, sep=";", header=None) |
|
223 |
|
data2.columns = ["index", "year", "month", "day", "temp_quality", "temp_min", "temp_avg", "temp_max", "precipitation"] |
|
224 |
|
df1 = pd.DataFrame({'year': data1["year"], |
|
225 |
|
'month': data1["month"], |
|
226 |
|
'day': data1["day"]}) |
|
227 |
|
df1["date"] = pd.to_datetime(df1) |
|
228 |
|
df1["temp_avg"] = data1["temp_avg"] |
|
229 |
|
df1["precipitation"] = pd.to_numeric(data1["precipitation"], |
|
230 |
|
errors='coerce') |
|
231 |
|
df2 = pd.DataFrame({'year': data2["year"], |
|
232 |
|
'month': data2["month"], |
|
233 |
|
'day': data2["day"]}) |
|
234 |
|
df2["date"] = pd.to_datetime(df2) |
|
235 |
|
df2["temp_avg"] = data2["temp_avg"] |
|
236 |
|
df2["precipitation"] = pd.to_numeric(data2["precipitation"], |
|
237 |
|
errors='coerce') |
|
238 |
|
|
|
239 |
|
# Стилизация графиков. |
|
240 |
|
sns.set_style("darkgrid") |
|
241 |
|
plt.rc("figure", figsize=(12, 9)) |
|
242 |
|
plt.rc("font", size=13) |
|
243 |
|
plt.rc("lines", markersize=5) |
|
244 |
|
plt.rc("lines", linewidth=3) |
|
245 |
|
|
|
246 |
|
# Создание папки для хранения графиков. |
|
247 |
|
if not os.path.exists("Result"): |
|
248 |
|
os.makedirs("Result") |
|
249 |
|
|
|
250 |
|
# Построения графика среднегодовой температуры города 1. |
|
251 |
|
print("Построения графика среднегодовой температуры города " + city1 + ".") |
|
252 |
|
result1 = df1.groupby('year').mean() |
|
253 |
|
plt.plot(result1.index, result1['temp_avg']) |
|
254 |
|
plt.title("Среднегодовая температура (" + city1 + ")") |
|
255 |
|
plt.xlabel('Год') |
|
256 |
|
plt.ylabel('Температура (цельсии)') |
|
257 |
|
z = np.polyfit(result1.index, result1['temp_avg'], 1) |
|
258 |
|
p = np.poly1d(z) |
|
259 |
|
plt.plot(result1.index, p(result1.index), "r--") |
|
260 |
|
plt.savefig('Result/' + city1 + '_Temperature_Plot.png') |
|
261 |
|
plt.clf() |
|
262 |
|
|
|
263 |
|
# Построения графика количества осадков за год города 1. |
|
264 |
|
print("Построения графика количества осадков за год города " + city1 + ".") |
|
265 |
|
plt.plot(result1.index, result1['precipitation']) |
|
266 |
|
plt.title("Количество осадков за год (" + city1 + ")") |
|
267 |
|
plt.xlabel('Год') |
|
268 |
|
plt.ylabel('Количество осадков') |
|
269 |
|
z = np.polyfit(result1.index, result1['precipitation'], 1) |
|
270 |
|
p = np.poly1d(z) |
|
271 |
|
plt.plot(result1.index, p(result1.index), "r--") |
|
272 |
|
plt.savefig('Result/' + city1 + '_Precipitations_Plot.png') |
|
273 |
|
plt.clf() |
|
274 |
|
|
|
275 |
|
# Построения графика среднегодовой температуры города 2. |
|
276 |
|
print("Построения графика среднегодовой температуры города " + city2 + ".") |
|
277 |
|
result2 = df2.groupby('year').mean() |
|
278 |
|
plt.plot(result2.index, result2['temp_avg']) |
|
279 |
|
plt.title("Среднегодовая температура (" + city2 + ")") |
|
280 |
|
plt.xlabel('Год') |
|
281 |
|
plt.ylabel('Температура (цельсии)') |
|
282 |
|
z = np.polyfit(result2.index, result2['temp_avg'], 1) |
|
283 |
|
p = np.poly1d(z) |
|
284 |
|
plt.plot(result2.index, p(result2.index), "r--") |
|
285 |
|
plt.savefig('Result/' + city2 + '_Temperature_Plot.png') |
|
286 |
|
plt.clf() |
|
287 |
|
|
|
288 |
|
# Построения графика количества осадков за год города 2. |
|
289 |
|
print("Построения графика количества осадков за год города " + city2 + ".") |
|
290 |
|
plt.plot(result2.index, result2['precipitation']) |
|
291 |
|
plt.title("Количество осадков за год (" + city2 + ")") |
|
292 |
|
plt.xlabel('Год') |
|
293 |
|
plt.ylabel('Количество осадков') |
|
294 |
|
z = np.polyfit(result2.index, result2['precipitation'], 1) |
|
295 |
|
p = np.poly1d(z) |
|
296 |
|
plt.plot(result2.index, p(result2.index), "r--") |
|
297 |
|
plt.savefig('Result/' + city2 + '_Precipitations_Plot.png') |
|
298 |
|
plt.clf() |
|
299 |
|
|
|
300 |
|
# Построения графика корреляции среднегодовой температуры двух городов. |
|
301 |
|
print("Построения графика корреляции среднегодовой температуры двух городов.") |
|
302 |
|
plt.plot(result1.index, result1['temp_avg'], |
|
303 |
|
label="Среднегодовая температура в городе " + city1) |
|
304 |
|
plt.plot(result2.index, result2['temp_avg'], |
|
305 |
|
label="Среднегодовая температура в городе " + city2) |
|
306 |
|
plt.title("Среднегодовая температура в городах " + city1 + " и " + city2) |
|
307 |
|
plt.xlabel('Год') |
|
308 |
|
plt.ylabel('Температура (цельсии)') |
|
309 |
|
plt.legend() |
|
310 |
|
plt.savefig('Result/Correlation_Temperature_Plot.png') |
|
311 |
|
print("Расчёт корреляции среднегодовой температуры двух городов.") |
|
312 |
|
corr1 = np.corrcoef(result1['temp_avg'], result2['temp_avg']) |
|
313 |
|
with open('Result/Temperature_Correlation.txt', 'w') as f: |
|
314 |
|
sys.stdout = f |
|
315 |
|
print('Матрица корреляции температур:\n') |
|
316 |
|
print(corr1) |
|
317 |
|
sys.stdout = original_stdout |
|
318 |
|
plt.clf() |
|
319 |
|
|
|
320 |
|
# Построения графика корреляции количества осадков за год двух городов. |
|
321 |
|
print("Построения графика корреляции количества осадков за год двух городов.") |
|
322 |
|
plt.plot(result1.index, result1['precipitation'], |
|
323 |
|
label="Среднегодовые осадки в городе " + city1) |
|
324 |
|
plt.plot(result2.index, result2['precipitation'], |
|
325 |
|
label="Среднегодовые осадки в городе " + city2) |
|
326 |
|
plt.title("Среднегодовые осадки в городах " + city1 + " и " + city2) |
|
327 |
|
plt.xlabel('Год') |
|
328 |
|
plt.ylabel('Количество осадков') |
|
329 |
|
plt.legend() |
|
330 |
|
plt.savefig('Result/Correlation_Precipitations_Plot.png') |
|
331 |
|
print("Расчёт корреляции количества осадков за год двух городов.") |
|
332 |
|
corr2 = np.corrcoef(result1['precipitation'], result2['precipitation']) |
|
333 |
|
with open('Result/Precipitations_Correlation.txt', 'w') as f: |
|
334 |
|
sys.stdout = f |
|
335 |
|
print('Матрица корреляции осадков:\n') |
|
336 |
|
print(corr2) |
|
337 |
|
sys.stdout = original_stdout |
|
338 |
|
plt.clf() |
|
339 |
|
|
|
340 |
|
# Построения диаграммы размаха среднегодовой температуры города 1. |
|
341 |
|
print("Построения диаграммы размаха среднегодовой температуры города " + city1 + ".") |
|
342 |
|
sns.boxplot(data=df1, x='month', y='temp_avg') |
|
343 |
|
plt.xlabel('Месяц') |
|
344 |
|
plt.ylabel('Температура (цельсии)') |
|
345 |
|
plt.title('Температура в городе ' + city1) |
|
346 |
|
plt.savefig('Result/' + city1 + '_Temperature_Boxplot.png') |
|
347 |
|
plt.clf() |
|
348 |
|
|
|
349 |
|
# Построения диаграммы размаха среднегодовой температуры города 2. |
|
350 |
|
print("Построения диаграммы размаха среднегодовой температуры города " + city2 + ".") |
|
351 |
|
sns.boxplot(data=df2, x='month', y='temp_avg') |
|
352 |
|
plt.xlabel('Месяц') |
|
353 |
|
plt.ylabel('Температура (цельсии)') |
|
354 |
|
plt.title('Температура в городе ' + city2) |
|
355 |
|
plt.savefig('Result/' + city2 + '_Temperature_Boxplot.png') |
|
356 |
|
plt.clf() |
|
357 |
|
|
|
358 |
|
# Декомпозиция данных по температуре города 1. |
|
359 |
|
print("Декомпозиция данных по температуре города " + city1 + ".") |
|
360 |
|
result = seasonal_decompose(result1['temp_avg'], model='additive', period=12) |
|
361 |
|
result.plot() |
|
362 |
|
plt.savefig('Result/' + city1 + '_Temperature_Decomposition.png') |
|
363 |
|
plt.clf() |
|
364 |
|
|
|
365 |
|
# Декомпозиция данных по осадкам города 1. |
|
366 |
|
print("Декомпозиция данных по осадкам города " + city1 + ".") |
|
367 |
|
result = seasonal_decompose(result1['precipitation'], model='additive', period=12) |
|
368 |
|
result.plot() |
|
369 |
|
plt.savefig('Result/' + city1 + '_Precipitations_Decomposition.png') |
|
370 |
|
plt.clf() |
|
371 |
|
|
|
372 |
|
# Декомпозиция данных по температуре города 2. |
|
373 |
|
print("Декомпозиция данных по температуре города " + city2 + ".") |
|
374 |
|
result = seasonal_decompose(result2['temp_avg'], model='additive', period=12) |
|
375 |
|
result.plot() |
|
376 |
|
plt.savefig('Result/' + city2 + '_Temperature_Decomposition.png') |
|
377 |
|
plt.clf() |
|
378 |
|
|
|
379 |
|
# Декомпозиция данных по осадкам города 2. |
|
380 |
|
print("Декомпозиция данных по осадкам города " + city2 + ".") |
|
381 |
|
result = seasonal_decompose(result2['precipitation'], model='additive', period=12) |
|
382 |
|
result.plot() |
|
383 |
|
plt.savefig('Result/' + city2 + '_Precipitations_Decomposition.png') |
|
384 |
|
plt.clf() |
|
385 |
|
|
|
386 |
|
print("\nРабота успешно завершена!") |
|
387 |
|
\end{MyCode} |
|
388 |
|
\begin{Program} |
|
389 |
|
\caption{Код реализации скрипта}\label{app1} |
|
390 |
|
\end{Program} |
200 |
391 |
\end{appendices} |
\end{appendices} |
201 |
392 |
|
|
202 |
393 |
\end{document} |
\end{document} |
File part1.tex changed (mode: 100644) (index 1090bb5..4d6a4be) |
... |
... |
NumPy (сокращенно от Numerical Python)— библиотека с о |
54 |
54 |
|
|
55 |
55 |
Математические алгоритмы, реализованные на интерпретируемых языках (например, Python), часто работают гораздо медленнее тех же алгоритмов, реализованных на компилируемых языках (например, Фортран, Си, Java). Библиотека NumPy предоставляет реализации вычислительных алгоритмов (в виде функций и операторов), оптимизированные для работы с многомерными массивами. В результате любой алгоритм, который может быть выражен в виде последовательности операций над массивами (матрицами) и реализованный с использованием NumPy, работает так же быстро, как эквивалентный код, выполняемый в MATLAB. |
Математические алгоритмы, реализованные на интерпретируемых языках (например, Python), часто работают гораздо медленнее тех же алгоритмов, реализованных на компилируемых языках (например, Фортран, Си, Java). Библиотека NumPy предоставляет реализации вычислительных алгоритмов (в виде функций и операторов), оптимизированные для работы с многомерными массивами. В результате любой алгоритм, который может быть выражен в виде последовательности операций над массивами (матрицами) и реализованный с использованием NumPy, работает так же быстро, как эквивалентный код, выполняемый в MATLAB. |
56 |
56 |
|
|
57 |
|
\subsection{Библиотека SciPy} |
|
|
57 |
|
\subsection{Библиотека Statsmodels} |
58 |
58 |
|
|
59 |
|
SciPy — библиотека для языка программирования Python с открытым исходным кодом, предназначенная для выполнения научных и инженерных расчётов. |
|
|
59 |
|
Statsmodels предоставляет набор методов статистического тестирования и моделирования, а также инструменты, предназначенные для анализа временных рядов. Также может быть использована для прогнозирования. |
60 |
60 |
|
|
61 |
|
Возможности: |
|
62 |
|
\begin{itemize} |
|
63 |
|
\item поиск минимумов и максимумов функций; |
|
64 |
|
|
|
65 |
|
\item вычисление интегралов функций; |
|
66 |
|
|
|
67 |
|
\item поддержка специальных функций; |
|
68 |
|
|
|
69 |
|
\item обработка сигналов; |
|
70 |
|
|
|
71 |
|
\item обработка изображений; |
|
72 |
|
|
|
73 |
|
\item работа с генетическими алгоритмами; |
|
74 |
|
|
|
75 |
|
\item решение обыкновенных дифференциальных уравнений. |
|
76 |
|
\end{itemize} |
|
77 |
61 |
Для визуализации результатов расчётов часто применяется библиотека Matplotlib. |
Для визуализации результатов расчётов часто применяется библиотека Matplotlib. |
78 |
62 |
|
|
79 |
63 |
\subsection{Библиотека Matplotlib} |
\subsection{Библиотека Matplotlib} |
|
... |
... |
Matplotlib является гибким, легко конфигурируем |
103 |
87 |
\item спектральные диаграммы (spectrogram). |
\item спектральные диаграммы (spectrogram). |
104 |
88 |
\end{itemize} |
\end{itemize} |
105 |
89 |
|
|
|
90 |
|
\subsection{Анализ временных рядов} |
106 |
91 |
|
|
107 |
|
\subsection{Пользовательский интерфейс JupyterLab} |
|
|
92 |
|
Анализ временных рядов – совокупность статистических методов для выявления составляющих временного ряда и его прогнозирования. |
108 |
93 |
|
|
109 |
|
JupyterLab — это интерактивная среда разработки для работы с блокнотами, кодом и данными. JupyterLab позволяет использовать текстовые редакторы, терминалы, средства просмотра файлов данных и другие настраиваемые компоненты рядом с блокнотами в разбитой на вкладки рабочей области. |
|
|
94 |
|
Временной ряд – последовательность статистических данных, собранных в разные моменты времени, о значении каких-либо параметров исследуемого процесса. Каждое значение временного ряда называется уровнем временного ряда. Во временном ряде каждому уровню должно быть указанно время измерения или номер измерения по порядку. Методы анализа временных рядов существенно отличаются от методов анализа данных простой выборки. При анализе временного ряда исследователя интересуют не только статистические характеристики временного ряда, но и учитывается взаимосвязь измерений со временем. |
110 |
95 |
|
|
111 |
|
JupyterLab позволяет организовать рабочую зону с помощью блокнотов, текстовых файлов, терминалов и выводов блокнотов. |
|
|
96 |
|
Временные ряды, как правило, возникают в результате измерения некоторого показателя. Это могут быть как характеристики технических систем, так и показатели природных, социально-экономических явлений и процессов. Например, динамика курса валюты или курса акции, при анализе которых пытаются определить основное направление развития. Или, например, анализ динамики продаж компании с целью планирования остатков на складе. |
112 |
97 |
|
|
113 |
|
JupyterLab обеспечивает высокий уровень интеграции между блокнотами, документами и действиями: |
|
114 |
|
\begin{itemize} |
|
115 |
|
\item используется drag-and-drop для того чтобы можно было переупорядочить ячейки и скопировать их между блокнотами; |
|
|
98 |
|
Основная цель анализа временного ряда – построить прогноз его значений на будущие периоды. А основные задачи анализа временного ряда – понять, под воздействием каких компонент формируется значение временного ряда, и построить математическую модель для каждой компоненты или их совокупности. Любой временной ряд можно разложить на следующие составляющие: тренд, сезонную составляющую, циклическую составляющую и случайную составляющую. Первые три компоненты образуют неслучайную составляющую временного ряда. Случайная составляющая присутствует в любом временном ряде. А а вот присутствие в структуре временного ряда компонент неслучайной составляющей не обязательно. |
116 |
99 |
|
|
117 |
|
\item блоки кода выполняются интерактивно прямо из текстовых файлов (.py, .R, .md, .tex и т. д.); |
|
|
100 |
|
Подходы к моделированию временного ряда можно разделить на два направления: |
|
101 |
|
\begin{itemize} |
|
102 |
|
\item моделирование неслучайной составляющей в совокупности; |
118 |
103 |
|
|
119 |
|
\item консоль кода можно связать с ядром блокнота, чтобы изучать код в интерактивном режиме, не загромождая блокнот временными правками; |
|
|
104 |
|
\item разложение временного ряда на составляющие компоненты и моделирование значений каждой компоненты в отдельности. |
|
105 |
|
\end{itemize} |
120 |
106 |
|
|
121 |
|
\item Возможность редактирования популярных форматов файлов с предварительным просмотром в реальном времени, такие как Markdown, JSON, CSV, Vega, VegaLite и другие. |
|
122 |
|
\end{itemize} |
|
|
107 |
|
Статистические методы прогнозирования делятся на алгоритмические методы и аналитические методы. К алгоритмическим методам относят методы простой и взвешенной скользящей средней. К аналитическим методам относят методы прогнозной экстраполяции на основе кривых роста в виде функций времени. В случае наличия сезонной или циклической компоненты во временном ряду проводят анализ периодических колебаний или спектральный анализ временного ряда. |
File part2.tex changed (mode: 100644) (index 125ec47..fb3ee11) |
1 |
1 |
% вторая часть |
% вторая часть |
2 |
2 |
|
|
3 |
|
\section{Анализ динамики температуры и осадков} |
|
|
3 |
|
\section{Демонстрация работы скрипта} |
4 |
4 |
|
|
5 |
5 |
\subsection{Получение данных} |
\subsection{Получение данных} |
6 |
6 |
|
|
7 |
|
Данные по температуре и осадках были взяты с сайта http://aisori-m.meteo.ru/. Пример запроса в базу данных приведён на рис.1 |
|
|
7 |
|
Данные по температуре и осадка были взяты с сайта http://aisori-m.meteo.ru/. Пример запроса в базу данных приведён на рис.1 |
8 |
8 |
|
|
9 |
9 |
\begin{figure}[H] |
\begin{figure}[H] |
10 |
10 |
\centering |
\centering |
|
41 |
41 |
\caption{Результат запроса в БД} |
\caption{Результат запроса в БД} |
42 |
42 |
\label{fig:2} |
\label{fig:2} |
43 |
43 |
\end{figure} |
\end{figure} |
44 |
|
\subsection{Подготовка данных} |
|
|
44 |
|
\subsection{Запуск скрипта} |
45 |
45 |
|
|
46 |
|
Для работы с данными использовался язык программирования Python с подключёнными библиотеками Pandas, NumPy, SciPy и Matplotlib. |
|
|
46 |
|
Перед запуском скрипта его необходимо переместить в папку с метеоданными, заранее переименованными по принципу *название города*.txt. |
47 |
47 |
|
|
48 |
|
\begin{Program}[H] |
|
49 |
|
\caption{Импорт необходимых библиотек} \label{lst:1} |
|
50 |
|
\begin{MyCode} |
|
51 |
|
import pandas as pd |
|
52 |
|
import numpy as np |
|
53 |
|
import scipy as sp |
|
54 |
|
import matplotlib.pyplot as plt |
|
55 |
|
\end{MyCode} |
|
56 |
|
\end{Program} |
|
57 |
|
|
|
58 |
|
Были заполнены датафреймы: |
|
59 |
|
|
|
60 |
|
\begin{Program}[H] |
|
61 |
|
\caption{Считывание днных о погоде в Москве} \label{lst:2} |
|
62 |
|
\begin{MyCode} |
|
63 |
|
data1 = pd.read_csv('DataSet1.txt', sep=";", header=None) |
|
64 |
|
data1.columns = ["index", "year", "month", "day", "temp_quality", |
|
65 |
|
"temp_min", "temp_avg", "temp_max", "precipitation"] |
|
66 |
|
\end{MyCode} |
|
67 |
|
\end{Program} |
|
68 |
|
|
|
69 |
|
\begin{Program}[H] |
|
70 |
|
\caption{Считывание днных о погоде в Нижнем Новгороде} \label{lst:3} |
|
71 |
|
\begin{MyCode} |
|
72 |
|
data2 = pd.read_csv('DataSet2.txt', sep=";", header=None) |
|
73 |
|
data2.columns = ["index", "year", "month", "day", "temp_quality", |
|
74 |
|
"temp_min", "temp_avg", "temp_max", "precipitation"] |
|
75 |
|
\end{MyCode} |
|
76 |
|
\end{Program} |
|
77 |
|
|
|
78 |
|
где: |
|
79 |
|
\begin{itemize} |
|
80 |
|
\item data1 - датафрейм с данными о погоде в Москве; |
|
81 |
|
|
|
82 |
|
\item data2 - датафрейм с данными о погоде в Нижнем Новгороде; |
|
83 |
|
|
|
84 |
|
\item index - индекс ВМО; |
|
85 |
|
|
|
86 |
|
\item year - год; |
|
87 |
|
|
|
88 |
|
\item month - месяц; |
|
89 |
|
|
|
90 |
|
\item day - день; |
|
91 |
|
|
|
92 |
|
\item temp\_quality - общий признак качества температур; |
|
93 |
|
|
|
94 |
|
\item temp\_min - минимальная температура воздуха; |
|
95 |
|
|
|
96 |
|
\item temp\_avg - средняя температура воздуха; |
|
97 |
|
|
|
98 |
|
\item temp\_max - максимальная температура воздуха; |
|
99 |
|
|
|
100 |
|
\item precipitation - количество осадков. |
|
101 |
|
\end{itemize} |
|
102 |
|
Проверка заполнености датафреймов: |
|
103 |
|
|
|
104 |
|
\begin{Program}[H] |
|
105 |
|
\caption{Вывод датафрейма с Московскими данными} \label{lst:4} |
|
106 |
|
\begin{MyCode} |
|
107 |
|
data1 |
|
108 |
|
\end{MyCode} |
|
109 |
|
\end{Program} |
|
|
48 |
|
Скрипт запускается через коммандную строку Windows. |
110 |
49 |
|
|
111 |
50 |
\begin{figure}[H] |
\begin{figure}[H] |
112 |
51 |
\centering |
\centering |
113 |
|
\includegraphics[width=0.50\linewidth]{pics/3} |
|
114 |
|
\caption{Результат вывода Московских данных} |
|
|
52 |
|
\includegraphics[width=0.75\linewidth]{pics/13} |
|
53 |
|
\caption{Запуск скрипта} |
115 |
54 |
\label{fig:3} |
\label{fig:3} |
116 |
55 |
\end{figure} |
\end{figure} |
117 |
56 |
|
|
118 |
|
\begin{Program}[H] |
|
119 |
|
\caption{Вывод датафрейма с данными Нижнего Новгорода} \label{lst:5} |
|
120 |
|
\begin{MyCode} |
|
121 |
|
data2 |
|
122 |
|
\end{MyCode} |
|
123 |
|
\end{Program} |
|
124 |
|
|
|
125 |
|
\begin{figure}[H] |
|
126 |
|
\centering |
|
127 |
|
\includegraphics[width=0.50\linewidth]{pics/4} |
|
128 |
|
\caption{Результат вывода данных Нижнего Новгорода} |
|
129 |
|
\label{fig:4} |
|
130 |
|
\end{figure} |
|
131 |
|
|
|
132 |
|
Сформированы датафреймы, где содержатся только необходимые столбцы. |
|
133 |
|
|
|
134 |
|
\begin{Program}[H] |
|
135 |
|
\caption{Формирование нового датафрейма с Московскими данными} \label{lst:6} |
|
136 |
|
\begin{MyCode} |
|
137 |
|
df1 = pd.DataFrame({'year': data1["year"], |
|
138 |
|
'month': data1["month"], |
|
139 |
|
'day': data1["day"]}) |
|
140 |
|
df1["date"] = pd.to_datetime(df1) |
|
141 |
|
df1["temp_avg"] = data1["temp_avg"] |
|
142 |
|
df1["precipitation"] = pd.to_numeric(data1["precipitation"], errors='coerce') |
|
143 |
|
df1 |
|
144 |
|
\end{MyCode} |
|
145 |
|
\end{Program} |
|
146 |
|
|
|
147 |
|
\begin{figure}[H] |
|
148 |
|
\centering |
|
149 |
|
\includegraphics[width=0.50\linewidth]{pics/5} |
|
150 |
|
\caption{Результат вывода нового датафрейма с Московскими данными} |
|
151 |
|
\label{fig:5} |
|
152 |
|
\end{figure} |
|
153 |
|
|
|
154 |
|
\begin{Program}[H] |
|
155 |
|
\caption{Формирование нового датафрейма с данными Нижнего Новгорода} \label{lst:7} |
|
156 |
|
\begin{MyCode} |
|
157 |
|
df2 = pd.DataFrame({'year': data2["year"], |
|
158 |
|
'month': data2["month"], |
|
159 |
|
'day': data2["day"]}) |
|
160 |
|
df2["date"] = pd.to_datetime(df2) |
|
161 |
|
df2["temp_avg"] = data2["temp_avg"] |
|
162 |
|
df2["precipitation"] = pd.to_numeric(data2["precipitation"], errors='coerce') |
|
163 |
|
df2 |
|
164 |
|
\end{MyCode} |
|
165 |
|
\end{Program} |
|
166 |
|
|
|
167 |
|
\begin{figure}[H] |
|
168 |
|
\centering |
|
169 |
|
\includegraphics[width=0.50\linewidth]{pics/6} |
|
170 |
|
\caption{Результат вывода нового датафрейма с данными Нижнего Новгорода} |
|
171 |
|
\label{fig:6} |
|
172 |
|
\end{figure} |
|
173 |
|
|
|
|
57 |
|
В командной строке необходимо перейти по пути, где лежит скрипт, с помощью команды cd. После этого запускается скрипт с двумя параметрами, представляющими из себя переименованные файлы с метеоданными. |
174 |
58 |
|
|
|
59 |
|
После завершения работы скрипта, весь результат сохраняется в папке Result. |
175 |
60 |
|
|
176 |
|
\subsection{Динамика температуры и осадков} |
|
|
61 |
|
\subsection{Результат работы скрипта} |
177 |
62 |
|
|
178 |
|
Построены графики среднегодовых температур и осадков в Москве и Нижнем Новгороде. |
|
|
63 |
|
После завершения работы скрипта построены следующие графики: |
179 |
64 |
|
|
180 |
|
\begin{Program}[H] |
|
181 |
|
\caption{Формирование графика среднегодовой температуры в Москве} \label{lst:8} |
|
182 |
|
\begin{MyCode} |
|
183 |
|
result1 = df1.groupby('year').mean() |
|
184 |
|
plt.plot(result1.index, result1['temp_avg']) |
|
185 |
|
plt.title("Среднегодовая температура (Москва)") |
|
186 |
|
plt.xlabel('Год') |
|
187 |
|
plt.ylabel('Температура (цельсии)') |
|
188 |
|
z = np.polyfit(result1.index, result1['temp_avg'], 1) |
|
189 |
|
p = np.poly1d(z) |
|
190 |
|
plt.plot(result1.index,p(result1.index),"r--") |
|
191 |
|
plt.show() |
|
192 |
|
\end{MyCode} |
|
193 |
|
\end{Program} |
|
194 |
|
|
|
195 |
|
\begin{figure}[H] |
|
196 |
|
\centering |
|
197 |
|
\includegraphics[width=0.75\linewidth]{pics/7} |
|
198 |
|
\caption{График среднегодовой температуры в Москве} |
|
199 |
|
\label{fig:7} |
|
200 |
|
\end{figure} |
|
201 |
|
|
|
202 |
|
\begin{Program}[H] |
|
203 |
|
\caption{Формирование графика среднегодовых осадков в Москве} \label{lst:9} |
|
204 |
|
\begin{MyCode} |
|
205 |
|
plt.plot(result1.index, result1['precipitation']) |
|
206 |
|
plt.title("Количество осадков за год (Москва)") |
|
207 |
|
plt.xlabel('Год') |
|
208 |
|
plt.ylabel('Количество осадков') |
|
209 |
|
z = np.polyfit(result1.index, result1['precipitation'], 1) |
|
210 |
|
p = np.poly1d(z) |
|
211 |
|
plt.plot(result1.index,p(result1.index),"r--") |
|
212 |
|
plt.show() |
|
213 |
|
\end{MyCode} |
|
214 |
|
\end{Program} |
|
215 |
|
|
|
216 |
|
\begin{figure}[H] |
|
217 |
|
\centering |
|
218 |
|
\includegraphics[width=0.75\linewidth]{pics/8} |
|
219 |
|
\caption{График среднегодовых осадков в Москве} |
|
220 |
|
\label{fig:8} |
|
221 |
|
\end{figure} |
|
222 |
|
|
|
223 |
|
\begin{Program}[H] |
|
224 |
|
\caption{Формирование графика среднегодовой температуры в Нижнем Новгороде} \label{lst:10} |
|
225 |
|
\begin{MyCode} |
|
226 |
|
result2 = df2.groupby('year').mean() |
|
227 |
|
plt.plot(result2.index, result2['temp_avg']) |
|
228 |
|
plt.title("Среднегодовая температура (Нижний-Новгород)") |
|
229 |
|
plt.xlabel('Год') |
|
230 |
|
plt.ylabel('Температура (цельсии)') |
|
231 |
|
z = np.polyfit(result2.index, result2['temp_avg'], 1) |
|
232 |
|
p = np.poly1d(z) |
|
233 |
|
plt.plot(result2.index,p(result2.index),"r--") |
|
234 |
|
plt.show() |
|
235 |
|
\end{MyCode} |
|
236 |
|
\end{Program} |
|
237 |
|
|
|
238 |
|
\begin{figure}[H] |
|
239 |
|
\centering |
|
240 |
|
\includegraphics[width=0.75\linewidth]{pics/9} |
|
241 |
|
\caption{График среднегодовой температуры в Нижнем Новгороде} |
|
242 |
|
\label{fig:9} |
|
243 |
|
\end{figure} |
|
244 |
|
|
|
245 |
|
\begin{Program}[H] |
|
246 |
|
\caption{Формирование графика среднегодовых осадков в Нижнем Новгороде} \label{lst:11} |
|
247 |
|
\begin{MyCode} |
|
248 |
|
plt.plot(result2.index, result2['precipitation']) |
|
249 |
|
plt.title("Количество осадков за год (Нижний-Новгород)") |
|
250 |
|
plt.xlabel('Год') |
|
251 |
|
plt.ylabel('Количество осадков') |
|
252 |
|
z = np.polyfit(result2.index, result2['precipitation'], 1) |
|
253 |
|
p = np.poly1d(z) |
|
254 |
|
plt.plot(result2.index,p(result2.index),"r--") |
|
255 |
|
plt.show() |
|
256 |
|
\end{MyCode} |
|
257 |
|
\end{Program} |
|
258 |
|
|
|
259 |
|
\begin{figure}[H] |
|
260 |
|
\centering |
|
261 |
|
\includegraphics[width=0.75\linewidth]{pics/10} |
|
262 |
|
\caption{График среднегодовых осадков в Нижнем Новгороде} |
|
263 |
|
\label{fig:10} |
|
264 |
|
\end{figure} |
|
265 |
|
|
|
266 |
|
Высчитан коэффициент корреляции для температур и осадков в разных точках наблюдения. |
|
267 |
|
|
|
268 |
|
\begin{Program}[H] |
|
269 |
|
\caption{Формирование графика среднегодовых температур} \label{lst:12} |
|
270 |
|
\begin{MyCode} |
|
271 |
|
plt.plot(result1.index, result1['temp_avg'], |
|
272 |
|
label = "Среднегодовая температура в Москве") |
|
273 |
|
plt.plot(result2.index, result2['temp_avg'], |
|
274 |
|
label = "Среднегодовая температура в Нижнем-Новгороде") |
|
275 |
|
plt.title("Среднегодовая температура в Москве и Нижнем-Новгороде") |
|
276 |
|
plt.xlabel('Год') |
|
277 |
|
plt.ylabel('Температура (цельсии)') |
|
278 |
|
plt.legend() |
|
279 |
|
plt.show() |
|
280 |
|
corr1 = np.corrcoef(result1['temp_avg'], result2['temp_avg']) |
|
281 |
|
print("Матрица корреляции:") |
|
282 |
|
print(corr1) |
|
283 |
|
\end{MyCode} |
|
284 |
|
\end{Program} |
|
285 |
|
|
|
286 |
|
\begin{figure}[H] |
|
287 |
|
\centering |
|
288 |
|
\includegraphics[width=0.75\linewidth]{pics/11} |
|
289 |
|
\caption{График среднегодовых температур} |
|
290 |
|
\label{fig:11} |
|
291 |
|
\end{figure} |
|
292 |
|
|
|
293 |
|
В данном случае коэффициент корреляции температур примерно равен 0.97 |
|
294 |
|
|
|
295 |
|
\begin{Program}[H] |
|
296 |
|
\caption{Формирование графика среднегодовых осадков} \label{lst:14} |
|
297 |
|
\begin{MyCode} |
|
298 |
|
plt.plot(result1.index, result1['precipitation'], |
|
299 |
|
label = "Среднегодовые осадки в Москве") |
|
300 |
|
plt.plot(result2.index, result2['precipitation'], |
|
301 |
|
label = "Среднегодовые осадки в Нижнем-Новгороде") |
|
302 |
|
plt.title("Среднегодовые осадки в Москве и Нижнем-Новгороде") |
|
303 |
|
plt.xlabel('Год') |
|
304 |
|
plt.ylabel('Количество осадков') |
|
305 |
|
plt.legend() |
|
306 |
|
plt.show() |
|
307 |
|
corr2 = np.corrcoef(result1['precipitation'], result2['precipitation']) |
|
308 |
|
print("Матрица корреляции:") |
|
309 |
|
print(corr2) |
|
310 |
|
\end{MyCode} |
|
311 |
|
\end{Program} |
|
312 |
|
|
|
313 |
|
\begin{figure}[H] |
|
314 |
|
\centering |
|
315 |
|
\includegraphics[width=0.75\linewidth]{pics/12} |
|
316 |
|
\caption{График среднегодовых осадков} |
|
317 |
|
\label{fig:12} |
|
318 |
|
\end{figure} |
|
|
65 |
|
\begin{itemize} |
|
66 |
|
\item графики среднегодовых температур и осадков в двух точках наблюдений; |
|
67 |
|
|
|
68 |
|
\begin{figure}[H] |
|
69 |
|
\centering |
|
70 |
|
\includegraphics[width=0.75\linewidth]{pics/20} |
|
71 |
|
\caption{График среднегодовой температуры в Москве} |
|
72 |
|
\label{fig:4} |
|
73 |
|
\end{figure} |
|
74 |
|
|
|
75 |
|
\begin{figure}[H] |
|
76 |
|
\centering |
|
77 |
|
\includegraphics[width=0.75\linewidth]{pics/21} |
|
78 |
|
\caption{График среднегодовых осадков в Москве} |
|
79 |
|
\label{fig:5} |
|
80 |
|
\end{figure} |
|
81 |
|
|
|
82 |
|
\begin{figure}[H] |
|
83 |
|
\centering |
|
84 |
|
\includegraphics[width=0.75\linewidth]{pics/22} |
|
85 |
|
\caption{График среднегодовой температуры в Нижнем-Новгороде} |
|
86 |
|
\label{fig:6} |
|
87 |
|
\end{figure} |
|
88 |
|
|
|
89 |
|
\begin{figure}[H] |
|
90 |
|
\centering |
|
91 |
|
\includegraphics[width=0.75\linewidth]{pics/23} |
|
92 |
|
\caption{График среднегодовых осадков в Нижнем-Новгороде} |
|
93 |
|
\label{fig:7} |
|
94 |
|
\end{figure} |
|
95 |
|
|
|
96 |
|
\item вычислен коэффициент корреляции для температур и осадков в разных |
|
97 |
|
точках наблюдения; |
|
98 |
|
|
|
99 |
|
\begin{figure}[H] |
|
100 |
|
\centering |
|
101 |
|
\includegraphics[width=0.75\linewidth]{pics/24} |
|
102 |
|
\caption{График среднегодовых температур} |
|
103 |
|
\label{fig:8} |
|
104 |
|
\end{figure} |
|
105 |
|
|
|
106 |
|
\begin{figure}[H] |
|
107 |
|
\centering |
|
108 |
|
\includegraphics[width=0.75\linewidth]{pics/25} |
|
109 |
|
\caption{График среднегодовых осадков} |
|
110 |
|
\label{fig:9} |
|
111 |
|
\end{figure} |
|
112 |
|
|
|
113 |
|
\begin{figure}[H] |
|
114 |
|
\centering |
|
115 |
|
\includegraphics[width=0.5\linewidth]{pics/26} |
|
116 |
|
\caption{Матрица корреляции среднегодовых температур} |
|
117 |
|
\label{fig:10} |
|
118 |
|
\end{figure} |
|
119 |
|
|
|
120 |
|
\begin{figure}[H] |
|
121 |
|
\centering |
|
122 |
|
\includegraphics[width=0.5\linewidth]{pics/27} |
|
123 |
|
\caption{Матрица корреляции среднегодовых осадков} |
|
124 |
|
\label{fig:11} |
|
125 |
|
\end{figure} |
|
126 |
|
|
|
127 |
|
\item коробочные диаграммы по температурам в двух точках наблюдения; |
|
128 |
|
|
|
129 |
|
\begin{figure}[H] |
|
130 |
|
\centering |
|
131 |
|
\includegraphics[width=0.75\linewidth]{pics/14} |
|
132 |
|
\caption{Коробочная диаграмма температуры в Москве} |
|
133 |
|
\label{fig:12} |
|
134 |
|
\end{figure} |
|
135 |
|
|
|
136 |
|
\begin{figure}[H] |
|
137 |
|
\centering |
|
138 |
|
\includegraphics[width=0.75\linewidth]{pics/15} |
|
139 |
|
\caption{Коробочная диаграмма температуры в Нижнем-Новгороде} |
|
140 |
|
\label{fig:13} |
|
141 |
|
\end{figure} |
|
142 |
|
|
|
143 |
|
\item графики декомпозиции данных по температуре и осадкам в двух точках наблюдения. |
|
144 |
|
|
|
145 |
|
\begin{figure}[H] |
|
146 |
|
\centering |
|
147 |
|
\includegraphics[width=0.75\linewidth]{pics/16} |
|
148 |
|
\caption{Декомпозиция данных по температуре в Москве} |
|
149 |
|
\label{fig:14} |
|
150 |
|
\end{figure} |
|
151 |
|
|
|
152 |
|
\begin{figure}[H] |
|
153 |
|
\centering |
|
154 |
|
\includegraphics[width=0.75\linewidth]{pics/17} |
|
155 |
|
\caption{Декомпозиция данных по осадкам в Москве} |
|
156 |
|
\label{fig:15} |
|
157 |
|
\end{figure} |
|
158 |
|
|
|
159 |
|
\begin{figure}[H] |
|
160 |
|
\centering |
|
161 |
|
\includegraphics[width=0.75\linewidth]{pics/18} |
|
162 |
|
\caption{Декомпозиция данных по температуре в Нижнем-Новгороде} |
|
163 |
|
\label{fig:16} |
|
164 |
|
\end{figure} |
|
165 |
|
|
|
166 |
|
\begin{figure}[H] |
|
167 |
|
\centering |
|
168 |
|
\includegraphics[width=0.75\linewidth]{pics/19} |
|
169 |
|
\caption{Декомпозиция данных по осадкам в Нижнем-Новгороде} |
|
170 |
|
\label{fig:17} |
|
171 |
|
\end{figure} |
|
172 |
|
|
|
173 |
|
\end{itemize} |
319 |
174 |
|
|
320 |
|
В данном случае коэффициент корреляции количества осадков примерно равен 0.59 |
|