Погода в регионах России
В русскоязычном датавиз-чате спросили:
Почему бы не попробовать сделать подобное для России?
Исходные данные
Я вспомнил, что как-то давно для Екатеринбурга уже получал данные о погоде в 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
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