Ваша задача — проанализировать данные по погодным условиям, полученные от API Яндекс Погоды.
1. Получите информацию о погодных условиях для указанного списка городов, используя API Яндекс Погоды.
Описание
Список городов находится в переменной CITIES
в файле utils.py. Для взаимодействия с API используйте готовый класс YandexWeatherAPI
в модуле external/client.py
. Пример работы с классом YandexWeatherAPI
описан в примере. Пример ответа от API для анализа вы найдёте в файле.
2. Вычислите среднюю температуру и проанализируйте информацию об осадках за указанный период для всех городов.
Описание
Условия и требования:
- период вычислений в течение дня — с 9 до 19 часов;
- средняя температура рассчитывается за указанный промежуток времени;
- сумма времени (часов), когда погода без осадков (без дождя, снега, града или грозы), рассчитывается за указанный промежуток времени;
- информация о температуре для указанного дня за определённый час находится по следующему пути:
forecasts> [день]> hours> temp
; - информация об осадках для указанного дня за определённый час находится по следующему пути:
forecasts> [день]> hours> condition
.
Пример данных с информацией о температуре и осадках за день.
Список вариантов погодных условий находится в таблице в блоке condition
или в файле.
Для анализа данных используйте подготовленный скрипт в модуле external/analyzer.py
. Скрипт имеет два параметра запуска:
-i
– путь до файла с данными, как результат ответа отYandexWeatherAPI
в форматеjson
;-o
– путь до файла для сохранения результата выполнения работы.
Пример запуска скрипта:
python3 external/analyzer.py -i examples/response.json -o output.json
Пример данных с информацией об анализе данных для одного города за период времени, указанный во входном файле.
3. Объедините полученные данные и сохраните результат в текстовом файле.
Описание
Формат сохраняемого файла – json, yml, csv или xls/xlsx.
Возможный формат таблицы для сохранения, где рейтинг — это позиция города относительно других при анализе «благоприятности поездки» (п.4).
Город/день | 14-06 | ... | 19-06 | Среднее | Рейтинг | |
---|---|---|---|---|---|---|
Москва | Температура, среднее | 24 | 27 | 25.6 | 8 | |
Без осадков, часов | 8 | 4 | 6 | |||
Абу-Даби | Температура, среднее | 34 | 37 | 35.5 | 2 | |
Без осадков, часов | 9 | 10 | 9.5 | |||
... |
4. Проанализируйте результат и сделайте вывод, какой из городов наиболее благоприятен для поездки.
Описание
Наиболее благоприятным городом считать тот, в котором средняя температура за всё время была самой высокой, а количество времени без осадков — максимальным. Если таких городов более одного, то выводить все.
- Используйте для решения как процессы, так и потоки. Для этого разделите все задачи по их типу – IO-bound или CPU-bound.
- Используйте для решения и очередь, и пул задач.
- Опишите этапы решения в виде отдельных классов в модуле tasks.py:
DataFetchingTask
— получение данных через API;DataCalculationTask
— вычисление погодных параметров;DataAggregationTask
— объединение вычисленных данных;DataAnalyzingTask
— финальный анализ и получение результата.
- Используйте концепции ООП.
- Предусмотрите обработку исключительных ситуаций.
- Логируйте результаты действий.
- Используйте аннотацию типов.
- Приведите стиль кода в соответствие pep8, flake8, mypy.
- Предусмотрите и обработайте ситуации с некорректным обращением к внешнему API: отсутствующая/битая ссылка, неверный ответ, невалидное содержимое или иной формат ответа.
- Покройте написанный код тестами.
- Используйте таймауты для ограничения времени выполнения частей программы и принудительного завершения при зависаниях или нештатных ситуациях.
from external.client import YandexWeatherAPI
from utils import get_url_by_city_name
city_name = "MOSCOW"
url_with_data = get_url_by_city_name(city_name)
resp = YandexWeatherAPI.get_forecasting(data_url)