Skip to content

Проектная работа первого спринта курса «Асинхронное программирование на Python».

Notifications You must be signed in to change notification settings

murzindima/YP_async-python-sprint-1

Repository files navigation

Комментарии для ревьюера

Здравствуйте, Владислав. Спасибо за ревью!

Про Any

Исправил.

Про ошибку при запуске тестов

Я использую poetry и эта зависимость в файле pyproject.toml

[tool.poetry.dev-dependencies]
pytest = "^8.2.2"
pytest-mock = "^3.14.0"

этот пакет -- pytest-mock = "^3.14.0"

$ poetry show
black              24.4.2   The uncompromising code formatter.
certifi            2024.6.2 Python package for providing Mozilla's CA Bundle.
charset-normalizer 3.3.2    The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.
click              8.1.7    Composable command line interface toolkit
idna               3.7      Internationalized Domain Names in Applications (IDNA)
iniconfig          2.0.0    brain-dead simple config-ini parsing
mypy-extensions    1.0.0    Type system extensions for programs checked with the mypy type checker.
packaging          24.1     Core utilities for Python packages
pathspec           0.12.1   Utility library for gitignore style pattern matching of file paths.
platformdirs       4.2.2    A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.
pluggy             1.5.0    plugin and hook calling mechanisms for python
pytest             8.2.2    pytest: simple powerful testing with Python
pytest-mock        3.14.0   Thin-wrapper around the mock package for easier use with pytest
requests           2.32.3   Python HTTP for Humans.
ruff               0.4.8    An extremely fast Python linter and code formatter, written in Rust.
urllib3            2.2.1    HTTP library with thread-safe connection pooling, file post, and more.

$ pytest
=== test session starts ==
platform darwin -- Python 3.12.3, pytest-8.2.2, pluggy-1.5.0
rootdir: /...........
configfile: pyproject.toml
plugins: mock-3.14.0
collected 4 items

tests/test_data_aggregation.py .                                                                                                                                                                     [ 25%]
tests/test_data_analyzing.py .                                                                                                                                                                       [ 50%]
tests/test_data_calculation.py .                                                                                                                                                                     [ 75%]
tests/test_data_fetching.py .                                                                                                                                                                        [100%]

== 4 passed in 0.02s =====

Про очереди

Вроде поправил. Добавил очередь Теперь fetching и calculation работают параллельно

Проектное задание первого спринта

Ваша задача — проанализировать данные по погодным условиям, полученные от 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. Проанализируйте результат и сделайте вывод, какой из городов наиболее благоприятен для поездки.

Описание

Наиболее благоприятным городом считать тот, в котором средняя температура за всё время была самой высокой, а количество времени без осадков — максимальным. Если таких городов более одного, то выводить все.

Требования к решению

  1. Используйте для решения как процессы, так и потоки. Для этого разделите все задачи по их типу – IO-bound или CPU-bound.
  2. Используйте для решения и очередь, и пул задач.
  3. Опишите этапы решения в виде отдельных классов в модуле tasks.py:
  • DataFetchingTask — получение данных через API;
  • DataCalculationTask — вычисление погодных параметров;
  • DataAggregationTask — объединение вычисленных данных;
  • DataAnalyzingTask — финальный анализ и получение результата.
  1. Используйте концепции ООП.
  2. Предусмотрите обработку исключительных ситуаций.
  3. Логируйте результаты действий.
  4. Используйте аннотацию типов.
  5. Приведите стиль кода в соответствие pep8, flake8, mypy.

Рекомендации к решению

  1. Предусмотрите и обработайте ситуации с некорректным обращением к внешнему API: отсутствующая/битая ссылка, неверный ответ, невалидное содержимое или иной формат ответа.
  2. Покройте написанный код тестами.
  3. Используйте таймауты для ограничения времени выполнения частей программы и принудительного завершения при зависаниях или нештатных ситуациях.

Пример использования YandexWeatherAPI для работы с 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)

About

Проектная работа первого спринта курса «Асинхронное программирование на Python».

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages