0. Общие требования к заданию
- Решение должно быть оформлено в проект, запускающийся в своём виртуальном окружении. Все дополнительные пакеты должны устанавливаться в это виртуальное окружение, а не в базовую установку python.
- Код пишется в ООП. Процедурный стиль недопустим.
- Алгоритмы в стиле for i in range() допустимы только при операциях, требующих длительного выполнения каждой итерации цикла (например, обработка веб-страницы). В данном задании таких циклов не предвидится.
- Можно использовать любые дополнительные модули python, облегчающие структурирование и обработку. Подсказка: в данном случае могут помочь (хотя и не обязательны) django, pandas или beautifulsoup + lxml. Для web-интерфейсов может облегчить жизнь bootstrap.
1. Реализовать веб-интерфейс считывания данных
Пользователь может выбрать диапазон дат в пределах 2 лет. По нажатию кнопки считываются курсы валют и страны мира.
-
- Считать курсы валют (доллар, евро, фунт, японская йена, турецкая лира, индийская рупия, китайский юань) за выбранный диапазон (в ссылке диапазон дат взят для примера) со страницы https://www.finmarket.ru/currency/rates/?id=10148&pv=1&cur=52170&bd=1&bm=2&by=2022&ed=1&em=2&ey=2024&x=48&y=13#archive
-
- Считать список валют стран мира со страницы https://www.iban.ru/currency-codes
-
- Синхронизировать данные в локальной базе данных. Можно взять sqlite или любую другую sql-базу, не требующую отдельной установки в ОС. Синхронизировать - значит не перезаписывать те записи, что не изменились. Удалять записи не надо. Только изменять или добавлять.
-
- В отдельной таблице синхронизировать расчёт относительных изменений курса основной валюты для каждой страны. За основу взять курс на любую выбранную дату. Эту дату сохранить в отдельной таблице параметров, использовать её при обновлении данных.
2. Реализовать веб-интерфейс к относительным изменениям курсов
Пользователь может выбрать несколько стран и диапазон дат. По нажатию кнопки на графике должны отобразиться относительные изменения курсов валют для выбранных стран (одна страна - одна линия).
Был реализован пользовательский веб-интерфейс считывания данных. В серверную часть приложения отправляются такие данные, как начальная и конечная даты считывания, а также сами валюты, которые необходимо отобразить.
В соответствии со считанными данными, в локальную базу данных test.db
добавляются новые данные или обновляются старые данные курса на определённую дату для каждой из выбранных валют.
После манипуляций с базой данных, программа переходит к задаче отображения информации. Для этого используется график, по оси абсцисс (ось x)
которого отображаются даты, в то время как по оси ординат (ось y)
отображается стоимость валют в рублях.
Стоит отметить, что выводимый график интерактивен. Вы можете добавлять или убирать с графика линии тех или иных вылют при необходимости. При этом, отображение будет подстраиваться под выбранные на текущий момент валюты автоматически, что удобно при переходе от просмотра динамики изменений нескольких валют к изменениям конкретной валюты, так как в таком случае изменяется диапазон оси абсцисс, позволяющий более точно наблюдать и оценивать динамику изменений конкретной валюты.
Также можно увеличить конкретную область, выделив её, зажав левую кнопку мыши и проведя по графику. Вернуться в исходное положение можно будет сделав двойной щелчек (возможно, двойной щелчек нужно будет повторить дважды).
Проект выполнен с использованием таких библиотек, как Dash, Pandas, Plotly и BeautifulSoup.
- Dash отвечает за связь между вводимыми пользователями данными с сервером их обрабатывающим, а также передаёт обработанные данные обратно в пользовательский интерфейс.
- Plotly выступает как составляющая фреймворка Dash, принимая необходимые данные и преобразуя их в график, который и возвращается пользователю.
- Pandas отвечает за связь со встроенной базой данных sqlite
- BeautifulSoup используется в качестве парсера данных с сайта https://www.finmarket.ru/
Стоит отметить, что при выполнении задания были допущены некоторые несоответствия приведённым требованиям.
- В программе присутствуют сразу 2 цикла
for i in ...
, так как я не понял, как заменить функционал, исполняюшийся этими циклами чем-то другим. Возможно, я не совсем понял суть задания, и использования цикла не подразумевалось в какой-то конкретной части (например, в части парсинга данных с внешнего сайта). - В задании дана ссылка (https://www.iban.ru/currency-codes) со списками валют и стран мира. Эта ссылка не была использована, так как я не понял, для чего её использовать. Возможные варианты для считывания валют даны в задании. Разве что считать коды валют, но эти данные являются достаточно постоянными, чтобы их просто зашить внутрь самого приложения, что я и сделал.
- Согласно заданию, приложение должно оперировать минимум двумя таблицами базы данных. Одна -- для записей курса валют (реализована), другая -- для записей изменений этого самого курса (не реализована). Если я правильно понял цель задания и график на выходе соответствует требованиям, то я не совсем понимаю, для чего нужна вторая таблица. Предполагаю, что данное задание можно реализовать таким образом, чтобы обе таблицы играли роль в приложении. Однако, если есть возможность что-то упростить, оставив таким же функциональным, ей, с моей точки зрения, нужно пользоваться.
- Не столько несоответствие требованию, сколько непонимание увиденного. Исходя из задания становится понятно, что нужно считать курсы выбранных валют и отобразить их в в рублёвом эквиваленте. Однако, на сайте, с которого производится считывание этих самых курсов присутствуют некоторые аномалии в части, касающейся конвертации валюты. На приведённом ниже скриншоте видно, что второй столбец (Кол-во) странным образом меняется, причём иногда на каждый новый день порядок изменяется. В связи с чем было принято решение прямо в коде записать необходимые коэффициенты преобразования курсов валют.
Чтобы посмотреть на работающее приложение, можно воспользоваться одним из следующих способов:
- Клонируем текущий репозиторий:
git clone https://github.com/nikitasyan/currency_dashboard.git
- Открываем любимую IDE и вводим команду
python main.py
. При этом, для каждого конкретного случая команда может меняться в зависимости от установленной версии интерпретатора python. Например, может использоваться командаpython3.12 main.py
.
В качестве второго способа идет использование docker
- Первый шаг аналогичен - клонируем репозиторий:
git clone https://github.com/nikitasyan/currency_dashboard.git
- Дальше необходимо собрать образ и запустить его:
- Сначала выполняем команду
docker build -t currency_dashboard .
Может потребоваться некоторое время для загрузки необходимых библиотек. - Затем, выполняем команду
docker run -p 8080:8080 currency_dashboard
, после чего образ запустится и по ссылкеhttp://127.0.0.1:8080
Вы сможете воспользоваться приложением.
- Сначала выполняем команду
P.S. При выполнении сборки проекта с помощью docker, может понадобится вставка ключевого слова sudo
в начале каждой команды.