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