Skip to content

nikitasyan/currency_dashboard

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Задание

Тестовое задание для стажера по направлению «Python-разработка»

0. Общие требования к заданию

  • Решение должно быть оформлено в проект, запускающийся в своём виртуальном окружении. Все дополнительные пакеты должны устанавливаться в это виртуальное окружение, а не в базовую установку python.
  • Код пишется в ООП. Процедурный стиль недопустим.
  • Алгоритмы в стиле for i in range() допустимы только при операциях, требующих длительного выполнения каждой итерации цикла (например, обработка веб-страницы). В данном задании таких циклов не предвидится.
  • Можно использовать любые дополнительные модули python, облегчающие структурирование и обработку. Подсказка: в данном случае могут помочь (хотя и не обязательны) django, pandas или beautifulsoup + lxml. Для web-интерфейсов может облегчить жизнь bootstrap.

1. Реализовать веб-интерфейс считывания данных

Пользователь может выбрать диапазон дат в пределах 2 лет. По нажатию кнопки считываются курсы валют и страны мира.

    1. Считать курсы валют (доллар, евро, фунт, японская йена, турецкая лира, индийская рупия, китайский юань) за выбранный диапазон (в ссылке диапазон дат взят для примера) со страницы 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
    1. Считать список валют стран мира со страницы https://www.iban.ru/currency-codes
    1. Синхронизировать данные в локальной базе данных. Можно взять sqlite или любую другую sql-базу, не требующую отдельной установки в ОС. Синхронизировать - значит не перезаписывать те записи, что не изменились. Удалять записи не надо. Только изменять или добавлять.
    1. В отдельной таблице синхронизировать расчёт относительных изменений курса основной валюты для каждой страны. За основу взять курс на любую выбранную дату. Эту дату сохранить в отдельной таблице параметров, использовать её при обновлении данных.

2. Реализовать веб-интерфейс к относительным изменениям курсов

Пользователь может выбрать несколько стран и диапазон дат. По нажатию кнопки на графике должны отобразиться относительные изменения курсов валют для выбранных стран (одна страна - одна линия).

Решение

Конечный результат

Был реализован пользовательский веб-интерфейс считывания данных. В серверную часть приложения отправляются такие данные, как начальная и конечная даты считывания, а также сами валюты, которые необходимо отобразить.

В соответствии со считанными данными, в локальную базу данных test.db добавляются новые данные или обновляются старые данные курса на определённую дату для каждой из выбранных валют.

После манипуляций с базой данных, программа переходит к задаче отображения информации. Для этого используется график, по оси абсцисс (ось x) которого отображаются даты, в то время как по оси ординат (ось y) отображается стоимость валют в рублях.

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

Также можно увеличить конкретную область, выделив её, зажав левую кнопку мыши и проведя по графику. Вернуться в исходное положение можно будет сделав двойной щелчек (возможно, двойной щелчек нужно будет повторить дважды).

Реализация

Проект выполнен с использованием таких библиотек, как Dash, Pandas, Plotly и BeautifulSoup.

  • Dash отвечает за связь между вводимыми пользователями данными с сервером их обрабатывающим, а также передаёт обработанные данные обратно в пользовательский интерфейс.
  • Plotly выступает как составляющая фреймворка Dash, принимая необходимые данные и преобразуя их в график, который и возвращается пользователю.
  • Pandas отвечает за связь со встроенной базой данных sqlite
  • BeautifulSoup используется в качестве парсера данных с сайта https://www.finmarket.ru/

Отклонения от задания

Стоит отметить, что при выполнении задания были допущены некоторые несоответствия приведённым требованиям.

  1. В программе присутствуют сразу 2 цикла for i in ..., так как я не понял, как заменить функционал, исполняюшийся этими циклами чем-то другим. Возможно, я не совсем понял суть задания, и использования цикла не подразумевалось в какой-то конкретной части (например, в части парсинга данных с внешнего сайта).
  2. В задании дана ссылка (https://www.iban.ru/currency-codes) со списками валют и стран мира. Эта ссылка не была использована, так как я не понял, для чего её использовать. Возможные варианты для считывания валют даны в задании. Разве что считать коды валют, но эти данные являются достаточно постоянными, чтобы их просто зашить внутрь самого приложения, что я и сделал.
  3. Согласно заданию, приложение должно оперировать минимум двумя таблицами базы данных. Одна -- для записей курса валют (реализована), другая -- для записей изменений этого самого курса (не реализована). Если я правильно понял цель задания и график на выходе соответствует требованиям, то я не совсем понимаю, для чего нужна вторая таблица. Предполагаю, что данное задание можно реализовать таким образом, чтобы обе таблицы играли роль в приложении. Однако, если есть возможность что-то упростить, оставив таким же функциональным, ей, с моей точки зрения, нужно пользоваться.
  4. Не столько несоответствие требованию, сколько непонимание увиденного. Исходя из задания становится понятно, что нужно считать курсы выбранных валют и отобразить их в в рублёвом эквиваленте. Однако, на сайте, с которого производится считывание этих самых курсов присутствуют некоторые аномалии в части, касающейся конвертации валюты. На приведённом ниже скриншоте видно, что второй столбец (Кол-во) странным образом меняется, причём иногда на каждый новый день порядок изменяется. В связи с чем было принято решение прямо в коде записать необходимые коэффициенты преобразования курсов валют.

Screenshot from 2024-05-24 12-45-54.png

Развёртывание

Чтобы посмотреть на работающее приложение, можно воспользоваться одним из следующих способов:

  1. Клонируем текущий репозиторий: git clone https://github.com/nikitasyan/currency_dashboard.git
  2. Открываем любимую IDE и вводим команду python main.py. При этом, для каждого конкретного случая команда может меняться в зависимости от установленной версии интерпретатора python. Например, может использоваться команда python3.12 main.py.

В качестве второго способа идет использование docker

  1. Первый шаг аналогичен - клонируем репозиторий: git clone https://github.com/nikitasyan/currency_dashboard.git
  2. Дальше необходимо собрать образ и запустить его:
    1. Сначала выполняем команду docker build -t currency_dashboard . Может потребоваться некоторое время для загрузки необходимых библиотек.
    2. Затем, выполняем команду docker run -p 8080:8080 currency_dashboard, после чего образ запустится и по ссылке http://127.0.0.1:8080 Вы сможете воспользоваться приложением.

P.S. При выполнении сборки проекта с помощью docker, может понадобится вставка ключевого слова sudo в начале каждой команды.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published