September 13, 2022

Погода в регионах России

В русскоязычном датавиз-чате спросили:

Почему бы не попробовать сделать подобное для России?

Исходные данные

Я вспомнил, что как-то давно для Екатеринбурга уже получал данные о погоде в R с помощью API от OpenWeather и пакета owmr. Можно попробовать с помощью R скачать данные о погоде для всех административных центров субъектов РФ, а визуализацию сделать в виде интерактивной плиточной карты в Datawrapper.

Краткое описание процесса получения и предобработки данных в R

Если вы не знаете R, можете пропустить эту часть, сохранив себе ссылку на гугл-таблицу из 5 шага.

Шаг 1) Из Википедии скачиваем список регионов и список административных центров регионов:

library(tidyverse)
library(rvest)

url <- "https://ru.wikipedia.org/wiki/Административные_центры_субъектов_Российской_Федерации"

regions <- read_html(url) %>%
  html_element("table") %>%
  html_table() %>%
  filter(!is.na(`Код ОКАТО`)) %>%
  mutate(`Субъект Российской Федерации` = gsub("\\[1\\]", "", 
                                               `Субъект Российской Федерации`)) %>%
  select(`Субъект Российской Федерации`, `Административный центр`) %>% 
  rename("region" = "Субъект Российской Федерации", 
             "city" = "Административный центр")
           

Итак, таблица со списком регионов и их админ-центрами выглядит так:

Файл: Административные центры субъектов РФ regions.csv

Шаг 2) Для получения данных о погоде через API командой find_city() пакета qwmr нам необходимо получить ID городов, сохранив в виде csv-таблицы:

Файл: ID городов city_admin.csv

Шаг 3) Также нам пригодится два файла: эмодзи-символы погоды и их соответствие кодам иконок сервиса и таблица-ключ с названиями регионов для последующего объединения датасетов (данных о погоде и названий регионов), в котором присутствует наименование регионов и метки (аббревиатуры) регионов, чтобы их распознал Datawrapper.

Файл: иконки и символы погоды weather_icons.csv

Файл: таблица-ключ регионов regions_key.csv

Шаг 4) Получаем данные о погоде по 85 городам c помощью предварительно написанной функции:

# Текущая погода по административным центрам
get_city_weather <- function(city) {
  res <- get_current(city, units = "metric", lang = "RU") %>%
    owmr_as_tibble() %>%
    mutate(name = city) %>%
    select(name, dt_txt, temp, temp_min, 
           temp_max, weather_id, 
           weather_main, weather_description, weather_icon) %>%
    mutate(icon_url = get_icon_url(weather_icon))
  Sys.sleep(2) # пауза в 2 секунды, чтобы не выйти за лимиты API 
  return(res)
}

df <- pro_map_df(city$name, get_city_weather)

Шаг 5) Объединяем данные, делаем небольшие преобразования и загружаем итоговый датасет в гугл-таблицы:

city <- left_join(city, df, by = c("city_eng" = "name")) 
city <- left_join(city, weather_icons, by = c("weather_icon" = "icon_weather"))
city <- left_join(city, regions_key, by = c("region", "city"))
city$temp <- round(city$temp) #округляем значения температуры до целых
# создаем метку аббревиатура города, температура и эмодзи-символ погоды
city$labels <- glue::glue("{city$RNabbr}<br>{city$temp}°C {city$utf_code}")

# Сохраняем локально в csv данные о погоде на конкретную дату и время запроса
write_csv2(city, glue("data/city_{format(Sys.time(), '%d_%m_%Y_%H_%M')}.csv"))
# Обновляем гугл-таблицу
write_sheet(city, ss = "ID_гугл-таблицы", sheet = "city")

Обновляемая гугл-таблица с данными о погоде, которую используем как источник данных для Datawrapper:

https://docs.google.com/spreadsheets/d/1wDqElULkz4Eycz03q8CmtFTi0oRO4kYan_MEkkRZABU/edit?usp=sharing

Полный R-скрипт:

library(tidyverse)
library(owmr)
library(purrrgress)
library(glue)
library(googlesheets4)
library(here)

# проходим авторизацию через сервисный аккаунт Google Cloud
# см. инструкцию https://habr.com/ru/post/488756/
# API-key OpenWeatherMap

gs4_auth(path = "_ваши_данные_.json")
owmr_settings("_ваш_API_key_")

# Загрузка данных
weather_icons <- read_csv("weather_icons.csv")
regions <- read_csv2("regions.csv")
regions_key <- read_csv("regions_keys.csv")
city <- read_csv("city_admin.csv")

# Текущая погода по административным центрам
get_city_weather <- function(city) {
  res <- get_current(city, units = "metric", lang = "RU") %>%
    owmr_as_tibble() %>%
    mutate(name = city) %>%
    select(name, dt_txt, temp, temp_min, 
           temp_max, weather_id, 
           weather_main, weather_description, weather_icon) %>%
    mutate(icon_url = get_icon_url(weather_icon))
  Sys.sleep(2) # пауза, чтобы не выйти за лимиты запросов API
  return(res)
}

df <- pro_map_df(city$city_eng, get_city_weather)

city <- left_join(city, df, by = c("city_eng" = "name")) 
city <- left_join(city, weather_icons, by = c("weather_icon" = "icon_weather"))
city <- left_join(city, regions_key, by = c("region", "city"))
city$temp <- round(city$temp)
city$labels <- glue::glue("{city$RNabbr}<br>{city$temp}°C {city$utf_code}")

# Сохраняем локально в csv данные о погоде на конкретную дату и время запроса
write_csv2(city, glue("data/city_{format(Sys.time(), '%d_%m_%Y_%H_%M')}.csv"))
# Обновляем гугл-таблицу
write_sheet(city, ss = "ID гугл-таблицы", sheet = "city")

Создаем плиточную карту РФ в Datawrapper

Шаг 1) Открываем Datawrapper, в меню выбираем создать новую карту (Create Map) и выбираем тип карты "Choropleth map", через поиск находим плиточный вариант карты для России (Russia >> Regions (squares)):

Шаг 2) Указываем, что наши данные в виде ссылки на внешний источник данных Link external dataset

Вставляем ссылку на гугл-таблицу (см. 5 шаг выше). Если все ОК, то напротив будет зеленая галочка. Выбираем пункт Use Datawrapper server и нажимаем кнопку Connect:

Убеждаемся, что данные успешно загрузились:

Шаг 3) Настраиваем нашу визуализацию (плиточную карту). Выбираем столбец (переменную, которая будет кодировать цвет плиток) — temp (1), выбираем палитру (2), тип палитры (3), а также указываем дополнительные атрибуты палитры (4) — количество интервалов, максимальное и минимальные значения:

Важно изменить направление цветов палитры, чтобы положительным значениям температуры соответствовали оттенки красного, а отрицательным — синего: нажмите на ключ, затем на кнопку Reverse:

На вкладке Annotate напишите заголовок визуализации, а также задайте метки для плиточек регионов. Для этого активируйте переключатель Show labels, выберите столбец (переменную) labels, в котором у нас хранятся метки регионов, температура и эмодзи-символ погоды.

Попробуйте далее самостоятельно дооформить визуализацию: добавить описание, автора, источник данных, ссылку на источник данных, определить возможные размеры плиточной карты и т.п. После этого переходите к шагу публикации визуализации -- получения ссылки на нее (вкладка Publish&Embed).

Финальный вариант плиточной карты эмодзи-погоды в России:

Мой телеграм-канал: https://t.me/weekly_charts