Несколько дней назад мы опубликовали сравнительный пост двух популярных API метеослужб — Dark Sky и OpenWeatherMap. В этом посте мы покажем вам, как использовать данные о погоде из Dark Sky API для создания анимированных визуализаций.

В последние годы споры о погоде и погодных условиях всегда вызывали споры о глобальном потеплении. Как бы нам ни хотелось отрицать это, мы чувствуем это каждый год, когда лето становится все жарче, а зима сжимается. Нет лучшего способа доказать это, чем использовать данные, и Dark Sky API предлагает нам множество возможностей для игры с погодными параметрами.

В этом посте мы собираемся создать скрипт python для захвата прогнозов погоды и представления параметров погоды с помощью анимированной визуализации.

Подключиться к Dark Sky API

Обзор API темного неба

API Dark Sky предоставляет как текущие прогнозы, так и исторические данные о погоде для заданного местоположения, определенного его координатами местоположения. Он предлагает обширный набор параметров погоды. Помимо типичных данных о температуре, влажности, давлении, он также имеет доступ к не столь часто наблюдаемым явлениям, таким как уровень озона и облачный покров.

Вы можете более подробно ознакомиться с конечными точками API через Консоль Dark Sky API.

Конечные точки API говорят сами за себя.

Конечные точки «GET Forecast» предоставляют текущий прогноз погоды для заданного местоположения, тогда как «GET Time Machine» предоставляет исторический прогноз для данного местоположения в заданном день в прошлом.

Как получить доступ к Dark Sky API

1. Зарегистрируйте учетную запись RapidAPI

Чтобы начать использовать Dark Sky API, вам сначала необходимо зарегистрировать бесплатную учетную запись разработчика RapidAPI. С этой учетной записью вы получаете универсальный API-ключ для доступа ко всем API, размещенным в RapidAPI.

RapidAPI — крупнейший в мире рынок API с более чем 10 000 API и сообществом из более чем 1 000 000 разработчиков. Наша цель — помочь разработчикам найти и подключиться к API, чтобы помочь им создавать потрясающие приложения.

2. Подпишитесь на API Dark Sky

После входа войдите в свою учетную запись RapidAPI и получите доступ к консоли API. Перейдите на вкладку «Цены» и подпишитесь на базовую подписку, которая дает вам 100 бесплатных вызовов API к Dark Sky API в месяц.

Является ли Dark Sky API бесплатным?

API Dark Sky предоставляется бесплатно до 100 вызовов API в месяц. После 100 вызовов в месяц с вас будет взиматься плата в размере 0,001 доллара США за каждый дополнительный запрос API.

3. Протестируйте подписку на API

Пришло время сделать тестовый запуск Dark Sky API.

Выберите конечную точку «GET Forecast» в консоли API. Введите значения параметров «широта» и «долгота», как показано, и нажмите кнопку Проверить конечную точку.

Это запускает API для возврата текущего прогноза для Нью-Йорка, как определено координатами местоположения.

Ответ API содержит конверт JSON, содержащий несколько прогнозов, в том числе текущий, почасовой, а также прогноз на день. Почасовой прогноз распространяется на 48 часов от настоящего времени, а дневной прогноз распространяется на следующие семь дней.

Подключиться к Dark Sky API

Как использовать API Dark Sky в Python для создания анимированных моделей погоды

Чтобы визуализировать погодные условия, сначала необходимо создать набор данных для накопления данных о погоде за ряд дней. Используя Dark Sky API, вы можете добиться этого двумя способами.

Вы можете использовать ежечасные или ежедневные прогнозы, предоставленные текущим прогнозом, возвращенным из конечной точки «GET Forecast». В качестве альтернативы, если вы хотите рассмотреть более широкий диапазон, тогда «GET Time Machine» — ваш лучший друг. С помощью «GET Time Machine» вы можете собирать исторические прогнозы погоды на определенные дни, например на начало каждого года, и создавать большой набор данных, чтобы следить за тенденциями.

Для простоты и с учетом ограничений на количество бесплатных вызовов API в рамках базовой подписки Dark Sky API мы будем использовать конечную точку «GET Forecast» и создадим набор данных, используя ежедневный прогноз для следующие семь дней.

Давайте напишем скрипт Python для создания набора данных для прогноза на следующие семь дней для Нью-Йорка. Прежде чем начать, убедитесь, что у вас установлен правильный набор инструментов и библиотек для среды разработки.

  1. Среда выполнения Python 3. У вас должна быть установлена ​​среда выполнения Python 3.
  2. Библиотека запросов. В среде выполнения Python 3 должна быть установлена ​​библиотека запросов. Вы можете использовать команду pip «запросы на установку pip», чтобы установить его.

Откройте свой любимый редактор кода и создайте новый файл с именем weather_capture.py. Следуйте шагу ниже, чтобы построить логику кода.

1. Определите импорт и глобальные переменные

Для начала вам нужно импортировать библиотеки, которые используются в скрипте. Сценарий также использует ключ RapidAPI для вызова API Dark Sky. Глобальная переменная определена для хранения ключа. Мы использовали другую глобальную переменную для хранения координат местоположения Нью-Йорка.

import sys
import json
import requests
import csv
from datetime import datetime, date, time, timedelta, timezone

LOCATION = "40.73,-73.93"

RAPIDAPI_KEY  = "<YOUR_RAPIDAPI_KEY>"

**Обязательно замените заполнитель ‹YOUR_RAPIDAPI_KEY› вашим ключом подписки на RapidAPI.**

2. Определите функцию для запуска Dark Sky API.

Каждый раз, когда скрипт запускается, он вызывает API Dark Sky, чтобы получить текущий прогноз из конечной точки «GET Forecast». Определим для этого отдельную функцию.

def trigger_api():

  url = "https://dark-sky.p.rapidapi.com/" + LOCATION

  querystring = {"lang":"en","units":"auto"}

  headers = {
      'x-rapidapi-host': "dark-sky.p.rapidapi.com",
      'x-rapidapi-key': RAPIDAPI_KEY
    }

  response = requests.request("GET", url, headers=headers, params=querystring)

  if(200 == response.status_code):
    return json.loads(response.text)
  else:
    return None

URL-адрес API берет местоположение из глобальной переменной, которую мы определили ранее. Строка запроса определяет язык и размер параметров погоды.

3. Инициализируйте сценарий с помощью начальных данных/времени.

Теперь перейдем к основной логике скрипта. Вначале сценарий запускает API, вызывая функцию trigger_api(). После этого он фиксирует метку времени из возвращенного ответа, чтобы получить текущую дату.

print("Getting Weather Data For Next Sever Days")

api_response = trigger_api()

current_date = datetime.fromtimestamp(api_response["currently"]["time"])

4. Анализ ответа API для создания набора данных о погоде

Как мы видели ранее, ответ API возвращает несколько прогнозов, включая ежедневные прогнозы на следующие семь дней. Мы берем несколько важных параметров из ежедневного прогноза и выгружаем их в CSV-файл с отметкой времени в формате ГГГГММДД.

with open('Weather_Data-' + current_date.strftime("%m-%d-%Y") +  '.csv', 'w',newline='') as csv_file:

  csv_writer = csv.writer(csv_file)

  csv_writer.writerow(["Parameter","Time", "Value"])  

  for record in api_response["daily"]["data"]:

    try: 

      time     = record["time"]
      tempH     = record["temperatureHigh"]
      tempL     = record["temperatureLow"]
      humidity = int(record["humidity"] * 100)
      cloud    = int(record["cloudCover"] * 100)
          

      time_of_day = datetime.fromtimestamp(time).strftime("%Y%m%d")

      print("Adding Record for " + time_of_day)
      csv_writer.writerow(["Temp High",time_of_day,tempH])
      csv_writer.writerow(["Temp Low",time_of_day,tempL])
      csv_writer.writerow(["Humidity",time_of_day,humidity])
      csv_writer.writerow(["Cloud Cover",time_of_day,cloud])  
          
    except TypeError as e:

      print(e)
      print("Type Error...Ignoring")
          
    except csv.Error as e:
          
      print(e)
      print("CSV Error...Ignoring")
          

  csv_file.close()

Это создаст запись CSV для следующих семи дней, содержащую самую высокую температуру, самую низкую температуру, влажность и облачность за каждый день.

Мы добавляем обычные проверки исключений и определение области действия для контекста __main__, чтобы придать скрипту окончательный вид.

import sys
import json
import requests
import csv
from datetime import datetime, date, time, timedelta, timezone

LOCATION = "40.73,-73.93"

RAPIDAPI_KEY  = "<YOUR_RAPIDAPI_KEY>"

def trigger_api():

  url = "https://dark-sky.p.rapidapi.com/" + LOCATION

  querystring = {"lang":"en","units":"auto"}

  headers = {
      'x-rapidapi-host': "dark-sky.p.rapidapi.com",
      'x-rapidapi-key': RAPIDAPI_KEY
    }

  response = requests.request("GET", url, headers=headers, params=querystring)

  if(200 == response.status_code):
    return json.loads(response.text)
  else:
    return None

if __name__ == "__main__":

  try: 

    print("Getting Weather Data For Next Sever Days")

    api_response = trigger_api()

    current_date = datetime.fromtimestamp(api_response["currently"]["time"])

    with open('Weather_Data-' + current_date.strftime("%m-%d-%Y") +  '.csv', 'w',newline='') as csv_file:

      csv_writer = csv.writer(csv_file)

      csv_writer.writerow(["Parameter","Time", "Value"])  

      for record in api_response["daily"]["data"]:

        try: 

          time     = record["time"]
          tempH     = record["temperatureHigh"]
          tempL     = record["temperatureLow"]
          humidity = int(record["humidity"] * 100)
          cloud    = int(record["cloudCover"] * 100)
          

          time_of_day = datetime.fromtimestamp(time).strftime("%Y%m%d")

          print("Adding Record for " + time_of_day)
          csv_writer.writerow(["Temp High",time_of_day,tempH])
          csv_writer.writerow(["Temp Low",time_of_day,tempL])
          csv_writer.writerow(["Humidity",time_of_day,humidity])
          csv_writer.writerow(["Cloud Cover",time_of_day,cloud])  
          
        except TypeError as e:

          print(e)
          print("Type Error...Ignoring")
          
        except csv.Error as e:
          
          print(e)
          print("CSV Error...Ignoring")
          

      csv_file.close()

  except Exception as e:

    print("Major Exception ...Aborting")
    sys.exit(e)

5. Запустите скрипт

Теперь скрипт готов для создания набора данных о погоде для Нью-Йорка.

Если вы хотите получить набор данных о погоде из какой-либо другой области, измените значение глобальной переменной LOCATION, чтобы она содержала координаты широты и долготы города, и все готово.

Запустите скрипт через интерпретатор Python3. Файл CSV будет создан по тому же пути, что и скрипт. Откройте файл, чтобы убедиться, что данные правильно собраны для параметров, которые мы извлекли из ответа API.

6. Визуализируйте погодные условия

Существует множество библиотек визуализации данных, которые вы можете использовать для визуализации этого набора данных. Однако вместо того, чтобы писать дополнительный код, почему бы не использовать некоторые из известных инструментов, которые могут легко обрабатывать данные.

Одним из таких инструментов является Gapminder, который визуализирует данные в виде анимированных паттернов. Он является частью фонда Gapminder, основанного покойным Гансом Рослингом, шведским экспертом, который, как известно, использовал этот инструмент, чтобы рассказывать истории с данными о надвигающихся реалиях мира. Поскольку изменение климата также является одной из таких критических проблем, этот инструмент хорошо подходит для демонстрации ухудшающихся погодных условий по всему миру.

Вы можете скачать инструмент Gapminder отсюда.

Установив инструмент Gapminder, вы можете напрямую импортировать сгенерированный набор данных и построить шаблон визуализации полученных нами параметров погоды.

Смотрите видео здесь: https://rapidapi.com/blog/wp-content/uploads/2020/02/Gapminder_Screencast.mp4?_=1

Вуаля!

Теперь вы наблюдаете погодные условия в виде анимированной линейной диаграммы.

Подключиться к Dark Sky API

Вывод

Если эта идея покажется вам интересной, вы можете попробовать расширить этот набор данных. С помощью исторических моделей погоды вы можете создать большой набор данных, чтобы получить более интересные тенденции.

Если вам интересно, как это возможно, посмотрите это видео самого великого Ганса Рослинга, рассказывающее историю о том, как мир изменился за последние 200 лет.

https://youtu.be/BPt8ElTQMIg

Теперь пришло время создать похожую историю с API Dark Sky, которая покажет, как изменилась погода в мире за последние несколько лет.

Первоначально опубликовано на https://rapidapi.com 4 марта 2020 г.