<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://digida.mgpu.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vladislav+Leontev</id>
	<title>Поле цифровой дидактики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="http://digida.mgpu.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vladislav+Leontev"/>
	<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Vladislav_Leontev"/>
	<updated>2026-05-06T22:07:25Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46183</id>
		<title>Изучение изменения стоимости валют по данным ЦБ</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46183"/>
		<updated>2026-04-14T08:24:11Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание проекта ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Анализ валютного рынка ЦБ РФ на основе R. Построение дашборда: дневные изменения, 30-дневная динамика и волатильность валют.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Назначение ==&lt;br /&gt;
Проект позволяет оценить характер изменения стоимости валют по данным ЦБ.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Общая концепция ==&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Уровни анализа валютного дашборда&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Источник данных (CBR API)&amp;quot; as data&lt;br /&gt;
rectangle &amp;quot;Сбор данных (httr + JSON)&amp;quot; as collect&lt;br /&gt;
rectangle &amp;quot;Обработка (R data.frame)&amp;quot; as process&lt;br /&gt;
rectangle &amp;quot;Метрики (изменения, волатильность)&amp;quot; as metrics&lt;br /&gt;
rectangle &amp;quot;Визуализация (ggplot2 + patchwork)&amp;quot; as viz&lt;br /&gt;
rectangle &amp;quot;Интерпретация (аналитика)&amp;quot; as interp&lt;br /&gt;
&lt;br /&gt;
data --&amp;gt; collect&lt;br /&gt;
collect --&amp;gt; process&lt;br /&gt;
process --&amp;gt; metrics&lt;br /&gt;
metrics --&amp;gt; viz&lt;br /&gt;
viz --&amp;gt; interp&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Валютный дашборд ЦБ РФ (R + анализ) =&lt;br /&gt;
&lt;br /&gt;
== Цель исследования ==&lt;br /&gt;
Проект направлен на анализ валютного рынка:&lt;br /&gt;
* дневные изменения валют&lt;br /&gt;
* динамика за 30 дней&lt;br /&gt;
* волатильность валют&lt;br /&gt;
* сравнение мировых и остальных валют&lt;br /&gt;
&lt;br /&gt;
== Источник данных ==&lt;br /&gt;
Данные берутся из API ЦБ РФ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://www.cbr-xml-daily.ru/daily_json.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Исторические данные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://www.cbr-xml-daily.ru/archive/YYYY/MM/DD/daily_json.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Архитектура обработки данных ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Поток обработки данных&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;CBR API&amp;quot; as api&lt;br /&gt;
rectangle &amp;quot;HTTP GET&amp;quot; as http&lt;br /&gt;
rectangle &amp;quot;JSON parsing&amp;quot; as json&lt;br /&gt;
rectangle &amp;quot;data.frame&amp;quot; as df&lt;br /&gt;
rectangle &amp;quot;Feature engineering&amp;quot; as feat&lt;br /&gt;
rectangle &amp;quot;Visualization&amp;quot; as plot&lt;br /&gt;
&lt;br /&gt;
api --&amp;gt; http&lt;br /&gt;
http --&amp;gt; json&lt;br /&gt;
json --&amp;gt; df&lt;br /&gt;
df --&amp;gt; feat&lt;br /&gt;
feat --&amp;gt; plot&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 📊 Структура данных ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Структура валютных данных&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Date&amp;quot; as date&lt;br /&gt;
rectangle &amp;quot;Currency Code&amp;quot; as code&lt;br /&gt;
rectangle &amp;quot;Value&amp;quot; as value&lt;br /&gt;
rectangle &amp;quot;Previous Value&amp;quot; as prev&lt;br /&gt;
rectangle &amp;quot;Change %&amp;quot; as change&lt;br /&gt;
&lt;br /&gt;
date --&amp;gt; value&lt;br /&gt;
code --&amp;gt; value&lt;br /&gt;
prev --&amp;gt; change&lt;br /&gt;
value --&amp;gt; change&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Загрузка и подготовка данных ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сегментация валют ==&lt;br /&gt;
&lt;br /&gt;
Мировые валюты:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;,&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Логика анализа ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Логика обработки валют&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Все валюты&amp;quot; as all&lt;br /&gt;
rectangle &amp;quot;Мировые валюты&amp;quot; as world&lt;br /&gt;
rectangle &amp;quot;Рост&amp;quot; as up&lt;br /&gt;
rectangle &amp;quot;Падение&amp;quot; as down&lt;br /&gt;
&lt;br /&gt;
all --&amp;gt; world&lt;br /&gt;
all --&amp;gt; up&lt;br /&gt;
all --&amp;gt; down&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Дневной анализ ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
title Группы валют&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Мировые&amp;quot; as world&lt;br /&gt;
rectangle &amp;quot;Рост&amp;quot; as up&lt;br /&gt;
rectangle &amp;quot;Падение&amp;quot; as down&lt;br /&gt;
&lt;br /&gt;
world --&amp;gt; &amp;quot;Сравнительный анализ&amp;quot;&lt;br /&gt;
up --&amp;gt; &amp;quot;Топ роста&amp;quot;&lt;br /&gt;
down --&amp;gt; &amp;quot;Топ падения&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 30-дневная динамика ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм:&lt;br /&gt;
# загрузка архивных данных ЦБ&lt;br /&gt;
# формирование временного ряда&lt;br /&gt;
# расчёт накопленного изменения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
change_30d_pct = (Value / first(Value) - 1) * 100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Волатильность ==&lt;br /&gt;
&lt;br /&gt;
Формула:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
Volatility = sd(\log(Value)) \times 100&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Визуализация системы ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Схема дашборда&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Дневной график&amp;quot; as main&lt;br /&gt;
rectangle &amp;quot;30-дневная динамика&amp;quot; as growth&lt;br /&gt;
rectangle &amp;quot;Волатильность&amp;quot; as vol&lt;br /&gt;
rectangle &amp;quot;Итоговый дашборд&amp;quot; as dashboard&lt;br /&gt;
&lt;br /&gt;
main --&amp;gt; dashboard&lt;br /&gt;
growth --&amp;gt; dashboard&lt;br /&gt;
vol --&amp;gt; dashboard&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Основной график ===&lt;br /&gt;
* дневные изменения валют&lt;br /&gt;
* цветовая группировка: рост / падение / мировые&lt;br /&gt;
&lt;br /&gt;
=== Волатильность ===&lt;br /&gt;
* TOP-10 наиболее нестабильных валют&lt;br /&gt;
&lt;br /&gt;
== Итоговый дашборд ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
final_plot &amp;lt;- (plot_main | plot_vol) /&lt;br /&gt;
              (plot_growth | plot_month)&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вывод ==&lt;br /&gt;
Проект демонстрирует:&lt;br /&gt;
* работу с внешними API&lt;br /&gt;
* обработку временных рядов&lt;br /&gt;
* построение аналитических дашбордов в R&lt;br /&gt;
* визуальную аналитику финансовых данных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Код на R ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute  # Извлекаем список валют из полученного объекта&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(  # Создаём таблицу&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),  # Код валюты (USD, EUR и т.д.)&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),  # Текущий курс валюты&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))  # Предыдущий курс валюты&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]  # Удаляем строки с пропущенными значениями&lt;br /&gt;
&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100  # Считаем процентное изменение курса валют&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]  # Удаляем бесконечные значения&lt;br /&gt;
&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;, # Список основных валют для отдельного анализа&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df_world &amp;lt;- df[df$CharCode %in% popular, ]  # Фильтруем только мировые валюты&lt;br /&gt;
df_world$group &amp;lt;- &amp;quot;Мировые&amp;quot;  # Добавляем метку группы&lt;br /&gt;
&lt;br /&gt;
df_top &amp;lt;- df[!df$CharCode %in% popular, ] # Оставляем все валюты не из списка&lt;br /&gt;
&lt;br /&gt;
df_up &amp;lt;- df_top[df_top$change_pct &amp;gt; 0, ]  # Фильтруем валюты, которые выросли&lt;br /&gt;
df_up &amp;lt;- df_up[order(df_up$change_pct, decreasing = TRUE), ] # Сортируем по убыванию роста&lt;br /&gt;
df_up &amp;lt;- head(df_up, 10) # Берём топ-10 валют роста&lt;br /&gt;
df_up$group &amp;lt;- &amp;quot;Рост&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_down &amp;lt;- df_top[df_top$change_pct &amp;lt; 0, ]  # Фильтруем валюты, которые упали&lt;br /&gt;
df_down &amp;lt;- df_down[order(df_down$change_pct), ]  # Сортируем по сильнейшему падению&lt;br /&gt;
df_down &amp;lt;- head(df_down, 10)  # Берём топ-10 падений&lt;br /&gt;
df_down$group &amp;lt;- &amp;quot;Падение&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_final &amp;lt;- rbind(df_world, df_up, df_down)  # Объединяем мировые + рост + падение в одну таблицу&lt;br /&gt;
&lt;br /&gt;
# График за день&lt;br /&gt;
plot_main &amp;lt;- ggplot(df_final, aes(&lt;br /&gt;
  x = reorder(CharCode, change_pct),  # Сортируем валюты по изменению&lt;br /&gt;
  y = change_pct,  # Значение по оси Y (% изменения)&lt;br /&gt;
  fill = group  # Цвет по группе&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_col() +  # Столбчатый график&lt;br /&gt;
&lt;br /&gt;
  geom_text(  # Подписи значений на столбцах&lt;br /&gt;
    aes(label = paste0(round(change_pct, 2), &amp;quot;%&amp;quot;)),&lt;br /&gt;
    vjust = -0.5,&lt;br /&gt;
    size = 3&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  scale_fill_manual(values = c(  # Цвета для групп&lt;br /&gt;
    &amp;quot;Мировые&amp;quot; = &amp;quot;gray60&amp;quot;,&lt;br /&gt;
    &amp;quot;Рост&amp;quot; = &amp;quot;green3&amp;quot;,&lt;br /&gt;
    &amp;quot;Падение&amp;quot; = &amp;quot;red3&amp;quot;&lt;br /&gt;
  )) +&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(    # Подписи графика&lt;br /&gt;
    title = &amp;quot;Валютный рынок ЦБ РФ&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Изменение (%)&amp;quot;,&lt;br /&gt;
    fill = &amp;quot;Группа&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  expand_limits(y = max(df_final$change_pct) * 1.2)  # Запас по оси Y, чтобы подписи не обрезались&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
currencies &amp;lt;- c(&amp;quot;USD&amp;quot;, &amp;quot;EUR&amp;quot;, &amp;quot;CNY&amp;quot;, &amp;quot;JPY&amp;quot;, &amp;quot;GBP&amp;quot;)  # Список валют для анализа месяца&lt;br /&gt;
dates &amp;lt;- seq(Sys.Date() - 30, Sys.Date(), by = &amp;quot;day&amp;quot;)  # Создаём список дат за последние 30 дней&lt;br /&gt;
&lt;br /&gt;
get_day_data &amp;lt;- function(date) {  # Функция загрузки данных за конкретный день&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;)) # Загружаем данные дня&lt;br /&gt;
&lt;br /&gt;
    data.frame(  # Создаём таблицу по выбранным валютам&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = currencies,&lt;br /&gt;
      Value = sapply(currencies, function(x) data$Valute[[x]]$Value)  # Берём значение каждой валюты&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)  # Если ошибка&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_data &amp;lt;- lapply(dates, get_day_data)  # Получаем данные за все дни&lt;br /&gt;
list_data &amp;lt;- Filter(Negate(is.null), list_data)  # Удаляем пустые результаты&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- do.call(rbind, list_data)  # объединяем в один график&lt;br /&gt;
df_month &amp;lt;- df_month[complete.cases(df_month), ]  # удаляем ненайденное&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- df_month %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  arrange(date) %&amp;gt;%&lt;br /&gt;
  mutate(&lt;br /&gt;
    change_30d_pct = (Value / first(Value) - 1) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  ungroup()&lt;br /&gt;
&lt;br /&gt;
plot_growth &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,&lt;br /&gt;
  y = change_30d_pct,&lt;br /&gt;
  color = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_line(linewidth = 1) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;Накопленное изменение валют за 30 дней (%)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;% изменения&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
get_all_currencies &amp;lt;- function(date) {&lt;br /&gt;
&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
    val &amp;lt;- data$Valute&lt;br /&gt;
&lt;br /&gt;
    data.frame(&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = names(val),&lt;br /&gt;
      Value = sapply(val, function(x) x$Value)&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_all &amp;lt;- lapply(dates, get_all_currencies)&lt;br /&gt;
list_all &amp;lt;- Filter(Negate(is.null), list_all)&lt;br /&gt;
&lt;br /&gt;
df_all &amp;lt;- do.call(rbind, list_all)&lt;br /&gt;
df_all &amp;lt;- df_all[complete.cases(df_all), ]&lt;br /&gt;
&lt;br /&gt;
volatility &amp;lt;- df_all %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  summarise(&lt;br /&gt;
    mean_value = mean(Value, na.rm = TRUE),&lt;br /&gt;
    sd_value = sd(Value, na.rm = TRUE),&lt;br /&gt;
    volatility = sd(log(Value), na.rm = TRUE) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  arrange(desc(volatility)) %&amp;gt;%&lt;br /&gt;
  slice_head(n = 10)&lt;br /&gt;
&lt;br /&gt;
plot_vol &amp;lt;- ggplot(volatility, aes(&lt;br /&gt;
  x = reorder(CharCode, volatility),&lt;br /&gt;
  y = volatility,&lt;br /&gt;
  fill = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_col(width = 0.7) +&lt;br /&gt;
  &lt;br /&gt;
  geom_text(&lt;br /&gt;
    aes(label = round(volatility, 2)),&lt;br /&gt;
    hjust = -0.2,&lt;br /&gt;
    size = 3.5&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  coord_flip() +&lt;br /&gt;
&lt;br /&gt;
scale_y_continuous(expand = expansion(mult = c(0, 0.25))) +&lt;br /&gt;
  &lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  theme(&lt;br /&gt;
    legend.position = &amp;quot;none&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;ТОП-10 самых волатильных валют (30 дней)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Волатильность (%)&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# График за месяц&lt;br /&gt;
plot_month &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,  # Ось X — дата&lt;br /&gt;
  y = Value,    # Ось Y — курс валюты&lt;br /&gt;
  color = CharCode,  # Цвет линий по валюте&lt;br /&gt;
  group = CharCode  # Группировка линий&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_line(linewidth = 1) + # Линия графика&lt;br /&gt;
  geom_point(size = 1.5) + # Точки на линии&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(  # Подписи&lt;br /&gt;
    title = &amp;quot;Динамика валют за 30 дней&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Курс к RUB&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
# Объединение графиков&lt;br /&gt;
final_plot &amp;lt;- (plot_main | plot_vol) /&lt;br /&gt;
              (plot_growth| plot_month)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)  # Вывод на экран&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,  # Сохранение в PNG файл&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Результаты ==&lt;br /&gt;
[[Файл:Таблица Валюты.png|обрамить]]&lt;br /&gt;
[[Файл:Графики Валют.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;br /&gt;
[[Категория: RRecipe]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46182</id>
		<title>Изучение изменения стоимости валют по данным ЦБ</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46182"/>
		<updated>2026-04-14T08:22:52Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание проекта ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Анализ валютного рынка ЦБ РФ на основе R. Построение дашборда: дневные изменения, 30-дневная динамика и волатильность валют.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Назначение ==&lt;br /&gt;
Проект позволяет оценить характер изменения стоимости валют по данным ЦБ.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Общая концепция ==&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Уровни анализа валютного дашборда&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Источник данных (CBR API)&amp;quot; as data&lt;br /&gt;
rectangle &amp;quot;Сбор данных (httr + JSON)&amp;quot; as collect&lt;br /&gt;
rectangle &amp;quot;Обработка (R data.frame)&amp;quot; as process&lt;br /&gt;
rectangle &amp;quot;Метрики (изменения, волатильность)&amp;quot; as metrics&lt;br /&gt;
rectangle &amp;quot;Визуализация (ggplot2 + patchwork)&amp;quot; as viz&lt;br /&gt;
rectangle &amp;quot;Интерпретация (аналитика)&amp;quot; as interp&lt;br /&gt;
&lt;br /&gt;
data --&amp;gt; collect&lt;br /&gt;
collect --&amp;gt; process&lt;br /&gt;
process --&amp;gt; metrics&lt;br /&gt;
metrics --&amp;gt; viz&lt;br /&gt;
viz --&amp;gt; interp&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Валютный дашборд ЦБ РФ (R + анализ) =&lt;br /&gt;
&lt;br /&gt;
== Цель исследования ==&lt;br /&gt;
Проект направлен на анализ валютного рынка:&lt;br /&gt;
* дневные изменения валют&lt;br /&gt;
* динамика за 30 дней&lt;br /&gt;
* волатильность валют&lt;br /&gt;
* сравнение мировых и остальных валют&lt;br /&gt;
&lt;br /&gt;
== Источник данных ==&lt;br /&gt;
Данные берутся из API ЦБ РФ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://www.cbr-xml-daily.ru/daily_json.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Исторические данные:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://www.cbr-xml-daily.ru/archive/YYYY/MM/DD/daily_json.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Архитектура обработки данных ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Поток обработки данных&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;CBR API&amp;quot; as api&lt;br /&gt;
rectangle &amp;quot;HTTP GET&amp;quot; as http&lt;br /&gt;
rectangle &amp;quot;JSON parsing&amp;quot; as json&lt;br /&gt;
rectangle &amp;quot;data.frame&amp;quot; as df&lt;br /&gt;
rectangle &amp;quot;Feature engineering&amp;quot; as feat&lt;br /&gt;
rectangle &amp;quot;Visualization&amp;quot; as plot&lt;br /&gt;
&lt;br /&gt;
api --&amp;gt; http&lt;br /&gt;
http --&amp;gt; json&lt;br /&gt;
json --&amp;gt; df&lt;br /&gt;
df --&amp;gt; feat&lt;br /&gt;
feat --&amp;gt; plot&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 📊 Структура данных ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Структура валютных данных&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Date&amp;quot; as date&lt;br /&gt;
rectangle &amp;quot;Currency Code&amp;quot; as code&lt;br /&gt;
rectangle &amp;quot;Value&amp;quot; as value&lt;br /&gt;
rectangle &amp;quot;Previous Value&amp;quot; as prev&lt;br /&gt;
rectangle &amp;quot;Change %&amp;quot; as change&lt;br /&gt;
&lt;br /&gt;
date --&amp;gt; value&lt;br /&gt;
code --&amp;gt; value&lt;br /&gt;
prev --&amp;gt; change&lt;br /&gt;
value --&amp;gt; change&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Загрузка и подготовка данных ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сегментация валют ==&lt;br /&gt;
&lt;br /&gt;
Мировые валюты:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;,&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Логика анализа ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Логика обработки валют&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Все валюты&amp;quot; as all&lt;br /&gt;
rectangle &amp;quot;Мировые валюты&amp;quot; as world&lt;br /&gt;
rectangle &amp;quot;Рост&amp;quot; as up&lt;br /&gt;
rectangle &amp;quot;Падение&amp;quot; as down&lt;br /&gt;
&lt;br /&gt;
all --&amp;gt; world&lt;br /&gt;
all --&amp;gt; up&lt;br /&gt;
all --&amp;gt; down&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Дневной анализ ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
title Группы валют&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Мировые&amp;quot; as world&lt;br /&gt;
rectangle &amp;quot;Рост&amp;quot; as up&lt;br /&gt;
rectangle &amp;quot;Падение&amp;quot; as down&lt;br /&gt;
&lt;br /&gt;
world --&amp;gt; &amp;quot;Сравнительный анализ&amp;quot;&lt;br /&gt;
up --&amp;gt; &amp;quot;Топ роста&amp;quot;&lt;br /&gt;
down --&amp;gt; &amp;quot;Топ падения&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 30-дневная динамика ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм:&lt;br /&gt;
# загрузка архивных данных ЦБ&lt;br /&gt;
# формирование временного ряда&lt;br /&gt;
# расчёт накопленного изменения&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
change_30d_pct = (Value / first(Value) - 1) * 100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Волатильность ==&lt;br /&gt;
&lt;br /&gt;
Формула:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
Volatility = sd(\log(Value)) \times 100&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Визуализация системы ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
title Схема дашборда&lt;br /&gt;
&lt;br /&gt;
rectangle &amp;quot;Дневной график&amp;quot; as main&lt;br /&gt;
rectangle &amp;quot;30-дневная динамика&amp;quot; as growth&lt;br /&gt;
rectangle &amp;quot;Волатильность&amp;quot; as vol&lt;br /&gt;
rectangle &amp;quot;Итоговый дашборд&amp;quot; as dashboard&lt;br /&gt;
&lt;br /&gt;
main --&amp;gt; dashboard&lt;br /&gt;
growth --&amp;gt; dashboard&lt;br /&gt;
vol --&amp;gt; dashboard&lt;br /&gt;
&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Основной график ===&lt;br /&gt;
* дневные изменения валют&lt;br /&gt;
* цветовая группировка: рост / падение / мировые&lt;br /&gt;
&lt;br /&gt;
=== Волатильность ===&lt;br /&gt;
* TOP-10 наиболее нестабильных валют&lt;br /&gt;
&lt;br /&gt;
== Итоговый дашборд ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
final_plot &amp;lt;- (plot_main | plot_vol) /&lt;br /&gt;
              (plot_growth | plot_month)&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вывод ==&lt;br /&gt;
Проект демонстрирует:&lt;br /&gt;
* работу с внешними API&lt;br /&gt;
* обработку временных рядов&lt;br /&gt;
* построение аналитических дашбордов в R&lt;br /&gt;
* визуальную аналитику финансовых данных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute  # Извлекаем список валют из полученного объекта&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(  # Создаём таблицу&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),  # Код валюты (USD, EUR и т.д.)&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),  # Текущий курс валюты&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))  # Предыдущий курс валюты&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]  # Удаляем строки с пропущенными значениями&lt;br /&gt;
&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100  # Считаем процентное изменение курса валют&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]  # Удаляем бесконечные значения&lt;br /&gt;
&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;, # Список основных валют для отдельного анализа&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df_world &amp;lt;- df[df$CharCode %in% popular, ]  # Фильтруем только мировые валюты&lt;br /&gt;
df_world$group &amp;lt;- &amp;quot;Мировые&amp;quot;  # Добавляем метку группы&lt;br /&gt;
&lt;br /&gt;
df_top &amp;lt;- df[!df$CharCode %in% popular, ] # Оставляем все валюты не из списка&lt;br /&gt;
&lt;br /&gt;
df_up &amp;lt;- df_top[df_top$change_pct &amp;gt; 0, ]  # Фильтруем валюты, которые выросли&lt;br /&gt;
df_up &amp;lt;- df_up[order(df_up$change_pct, decreasing = TRUE), ] # Сортируем по убыванию роста&lt;br /&gt;
df_up &amp;lt;- head(df_up, 10) # Берём топ-10 валют роста&lt;br /&gt;
df_up$group &amp;lt;- &amp;quot;Рост&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_down &amp;lt;- df_top[df_top$change_pct &amp;lt; 0, ]  # Фильтруем валюты, которые упали&lt;br /&gt;
df_down &amp;lt;- df_down[order(df_down$change_pct), ]  # Сортируем по сильнейшему падению&lt;br /&gt;
df_down &amp;lt;- head(df_down, 10)  # Берём топ-10 падений&lt;br /&gt;
df_down$group &amp;lt;- &amp;quot;Падение&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_final &amp;lt;- rbind(df_world, df_up, df_down)  # Объединяем мировые + рост + падение в одну таблицу&lt;br /&gt;
&lt;br /&gt;
# График за день&lt;br /&gt;
plot_main &amp;lt;- ggplot(df_final, aes(&lt;br /&gt;
  x = reorder(CharCode, change_pct),  # Сортируем валюты по изменению&lt;br /&gt;
  y = change_pct,  # Значение по оси Y (% изменения)&lt;br /&gt;
  fill = group  # Цвет по группе&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_col() +  # Столбчатый график&lt;br /&gt;
&lt;br /&gt;
  geom_text(  # Подписи значений на столбцах&lt;br /&gt;
    aes(label = paste0(round(change_pct, 2), &amp;quot;%&amp;quot;)),&lt;br /&gt;
    vjust = -0.5,&lt;br /&gt;
    size = 3&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  scale_fill_manual(values = c(  # Цвета для групп&lt;br /&gt;
    &amp;quot;Мировые&amp;quot; = &amp;quot;gray60&amp;quot;,&lt;br /&gt;
    &amp;quot;Рост&amp;quot; = &amp;quot;green3&amp;quot;,&lt;br /&gt;
    &amp;quot;Падение&amp;quot; = &amp;quot;red3&amp;quot;&lt;br /&gt;
  )) +&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(    # Подписи графика&lt;br /&gt;
    title = &amp;quot;Валютный рынок ЦБ РФ&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Изменение (%)&amp;quot;,&lt;br /&gt;
    fill = &amp;quot;Группа&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  expand_limits(y = max(df_final$change_pct) * 1.2)  # Запас по оси Y, чтобы подписи не обрезались&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
currencies &amp;lt;- c(&amp;quot;USD&amp;quot;, &amp;quot;EUR&amp;quot;, &amp;quot;CNY&amp;quot;, &amp;quot;JPY&amp;quot;, &amp;quot;GBP&amp;quot;)  # Список валют для анализа месяца&lt;br /&gt;
dates &amp;lt;- seq(Sys.Date() - 30, Sys.Date(), by = &amp;quot;day&amp;quot;)  # Создаём список дат за последние 30 дней&lt;br /&gt;
&lt;br /&gt;
get_day_data &amp;lt;- function(date) {  # Функция загрузки данных за конкретный день&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;)) # Загружаем данные дня&lt;br /&gt;
&lt;br /&gt;
    data.frame(  # Создаём таблицу по выбранным валютам&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = currencies,&lt;br /&gt;
      Value = sapply(currencies, function(x) data$Valute[[x]]$Value)  # Берём значение каждой валюты&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)  # Если ошибка&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_data &amp;lt;- lapply(dates, get_day_data)  # Получаем данные за все дни&lt;br /&gt;
list_data &amp;lt;- Filter(Negate(is.null), list_data)  # Удаляем пустые результаты&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- do.call(rbind, list_data)  # объединяем в один график&lt;br /&gt;
df_month &amp;lt;- df_month[complete.cases(df_month), ]  # удаляем ненайденное&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- df_month %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  arrange(date) %&amp;gt;%&lt;br /&gt;
  mutate(&lt;br /&gt;
    change_30d_pct = (Value / first(Value) - 1) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  ungroup()&lt;br /&gt;
&lt;br /&gt;
plot_growth &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,&lt;br /&gt;
  y = change_30d_pct,&lt;br /&gt;
  color = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_line(linewidth = 1) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;Накопленное изменение валют за 30 дней (%)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;% изменения&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
get_all_currencies &amp;lt;- function(date) {&lt;br /&gt;
&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
    val &amp;lt;- data$Valute&lt;br /&gt;
&lt;br /&gt;
    data.frame(&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = names(val),&lt;br /&gt;
      Value = sapply(val, function(x) x$Value)&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_all &amp;lt;- lapply(dates, get_all_currencies)&lt;br /&gt;
list_all &amp;lt;- Filter(Negate(is.null), list_all)&lt;br /&gt;
&lt;br /&gt;
df_all &amp;lt;- do.call(rbind, list_all)&lt;br /&gt;
df_all &amp;lt;- df_all[complete.cases(df_all), ]&lt;br /&gt;
&lt;br /&gt;
volatility &amp;lt;- df_all %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  summarise(&lt;br /&gt;
    mean_value = mean(Value, na.rm = TRUE),&lt;br /&gt;
    sd_value = sd(Value, na.rm = TRUE),&lt;br /&gt;
    volatility = sd(log(Value), na.rm = TRUE) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  arrange(desc(volatility)) %&amp;gt;%&lt;br /&gt;
  slice_head(n = 10)&lt;br /&gt;
&lt;br /&gt;
plot_vol &amp;lt;- ggplot(volatility, aes(&lt;br /&gt;
  x = reorder(CharCode, volatility),&lt;br /&gt;
  y = volatility,&lt;br /&gt;
  fill = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_col(width = 0.7) +&lt;br /&gt;
  &lt;br /&gt;
  geom_text(&lt;br /&gt;
    aes(label = round(volatility, 2)),&lt;br /&gt;
    hjust = -0.2,&lt;br /&gt;
    size = 3.5&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  coord_flip() +&lt;br /&gt;
&lt;br /&gt;
scale_y_continuous(expand = expansion(mult = c(0, 0.25))) +&lt;br /&gt;
  &lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  theme(&lt;br /&gt;
    legend.position = &amp;quot;none&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;ТОП-10 самых волатильных валют (30 дней)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Волатильность (%)&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# График за месяц&lt;br /&gt;
plot_month &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,  # Ось X — дата&lt;br /&gt;
  y = Value,    # Ось Y — курс валюты&lt;br /&gt;
  color = CharCode,  # Цвет линий по валюте&lt;br /&gt;
  group = CharCode  # Группировка линий&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_line(linewidth = 1) + # Линия графика&lt;br /&gt;
  geom_point(size = 1.5) + # Точки на линии&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(  # Подписи&lt;br /&gt;
    title = &amp;quot;Динамика валют за 30 дней&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Курс к RUB&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
# Объединение графиков&lt;br /&gt;
final_plot &amp;lt;- (plot_main | plot_vol) /&lt;br /&gt;
              (plot_growth| plot_month)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)  # Вывод на экран&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,  # Сохранение в PNG файл&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Результаты ==&lt;br /&gt;
[[Файл:Таблица Валюты.png|обрамить]]&lt;br /&gt;
[[Файл:Графики Валют.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=46172</id>
		<title>Участник:Vladislav Leontev</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=46172"/>
		<updated>2026-04-14T08:04:20Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент группы ИНДОР-211.&lt;br /&gt;
|Field_of_knowledge=Математика, Информатика, Робототехника, Педагогика, Образование, Интернет вещей, Большие данные, Алгебра, Технология&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Working_On=Анализ погоды за последнюю неделю, Изучение изменения стоимости валют по данным ЦБ&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D0%9B%D0%B5%D0%BE%D0%BD%D1%82%D1%8C%D0%B5%D0%B2_R2&amp;diff=46171</id>
		<title>Проект Леонтьев R2</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D0%9B%D0%B5%D0%BE%D0%BD%D1%82%D1%8C%D0%B5%D0%B2_R2&amp;diff=46171"/>
		<updated>2026-04-14T08:03:35Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: Vladislav Leontev переименовал страницу Проект Леонтьев R2 в Анализ погоды за последнюю неделю: Название с ошибкой&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Анализ погоды за последнюю неделю]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46170</id>
		<title>Анализ погоды за последнюю неделю</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46170"/>
		<updated>2026-04-14T08:03:35Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: Vladislav Leontev переименовал страницу Проект Леонтьев R2 в Анализ погоды за последнюю неделю: Название с ошибкой&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание проекта ==&lt;br /&gt;
Анализ погоды за последнюю неделю.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(dplyr)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
start_date &amp;lt;- as.character(Sys.Date() - 8)  # Начало периода (7 дней назад)&lt;br /&gt;
end_date   &amp;lt;- as.character(Sys.Date() - 1)  # Конец периода (вчера)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- paste0(&lt;br /&gt;
  &amp;quot;https://archive-api.open-meteo.com/v1/archive?&amp;quot;,&lt;br /&gt;
  &amp;quot;latitude=55.7558&amp;amp;longitude=37.6173&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;start_date=&amp;quot;, start_date,&lt;br /&gt;
  &amp;quot;&amp;amp;end_date=&amp;quot;, end_date,&lt;br /&gt;
  &amp;quot;&amp;amp;hourly=temperature_2m,precipitation,cloudcover,windspeed_10m&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;timezone=Europe/Moscow&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
res &amp;lt;- GET(url)  # Отправка запроса&lt;br /&gt;
&lt;br /&gt;
stop_for_status(res)  # Остановка, если ошибка&lt;br /&gt;
&lt;br /&gt;
text &amp;lt;- content(res, &amp;quot;text&amp;quot;, encoding = &amp;quot;UTF-8&amp;quot;) # Извлекаем текст ответа&lt;br /&gt;
json &amp;lt;- fromJSON(text)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(&lt;br /&gt;
  datetime = json$hourly$time,&lt;br /&gt;
  temp     = json$hourly$temperature_2m,&lt;br /&gt;
  precip   = json$hourly$precipitation,&lt;br /&gt;
  cloud    = json$hourly$cloudcover,&lt;br /&gt;
  wind     = json$hourly$windspeed_10m&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df$datetime &amp;lt;- as.POSIXct(df$datetime, format = &amp;quot;%Y-%m-%dT%H:%M&amp;quot;, tz = &amp;quot;Europe/Moscow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df$date &amp;lt;- as.Date(df$datetime)  # Выделяем дату&lt;br /&gt;
df$hour &amp;lt;- format(df$datetime, &amp;quot;%H:%M&amp;quot;)  # Выделяем час&lt;br /&gt;
&lt;br /&gt;
df_table &amp;lt;- df %&amp;gt;%&lt;br /&gt;
  select(date, hour, temp, precip, cloud, wind) %&amp;gt;%  # Выбираем нужные колонки&lt;br /&gt;
  arrange(date, hour)  # Сортировка по времени&lt;br /&gt;
&lt;br /&gt;
print(head(df_table, 20))  # Вывод первых строк&lt;br /&gt;
View(df_table)  # открытие таблицы&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Графики&lt;br /&gt;
plot_temp &amp;lt;- ggplot(df, aes(datetime, temp)) +&lt;br /&gt;
  geom_line(color = &amp;quot;red&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Температура (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;°C&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_precip &amp;lt;- ggplot(df, aes(datetime, precip)) +&lt;br /&gt;
  geom_col(fill = &amp;quot;blue&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Осадки (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;mm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_cloud &amp;lt;- ggplot(df, aes(datetime, cloud)) +&lt;br /&gt;
  geom_line(color = &amp;quot;gray40&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Облачность (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;%&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_wind &amp;lt;- ggplot(df, aes(datetime, wind)) +&lt;br /&gt;
  geom_line(color = &amp;quot;darkgreen&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Ветер (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;m/s&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
final_plot &amp;lt;- (plot_temp | plot_precip) /  # Объединение графиков&lt;br /&gt;
              (plot_cloud | plot_wind)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;moscow_weather_7days.png&amp;quot;,  # Сохранение картинки&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Результаты ==&lt;br /&gt;
[[Файл:Таблица Погода.png|обрамить]]&lt;br /&gt;
[[Файл:График Погода.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;br /&gt;
[[Категория: RRecipe]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=46169</id>
		<title>Участник:Vladislav Leontev</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=46169"/>
		<updated>2026-04-14T08:03:09Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент группы ИНДОР-211.&lt;br /&gt;
|Field_of_knowledge=Математика, Информатика, Робототехника, Педагогика, Образование, Интернет вещей, Большие данные, Алгебра, Технология&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Working_On=Проект Леонтьев R2, Изучение изменения стоимости валют по данным ЦБ&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46162</id>
		<title>Анализ погоды за последнюю неделю</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46162"/>
		<updated>2026-04-14T07:37:24Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание проекта ==&lt;br /&gt;
Анализ погоды за последнюю неделю.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(dplyr)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
start_date &amp;lt;- as.character(Sys.Date() - 8)  # Начало периода (7 дней назад)&lt;br /&gt;
end_date   &amp;lt;- as.character(Sys.Date() - 1)  # Конец периода (вчера)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- paste0(&lt;br /&gt;
  &amp;quot;https://archive-api.open-meteo.com/v1/archive?&amp;quot;,&lt;br /&gt;
  &amp;quot;latitude=55.7558&amp;amp;longitude=37.6173&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;start_date=&amp;quot;, start_date,&lt;br /&gt;
  &amp;quot;&amp;amp;end_date=&amp;quot;, end_date,&lt;br /&gt;
  &amp;quot;&amp;amp;hourly=temperature_2m,precipitation,cloudcover,windspeed_10m&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;timezone=Europe/Moscow&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
res &amp;lt;- GET(url)  # Отправка запроса&lt;br /&gt;
&lt;br /&gt;
stop_for_status(res)  # Остановка, если ошибка&lt;br /&gt;
&lt;br /&gt;
text &amp;lt;- content(res, &amp;quot;text&amp;quot;, encoding = &amp;quot;UTF-8&amp;quot;) # Извлекаем текст ответа&lt;br /&gt;
json &amp;lt;- fromJSON(text)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(&lt;br /&gt;
  datetime = json$hourly$time,&lt;br /&gt;
  temp     = json$hourly$temperature_2m,&lt;br /&gt;
  precip   = json$hourly$precipitation,&lt;br /&gt;
  cloud    = json$hourly$cloudcover,&lt;br /&gt;
  wind     = json$hourly$windspeed_10m&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df$datetime &amp;lt;- as.POSIXct(df$datetime, format = &amp;quot;%Y-%m-%dT%H:%M&amp;quot;, tz = &amp;quot;Europe/Moscow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df$date &amp;lt;- as.Date(df$datetime)  # Выделяем дату&lt;br /&gt;
df$hour &amp;lt;- format(df$datetime, &amp;quot;%H:%M&amp;quot;)  # Выделяем час&lt;br /&gt;
&lt;br /&gt;
df_table &amp;lt;- df %&amp;gt;%&lt;br /&gt;
  select(date, hour, temp, precip, cloud, wind) %&amp;gt;%  # Выбираем нужные колонки&lt;br /&gt;
  arrange(date, hour)  # Сортировка по времени&lt;br /&gt;
&lt;br /&gt;
print(head(df_table, 20))  # Вывод первых строк&lt;br /&gt;
View(df_table)  # открытие таблицы&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Графики&lt;br /&gt;
plot_temp &amp;lt;- ggplot(df, aes(datetime, temp)) +&lt;br /&gt;
  geom_line(color = &amp;quot;red&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Температура (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;°C&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_precip &amp;lt;- ggplot(df, aes(datetime, precip)) +&lt;br /&gt;
  geom_col(fill = &amp;quot;blue&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Осадки (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;mm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_cloud &amp;lt;- ggplot(df, aes(datetime, cloud)) +&lt;br /&gt;
  geom_line(color = &amp;quot;gray40&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Облачность (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;%&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_wind &amp;lt;- ggplot(df, aes(datetime, wind)) +&lt;br /&gt;
  geom_line(color = &amp;quot;darkgreen&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Ветер (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;m/s&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
final_plot &amp;lt;- (plot_temp | plot_precip) /  # Объединение графиков&lt;br /&gt;
              (plot_cloud | plot_wind)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;moscow_weather_7days.png&amp;quot;,  # Сохранение картинки&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Результаты ==&lt;br /&gt;
[[Файл:Таблица Погода.png|обрамить]]&lt;br /&gt;
[[Файл:График Погода.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;br /&gt;
[[Категория: RRecipe]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46161</id>
		<title>Изучение изменения стоимости валют по данным ЦБ</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46161"/>
		<updated>2026-04-14T07:36:46Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание проекта ==&lt;br /&gt;
Проект позволяет оценить характер изменения стоимости валют по данным ЦБ.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute  # Извлекаем список валют из полученного объекта&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(  # Создаём таблицу&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),  # Код валюты (USD, EUR и т.д.)&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),  # Текущий курс валюты&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))  # Предыдущий курс валюты&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]  # Удаляем строки с пропущенными значениями&lt;br /&gt;
&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100  # Считаем процентное изменение курса валют&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]  # Удаляем бесконечные значения&lt;br /&gt;
&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;, # Список основных валют для отдельного анализа&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df_world &amp;lt;- df[df$CharCode %in% popular, ]  # Фильтруем только мировые валюты&lt;br /&gt;
df_world$group &amp;lt;- &amp;quot;Мировые&amp;quot;  # Добавляем метку группы&lt;br /&gt;
&lt;br /&gt;
df_top &amp;lt;- df[!df$CharCode %in% popular, ] # Оставляем все валюты не из списка&lt;br /&gt;
&lt;br /&gt;
df_up &amp;lt;- df_top[df_top$change_pct &amp;gt; 0, ]  # Фильтруем валюты, которые выросли&lt;br /&gt;
df_up &amp;lt;- df_up[order(df_up$change_pct, decreasing = TRUE), ] # Сортируем по убыванию роста&lt;br /&gt;
df_up &amp;lt;- head(df_up, 10) # Берём топ-10 валют роста&lt;br /&gt;
df_up$group &amp;lt;- &amp;quot;Рост&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_down &amp;lt;- df_top[df_top$change_pct &amp;lt; 0, ]  # Фильтруем валюты, которые упали&lt;br /&gt;
df_down &amp;lt;- df_down[order(df_down$change_pct), ]  # Сортируем по сильнейшему падению&lt;br /&gt;
df_down &amp;lt;- head(df_down, 10)  # Берём топ-10 падений&lt;br /&gt;
df_down$group &amp;lt;- &amp;quot;Падение&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_final &amp;lt;- rbind(df_world, df_up, df_down)  # Объединяем мировые + рост + падение в одну таблицу&lt;br /&gt;
&lt;br /&gt;
# График за день&lt;br /&gt;
plot_main &amp;lt;- ggplot(df_final, aes(&lt;br /&gt;
  x = reorder(CharCode, change_pct),  # Сортируем валюты по изменению&lt;br /&gt;
  y = change_pct,  # Значение по оси Y (% изменения)&lt;br /&gt;
  fill = group  # Цвет по группе&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_col() +  # Столбчатый график&lt;br /&gt;
&lt;br /&gt;
  geom_text(  # Подписи значений на столбцах&lt;br /&gt;
    aes(label = paste0(round(change_pct, 2), &amp;quot;%&amp;quot;)),&lt;br /&gt;
    vjust = -0.5,&lt;br /&gt;
    size = 3&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  scale_fill_manual(values = c(  # Цвета для групп&lt;br /&gt;
    &amp;quot;Мировые&amp;quot; = &amp;quot;gray60&amp;quot;,&lt;br /&gt;
    &amp;quot;Рост&amp;quot; = &amp;quot;green3&amp;quot;,&lt;br /&gt;
    &amp;quot;Падение&amp;quot; = &amp;quot;red3&amp;quot;&lt;br /&gt;
  )) +&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(    # Подписи графика&lt;br /&gt;
    title = &amp;quot;Валютный рынок ЦБ РФ&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Изменение (%)&amp;quot;,&lt;br /&gt;
    fill = &amp;quot;Группа&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  expand_limits(y = max(df_final$change_pct) * 1.2)  # Запас по оси Y, чтобы подписи не обрезались&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
currencies &amp;lt;- c(&amp;quot;USD&amp;quot;, &amp;quot;EUR&amp;quot;, &amp;quot;CNY&amp;quot;, &amp;quot;JPY&amp;quot;, &amp;quot;GBP&amp;quot;)  # Список валют для анализа месяца&lt;br /&gt;
dates &amp;lt;- seq(Sys.Date() - 30, Sys.Date(), by = &amp;quot;day&amp;quot;)  # Создаём список дат за последние 30 дней&lt;br /&gt;
&lt;br /&gt;
get_day_data &amp;lt;- function(date) {  # Функция загрузки данных за конкретный день&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;)) # Загружаем данные дня&lt;br /&gt;
&lt;br /&gt;
    data.frame(  # Создаём таблицу по выбранным валютам&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = currencies,&lt;br /&gt;
      Value = sapply(currencies, function(x) data$Valute[[x]]$Value)  # Берём значение каждой валюты&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)  # Если ошибка&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_data &amp;lt;- lapply(dates, get_day_data)  # Получаем данные за все дни&lt;br /&gt;
list_data &amp;lt;- Filter(Negate(is.null), list_data)  # Удаляем пустые результаты&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- do.call(rbind, list_data)  # объединяем в один график&lt;br /&gt;
df_month &amp;lt;- df_month[complete.cases(df_month), ]  # удаляем ненайденное&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- df_month %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  arrange(date) %&amp;gt;%&lt;br /&gt;
  mutate(&lt;br /&gt;
    change_30d_pct = (Value / first(Value) - 1) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  ungroup()&lt;br /&gt;
&lt;br /&gt;
plot_growth &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,&lt;br /&gt;
  y = change_30d_pct,&lt;br /&gt;
  color = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_line(linewidth = 1) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;Накопленное изменение валют за 30 дней (%)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;% изменения&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
get_all_currencies &amp;lt;- function(date) {&lt;br /&gt;
&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
    val &amp;lt;- data$Valute&lt;br /&gt;
&lt;br /&gt;
    data.frame(&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = names(val),&lt;br /&gt;
      Value = sapply(val, function(x) x$Value)&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_all &amp;lt;- lapply(dates, get_all_currencies)&lt;br /&gt;
list_all &amp;lt;- Filter(Negate(is.null), list_all)&lt;br /&gt;
&lt;br /&gt;
df_all &amp;lt;- do.call(rbind, list_all)&lt;br /&gt;
df_all &amp;lt;- df_all[complete.cases(df_all), ]&lt;br /&gt;
&lt;br /&gt;
volatility &amp;lt;- df_all %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  summarise(&lt;br /&gt;
    mean_value = mean(Value, na.rm = TRUE),&lt;br /&gt;
    sd_value = sd(Value, na.rm = TRUE),&lt;br /&gt;
    volatility = sd(log(Value), na.rm = TRUE) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  arrange(desc(volatility)) %&amp;gt;%&lt;br /&gt;
  slice_head(n = 10)&lt;br /&gt;
&lt;br /&gt;
plot_vol &amp;lt;- ggplot(volatility, aes(&lt;br /&gt;
  x = reorder(CharCode, volatility),&lt;br /&gt;
  y = volatility,&lt;br /&gt;
  fill = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_col(width = 0.7) +&lt;br /&gt;
  &lt;br /&gt;
  geom_text(&lt;br /&gt;
    aes(label = round(volatility, 2)),&lt;br /&gt;
    hjust = -0.2,&lt;br /&gt;
    size = 3.5&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  coord_flip() +&lt;br /&gt;
&lt;br /&gt;
scale_y_continuous(expand = expansion(mult = c(0, 0.25))) +&lt;br /&gt;
  &lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  theme(&lt;br /&gt;
    legend.position = &amp;quot;none&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;ТОП-10 самых волатильных валют (30 дней)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Волатильность (%)&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# График за месяц&lt;br /&gt;
plot_month &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,  # Ось X — дата&lt;br /&gt;
  y = Value,    # Ось Y — курс валюты&lt;br /&gt;
  color = CharCode,  # Цвет линий по валюте&lt;br /&gt;
  group = CharCode  # Группировка линий&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_line(linewidth = 1) + # Линия графика&lt;br /&gt;
  geom_point(size = 1.5) + # Точки на линии&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(  # Подписи&lt;br /&gt;
    title = &amp;quot;Динамика валют за 30 дней&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Курс к RUB&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
# Объединение графиков&lt;br /&gt;
final_plot &amp;lt;- (plot_main | plot_vol) /&lt;br /&gt;
              (plot_growth| plot_month)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)  # Вывод на экран&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,  # Сохранение в PNG файл&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Результаты ==&lt;br /&gt;
[[Файл:Таблица Валюты.png|обрамить]]&lt;br /&gt;
[[Файл:Графики Валют.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46160</id>
		<title>Изучение изменения стоимости валют по данным ЦБ</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46160"/>
		<updated>2026-04-14T07:36:16Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание проекта ==&lt;br /&gt;
Проект позволяет оценить характер изменения стоимости валют по данным ЦБ.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute  # Извлекаем список валют из полученного объекта&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(  # Создаём таблицу&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),  # Код валюты (USD, EUR и т.д.)&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),  # Текущий курс валюты&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))  # Предыдущий курс валюты&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]  # Удаляем строки с пропущенными значениями&lt;br /&gt;
&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100  # Считаем процентное изменение курса валют&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]  # Удаляем бесконечные значения&lt;br /&gt;
&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;, # Список основных валют для отдельного анализа&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df_world &amp;lt;- df[df$CharCode %in% popular, ]  # Фильтруем только мировые валюты&lt;br /&gt;
df_world$group &amp;lt;- &amp;quot;Мировые&amp;quot;  # Добавляем метку группы&lt;br /&gt;
&lt;br /&gt;
df_top &amp;lt;- df[!df$CharCode %in% popular, ] # Оставляем все валюты не из списка&lt;br /&gt;
&lt;br /&gt;
df_up &amp;lt;- df_top[df_top$change_pct &amp;gt; 0, ]  # Фильтруем валюты, которые выросли&lt;br /&gt;
df_up &amp;lt;- df_up[order(df_up$change_pct, decreasing = TRUE), ] # Сортируем по убыванию роста&lt;br /&gt;
df_up &amp;lt;- head(df_up, 10) # Берём топ-10 валют роста&lt;br /&gt;
df_up$group &amp;lt;- &amp;quot;Рост&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_down &amp;lt;- df_top[df_top$change_pct &amp;lt; 0, ]  # Фильтруем валюты, которые упали&lt;br /&gt;
df_down &amp;lt;- df_down[order(df_down$change_pct), ]  # Сортируем по сильнейшему падению&lt;br /&gt;
df_down &amp;lt;- head(df_down, 10)  # Берём топ-10 падений&lt;br /&gt;
df_down$group &amp;lt;- &amp;quot;Падение&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_final &amp;lt;- rbind(df_world, df_up, df_down)  # Объединяем мировые + рост + падение в одну таблицу&lt;br /&gt;
&lt;br /&gt;
# График за день&lt;br /&gt;
plot_main &amp;lt;- ggplot(df_final, aes(&lt;br /&gt;
  x = reorder(CharCode, change_pct),  # Сортируем валюты по изменению&lt;br /&gt;
  y = change_pct,  # Значение по оси Y (% изменения)&lt;br /&gt;
  fill = group  # Цвет по группе&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_col() +  # Столбчатый график&lt;br /&gt;
&lt;br /&gt;
  geom_text(  # Подписи значений на столбцах&lt;br /&gt;
    aes(label = paste0(round(change_pct, 2), &amp;quot;%&amp;quot;)),&lt;br /&gt;
    vjust = -0.5,&lt;br /&gt;
    size = 3&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  scale_fill_manual(values = c(  # Цвета для групп&lt;br /&gt;
    &amp;quot;Мировые&amp;quot; = &amp;quot;gray60&amp;quot;,&lt;br /&gt;
    &amp;quot;Рост&amp;quot; = &amp;quot;green3&amp;quot;,&lt;br /&gt;
    &amp;quot;Падение&amp;quot; = &amp;quot;red3&amp;quot;&lt;br /&gt;
  )) +&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(    # Подписи графика&lt;br /&gt;
    title = &amp;quot;Валютный рынок ЦБ РФ&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Изменение (%)&amp;quot;,&lt;br /&gt;
    fill = &amp;quot;Группа&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  expand_limits(y = max(df_final$change_pct) * 1.2)  # Запас по оси Y, чтобы подписи не обрезались&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
currencies &amp;lt;- c(&amp;quot;USD&amp;quot;, &amp;quot;EUR&amp;quot;, &amp;quot;CNY&amp;quot;, &amp;quot;JPY&amp;quot;, &amp;quot;GBP&amp;quot;)  # Список валют для анализа месяца&lt;br /&gt;
dates &amp;lt;- seq(Sys.Date() - 30, Sys.Date(), by = &amp;quot;day&amp;quot;)  # Создаём список дат за последние 30 дней&lt;br /&gt;
&lt;br /&gt;
get_day_data &amp;lt;- function(date) {  # Функция загрузки данных за конкретный день&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;)) # Загружаем данные дня&lt;br /&gt;
&lt;br /&gt;
    data.frame(  # Создаём таблицу по выбранным валютам&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = currencies,&lt;br /&gt;
      Value = sapply(currencies, function(x) data$Valute[[x]]$Value)  # Берём значение каждой валюты&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)  # Если ошибка&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_data &amp;lt;- lapply(dates, get_day_data)  # Получаем данные за все дни&lt;br /&gt;
list_data &amp;lt;- Filter(Negate(is.null), list_data)  # Удаляем пустые результаты&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- do.call(rbind, list_data)  # объединяем в один график&lt;br /&gt;
df_month &amp;lt;- df_month[complete.cases(df_month), ]  # удаляем ненайденное&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- df_month %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  arrange(date) %&amp;gt;%&lt;br /&gt;
  mutate(&lt;br /&gt;
    change_30d_pct = (Value / first(Value) - 1) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  ungroup()&lt;br /&gt;
&lt;br /&gt;
plot_growth &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,&lt;br /&gt;
  y = change_30d_pct,&lt;br /&gt;
  color = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_line(linewidth = 1) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;Накопленное изменение валют за 30 дней (%)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;% изменения&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
get_all_currencies &amp;lt;- function(date) {&lt;br /&gt;
&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
    val &amp;lt;- data$Valute&lt;br /&gt;
&lt;br /&gt;
    data.frame(&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = names(val),&lt;br /&gt;
      Value = sapply(val, function(x) x$Value)&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_all &amp;lt;- lapply(dates, get_all_currencies)&lt;br /&gt;
list_all &amp;lt;- Filter(Negate(is.null), list_all)&lt;br /&gt;
&lt;br /&gt;
df_all &amp;lt;- do.call(rbind, list_all)&lt;br /&gt;
df_all &amp;lt;- df_all[complete.cases(df_all), ]&lt;br /&gt;
&lt;br /&gt;
volatility &amp;lt;- df_all %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  summarise(&lt;br /&gt;
    mean_value = mean(Value, na.rm = TRUE),&lt;br /&gt;
    sd_value = sd(Value, na.rm = TRUE),&lt;br /&gt;
    volatility = sd(log(Value), na.rm = TRUE) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  arrange(desc(volatility)) %&amp;gt;%&lt;br /&gt;
  slice_head(n = 10)&lt;br /&gt;
&lt;br /&gt;
plot_vol &amp;lt;- ggplot(volatility, aes(&lt;br /&gt;
  x = reorder(CharCode, volatility),&lt;br /&gt;
  y = volatility,&lt;br /&gt;
  fill = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_col(width = 0.7) +&lt;br /&gt;
  &lt;br /&gt;
  geom_text(&lt;br /&gt;
    aes(label = round(volatility, 2)),&lt;br /&gt;
    hjust = -0.2,&lt;br /&gt;
    size = 3.5&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  coord_flip() +&lt;br /&gt;
&lt;br /&gt;
scale_y_continuous(expand = expansion(mult = c(0, 0.25))) +&lt;br /&gt;
  &lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  theme(&lt;br /&gt;
    legend.position = &amp;quot;none&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;ТОП-10 самых волатильных валют (30 дней)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Волатильность (%)&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# График за месяц&lt;br /&gt;
plot_month &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,  # Ось X — дата&lt;br /&gt;
  y = Value,    # Ось Y — курс валюты&lt;br /&gt;
  color = CharCode,  # Цвет линий по валюте&lt;br /&gt;
  group = CharCode  # Группировка линий&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_line(linewidth = 1) + # Линия графика&lt;br /&gt;
  geom_point(size = 1.5) + # Точки на линии&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(  # Подписи&lt;br /&gt;
    title = &amp;quot;Динамика валют за 30 дней&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Курс к RUB&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
# Объединение графиков&lt;br /&gt;
final_plot &amp;lt;- (plot_main | plot_vol) /&lt;br /&gt;
              (plot_growth| plot_month)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)  # Вывод на экран&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,  # Сохранение в PNG файл&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Валюты.png|обрамить]]&lt;br /&gt;
[[Файл:Графики Валют.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46159</id>
		<title>Изучение изменения стоимости валют по данным ЦБ</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46159"/>
		<updated>2026-04-14T07:34:05Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute  # Извлекаем список валют из полученного объекта&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(  # Создаём таблицу&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),  # Код валюты (USD, EUR и т.д.)&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),  # Текущий курс валюты&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))  # Предыдущий курс валюты&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]  # Удаляем строки с пропущенными значениями&lt;br /&gt;
&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100  # Считаем процентное изменение курса валют&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]  # Удаляем бесконечные значения&lt;br /&gt;
&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;, # Список основных валют для отдельного анализа&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df_world &amp;lt;- df[df$CharCode %in% popular, ]  # Фильтруем только мировые валюты&lt;br /&gt;
df_world$group &amp;lt;- &amp;quot;Мировые&amp;quot;  # Добавляем метку группы&lt;br /&gt;
&lt;br /&gt;
df_top &amp;lt;- df[!df$CharCode %in% popular, ] # Оставляем все валюты не из списка&lt;br /&gt;
&lt;br /&gt;
df_up &amp;lt;- df_top[df_top$change_pct &amp;gt; 0, ]  # Фильтруем валюты, которые выросли&lt;br /&gt;
df_up &amp;lt;- df_up[order(df_up$change_pct, decreasing = TRUE), ] # Сортируем по убыванию роста&lt;br /&gt;
df_up &amp;lt;- head(df_up, 10) # Берём топ-10 валют роста&lt;br /&gt;
df_up$group &amp;lt;- &amp;quot;Рост&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_down &amp;lt;- df_top[df_top$change_pct &amp;lt; 0, ]  # Фильтруем валюты, которые упали&lt;br /&gt;
df_down &amp;lt;- df_down[order(df_down$change_pct), ]  # Сортируем по сильнейшему падению&lt;br /&gt;
df_down &amp;lt;- head(df_down, 10)  # Берём топ-10 падений&lt;br /&gt;
df_down$group &amp;lt;- &amp;quot;Падение&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_final &amp;lt;- rbind(df_world, df_up, df_down)  # Объединяем мировые + рост + падение в одну таблицу&lt;br /&gt;
&lt;br /&gt;
# График за день&lt;br /&gt;
plot_main &amp;lt;- ggplot(df_final, aes(&lt;br /&gt;
  x = reorder(CharCode, change_pct),  # Сортируем валюты по изменению&lt;br /&gt;
  y = change_pct,  # Значение по оси Y (% изменения)&lt;br /&gt;
  fill = group  # Цвет по группе&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_col() +  # Столбчатый график&lt;br /&gt;
&lt;br /&gt;
  geom_text(  # Подписи значений на столбцах&lt;br /&gt;
    aes(label = paste0(round(change_pct, 2), &amp;quot;%&amp;quot;)),&lt;br /&gt;
    vjust = -0.5,&lt;br /&gt;
    size = 3&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  scale_fill_manual(values = c(  # Цвета для групп&lt;br /&gt;
    &amp;quot;Мировые&amp;quot; = &amp;quot;gray60&amp;quot;,&lt;br /&gt;
    &amp;quot;Рост&amp;quot; = &amp;quot;green3&amp;quot;,&lt;br /&gt;
    &amp;quot;Падение&amp;quot; = &amp;quot;red3&amp;quot;&lt;br /&gt;
  )) +&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(    # Подписи графика&lt;br /&gt;
    title = &amp;quot;Валютный рынок ЦБ РФ&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Изменение (%)&amp;quot;,&lt;br /&gt;
    fill = &amp;quot;Группа&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  expand_limits(y = max(df_final$change_pct) * 1.2)  # Запас по оси Y, чтобы подписи не обрезались&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
currencies &amp;lt;- c(&amp;quot;USD&amp;quot;, &amp;quot;EUR&amp;quot;, &amp;quot;CNY&amp;quot;, &amp;quot;JPY&amp;quot;, &amp;quot;GBP&amp;quot;)  # Список валют для анализа месяца&lt;br /&gt;
dates &amp;lt;- seq(Sys.Date() - 30, Sys.Date(), by = &amp;quot;day&amp;quot;)  # Создаём список дат за последние 30 дней&lt;br /&gt;
&lt;br /&gt;
get_day_data &amp;lt;- function(date) {  # Функция загрузки данных за конкретный день&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;)) # Загружаем данные дня&lt;br /&gt;
&lt;br /&gt;
    data.frame(  # Создаём таблицу по выбранным валютам&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = currencies,&lt;br /&gt;
      Value = sapply(currencies, function(x) data$Valute[[x]]$Value)  # Берём значение каждой валюты&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)  # Если ошибка&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_data &amp;lt;- lapply(dates, get_day_data)  # Получаем данные за все дни&lt;br /&gt;
list_data &amp;lt;- Filter(Negate(is.null), list_data)  # Удаляем пустые результаты&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- do.call(rbind, list_data)  # объединяем в один график&lt;br /&gt;
df_month &amp;lt;- df_month[complete.cases(df_month), ]  # удаляем ненайденное&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- df_month %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  arrange(date) %&amp;gt;%&lt;br /&gt;
  mutate(&lt;br /&gt;
    change_30d_pct = (Value / first(Value) - 1) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  ungroup()&lt;br /&gt;
&lt;br /&gt;
plot_growth &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,&lt;br /&gt;
  y = change_30d_pct,&lt;br /&gt;
  color = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_line(linewidth = 1) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;Накопленное изменение валют за 30 дней (%)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;% изменения&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
get_all_currencies &amp;lt;- function(date) {&lt;br /&gt;
&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
    val &amp;lt;- data$Valute&lt;br /&gt;
&lt;br /&gt;
    data.frame(&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = names(val),&lt;br /&gt;
      Value = sapply(val, function(x) x$Value)&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_all &amp;lt;- lapply(dates, get_all_currencies)&lt;br /&gt;
list_all &amp;lt;- Filter(Negate(is.null), list_all)&lt;br /&gt;
&lt;br /&gt;
df_all &amp;lt;- do.call(rbind, list_all)&lt;br /&gt;
df_all &amp;lt;- df_all[complete.cases(df_all), ]&lt;br /&gt;
&lt;br /&gt;
volatility &amp;lt;- df_all %&amp;gt;%&lt;br /&gt;
  group_by(CharCode) %&amp;gt;%&lt;br /&gt;
  summarise(&lt;br /&gt;
    mean_value = mean(Value, na.rm = TRUE),&lt;br /&gt;
    sd_value = sd(Value, na.rm = TRUE),&lt;br /&gt;
    volatility = sd(log(Value), na.rm = TRUE) * 100&lt;br /&gt;
  ) %&amp;gt;%&lt;br /&gt;
  arrange(desc(volatility)) %&amp;gt;%&lt;br /&gt;
  slice_head(n = 10)&lt;br /&gt;
&lt;br /&gt;
plot_vol &amp;lt;- ggplot(volatility, aes(&lt;br /&gt;
  x = reorder(CharCode, volatility),&lt;br /&gt;
  y = volatility,&lt;br /&gt;
  fill = CharCode&lt;br /&gt;
)) +&lt;br /&gt;
  geom_col(width = 0.7) +&lt;br /&gt;
  &lt;br /&gt;
  geom_text(&lt;br /&gt;
    aes(label = round(volatility, 2)),&lt;br /&gt;
    hjust = -0.2,&lt;br /&gt;
    size = 3.5&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  coord_flip() +&lt;br /&gt;
&lt;br /&gt;
scale_y_continuous(expand = expansion(mult = c(0, 0.25))) +&lt;br /&gt;
  &lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  theme(&lt;br /&gt;
    legend.position = &amp;quot;none&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
  &lt;br /&gt;
  labs(&lt;br /&gt;
    title = &amp;quot;ТОП-10 самых волатильных валют (30 дней)&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Волатильность (%)&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# График за месяц&lt;br /&gt;
plot_month &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,  # Ось X — дата&lt;br /&gt;
  y = Value,    # Ось Y — курс валюты&lt;br /&gt;
  color = CharCode,  # Цвет линий по валюте&lt;br /&gt;
  group = CharCode  # Группировка линий&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_line(linewidth = 1) + # Линия графика&lt;br /&gt;
  geom_point(size = 1.5) + # Точки на линии&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(  # Подписи&lt;br /&gt;
    title = &amp;quot;Динамика валют за 30 дней&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Курс к RUB&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
# Объединение графиков&lt;br /&gt;
final_plot &amp;lt;- (plot_main | plot_vol) /&lt;br /&gt;
              (plot_growth| plot_month)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)  # Вывод на экран&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,  # Сохранение в PNG файл&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Валюты.png|обрамить]]&lt;br /&gt;
[[Файл:Графики Валют.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%93%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B8_%D0%92%D0%B0%D0%BB%D1%8E%D1%82.png&amp;diff=46158</id>
		<title>Файл:Графики Валют.png</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%93%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B8_%D0%92%D0%B0%D0%BB%D1%8E%D1%82.png&amp;diff=46158"/>
		<updated>2026-04-14T07:33:53Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Графики изменения валют&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46151</id>
		<title>Анализ погоды за последнюю неделю</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46151"/>
		<updated>2026-04-14T06:55:33Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(dplyr)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
start_date &amp;lt;- as.character(Sys.Date() - 8)  # Начало периода (7 дней назад)&lt;br /&gt;
end_date   &amp;lt;- as.character(Sys.Date() - 1)  # Конец периода (вчера)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- paste0(&lt;br /&gt;
  &amp;quot;https://archive-api.open-meteo.com/v1/archive?&amp;quot;,&lt;br /&gt;
  &amp;quot;latitude=55.7558&amp;amp;longitude=37.6173&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;start_date=&amp;quot;, start_date,&lt;br /&gt;
  &amp;quot;&amp;amp;end_date=&amp;quot;, end_date,&lt;br /&gt;
  &amp;quot;&amp;amp;hourly=temperature_2m,precipitation,cloudcover,windspeed_10m&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;timezone=Europe/Moscow&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
res &amp;lt;- GET(url)  # Отправка запроса&lt;br /&gt;
&lt;br /&gt;
stop_for_status(res)  # Остановка, если ошибка&lt;br /&gt;
&lt;br /&gt;
text &amp;lt;- content(res, &amp;quot;text&amp;quot;, encoding = &amp;quot;UTF-8&amp;quot;) # Извлекаем текст ответа&lt;br /&gt;
json &amp;lt;- fromJSON(text)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(&lt;br /&gt;
  datetime = json$hourly$time,&lt;br /&gt;
  temp     = json$hourly$temperature_2m,&lt;br /&gt;
  precip   = json$hourly$precipitation,&lt;br /&gt;
  cloud    = json$hourly$cloudcover,&lt;br /&gt;
  wind     = json$hourly$windspeed_10m&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df$datetime &amp;lt;- as.POSIXct(df$datetime, format = &amp;quot;%Y-%m-%dT%H:%M&amp;quot;, tz = &amp;quot;Europe/Moscow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df$date &amp;lt;- as.Date(df$datetime)  # Выделяем дату&lt;br /&gt;
df$hour &amp;lt;- format(df$datetime, &amp;quot;%H:%M&amp;quot;)  # Выделяем час&lt;br /&gt;
&lt;br /&gt;
df_table &amp;lt;- df %&amp;gt;%&lt;br /&gt;
  select(date, hour, temp, precip, cloud, wind) %&amp;gt;%  # Выбираем нужные колонки&lt;br /&gt;
  arrange(date, hour)  # Сортировка по времени&lt;br /&gt;
&lt;br /&gt;
print(head(df_table, 20))  # Вывод первых строк&lt;br /&gt;
View(df_table)  # открытие таблицы&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Графики&lt;br /&gt;
plot_temp &amp;lt;- ggplot(df, aes(datetime, temp)) +&lt;br /&gt;
  geom_line(color = &amp;quot;red&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Температура (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;°C&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_precip &amp;lt;- ggplot(df, aes(datetime, precip)) +&lt;br /&gt;
  geom_col(fill = &amp;quot;blue&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Осадки (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;mm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_cloud &amp;lt;- ggplot(df, aes(datetime, cloud)) +&lt;br /&gt;
  geom_line(color = &amp;quot;gray40&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Облачность (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;%&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_wind &amp;lt;- ggplot(df, aes(datetime, wind)) +&lt;br /&gt;
  geom_line(color = &amp;quot;darkgreen&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Ветер (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;m/s&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
final_plot &amp;lt;- (plot_temp | plot_precip) /  # Объединение графиков&lt;br /&gt;
              (plot_cloud | plot_wind)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;moscow_weather_7days.png&amp;quot;,  # Сохранение картинки&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Погода.png|обрамить]]&lt;br /&gt;
[[Файл:График Погода.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;br /&gt;
[[Категория: RRecipe]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46150</id>
		<title>Изучение изменения стоимости валют по данным ЦБ</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46150"/>
		<updated>2026-04-14T06:55:14Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute  # Извлекаем список валют из полученного объекта&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(  # Создаём таблицу&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),  # Код валюты (USD, EUR и т.д.)&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),  # Текущий курс валюты&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))  # Предыдущий курс валюты&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]  # Удаляем строки с пропущенными значениями&lt;br /&gt;
&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100  # Считаем процентное изменение курса валют&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]  # Удаляем бесконечные значения&lt;br /&gt;
&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;, # Список основных валют для отдельного анализа&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df_world &amp;lt;- df[df$CharCode %in% popular, ]  # Фильтруем только мировые валюты&lt;br /&gt;
df_world$group &amp;lt;- &amp;quot;Мировые&amp;quot;  # Добавляем метку группы&lt;br /&gt;
&lt;br /&gt;
df_top &amp;lt;- df[!df$CharCode %in% popular, ] # Оставляем все валюты не из списка&lt;br /&gt;
&lt;br /&gt;
df_up &amp;lt;- df_top[df_top$change_pct &amp;gt; 0, ]  # Фильтруем валюты, которые выросли&lt;br /&gt;
df_up &amp;lt;- df_up[order(df_up$change_pct, decreasing = TRUE), ] # Сортируем по убыванию роста&lt;br /&gt;
df_up &amp;lt;- head(df_up, 10) # Берём топ-10 валют роста&lt;br /&gt;
df_up$group &amp;lt;- &amp;quot;Рост&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_down &amp;lt;- df_top[df_top$change_pct &amp;lt; 0, ]  # Фильтруем валюты, которые упали&lt;br /&gt;
df_down &amp;lt;- df_down[order(df_down$change_pct), ]  # Сортируем по сильнейшему падению&lt;br /&gt;
df_down &amp;lt;- head(df_down, 10)  # Берём топ-10 падений&lt;br /&gt;
df_down$group &amp;lt;- &amp;quot;Падение&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_final &amp;lt;- rbind(df_world, df_up, df_down)  # Объединяем мировые + рост + падение в одну таблицу&lt;br /&gt;
&lt;br /&gt;
# График за день&lt;br /&gt;
plot_main &amp;lt;- ggplot(df_final, aes(&lt;br /&gt;
  x = reorder(CharCode, change_pct),  # Сортируем валюты по изменению&lt;br /&gt;
  y = change_pct,  # Значение по оси Y (% изменения)&lt;br /&gt;
  fill = group  # Цвет по группе&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_col() +  # Столбчатый график&lt;br /&gt;
&lt;br /&gt;
  geom_text(  # Подписи значений на столбцах&lt;br /&gt;
    aes(label = paste0(round(change_pct, 2), &amp;quot;%&amp;quot;)),&lt;br /&gt;
    vjust = -0.5,&lt;br /&gt;
    size = 3&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  scale_fill_manual(values = c(  # Цвета для групп&lt;br /&gt;
    &amp;quot;Мировые&amp;quot; = &amp;quot;gray60&amp;quot;,&lt;br /&gt;
    &amp;quot;Рост&amp;quot; = &amp;quot;green3&amp;quot;,&lt;br /&gt;
    &amp;quot;Падение&amp;quot; = &amp;quot;red3&amp;quot;&lt;br /&gt;
  )) +&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(    # Подписи графика&lt;br /&gt;
    title = &amp;quot;Валютный рынок ЦБ РФ&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Изменение (%)&amp;quot;,&lt;br /&gt;
    fill = &amp;quot;Группа&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  expand_limits(y = max(df_final$change_pct) * 1.2)  # Запас по оси Y, чтобы подписи не обрезались&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
currencies &amp;lt;- c(&amp;quot;USD&amp;quot;, &amp;quot;EUR&amp;quot;, &amp;quot;CNY&amp;quot;, &amp;quot;JPY&amp;quot;, &amp;quot;GBP&amp;quot;)  # Список валют для анализа месяца&lt;br /&gt;
dates &amp;lt;- seq(Sys.Date() - 30, Sys.Date(), by = &amp;quot;day&amp;quot;)  # Создаём список дат за последние 30 дней&lt;br /&gt;
&lt;br /&gt;
get_day_data &amp;lt;- function(date) {  # Функция загрузки данных за конкретный день&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;)) # Загружаем данные дня&lt;br /&gt;
&lt;br /&gt;
    data.frame(  # Создаём таблицу по выбранным валютам&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = currencies,&lt;br /&gt;
      Value = sapply(currencies, function(x) data$Valute[[x]]$Value)  # Берём значение каждой валюты&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)  # Если ошибка&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_data &amp;lt;- lapply(dates, get_day_data)  # Получаем данные за все дни&lt;br /&gt;
list_data &amp;lt;- Filter(Negate(is.null), list_data)  # Удаляем пустые результаты&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- do.call(rbind, list_data)  # объединяем в один график&lt;br /&gt;
df_month &amp;lt;- df_month[complete.cases(df_month), ]  # удаляем ненайденное&lt;br /&gt;
&lt;br /&gt;
# График за месяц&lt;br /&gt;
plot_month &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,  # Ось X — дата&lt;br /&gt;
  y = Value,    # Ось Y — курс валюты&lt;br /&gt;
  color = CharCode,  # Цвет линий по валюте&lt;br /&gt;
  group = CharCode  # Группировка линий&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_line(linewidth = 1) + # Линия графика&lt;br /&gt;
  geom_point(size = 1.5) + # Точки на линии&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(  # Подписи&lt;br /&gt;
    title = &amp;quot;Динамика валют за 30 дней&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Курс к RUB&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
# Объединение графиков&lt;br /&gt;
final_plot &amp;lt;- plot_main / plot_month&lt;br /&gt;
&lt;br /&gt;
print(final_plot)  # Вывод на экран&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,  # Сохранение в PNG файл&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Валюты.png|обрамить]]&lt;br /&gt;
[[Файл:График Валюты.png|обрамить]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:BigDataWorks]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=46137</id>
		<title>Участник:Vladislav Leontev</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=46137"/>
		<updated>2026-04-14T06:41:48Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент группы ИНДОР-211.&lt;br /&gt;
|Field_of_knowledge=Математика, Информатика, Робототехника, Педагогика, Образование, Интернет вещей, Большие данные, Алгебра, Технология&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
|Working_On=Проект_Леонтьев_R, Проект_Леонтьев_R2&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=46126</id>
		<title>Участник:Vladislav Leontev</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=46126"/>
		<updated>2026-04-14T06:10:16Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Description=Студент группы ИНДОР-211.&lt;br /&gt;
|Field_of_knowledge=Математика, Информатика, Робототехника, Педагогика, Образование, Интернет вещей, Большие данные, Алгебра, Технология&lt;br /&gt;
|Position=Бакалавриат&lt;br /&gt;
|Profile=Информатика, Робототехника&lt;br /&gt;
|PedDirection=Да&lt;br /&gt;
}}&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46087</id>
		<title>Изучение изменения стоимости валют по данным ЦБ</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46087"/>
		<updated>2026-04-13T23:05:19Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: Исправлено отображение картинок&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute  # Извлекаем список валют из полученного объекта&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(  # Создаём таблицу&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),  # Код валюты (USD, EUR и т.д.)&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),  # Текущий курс валюты&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))  # Предыдущий курс валюты&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]  # Удаляем строки с пропущенными значениями&lt;br /&gt;
&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100  # Считаем процентное изменение курса валют&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]  # Удаляем бесконечные значения&lt;br /&gt;
&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;, # Список основных валют для отдельного анализа&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df_world &amp;lt;- df[df$CharCode %in% popular, ]  # Фильтруем только мировые валюты&lt;br /&gt;
df_world$group &amp;lt;- &amp;quot;Мировые&amp;quot;  # Добавляем метку группы&lt;br /&gt;
&lt;br /&gt;
df_top &amp;lt;- df[!df$CharCode %in% popular, ] # Оставляем все валюты не из списка&lt;br /&gt;
&lt;br /&gt;
df_up &amp;lt;- df_top[df_top$change_pct &amp;gt; 0, ]  # Фильтруем валюты, которые выросли&lt;br /&gt;
df_up &amp;lt;- df_up[order(df_up$change_pct, decreasing = TRUE), ] # Сортируем по убыванию роста&lt;br /&gt;
df_up &amp;lt;- head(df_up, 10) # Берём топ-10 валют роста&lt;br /&gt;
df_up$group &amp;lt;- &amp;quot;Рост&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_down &amp;lt;- df_top[df_top$change_pct &amp;lt; 0, ]  # Фильтруем валюты, которые упали&lt;br /&gt;
df_down &amp;lt;- df_down[order(df_down$change_pct), ]  # Сортируем по сильнейшему падению&lt;br /&gt;
df_down &amp;lt;- head(df_down, 10)  # Берём топ-10 падений&lt;br /&gt;
df_down$group &amp;lt;- &amp;quot;Падение&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_final &amp;lt;- rbind(df_world, df_up, df_down)  # Объединяем мировые + рост + падение в одну таблицу&lt;br /&gt;
&lt;br /&gt;
# График за день&lt;br /&gt;
plot_main &amp;lt;- ggplot(df_final, aes(&lt;br /&gt;
  x = reorder(CharCode, change_pct),  # Сортируем валюты по изменению&lt;br /&gt;
  y = change_pct,  # Значение по оси Y (% изменения)&lt;br /&gt;
  fill = group  # Цвет по группе&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_col() +  # Столбчатый график&lt;br /&gt;
&lt;br /&gt;
  geom_text(  # Подписи значений на столбцах&lt;br /&gt;
    aes(label = paste0(round(change_pct, 2), &amp;quot;%&amp;quot;)),&lt;br /&gt;
    vjust = -0.5,&lt;br /&gt;
    size = 3&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  scale_fill_manual(values = c(  # Цвета для групп&lt;br /&gt;
    &amp;quot;Мировые&amp;quot; = &amp;quot;gray60&amp;quot;,&lt;br /&gt;
    &amp;quot;Рост&amp;quot; = &amp;quot;green3&amp;quot;,&lt;br /&gt;
    &amp;quot;Падение&amp;quot; = &amp;quot;red3&amp;quot;&lt;br /&gt;
  )) +&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(    # Подписи графика&lt;br /&gt;
    title = &amp;quot;Валютный рынок ЦБ РФ&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Изменение (%)&amp;quot;,&lt;br /&gt;
    fill = &amp;quot;Группа&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  expand_limits(y = max(df_final$change_pct) * 1.2)  # Запас по оси Y, чтобы подписи не обрезались&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
currencies &amp;lt;- c(&amp;quot;USD&amp;quot;, &amp;quot;EUR&amp;quot;, &amp;quot;CNY&amp;quot;, &amp;quot;JPY&amp;quot;, &amp;quot;GBP&amp;quot;)  # Список валют для анализа месяца&lt;br /&gt;
dates &amp;lt;- seq(Sys.Date() - 30, Sys.Date(), by = &amp;quot;day&amp;quot;)  # Создаём список дат за последние 30 дней&lt;br /&gt;
&lt;br /&gt;
get_day_data &amp;lt;- function(date) {  # Функция загрузки данных за конкретный день&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;)) # Загружаем данные дня&lt;br /&gt;
&lt;br /&gt;
    data.frame(  # Создаём таблицу по выбранным валютам&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = currencies,&lt;br /&gt;
      Value = sapply(currencies, function(x) data$Valute[[x]]$Value)  # Берём значение каждой валюты&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)  # Если ошибка&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_data &amp;lt;- lapply(dates, get_day_data)  # Получаем данные за все дни&lt;br /&gt;
list_data &amp;lt;- Filter(Negate(is.null), list_data)  # Удаляем пустые результаты&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- do.call(rbind, list_data)  # объединяем в один график&lt;br /&gt;
df_month &amp;lt;- df_month[complete.cases(df_month), ]  # удаляем ненайденное&lt;br /&gt;
&lt;br /&gt;
# График за месяц&lt;br /&gt;
plot_month &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,  # Ось X — дата&lt;br /&gt;
  y = Value,    # Ось Y — курс валюты&lt;br /&gt;
  color = CharCode,  # Цвет линий по валюте&lt;br /&gt;
  group = CharCode  # Группировка линий&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_line(linewidth = 1) + # Линия графика&lt;br /&gt;
  geom_point(size = 1.5) + # Точки на линии&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(  # Подписи&lt;br /&gt;
    title = &amp;quot;Динамика валют за 30 дней&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Курс к RUB&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
# Объединение графиков&lt;br /&gt;
final_plot &amp;lt;- plot_main / plot_month&lt;br /&gt;
&lt;br /&gt;
print(final_plot)  # Вывод на экран&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,  # Сохранение в PNG файл&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Валюты.png|обрамить]]&lt;br /&gt;
[[Файл:График Валюты.png|обрамить]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46086</id>
		<title>Анализ погоды за последнюю неделю</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46086"/>
		<updated>2026-04-13T23:04:51Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(dplyr)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
start_date &amp;lt;- as.character(Sys.Date() - 8)  # Начало периода (7 дней назад)&lt;br /&gt;
end_date   &amp;lt;- as.character(Sys.Date() - 1)  # Конец периода (вчера)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- paste0(&lt;br /&gt;
  &amp;quot;https://archive-api.open-meteo.com/v1/archive?&amp;quot;,&lt;br /&gt;
  &amp;quot;latitude=55.7558&amp;amp;longitude=37.6173&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;start_date=&amp;quot;, start_date,&lt;br /&gt;
  &amp;quot;&amp;amp;end_date=&amp;quot;, end_date,&lt;br /&gt;
  &amp;quot;&amp;amp;hourly=temperature_2m,precipitation,cloudcover,windspeed_10m&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;timezone=Europe/Moscow&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
res &amp;lt;- GET(url)  # Отправка запроса&lt;br /&gt;
&lt;br /&gt;
stop_for_status(res)  # Остановка, если ошибка&lt;br /&gt;
&lt;br /&gt;
text &amp;lt;- content(res, &amp;quot;text&amp;quot;, encoding = &amp;quot;UTF-8&amp;quot;) # Извлекаем текст ответа&lt;br /&gt;
json &amp;lt;- fromJSON(text)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(&lt;br /&gt;
  datetime = json$hourly$time,&lt;br /&gt;
  temp     = json$hourly$temperature_2m,&lt;br /&gt;
  precip   = json$hourly$precipitation,&lt;br /&gt;
  cloud    = json$hourly$cloudcover,&lt;br /&gt;
  wind     = json$hourly$windspeed_10m&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df$datetime &amp;lt;- as.POSIXct(df$datetime, format = &amp;quot;%Y-%m-%dT%H:%M&amp;quot;, tz = &amp;quot;Europe/Moscow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df$date &amp;lt;- as.Date(df$datetime)  # Выделяем дату&lt;br /&gt;
df$hour &amp;lt;- format(df$datetime, &amp;quot;%H:%M&amp;quot;)  # Выделяем час&lt;br /&gt;
&lt;br /&gt;
df_table &amp;lt;- df %&amp;gt;%&lt;br /&gt;
  select(date, hour, temp, precip, cloud, wind) %&amp;gt;%  # Выбираем нужные колонки&lt;br /&gt;
  arrange(date, hour)  # Сортировка по времени&lt;br /&gt;
&lt;br /&gt;
print(head(df_table, 20))  # Вывод первых строк&lt;br /&gt;
View(df_table)  # открытие таблицы&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Графики&lt;br /&gt;
plot_temp &amp;lt;- ggplot(df, aes(datetime, temp)) +&lt;br /&gt;
  geom_line(color = &amp;quot;red&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Температура (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;°C&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_precip &amp;lt;- ggplot(df, aes(datetime, precip)) +&lt;br /&gt;
  geom_col(fill = &amp;quot;blue&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Осадки (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;mm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_cloud &amp;lt;- ggplot(df, aes(datetime, cloud)) +&lt;br /&gt;
  geom_line(color = &amp;quot;gray40&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Облачность (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;%&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_wind &amp;lt;- ggplot(df, aes(datetime, wind)) +&lt;br /&gt;
  geom_line(color = &amp;quot;darkgreen&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Ветер (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;m/s&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
final_plot &amp;lt;- (plot_temp | plot_precip) /  # Объединение графиков&lt;br /&gt;
              (plot_cloud | plot_wind)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;moscow_weather_7days.png&amp;quot;,  # Сохранение картинки&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Погода.png|обрамить]]&lt;br /&gt;
[[Файл:График Погода.png|обрамить]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46085</id>
		<title>Анализ погоды за последнюю неделю</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46085"/>
		<updated>2026-04-13T23:04:37Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(dplyr)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
start_date &amp;lt;- as.character(Sys.Date() - 8)  # Начало периода (7 дней назад)&lt;br /&gt;
end_date   &amp;lt;- as.character(Sys.Date() - 1)  # Конец периода (вчера)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- paste0(&lt;br /&gt;
  &amp;quot;https://archive-api.open-meteo.com/v1/archive?&amp;quot;,&lt;br /&gt;
  &amp;quot;latitude=55.7558&amp;amp;longitude=37.6173&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;start_date=&amp;quot;, start_date,&lt;br /&gt;
  &amp;quot;&amp;amp;end_date=&amp;quot;, end_date,&lt;br /&gt;
  &amp;quot;&amp;amp;hourly=temperature_2m,precipitation,cloudcover,windspeed_10m&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;timezone=Europe/Moscow&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
res &amp;lt;- GET(url)  # Отправка запроса&lt;br /&gt;
&lt;br /&gt;
stop_for_status(res)  # Остановка, если ошибка&lt;br /&gt;
&lt;br /&gt;
text &amp;lt;- content(res, &amp;quot;text&amp;quot;, encoding = &amp;quot;UTF-8&amp;quot;) # Извлекаем текст ответа&lt;br /&gt;
json &amp;lt;- fromJSON(text)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(&lt;br /&gt;
  datetime = json$hourly$time,&lt;br /&gt;
  temp     = json$hourly$temperature_2m,&lt;br /&gt;
  precip   = json$hourly$precipitation,&lt;br /&gt;
  cloud    = json$hourly$cloudcover,&lt;br /&gt;
  wind     = json$hourly$windspeed_10m&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df$datetime &amp;lt;- as.POSIXct(df$datetime, format = &amp;quot;%Y-%m-%dT%H:%M&amp;quot;, tz = &amp;quot;Europe/Moscow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df$date &amp;lt;- as.Date(df$datetime)  # Выделяем дату&lt;br /&gt;
df$hour &amp;lt;- format(df$datetime, &amp;quot;%H:%M&amp;quot;)  # Выделяем час&lt;br /&gt;
&lt;br /&gt;
df_table &amp;lt;- df %&amp;gt;%&lt;br /&gt;
  select(date, hour, temp, precip, cloud, wind) %&amp;gt;%  # Выбираем нужные колонки&lt;br /&gt;
  arrange(date, hour)  # Сортировка по времени&lt;br /&gt;
&lt;br /&gt;
print(head(df_table, 20))  # Вывод первых строк&lt;br /&gt;
View(df_table)  # открытие таблицы&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Графики&lt;br /&gt;
plot_temp &amp;lt;- ggplot(df, aes(datetime, temp)) +&lt;br /&gt;
  geom_line(color = &amp;quot;red&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Температура (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;°C&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_precip &amp;lt;- ggplot(df, aes(datetime, precip)) +&lt;br /&gt;
  geom_col(fill = &amp;quot;blue&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Осадки (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;mm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_cloud &amp;lt;- ggplot(df, aes(datetime, cloud)) +&lt;br /&gt;
  geom_line(color = &amp;quot;gray40&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Облачность (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;%&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_wind &amp;lt;- ggplot(df, aes(datetime, wind)) +&lt;br /&gt;
  geom_line(color = &amp;quot;darkgreen&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Ветер (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;m/s&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
final_plot &amp;lt;- (plot_temp | plot_precip) /  # Объединение графиков&lt;br /&gt;
              (plot_cloud | plot_wind)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;moscow_weather_7days.png&amp;quot;,  # Сохранение картинки&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Погода.png|обрамить]]&lt;br /&gt;
[[Файл:График Погода.png|мини]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46084</id>
		<title>Анализ погоды за последнюю неделю</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D1%8B_%D0%B7%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D1%8E%D1%8E_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8E&amp;diff=46084"/>
		<updated>2026-04-13T23:04:03Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: Новая страница: «&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt; library(httr) library(jsonlite) library(ggplot2) library(dplyr) library(patchwork)  options(encoding = &amp;quot;UTF-8&amp;quot;)  start_date &amp;lt;- as.character(Sys.Date() - 8)  # Начало периода (7 дней назад) end_date   &amp;lt;- as.character(Sys.Date() - 1)  # Конец периода (вчера)  url &amp;lt;- paste0(   &amp;quot;https://archive-api.open-meteo.com/v1/archive?&amp;quot;,   &amp;quot;latitude=55.7558&amp;amp;longitude=37.6173&amp;quot;,   &amp;quot;&amp;amp;start_date=&amp;quot;, start_date,...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(dplyr)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
start_date &amp;lt;- as.character(Sys.Date() - 8)  # Начало периода (7 дней назад)&lt;br /&gt;
end_date   &amp;lt;- as.character(Sys.Date() - 1)  # Конец периода (вчера)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- paste0(&lt;br /&gt;
  &amp;quot;https://archive-api.open-meteo.com/v1/archive?&amp;quot;,&lt;br /&gt;
  &amp;quot;latitude=55.7558&amp;amp;longitude=37.6173&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;start_date=&amp;quot;, start_date,&lt;br /&gt;
  &amp;quot;&amp;amp;end_date=&amp;quot;, end_date,&lt;br /&gt;
  &amp;quot;&amp;amp;hourly=temperature_2m,precipitation,cloudcover,windspeed_10m&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;amp;timezone=Europe/Moscow&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
res &amp;lt;- GET(url)  # Отправка запроса&lt;br /&gt;
&lt;br /&gt;
stop_for_status(res)  # Остановка, если ошибка&lt;br /&gt;
&lt;br /&gt;
text &amp;lt;- content(res, &amp;quot;text&amp;quot;, encoding = &amp;quot;UTF-8&amp;quot;) # Извлекаем текст ответа&lt;br /&gt;
json &amp;lt;- fromJSON(text)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(&lt;br /&gt;
  datetime = json$hourly$time,&lt;br /&gt;
  temp     = json$hourly$temperature_2m,&lt;br /&gt;
  precip   = json$hourly$precipitation,&lt;br /&gt;
  cloud    = json$hourly$cloudcover,&lt;br /&gt;
  wind     = json$hourly$windspeed_10m&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
df$datetime &amp;lt;- as.POSIXct(df$datetime, format = &amp;quot;%Y-%m-%dT%H:%M&amp;quot;, tz = &amp;quot;Europe/Moscow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df$date &amp;lt;- as.Date(df$datetime)  # Выделяем дату&lt;br /&gt;
df$hour &amp;lt;- format(df$datetime, &amp;quot;%H:%M&amp;quot;)  # Выделяем час&lt;br /&gt;
&lt;br /&gt;
df_table &amp;lt;- df %&amp;gt;%&lt;br /&gt;
  select(date, hour, temp, precip, cloud, wind) %&amp;gt;%  # Выбираем нужные колонки&lt;br /&gt;
  arrange(date, hour)  # Сортировка по времени&lt;br /&gt;
&lt;br /&gt;
print(head(df_table, 20))  # Вывод первых строк&lt;br /&gt;
View(df_table)  # открытие таблицы&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Графики&lt;br /&gt;
plot_temp &amp;lt;- ggplot(df, aes(datetime, temp)) +&lt;br /&gt;
  geom_line(color = &amp;quot;red&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Температура (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;°C&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_precip &amp;lt;- ggplot(df, aes(datetime, precip)) +&lt;br /&gt;
  geom_col(fill = &amp;quot;blue&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Осадки (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;mm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_cloud &amp;lt;- ggplot(df, aes(datetime, cloud)) +&lt;br /&gt;
  geom_line(color = &amp;quot;gray40&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Облачность (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;%&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
plot_wind &amp;lt;- ggplot(df, aes(datetime, wind)) +&lt;br /&gt;
  geom_line(color = &amp;quot;darkgreen&amp;quot;) +&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
  labs(title = &amp;quot;Ветер (7 дней)&amp;quot;, x = &amp;quot;&amp;quot;, y = &amp;quot;m/s&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
final_plot &amp;lt;- (plot_temp | plot_precip) /  # Объединение графиков&lt;br /&gt;
              (plot_cloud | plot_wind)&lt;br /&gt;
&lt;br /&gt;
print(final_plot)&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;moscow_weather_7days.png&amp;quot;,  # Сохранение картинки&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Погода.png|мини]]&lt;br /&gt;
[[Файл:График Погода.png|мини]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%93%D1%80%D0%B0%D1%84%D0%B8%D0%BA_%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0.png&amp;diff=46083</id>
		<title>Файл:График Погода.png</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%93%D1%80%D0%B0%D1%84%D0%B8%D0%BA_%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0.png&amp;diff=46083"/>
		<updated>2026-04-13T23:03:40Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Графики изменений погоды за 7 дней&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0.png&amp;diff=46082</id>
		<title>Файл:Таблица Погода.png</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0.png&amp;diff=46082"/>
		<updated>2026-04-13T23:01:18Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Таблица данных о погоде за 7 дней&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46081</id>
		<title>Изучение изменения стоимости валют по данным ЦБ</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%98%D0%B7%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%B2%D0%B0%D0%BB%D1%8E%D1%82_%D0%BF%D0%BE_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC_%D0%A6%D0%91&amp;diff=46081"/>
		<updated>2026-04-13T22:59:53Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: Дополнено&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(httr)&lt;br /&gt;
library(jsonlite)&lt;br /&gt;
library(ggplot2)&lt;br /&gt;
library(patchwork)&lt;br /&gt;
&lt;br /&gt;
options(encoding = &amp;quot;UTF-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
url &amp;lt;- &amp;quot;https://www.cbr-xml-daily.ru/daily_json.js&amp;quot;&lt;br /&gt;
data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
valutes &amp;lt;- data$Valute  # Извлекаем список валют из полученного объекта&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- data.frame(  # Создаём таблицу&lt;br /&gt;
  CharCode = sapply(valutes, function(x) x$CharCode),  # Код валюты (USD, EUR и т.д.)&lt;br /&gt;
  Value    = as.numeric(sapply(valutes, function(x) x$Value)),  # Текущий курс валюты&lt;br /&gt;
  Previous = as.numeric(sapply(valutes, function(x) x$Previous))  # Предыдущий курс валюты&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
df &amp;lt;- df[complete.cases(df), ]  # Удаляем строки с пропущенными значениями&lt;br /&gt;
&lt;br /&gt;
df$change_pct &amp;lt;- (df$Value - df$Previous) / df$Previous * 100  # Считаем процентное изменение курса валют&lt;br /&gt;
df &amp;lt;- df[is.finite(df$change_pct), ]  # Удаляем бесконечные значения&lt;br /&gt;
&lt;br /&gt;
popular &amp;lt;- c(&amp;quot;USD&amp;quot;,&amp;quot;EUR&amp;quot;,&amp;quot;GBP&amp;quot;,&amp;quot;JPY&amp;quot;,&amp;quot;CNY&amp;quot;, # Список основных валют для отдельного анализа&lt;br /&gt;
             &amp;quot;CHF&amp;quot;,&amp;quot;CAD&amp;quot;,&amp;quot;AUD&amp;quot;,&amp;quot;NZD&amp;quot;,&amp;quot;SEK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
df_world &amp;lt;- df[df$CharCode %in% popular, ]  # Фильтруем только мировые валюты&lt;br /&gt;
df_world$group &amp;lt;- &amp;quot;Мировые&amp;quot;  # Добавляем метку группы&lt;br /&gt;
&lt;br /&gt;
df_top &amp;lt;- df[!df$CharCode %in% popular, ] # Оставляем все валюты не из списка&lt;br /&gt;
&lt;br /&gt;
df_up &amp;lt;- df_top[df_top$change_pct &amp;gt; 0, ]  # Фильтруем валюты, которые выросли&lt;br /&gt;
df_up &amp;lt;- df_up[order(df_up$change_pct, decreasing = TRUE), ] # Сортируем по убыванию роста&lt;br /&gt;
df_up &amp;lt;- head(df_up, 10) # Берём топ-10 валют роста&lt;br /&gt;
df_up$group &amp;lt;- &amp;quot;Рост&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_down &amp;lt;- df_top[df_top$change_pct &amp;lt; 0, ]  # Фильтруем валюты, которые упали&lt;br /&gt;
df_down &amp;lt;- df_down[order(df_down$change_pct), ]  # Сортируем по сильнейшему падению&lt;br /&gt;
df_down &amp;lt;- head(df_down, 10)  # Берём топ-10 падений&lt;br /&gt;
df_down$group &amp;lt;- &amp;quot;Падение&amp;quot;&lt;br /&gt;
&lt;br /&gt;
df_final &amp;lt;- rbind(df_world, df_up, df_down)  # Объединяем мировые + рост + падение в одну таблицу&lt;br /&gt;
&lt;br /&gt;
# График за день&lt;br /&gt;
plot_main &amp;lt;- ggplot(df_final, aes(&lt;br /&gt;
  x = reorder(CharCode, change_pct),  # Сортируем валюты по изменению&lt;br /&gt;
  y = change_pct,  # Значение по оси Y (% изменения)&lt;br /&gt;
  fill = group  # Цвет по группе&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_col() +  # Столбчатый график&lt;br /&gt;
&lt;br /&gt;
  geom_text(  # Подписи значений на столбцах&lt;br /&gt;
    aes(label = paste0(round(change_pct, 2), &amp;quot;%&amp;quot;)),&lt;br /&gt;
    vjust = -0.5,&lt;br /&gt;
    size = 3&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  scale_fill_manual(values = c(  # Цвета для групп&lt;br /&gt;
    &amp;quot;Мировые&amp;quot; = &amp;quot;gray60&amp;quot;,&lt;br /&gt;
    &amp;quot;Рост&amp;quot; = &amp;quot;green3&amp;quot;,&lt;br /&gt;
    &amp;quot;Падение&amp;quot; = &amp;quot;red3&amp;quot;&lt;br /&gt;
  )) +&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(    # Подписи графика&lt;br /&gt;
    title = &amp;quot;Валютный рынок ЦБ РФ&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Валюта&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Изменение (%)&amp;quot;,&lt;br /&gt;
    fill = &amp;quot;Группа&amp;quot;&lt;br /&gt;
  ) +&lt;br /&gt;
&lt;br /&gt;
  expand_limits(y = max(df_final$change_pct) * 1.2)  # Запас по оси Y, чтобы подписи не обрезались&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
currencies &amp;lt;- c(&amp;quot;USD&amp;quot;, &amp;quot;EUR&amp;quot;, &amp;quot;CNY&amp;quot;, &amp;quot;JPY&amp;quot;, &amp;quot;GBP&amp;quot;)  # Список валют для анализа месяца&lt;br /&gt;
dates &amp;lt;- seq(Sys.Date() - 30, Sys.Date(), by = &amp;quot;day&amp;quot;)  # Создаём список дат за последние 30 дней&lt;br /&gt;
&lt;br /&gt;
get_day_data &amp;lt;- function(date) {  # Функция загрузки данных за конкретный день&lt;br /&gt;
  url &amp;lt;- paste0(&lt;br /&gt;
    &amp;quot;https://www.cbr-xml-daily.ru/archive/&amp;quot;,&lt;br /&gt;
    format(date, &amp;quot;%Y/%m/%d&amp;quot;),&lt;br /&gt;
    &amp;quot;/daily_json.js&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  tryCatch({&lt;br /&gt;
    data &amp;lt;- fromJSON(content(GET(url), &amp;quot;text&amp;quot;)) # Загружаем данные дня&lt;br /&gt;
&lt;br /&gt;
    data.frame(  # Создаём таблицу по выбранным валютам&lt;br /&gt;
      date = as.Date(date),&lt;br /&gt;
      CharCode = currencies,&lt;br /&gt;
      Value = sapply(currencies, function(x) data$Valute[[x]]$Value)  # Берём значение каждой валюты&lt;br /&gt;
    )&lt;br /&gt;
  }, error = function(e) NULL)  # Если ошибка&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list_data &amp;lt;- lapply(dates, get_day_data)  # Получаем данные за все дни&lt;br /&gt;
list_data &amp;lt;- Filter(Negate(is.null), list_data)  # Удаляем пустые результаты&lt;br /&gt;
&lt;br /&gt;
df_month &amp;lt;- do.call(rbind, list_data)  # объединяем в один график&lt;br /&gt;
df_month &amp;lt;- df_month[complete.cases(df_month), ]  # удаляем ненайденное&lt;br /&gt;
&lt;br /&gt;
# График за месяц&lt;br /&gt;
plot_month &amp;lt;- ggplot(df_month, aes(&lt;br /&gt;
  x = date,  # Ось X — дата&lt;br /&gt;
  y = Value,    # Ось Y — курс валюты&lt;br /&gt;
  color = CharCode,  # Цвет линий по валюте&lt;br /&gt;
  group = CharCode  # Группировка линий&lt;br /&gt;
)) +&lt;br /&gt;
&lt;br /&gt;
  geom_line(linewidth = 1) + # Линия графика&lt;br /&gt;
  geom_point(size = 1.5) + # Точки на линии&lt;br /&gt;
&lt;br /&gt;
  theme_minimal() +&lt;br /&gt;
&lt;br /&gt;
  labs(  # Подписи&lt;br /&gt;
    title = &amp;quot;Динамика валют за 30 дней&amp;quot;,&lt;br /&gt;
    x = &amp;quot;Дата&amp;quot;,&lt;br /&gt;
    y = &amp;quot;Курс к RUB&amp;quot;,&lt;br /&gt;
    color = &amp;quot;Валюта&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
# Объединение графиков&lt;br /&gt;
final_plot &amp;lt;- plot_main / plot_month&lt;br /&gt;
&lt;br /&gt;
print(final_plot)  # Вывод на экран&lt;br /&gt;
&lt;br /&gt;
ggsave(&amp;quot;currency_dashboard_full.png&amp;quot;,  # Сохранение в PNG файл&lt;br /&gt;
       final_plot,&lt;br /&gt;
       width = 14,&lt;br /&gt;
       height = 10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Файл:Таблица Валюты.png|мини]]&lt;br /&gt;
[[Файл:График Валюты.png|мини]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%93%D1%80%D0%B0%D1%84%D0%B8%D0%BA_%D0%92%D0%B0%D0%BB%D1%8E%D1%82%D1%8B.png&amp;diff=46080</id>
		<title>Файл:График Валюты.png</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%93%D1%80%D0%B0%D1%84%D0%B8%D0%BA_%D0%92%D0%B0%D0%BB%D1%8E%D1%82%D1%8B.png&amp;diff=46080"/>
		<updated>2026-04-13T22:57:33Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;График изменения стоимости различных валют&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D0%92%D0%B0%D0%BB%D1%8E%D1%82%D1%8B.png&amp;diff=46079</id>
		<title>Файл:Таблица Валюты.png</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D0%92%D0%B0%D0%BB%D1%8E%D1%82%D1%8B.png&amp;diff=46079"/>
		<updated>2026-04-13T22:56:10Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Таблица данных о стоимости валют&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=20463</id>
		<title>Участник:Vladislav Leontev</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=20463"/>
		<updated>2024-10-06T13:03:15Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=19197</id>
		<title>Участник:Vladislav Leontev</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Vladislav_Leontev&amp;diff=19197"/>
		<updated>2024-09-07T10:03:28Z</updated>

		<summary type="html">&lt;p&gt;Vladislav Leontev: Новая страница: «{{UserMGPU |Field_of_knowledge=Информатика, Робототехника |Environment=Lego Mindstorms, Кулибин, Lego WeDo }} ---- Категория:ИНДОР-211 Категория:UserMGPU»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserMGPU&lt;br /&gt;
|Field_of_knowledge=Информатика, Робототехника&lt;br /&gt;
|Environment=Lego Mindstorms, Кулибин, Lego WeDo&lt;br /&gt;
}}&lt;br /&gt;
----&lt;br /&gt;
[[Категория:ИНДОР-211]]&lt;br /&gt;
[[Категория:UserMGPU]]&lt;/div&gt;</summary>
		<author><name>Vladislav Leontev</name></author>
	</entry>
</feed>