{"id":1244,"date":"2025-08-08T08:51:46","date_gmt":"2025-08-08T05:51:46","guid":{"rendered":"https:\/\/gerdlezhev.ru\/?p=1244"},"modified":"2026-01-11T22:44:52","modified_gmt":"2026-01-11T19:44:52","slug":"%d0%be%d1%82-excel-%d0%ba-python-%d0%bf%d0%be%d0%bb%d0%bd%d0%be%d1%86%d0%b5%d0%bd%d0%bd%d0%be%d0%b5-%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d0%bf%d0%be-%d0%bf%d0%b5%d1%80","status":"publish","type":"post","link":"https:\/\/gerdlezhev.ru\/?p=1244","title":{"rendered":"\u041e\u0442 Excel \u043a Python: \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0443 \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438"},"content":{"rendered":"\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 Excel \u043a Python \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 Python \u0434\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0434\u043b\u044f 100 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0412\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u043e\u0441\u0432\u043e\u0438\u0442\u044c Python \u0441 \u043d\u0443\u043b\u044f, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c \u043b\u0438 \u0432\u044b \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0441\u0442\u043e\u043c, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438\u043b\u0438 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c, \u044d\u0442\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0443\u0442\u0438\u043d\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0432 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"python--excel\">\u041f\u043e\u0447\u0435\u043c\u0443 Python \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 Excel \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f Excel \u0432 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435<\/h2>\n\n\n\n<p>Excel \u0443\u0436\u0435 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u0444\u0435\u0440\u0430\u0445. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c\u0438 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. Excel \u0438\u043c\u0435\u0435\u0442 \u043b\u0438\u043c\u0438\u0442 \u0432 1,048,576 \u0441\u0442\u0440\u043e\u043a \u0438 16,384 \u0441\u0442\u043e\u043b\u0431\u0446\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 Excel \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0438 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442.<\/p>\n\n\n\n<p>\u041a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 Excel \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 Excel Online \u0438\u043b\u0438 Google Sheets, \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u043b\u0438\u0431\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043b\u0438\u0431\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432, \u0447\u0442\u043e \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u0435\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0438 \u0430\u043d\u0430\u043b\u0438\u0437.<\/p>\n\n\n\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0432 Excel \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 VBA, \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 Excel \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 Python \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/h2>\n\n\n\n<p>Python \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0435\u0433\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u043d\u044b Excel \u0432 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c<\/strong>: Python \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0430\u0436\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c.<\/li>\n\n\n\n<li><strong>\u0411\u043e\u0433\u0430\u0442\u0430\u044f \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Pandas, NumPy, SciPy, Scikit-learn \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u043e\u0449\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438, \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c Excel.<\/li>\n\n\n\n<li><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f<\/strong>: Python \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438, \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0438 API, \u0447\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0448\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/li>\n\n\n\n<li><strong>\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/strong>: \u041a\u043e\u0434 \u043d\u0430 Python \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0448\u0430\u0433\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u043c \u0438 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u043d\u044b\u043c \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0440\u0443\u0447\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0432 Excel.<\/li>\n\n\n\n<li><strong>\u041a\u043e\u043b\u043b\u0430\u0431\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430<\/strong>: \u0421\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 (Git) \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438.<\/li>\n\n\n\n<li><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/strong>: Python \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 (Flask, Django, Streamlit) \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u0420\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/h2>\n\n\n\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 Excel \u0438 Python \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u044b\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0441\u0442\u0440\u043e\u043a \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b \u0432 Excel \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0430\u0441\u044b, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Python \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438\u043b\u0438 \u043c\u0438\u043d\u0443\u0442\u044b.<\/p>\n\n\n\n<p>\u0412 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0441\u0444\u0435\u0440\u0435, \u0433\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043c\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b, Python \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430: \u043e\u0442 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043b\u0438\u0446\u0430\u043c.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"python\">\u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 Python \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0441\u0442\u043e\u0432 \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Python \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h2>\n\n\n\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f Python \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0430\u043c \u044f\u0437\u044b\u043a \u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b. \u0414\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0441\u0442\u043e\u0432 \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432, \u043f\u0440\u0438\u0432\u044b\u043a\u0448\u0438\u0445 \u043a Excel, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 Anaconda, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 Python \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435.<\/p>\n\n\n\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Anaconda:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 Anaconda \u0438 \u0441\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (Windows, macOS \u0438\u043b\u0438 Linux).<\/li>\n\n\n\n<li>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0438 \u0441\u043b\u0435\u0434\u0443\u0439\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Anaconda \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 PATH \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n\n\n\n<li>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d Anaconda Navigator \u2013 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u0430\u043c\u0438 \u0438 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 Python.<\/li>\n\n\n\n<li>\u0427\u0435\u0440\u0435\u0437 Navigator \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Jupyter Notebook \u2013 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f.<\/li>\n<\/ol>\n\n\n\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c IDE (\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438) \u0434\u043b\u044f Python. \u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f PyCharm, Visual Studio Code \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c Python \u0438\u043b\u0438 Spyder, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0432 Anaconda.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0441\u043d\u043e\u0432\u044b \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Python \u0434\u043b\u044f Excel-\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/h2>\n\n\n\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u0444\u043e\u0440\u043c\u0443\u043b Excel \u043a \u043a\u043e\u0434\u0443 Python \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b. \u0412\u043e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u044f\u0447\u0435\u0435\u043a Excel, \u0432 Python \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/em>\n\u0432\u044b\u0440\u0443\u0447\u043a\u0430 = 15000000\n\u0440\u0430\u0441\u0445\u043e\u0434\u044b = 9500000\n\u043f\u0440\u0438\u0431\u044b\u043b\u044c = \u0432\u044b\u0440\u0443\u0447\u043a\u0430 - \u0440\u0430\u0441\u0445\u043e\u0434\u044b\nprint(f\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 {\u043f\u0440\u0438\u0431\u044b\u043b\u044c} \u0440\u0443\u0431\u043b\u0435\u0439\")\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u0421\u043f\u0438\u0441\u043a\u0438 \u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u0438<\/strong>: \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u0432 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0421\u043f\u0438\u0441\u043e\u043a - \u0430\u043d\u0430\u043b\u043e\u0433 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 Excel<\/em>\n\u043c\u0435\u0441\u044f\u0446\u044b = [\"\u042f\u043d\u0432\u0430\u0440\u044c\", \"\u0424\u0435\u0432\u0440\u0430\u043b\u044c\", \"\u041c\u0430\u0440\u0442\", \"\u0410\u043f\u0440\u0435\u043b\u044c\"]\n\n<em># \u0421\u043b\u043e\u0432\u0430\u0440\u044c - \u0430\u043d\u0430\u043b\u043e\u0433 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438<\/em>\n\u043f\u0440\u043e\u0434\u0430\u0436\u0438_\u043f\u043e_\u043c\u0435\u0441\u044f\u0446\u0430\u043c = {\n    \"\u042f\u043d\u0432\u0430\u0440\u044c\": 1200000,\n    \"\u0424\u0435\u0432\u0440\u0430\u043b\u044c\": 1350000,\n    \"\u041c\u0430\u0440\u0442\": 1500000,\n    \"\u0410\u043f\u0440\u0435\u043b\u044c\": 1650000\n}\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u0423\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/strong>: \u0417\u0430\u043c\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 IF \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0410\u043d\u0430\u043b\u043e\u0433 IF \u0432 Excel<\/em>\nif \u043f\u0440\u043e\u0434\u0430\u0436\u0438_\u043f\u043e_\u043c\u0435\u0441\u044f\u0446\u0430\u043c[\"\u041c\u0430\u0440\u0442\"] &gt; 1400000:\n    \u0431\u043e\u043d\u0443\u0441 = 50000\nelse:\n    \u0431\u043e\u043d\u0443\u0441 = 0\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u0426\u0438\u043a\u043b\u044b<\/strong>: \u0417\u0430\u043c\u0435\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0443\u043b \u0432\u043d\u0438\u0437\/\u0432\u043f\u0440\u0430\u0432\u043e \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0410\u043d\u0430\u043b\u043e\u0433 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043d\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0432 Excel<\/em>\n\u043e\u0431\u0449\u0430\u044f_\u0432\u044b\u0440\u0443\u0447\u043a\u0430 = 0\nfor \u043c\u0435\u0441\u044f\u0446 in \u043f\u0440\u043e\u0434\u0430\u0436\u0438_\u043f\u043e_\u043c\u0435\u0441\u044f\u0446\u0430\u043c:\n    \u043e\u0431\u0449\u0430\u044f_\u0432\u044b\u0440\u0443\u0447\u043a\u0430 += \u043f\u0440\u043e\u0434\u0430\u0436\u0438_\u043f\u043e_\u043c\u0435\u0441\u044f\u0446\u0430\u043c[\u043c\u0435\u0441\u044f\u0446]\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u0438<\/strong>: \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0430\u043d\u0430\u043b\u043e\u0433 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 VBA)<\/em>\ndef \u0440\u0430\u0441\u0447\u0435\u0442_\u043d\u0430\u043b\u043e\u0433\u0430(\u0441\u0443\u043c\u043c\u0430, \u0441\u0442\u0430\u0432\u043a\u0430=0.2):\n    return \u0441\u0443\u043c\u043c\u0430 * \u0441\u0442\u0430\u0432\u043a\u0430\n\n\u043d\u0430\u043b\u043e\u0433 = \u0440\u0430\u0441\u0447\u0435\u0442_\u043d\u0430\u043b\u043e\u0433\u0430(\u043f\u0440\u0438\u0431\u044b\u043b\u044c)\n<\/code><\/pre>\n\n\n\n<p>\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e Python \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 &#171;\u044f\u0432\u043d\u043e\u0435 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043d\u0435\u044f\u0432\u043d\u043e\u0435&#187;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u0447\u0430\u0441\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u043d, \u0447\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0432 Excel, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Pandas: \u043c\u043e\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 Excel \u0438 Python<\/h2>\n\n\n\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Pandas \u2013 \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 Excel \u043a Python. \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 Python \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e\u0439, \u043a\u0430\u043a \u0432 Excel, \u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0439.<\/p>\n\n\n\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Pandas \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f DataFrame \u2013 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u043b\u0438\u0441\u0442\u0443 Excel:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code>import pandas as pd\n\n<em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 DataFrame - \u0430\u043d\u0430\u043b\u043e\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b Excel<\/em>\n\u0434\u0430\u043d\u043d\u044b\u0435 = {\n    \"\u041c\u0435\u0441\u044f\u0446\": [\"\u042f\u043d\u0432\u0430\u0440\u044c\", \"\u0424\u0435\u0432\u0440\u0430\u043b\u044c\", \"\u041c\u0430\u0440\u0442\", \"\u0410\u043f\u0440\u0435\u043b\u044c\"],\n    \"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\": [1200000, 1350000, 1500000, 1650000],\n    \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\": [800000, 850000, 950000, 1000000]\n}\n\ndf = pd.DataFrame(\u0434\u0430\u043d\u043d\u044b\u0435)\n\n<em># \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441 \u0444\u043e\u0440\u043c\u0443\u043b\u043e\u0439 (\u0430\u043d\u0430\u043b\u043e\u0433 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0432 Excel)<\/em>\ndf[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"] = df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] - df[\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"]\n\n<em># \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0438\u0442\u043e\u0433\u043e\u0432 (\u0430\u043d\u0430\u043b\u043e\u0433 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0421\u0423\u041c\u041c, \u0421\u0420\u0417\u041d\u0410\u0427 \u0432 Excel)<\/em>\n\u0438\u0442\u043e\u0433\u043e_\u0432\u044b\u0440\u0443\u0447\u043a\u0430 = df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"].sum()\n\u0441\u0440\u0435\u0434\u043d\u044f\u044f_\u043f\u0440\u0438\u0431\u044b\u043b\u044c = df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"].mean()\n<\/code><\/pre>\n\n\n\n<p>Pandas \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0432 Excel, \u043d\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e \u0438 \u0434\u043b\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u0410\u043d\u0430\u043b\u043e\u0433 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f (\u0430\u043d\u0430\u043b\u043e\u0433 \u0414\u0430\u043d\u043d\u044b\u0435 -&gt; \u0424\u0438\u043b\u044c\u0442\u0440 \u0432 Excel)<\/em>\n\u0432\u044b\u0441\u043e\u043a\u0430\u044f_\u043f\u0440\u0438\u0431\u044b\u043b\u044c = df[df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"] &gt; 500000]\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430<\/strong>: \u0410\u043d\u0430\u043b\u043e\u0433 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u0430\u043d\u0430\u043b\u043e\u0433 \u0414\u0430\u043d\u043d\u044b\u0435 -&gt; \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432 Excel)<\/em>\n\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435_\u0434\u0430\u043d\u043d\u044b\u0435 = df.sort_values(by=\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", ascending=False)\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f<\/strong>: \u0410\u043d\u0430\u043b\u043e\u0433 \u0441\u0432\u043e\u0434\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \"\u041e\u0442\u0434\u0435\u043b\"<\/em>\n<em># \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 (\u0430\u043d\u0430\u043b\u043e\u0433 \u0441\u0432\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 Excel)<\/em>\n\u0441\u0432\u043e\u0434\u043d\u0430\u044f_\u043f\u043e_\u043e\u0442\u0434\u0435\u043b\u0430\u043c = df.groupby(\"\u041e\u0442\u0434\u0435\u043b\").agg({\n    \"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\": \"sum\",\n    \"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\": [\"sum\", \"mean\"]\n})\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Excel-\u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/strong>: Pandas \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c Excel-\u0444\u0430\u0439\u043b\u043e\u0432.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Excel<\/em>\ndf_\u0438\u0437_excel = pd.read_excel(\"\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439_\u043e\u0442\u0447\u0435\u0442.xlsx\", sheet_name=\"\u041a\u0432\u0430\u0440\u0442\u0430\u043b 1\")\n\n<em># \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 Excel<\/em>\ndf.to_excel(\"\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439_\u043e\u0442\u0447\u0435\u0442.xlsx\", sheet_name=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\", index=False)\n<\/code><\/pre>\n\n\n\n<p>\u041e\u0441\u0432\u043e\u0435\u043d\u0438\u0435 Pandas \u2013 \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0448\u0430\u0433 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430, \u0436\u0435\u043b\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043e\u0442 Excel \u043a Python, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0441 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pandas\">\u0423\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 Pandas \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Pandas<\/h2>\n\n\n\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 Python \u0438 Pandas \u043d\u0430\u0434 Excel \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u043e\u0433\u0434\u0430 \u0432\u0430\u0448\u0438 \u0444\u0430\u0439\u043b\u044b Excel \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u043e \u0441\u043e\u0442\u0435\u043d \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0430\u0442\u044c, Pandas \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e.<\/p>\n\n\n\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Pandas \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u0438\u043a:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0423\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0443\u0442\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\ndf_optimized = df.copy()\nfor col in df.select_dtypes(include=['int']).columns:\n    df_optimized[col] = pd.to_numeric(df[col], downcast='integer')\nfor col in df.select_dtypes(include=['float']).columns:\n    df_optimized[col] = pd.to_numeric(df[col], downcast='float')\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u043c\u0438<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0427\u0442\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0447\u0430\u0441\u0442\u044f\u043c\u0438<\/em>\nchunk_size = 100000  <em># \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u043e\u0434\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/em>\nchunks = []\nfor chunk in pd.read_csv(\"\u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439_\u0444\u0430\u0439\u043b.csv\", chunksize=chunk_size):\n    <em># \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/em>\n    \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439_chunk = \u043d\u0435\u043a\u0430\u044f_\u0444\u0443\u043d\u043a\u0446\u0438\u044f(chunk)\n    chunks.append(\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439_chunk)\n\n<em># \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/em>\n\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = pd.concat(chunks)\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438<\/em>\ndf[\"\u0420\u0435\u0433\u0438\u043e\u043d\"] = df[\"\u0420\u0435\u0433\u0438\u043e\u043d\"].astype(\"category\")\ndf[\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f_\u0442\u043e\u0432\u0430\u0440\u0430\"] = df[\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f_\u0442\u043e\u0432\u0430\u0440\u0430\"].astype(\"category\")\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Pandas<\/h2>\n\n\n\n<p>Pandas \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Excel:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u044f\u0434\u044b<\/strong>: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0430\u0442\u0430\u043c\u0438 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432 Pandas \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u0447\u0435\u043c \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441 \u0434\u0430\u0442\u0430\u043c\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 datetime<\/em>\ndf[\"\u0414\u0430\u0442\u0430\"] = pd.to_datetime(df[\"\u0414\u0430\u0442\u0430\"])\n\n<em># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0414\u0430\u0442\u044b \u043a\u0430\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430<\/em>\ndf.set_index(\"\u0414\u0430\u0442\u0430\", inplace=True)\n\n<em># \u0420\u0435\u0441\u0435\u043c\u043f\u043b\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433 \u0438\u0437 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445)<\/em>\n\u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0435_\u043f\u0440\u043e\u0434\u0430\u0436\u0438 = df[\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\"].resample(\"M\").sum()\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u041e\u043a\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/strong>: \u0410\u043d\u0430\u043b\u043e\u0433 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0421\u041c\u0415\u0429, \u0421\u0420\u0417\u041d\u0410\u0427 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432 Excel, \u043d\u043e \u0441 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u0430 7 \u0434\u043d\u0435\u0439<\/em>\ndf[\"\u0421\u0440\u0435\u0434\u043d\u0438\u0435_\u043f\u0440\u043e\u0434\u0430\u0436\u0438_7\u0434\"] = df[\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\"].rolling(window=7).mean()\n\n<em># \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u043c<\/em>\ndf[\"\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435_%\"] = df[\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\"].pct_change() * 100\n\n<em># \u041a\u0443\u043c\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u043e\u0434\u0430<\/em>\ndf[\"\u0421_\u043d\u0430\u0447\u0430\u043b\u0430_\u0433\u043e\u0434\u0430\"] = df.groupby(df.index.year)[\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\"].cumsum()\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u0421\u0432\u043e\u0434\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/strong>: \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0432\u043e\u0434\u043d\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u0430\u043d\u0430\u043b\u043e\u0433 PivotTable \u0432 Excel)<\/em>\n\u0441\u0432\u043e\u0434\u043d\u0430\u044f = pd.pivot_table(\n    df_\u043f\u0440\u043e\u0434\u0430\u0436\u0438,\n    values=\"\u0421\u0443\u043c\u043c\u0430\",\n    index=[\"\u0420\u0435\u0433\u0438\u043e\u043d\", \"\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\"],\n    columns=[\"\u0413\u043e\u0434\", \"\u041c\u0435\u0441\u044f\u0446\"],\n    aggfunc={\"\u0421\u0443\u043c\u043c\u0430\": [\"sum\", \"mean\"]},\n    margins=True\n)\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u0421\u043b\u0438\u044f\u043d\u0438\u0435 \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u0410\u043d\u0430\u043b\u043e\u0433 VLOOKUP \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 DataFrame (\u0430\u043d\u0430\u043b\u043e\u0433 \u0412\u041f\u0420\/VLOOKUP)<\/em>\n\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = pd.merge(\n    df_\u043f\u0440\u043e\u0434\u0430\u0436\u0438, \n    df_\u043a\u043b\u0438\u0435\u043d\u0442\u044b, \n    left_on=\"ID_\u043a\u043b\u0438\u0435\u043d\u0442\u0430\", \n    right_on=\"ID\", \n    how=\"left\"\n)\n\n<em># \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 Excel<\/em>\n\u0432\u0441\u0435_\u0444\u0430\u0439\u043b\u044b = glob.glob(\"\u043e\u0442\u0447\u0435\u0442\u044b_\u0444\u0438\u043b\u0438\u0430\u043b\u043e\u0432_*.xlsx\")\n\u0441\u043f\u0438\u0441\u043e\u043a_df = []\n\nfor \u0444\u0430\u0439\u043b in \u0432\u0441\u0435_\u0444\u0430\u0439\u043b\u044b:\n    df = pd.read_excel(\u0444\u0430\u0439\u043b)\n    \u0441\u043f\u0438\u0441\u043e\u043a_df.append(df)\n    \n\u043e\u0431\u0449\u0438\u0439_\u043e\u0442\u0447\u0435\u0442 = pd.concat(\u0441\u043f\u0438\u0441\u043e\u043a_df, ignore_index=True)\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a \u0434\u0430\u043d\u043d\u044b\u043c<\/strong>: \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0444\u043e\u0440\u043c\u0443\u043b \u0432 Excel.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 DataFrame<\/em>\ndef \u0440\u0430\u0441\u0447\u0435\u0442_\u0431\u043e\u043d\u0443\u0441\u0430(\u043f\u0440\u043e\u0434\u0430\u0436\u0438, \u043f\u043b\u0430\u043d):\n    if \u043f\u0440\u043e\u0434\u0430\u0436\u0438 &gt;= \u043f\u043b\u0430\u043d * 1.2:\n        return \u043f\u0440\u043e\u0434\u0430\u0436\u0438 * 0.05\n    elif \u043f\u0440\u043e\u0434\u0430\u0436\u0438 &gt;= \u043f\u043b\u0430\u043d:\n        return \u043f\u0440\u043e\u0434\u0430\u0436\u0438 * 0.03\n    else:\n        return 0\n\ndf[\"\u0411\u043e\u043d\u0443\u0441\"] = df.apply(lambda row: \u0440\u0430\u0441\u0447\u0435\u0442_\u0431\u043e\u043d\u0443\u0441\u0430(row[\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\"], row[\"\u041f\u043b\u0430\u043d\"]), axis=1)\n<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430\u043c, \u043f\u0435\u0440\u0435\u0448\u0435\u0434\u0448\u0438\u043c \u0441 Excel \u043d\u0430 Python, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"python\">\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Python: \u043e\u0442 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u043a \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430\u043c<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Matplotlib \u0438 Seaborn<\/h2>\n\n\n\n<p>Python \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Excel. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u2013 Matplotlib \u0438 Seaborn. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code>import matplotlib.pyplot as plt\nimport seaborn as sns\n\n<em># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0438\u043b\u044f \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/em>\nsns.set(style=\"whitegrid\")\n\n<em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430<\/em>\nplt.figure(figsize=(12, 6))\nplt.plot(df_monthly[\"\u0414\u0430\u0442\u0430\"], df_monthly[\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\"], marker='o', linewidth=2)\nplt.title(\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u0440\u043e\u0434\u0430\u0436 \u043f\u043e \u043c\u0435\u0441\u044f\u0446\u0430\u043c\", fontsize=16)\nplt.xlabel(\"\u041c\u0435\u0441\u044f\u0446\", fontsize=14)\nplt.ylabel(\"\u041e\u0431\u044a\u0435\u043c \u043f\u0440\u043e\u0434\u0430\u0436 (\u0440\u0443\u0431.)\", fontsize=14)\nplt.grid(True)\nplt.tight_layout()\nplt.savefig(\"\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430_\u043f\u0440\u043e\u0434\u0430\u0436.png\", dpi=300)\nplt.show()\n<\/code><\/pre>\n\n\n\n<p>\u0414\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u0430\u043d\u0435\u043b\u044c\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u0430\u043d\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430<\/em>\nfig, axes = plt.subplots(2, 2, figsize=(14, 10))\n\n<em># \u0413\u0440\u0430\u0444\u0438\u043a 1: \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u043a \u043f\u0440\u043e\u0434\u0430\u0436<\/em>\naxes[0, 0].plot(df_monthly[\"\u0414\u0430\u0442\u0430\"], df_monthly[\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\"], color='blue')\naxes[0, 0].set_title(\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u0440\u043e\u0434\u0430\u0436\")\n\n<em># \u0413\u0440\u0430\u0444\u0438\u043a 2: \u0421\u0442\u043e\u043b\u0431\u0447\u0430\u0442\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c<\/em>\nsns.barplot(x=\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\", y=\"\u0421\u0443\u043c\u043c\u0430\", data=df_cat, ax=axes[0, 1])\naxes[0, 1].set_title(\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\")\n\n<em># \u0413\u0440\u0430\u0444\u0438\u043a 3: \u041a\u0440\u0443\u0433\u043e\u0432\u0430\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0435\u0439 \u0440\u044b\u043d\u043a\u0430<\/em>\naxes[1, 0].pie(df_region[\"\u0414\u043e\u043b\u044f\"], labels=df_region[\"\u0420\u0435\u0433\u0438\u043e\u043d\"], autopct='%1.1f%%')\naxes[1, 0].set_title(\"\u0414\u043e\u043b\u044f \u0440\u044b\u043d\u043a\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c\")\n\n<em># \u0413\u0440\u0430\u0444\u0438\u043a 4: \u0422\u0435\u043f\u043b\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0439<\/em>\nsns.heatmap(df.corr(), annot=True, cmap=\"coolwarm\", ax=axes[1, 1])\naxes[1, 1].set_title(\"\u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\")\n\nplt.tight_layout()\nplt.savefig(\"\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439_\u0434\u0430\u0448\u0431\u043e\u0440\u0434.png\", dpi=300)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0441 Plotly<\/h2>\n\n\n\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Plotly. \u041e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 HTML \u0441 JavaScript, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0430, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code>import plotly.express as px\nimport plotly.graph_objects as go\nfrom plotly.subplots import make_subplots\n\n<em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430<\/em>\nfig = px.line(\n    df_monthly, \n    x=\"\u0414\u0430\u0442\u0430\", \n    y=[\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\", \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\", \"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"],\n    title=\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u043e \u043c\u0435\u0441\u044f\u0446\u0430\u043c\",\n    labels={\"value\": \"\u0421\u0443\u043c\u043c\u0430 (\u0440\u0443\u0431.)\", \"variable\": \"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\"},\n    line_shape=\"spline\",\n    render_mode=\"svg\"\n)\n\n<em># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430<\/em>\nfig.update_layout(\n    template=\"plotly_white\",\n    legend=dict(orientation=\"h\", yanchor=\"bottom\", y=1.02, xanchor=\"right\", x=1),\n    hovermode=\"x unified\"\n)\n\n<em># \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 HTML<\/em>\nfig.write_html(\"\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439_\u043e\u0442\u0447\u0435\u0442.html\")\n\n<em># \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 Jupyter Notebook<\/em>\nfig.show()\n<\/code><\/pre>\n\n\n\n<p>Plotly \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0432\u0435\u0447\u043d\u044b\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0446\u0435\u043d \u0430\u043a\u0446\u0438\u0439:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code><em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0447\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430<\/em>\nfig = go.Figure(data=[go.Candlestick(\n    x=df_\u0430\u043a\u0446\u0438\u0438['\u0414\u0430\u0442\u0430'],\n    open=df_\u0430\u043a\u0446\u0438\u0438['\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435'],\n    high=df_\u0430\u043a\u0446\u0438\u0438['\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c'],\n    low=df_\u0430\u043a\u0446\u0438\u0438['\u041c\u0438\u043d\u0438\u043c\u0443\u043c'],\n    close=df_\u0430\u043a\u0446\u0438\u0438['\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435'],\n    name=\"\u0421\u0432\u0435\u0447\u0438\"\n)])\n\n<em># \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0445 \u0441\u0440\u0435\u0434\u043d\u0438\u0445<\/em>\nfig.add_trace(go.Scatter(\n    x=df_\u0430\u043a\u0446\u0438\u0438['\u0414\u0430\u0442\u0430'],\n    y=df_\u0430\u043a\u0446\u0438\u0438['SMA_20'],\n    line=dict(color='blue', width=1),\n    name=\"SMA 20\"\n))\n\nfig.add_trace(go.Scatter(\n    x=df_\u0430\u043a\u0446\u0438\u0438['\u0414\u0430\u0442\u0430'],\n    y=df_\u0430\u043a\u0446\u0438\u0438['SMA_50'],\n    line=dict(color='red', width=1),\n    name=\"SMA 50\"\n))\n\nfig.update_layout(\n    title=\"\u0410\u043d\u0430\u043b\u0438\u0437 \u0430\u043a\u0446\u0438\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438\",\n    xaxis_title=\"\u0414\u0430\u0442\u0430\",\n    yaxis_title=\"\u0426\u0435\u043d\u0430 (\u0440\u0443\u0431.)\",\n    xaxis_rangeslider_visible=False\n)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Dash \u0438 Streamlit<\/h2>\n\n\n\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0432 Python \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a Dash \u043e\u0442 Plotly \u0438 Streamlit. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 Excel-\u0444\u0430\u0439\u043b\u044b \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438.<\/p>\n\n\n\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u043d\u0430 Streamlit:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code>import streamlit as st\nimport pandas as pd\nimport plotly.express as px\n\n<em># \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430<\/em>\nst.title(\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438\")\n\n<em># \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445)<\/em>\n@st.cache_data\ndef load_data():\n    return pd.read_excel(\"\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435_\u0434\u0430\u043d\u043d\u044b\u0435.xlsx\")\n\ndf = load_data()\n\n<em># \u0411\u043e\u043a\u043e\u0432\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438<\/em>\nst.sidebar.header(\"\u0424\u0438\u043b\u044c\u0442\u0440\u044b\")\n\n<em># \u0412\u044b\u0431\u043e\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430<\/em>\nstart_date = st.sidebar.date_input(\"\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0430\u0442\u0430\", df[\"\u0414\u0430\u0442\u0430\"].min())\nend_date = st.sidebar.date_input(\"\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0434\u0430\u0442\u0430\", df[\"\u0414\u0430\u0442\u0430\"].max())\n\n<em># \u0412\u044b\u0431\u043e\u0440 \u043e\u0442\u0434\u0435\u043b\u043e\u0432 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430<\/em>\ndepartments = st.sidebar.multiselect(\n    \"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044b\",\n    options=df[\"\u041e\u0442\u0434\u0435\u043b\"].unique(),\n    default=df[\"\u041e\u0442\u0434\u0435\u043b\"].unique()\n)\n\n<em># \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\nfiltered_df = df[\n    (df[\"\u0414\u0430\u0442\u0430\"] &gt;= start_date) &amp; \n    (df[\"\u0414\u0430\u0442\u0430\"] &lt;= end_date) &amp; \n    (df[\"\u041e\u0442\u0434\u0435\u043b\"].isin(departments))\n]\n\n<em># \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430<\/em>\nst.header(\"\u041e\u0431\u0437\u043e\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\")\n\n<em># \u041c\u0435\u0442\u0440\u0438\u043a\u0438<\/em>\ncol1, col2, col3 = st.columns(3)\ncol1.metric(\"\u041e\u0431\u0449\u0430\u044f \u0432\u044b\u0440\u0443\u0447\u043a\u0430\", f\"{filtered_df['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'].sum():,.0f} \u20bd\")\ncol2.metric(\"\u041e\u0431\u0449\u0438\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b\", f\"{filtered_df['\u0420\u0430\u0441\u0445\u043e\u0434\u044b'].sum():,.0f} \u20bd\")\ncol3.metric(\"\u0427\u0438\u0441\u0442\u0430\u044f \u043f\u0440\u0438\u0431\u044b\u043b\u044c\", f\"{(filtered_df['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'] - filtered_df['\u0420\u0430\u0441\u0445\u043e\u0434\u044b']).sum():,.0f} \u20bd\")\n\n<em># \u0413\u0440\u0430\u0444\u0438\u043a\u0438<\/em>\nst.subheader(\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\")\nmonthly_data = filtered_df.resample('M', on='\u0414\u0430\u0442\u0430').sum().reset_index()\nfig = px.line(\n    monthly_data, \n    x=\"\u0414\u0430\u0442\u0430\", \n    y=[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"],\n    title=\"\u0415\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438\"\n)\nst.plotly_chart(fig, use_container_width=True)\n\n<em># \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/em>\nst.subheader(\"\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\")\nst.dataframe(filtered_df)\n\n<em># \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\nif st.button(\"\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Excel\"):\n    filtered_df.to_excel(\"\u044d\u043a\u0441\u043f\u043e\u0440\u0442_\u0434\u0430\u043d\u043d\u044b\u0445.xlsx\", index=False)\n    st.success(\"\u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b!\")\n<\/code><\/pre>\n\n\n\n<p>\u0422\u0430\u043a\u043e\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Excel, \u0433\u0434\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b \u0447\u0430\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e, Python-\u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e\/\u043e\u0444\u0438\u0441\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 Linux<\/h2>\n\n\n\n<p>\u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u0430\u0448\u0438\u043c Python-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440. Linux \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0441\u0442\u04381.<\/p>\n\n\n\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0444\u0438\u0441\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u0438. \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a \u043d\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e 100 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440: 4+ \u044f\u0434\u0440\u0430 (AMD Ryzen)<\/li>\n\n\n\n<li>\u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c: 16+ \u0413\u0411 (\u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445)<\/li>\n\n\n\n<li>\u0414\u0438\u0441\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: SSD 256+ \u0413\u0411 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, HDD 1+ \u0422\u0411 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li>\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430: Gigabit Ethernet<\/li>\n<\/ul>\n\n\n\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f Ubuntu Server LTS \u0438\u043b\u0438 Debian, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e.<\/p>\n\n\n\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Linux \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 ISO-\u043e\u0431\u0440\u0430\u0437 Ubuntu Server \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430.<\/li>\n\n\n\n<li>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u0443\u044e \u0444\u043b\u0435\u0448\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Rufus (Windows) \u0438\u043b\u0438 dd (Linux).<\/li>\n\n\n\n<li>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435\u0441\u044c \u0441 \u0444\u043b\u0435\u0448\u043a\u0438 \u0438 \u0441\u043b\u0435\u0434\u0443\u0439\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430.<\/li>\n\n\n\n<li>\u041f\u0440\u0438 \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0435 \u0434\u0438\u0441\u043a\u043e\u0432 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c RAID-\u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n\n\n\n<li>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">bash<code><em># \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/em>\nsudo apt update\nsudo apt upgrade -y\n\n<em># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/em>\nsudo apt install -y htop iotop net-tools ufw fail2ban\n\n<em># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u0430<\/em>\nsudo ufw allow ssh\nsudo ufw allow http\nsudo ufw allow https\nsudo ufw enable\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Python-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/h2>\n\n\n\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Python-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash<code><em># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Python \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/em>\nsudo apt install -y python3 python3-pip python3-venv\n\n<em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432<\/em>\nmkdir -p \/srv\/python-projects\ncd \/srv\/python-projects\npython3 -m venv venv\nsource venv\/bin\/activate\n\n<em># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/em>\npip install pandas numpy matplotlib seaborn plotly flask streamlit gunicorn\n<\/code><\/pre>\n\n\n\n<p>\u0414\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u0438\u043b\u0438 \u0434\u0438\u0441\u043a:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash<code><em># \u041c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\nsudo mkdir -p \/data\nsudo mount \/dev\/sdb1 \/data\nsudo chown -R youruser:yourgroup \/data\n\n<em># \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \/etc\/fstab \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/em>\necho \"\/dev\/sdb1 \/data ext4 defaults 0 2\" | sudo tee -a \/etc\/fstab\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c<\/h2>\n\n\n\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u0430\u0448\u0438\u043c Python-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440. \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u2013 Nginx:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bash<code><em># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Nginx<\/em>\nsudo apt install -y nginx\n\n<em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Flask-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/em>\nsudo nano \/etc\/nginx\/sites-available\/flask-app\n\n<em># \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/em>\nserver {\n    listen 80;\n    server_name data-analytics.local;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:5000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n\n<em># \u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/em>\nsudo ln -s \/etc\/nginx\/sites-available\/flask-app \/etc\/nginx\/sites-enabled\/\nsudo nginx -t\nsudo systemctl restart nginx\n<\/code><\/pre>\n\n\n\n<p>\u0414\u043b\u044f Streamlit-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0439, \u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0440\u0442\u043e\u043c:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>server {\n    listen 80;\n    server_name dashboard.local;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:8501;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/h2>\n\n\n\n<p>\u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/dataknowsall.com\/blog\/streamlitauthmultipage.html\">2<\/a>. \u0412 Streamlit \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 streamlit-authenticator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code>import streamlit as st\nimport streamlit_authenticator as stauth\nimport yaml\nfrom yaml.loader import SafeLoader\n\n<em># \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/em>\nwith open('config.yaml') as file:\n    config = yaml.load(file, Loader=SafeLoader)\n\n<em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430<\/em>\nauthenticator = stauth.Authenticate(\n    config['credentials'],\n    config['cookie']['name'],\n    config['cookie']['key'],\n    config['cookie']['expiry_days'],\n    config['preauthorized']\n)\n\n<em># \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u044b \u0432\u0445\u043e\u0434\u0430<\/em>\nname, authentication_status, username = authenticator.login('\u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443', 'main')\n\n<em># \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/em>\nif authentication_status:\n    st.write(f'\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c, *{name}*!')\n    \n    <em># \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/em>\n    st.header('\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430')\n    \n    <em># ...<\/em>\n\n    <em># \u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430<\/em>\n    authenticator.logout('\u0412\u044b\u0445\u043e\u0434', 'sidebar')\n    \nelif authentication_status == False:\n    st.error('\u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c')\nelif authentication_status == None:\n    st.warning('\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c')\n<\/code><\/pre>\n\n\n\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 config.yaml:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u0442\u0435\u043a\u0441\u0442<code>credentials:\n  usernames:\n    jsmith:\n      email: jsmith@example.com\n      name: John Smith\n      password: $2b$12$FknF8Vn0.6nsIZeqXH7lieQjYr3xp1rKN6lOMs.WHLlQuG5onZ1Oq\n    rbriggs:\n      email: rbriggs@example.com\n      name: Rebecca Briggs\n      password: $2b$12$HxPRKbhK.58sd9xNLjcTW.aVhBDNf7KfMuVpLxREPKIYkHv0.ioNW\ncookie:\n  expiry_days: 30\n  key: some_signature_key\n  name: some_cookie_name\npreauthorized:\n  emails:\n  - melsby@example.com\n<\/code><\/pre>\n\n\n\n<p>\u041f\u0430\u0440\u043e\u043b\u0438 \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0445\u0435\u0448\u0435\u0439, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e bcrypt. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0445\u0435\u0448\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u043f\u0438\u0442\u043e\u043d<code>import bcrypt\n\npassword = 'abc'  <em># \u043f\u0430\u0440\u043e\u043b\u044c \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435<\/em>\nhashed_password = bcrypt.hashpw(password.encode(), bcrypt.gensalt())\nprint(hashed_password.decode())\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Flask<\/h2>\n\n\n\n<p>Flask \u2014 \u044d\u0442\u043e \u043b\u0451\u0433\u043a\u0438\u0439 \u0432\u0435\u0431-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f API \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438.<\/p>\n\n\n\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Flask \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Excel:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u043f\u0438\u0442\u043e\u043d<code>from flask import Flask, render_template, request, send_file\nimport pandas as pd\nimport os\nfrom werkzeug.utils import secure_filename\nimport io\n\napp = Flask(__name__)\napp.config['UPLOAD_FOLDER'] = 'uploads'\nos.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)\n\n@app.route('\/')\ndef home():\n    return render_template('index.html')\n\n@app.route('\/upload', methods=['POST'])\ndef upload_file():\n    if 'file' not in request.files:\n        return render_template('index.html', error='\u0424\u0430\u0439\u043b \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d')\n    \n    file = request.files['file']\n    if file.filename == '':\n        return render_template('index.html', error='\u0424\u0430\u0439\u043b \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d')\n    \n    if file and file.filename.endswith(('.xls', '.xlsx')):\n        filename = secure_filename(file.filename)\n        filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)\n        file.save(filepath)\n        \n        <em># \u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Excel<\/em>\n        df = pd.read_excel(filepath)\n        \n        <em># \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437<\/em>\n        summary = {\n            'rows': len(df),\n            'columns': len(df.columns),\n            'column_names': df.columns.tolist(),\n            'missing_values': df.isna().sum().sum(),\n            'numeric_columns': df.select_dtypes(include=['number']).columns.tolist()\n        }\n        \n        <em># \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443<\/em>\n        if summary['numeric_columns']:\n            stats_df = df[summary['numeric_columns']].describe().transpose()\n            stats_html = stats_df.to_html(classes='table table-striped')\n            summary['stats_html'] = stats_html\n        \n        <em># \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0435 100 \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/em>\n        preview_html = df.head(100).to_html(classes='table table-striped')\n        \n        return render_template(\n            'result.html', \n            filename=filename, \n            summary=summary, \n            preview_html=preview_html\n        )\n    \n    return render_template('index.html', error='\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u044b Excel (.xls, .xlsx)')\n\n@app.route('\/download\/&lt;filename&gt;')\ndef download_processed(filename):\n    filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)\n    \n    if not os.path.exists(filepath):\n        return \"\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\", 404\n    \n    <em># \u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\n    df = pd.read_excel(filepath)\n    \n    <em># \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (\u043f\u0440\u0438\u043c\u0435\u0440)<\/em>\n    <em># \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u0445 \u0441\u0440\u0435\u0434\u043d\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/em>\n    numeric_cols = df.select_dtypes(include=['number']).columns\n    for col in numeric_cols:\n        df[col] = df[col].fillna(df[col].mean())\n    \n    <em># \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 (\u043f\u0440\u0438\u043c\u0435\u0440)<\/em>\n    if '\u0412\u044b\u0440\u0443\u0447\u043a\u0430' in df.columns and '\u0420\u0430\u0441\u0445\u043e\u0434\u044b' in df.columns:\n        df['\u041f\u0440\u0438\u0431\u044b\u043b\u044c'] = df['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'] - df['\u0420\u0430\u0441\u0445\u043e\u0434\u044b']\n        if '\u0420\u0430\u0441\u0445\u043e\u0434\u044b' in df.columns:\n            df['\u0420\u0435\u043d\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c'] = (df['\u041f\u0440\u0438\u0431\u044b\u043b\u044c'] \/ df['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'] * 100).round(2)\n    \n    <em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430<\/em>\n    output = io.BytesIO()\n    \n    <em># \u0417\u0430\u043f\u0438\u0441\u044c \u0432 Excel<\/em>\n    with pd.ExcelWriter(output, engine='xlsxwriter') as writer:\n        df.to_excel(writer, sheet_name='\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435', index=False)\n        \n        <em># \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043b\u0438\u0441\u0442 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u043e\u0439<\/em>\n        if numeric_cols.any():\n            stats_df = df[numeric_cols].describe()\n            stats_df.to_excel(writer, sheet_name='\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430')\n    \n    output.seek(0)\n    \n    return send_file(\n        output,\n        as_attachment=True,\n        download_name=f\"processed_{filename}\",\n        mimetype='application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n    )\n\nif __name__ == '__main__':\n    app.run(debug=True, host='0.0.0.0', port=5000)\n<\/code><\/pre>\n\n\n\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 HTML-\u0448\u0430\u0431\u043b\u043e\u043d\u044b:<\/p>\n\n\n\n<p>index.html:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">xml<code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;title&gt;\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Excel-\u0444\u0430\u0439\u043b\u043e\u0432&lt;\/title&gt;\n    &lt;link rel=\"stylesheet\" href=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.5.2\/css\/bootstrap.min.css\"&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;div class=\"container mt-5\"&gt;\n        &lt;h1&gt;\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 Excel-\u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438&lt;\/h1&gt;\n        \n        {% if error %}\n        &lt;div class=\"alert alert-danger\"&gt;{{ error }}&lt;\/div&gt;\n        {% endif %}\n        \n        &lt;form action=\"\/upload\" method=\"post\" enctype=\"multipart\/form-data\"&gt;\n            &lt;div class=\"form-group\"&gt;\n                &lt;label for=\"file\"&gt;\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Excel-\u0444\u0430\u0439\u043b:&lt;\/label&gt;\n                &lt;input type=\"file\" class=\"form-control-file\" id=\"file\" name=\"file\" accept=\".xls,.xlsx\"&gt;\n            &lt;\/div&gt;\n            &lt;button type=\"submit\" class=\"btn btn-primary\"&gt;\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c&lt;\/button&gt;\n        &lt;\/form&gt;\n    &lt;\/div&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre>\n\n\n\n<p>result.html:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">xml<code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;title&gt;\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438&lt;\/title&gt;\n    &lt;link rel=\"stylesheet\" href=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.5.2\/css\/bootstrap.min.css\"&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;div class=\"container mt-5\"&gt;\n        &lt;h1&gt;\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 {{ filename }}&lt;\/h1&gt;\n        \n        &lt;div class=\"card mb-4\"&gt;\n            &lt;div class=\"card-header\"&gt;\n                &lt;h3&gt;\u0421\u0432\u043e\u0434\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f&lt;\/h3&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"card-body\"&gt;\n                &lt;ul&gt;\n                    &lt;li&gt;\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a: {{ summary.rows }}&lt;\/li&gt;\n                    &lt;li&gt;\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432: {{ summary.columns }}&lt;\/li&gt;\n                    &lt;li&gt;\u0418\u043c\u0435\u043d\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432: {{ ', '.join(summary.column_names) }}&lt;\/li&gt;\n                    &lt;li&gt;\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: {{ summary.missing_values }}&lt;\/li&gt;\n                &lt;\/ul&gt;\n                \n                {% if summary.stats_html %}\n                &lt;h4&gt;\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c:&lt;\/h4&gt;\n                {{ summary.stats_html|safe }}\n                {% endif %}\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n        \n        &lt;div class=\"card mb-4\"&gt;\n            &lt;div class=\"card-header\"&gt;\n                &lt;h3&gt;\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u0435\u0440\u0432\u044b\u0435 100 \u0441\u0442\u0440\u043e\u043a)&lt;\/h3&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"card-body\"&gt;\n                {{ preview_html|safe }}\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n        \n        &lt;a href=\"\/download\/{{ filename }}\" class=\"btn btn-success mb-5\"&gt;\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b&lt;\/a&gt;\n        &lt;a href=\"\/\" class=\"btn btn-secondary mb-5\"&gt;\u0412\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434&lt;\/a&gt;\n    &lt;\/div&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u043d\u0430 Streamlit<\/h2>\n\n\n\n<p>Streamlit \u2014 \u044d\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Flask. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043e\u0442\u0447\u0451\u0442\u044b \u0432 Excel:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u043f\u0438\u0442\u043e\u043d<code>import streamlit as st\nimport pandas as pd\nimport plotly.express as px\nimport plotly.graph_objects as go\nfrom io import BytesIO\nimport numpy as np\nimport datetime\n\n<em># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/em>\nst.set_page_config(page_title=\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\", layout=\"wide\", page_icon=\"\ud83d\udcb9\")\n\n<em># \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\n@st.cache_data\ndef load_demo_data():\n    <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0435\u043c\u043e-\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430<\/em>\n    np.random.seed(42)\n    dates = pd.date_range(start=\"2022-01-01\", end=\"2023-12-31\", freq=\"D\")\n    \n    departments = [\"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\", \"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\", \"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430\", \"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\", \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f\"]\n    categories = [\"\u0422\u043e\u0432\u0430\u0440 A\", \"\u0422\u043e\u0432\u0430\u0440 B\", \"\u0422\u043e\u0432\u0430\u0440 C\", \"\u0423\u0441\u043b\u0443\u0433\u0430 1\", \"\u0423\u0441\u043b\u0443\u0433\u0430 2\"]\n    regions = [\"\u041c\u043e\u0441\u043a\u0432\u0430\", \"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\", \"\u041a\u0430\u0437\u0430\u043d\u044c\", \"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\", \"\u0415\u043a\u0430\u0442\u0435\u0440\u0438\u043d\u0431\u0443\u0440\u0433\"]\n    \n    <em># \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/em>\n    n_records = len(dates) * 3  <em># \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 3 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u0434\u0435\u043d\u044c<\/em>\n    \n    df = pd.DataFrame({\n        \"\u0414\u0430\u0442\u0430\": np.random.choice(dates, n_records),\n        \"\u041e\u0442\u0434\u0435\u043b\": np.random.choice(departments, n_records),\n        \"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\": np.random.choice(categories, n_records),\n        \"\u0420\u0435\u0433\u0438\u043e\u043d\": np.random.choice(regions, n_records)\n    })\n    \n    <em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0442\u0440\u0435\u043d\u0434\u0430\u043c\u0438<\/em>\n    base_revenue = np.random.normal(loc=100000, scale=30000, size=n_records)\n    \n    <em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0435\u0437\u043e\u043d\u043d\u043e\u0441\u0442\u044c (\u043b\u0435\u0442\u043e - \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u0430\u0436)<\/em>\n    month_factor = np.array([0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.3, 1.1, 1.0, 0.9, 0.8])\n    month_indices = df[\"\u0414\u0430\u0442\u0430\"].dt.month - 1\n    \n    <em># \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0435\u0437\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u043a\u0442\u043e\u0440<\/em>\n    df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] = base_revenue * month_factor[month_indices]\n    \n    <em># \u0420\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043d\u0443\u044e \u043c\u0430\u0440\u0436\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/em>\n    category_margin = {\n        \"\u0422\u043e\u0432\u0430\u0440 A\": 0.25,\n        \"\u0422\u043e\u0432\u0430\u0440 B\": 0.3,\n        \"\u0422\u043e\u0432\u0430\u0440 C\": 0.22,\n        \"\u0423\u0441\u043b\u0443\u0433\u0430 1\": 0.6,\n        \"\u0423\u0441\u043b\u0443\u0433\u0430 2\": 0.7,\n    }\n    \n    <em># \u0420\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438<\/em>\n    df[\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"] = df.apply(\n        lambda row: row[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] * (1 - category_margin[row[\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\"]]) * np.random.uniform(0.9, 1.1),\n        axis=1\n    )\n    \n    <em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043b\u0430\u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438<\/em>\n    df[\"\u041f\u043b\u0430\u043d \u043f\u043e \u0432\u044b\u0440\u0443\u0447\u043a\u0435\"] = df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] * np.random.uniform(0.8, 1.2, n_records)\n    \n    <em># \u041e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438<\/em>\n    df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] = df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"].round(0).astype(int)\n    df[\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"] = df[\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"].round(0).astype(int)\n    df[\"\u041f\u043b\u0430\u043d \u043f\u043e \u0432\u044b\u0440\u0443\u0447\u043a\u0435\"] = df[\"\u041f\u043b\u0430\u043d \u043f\u043e \u0432\u044b\u0440\u0443\u0447\u043a\u0435\"].round(0).astype(int)\n    \n    <em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f<\/em>\n    df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"] = df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] - df[\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"]\n    df[\"\u041c\u0430\u0440\u0436\u0430\"] = (df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"] \/ df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] * 100).round(2)\n    df[\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u043d\u0430\"] = (df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] \/ df[\"\u041f\u043b\u0430\u043d \u043f\u043e \u0432\u044b\u0440\u0443\u0447\u043a\u0435\"] * 100).round(2)\n    \n    return df\n\n<em># \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/em>\ndef load_user_data(uploaded_file):\n    if uploaded_file.name.endswith('.csv'):\n        df = pd.read_csv(uploaded_file)\n    else:\n        df = pd.read_excel(uploaded_file)\n    return df\n\n<em># \u0411\u043e\u043a\u043e\u0432\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\nst.sidebar.header(\"\u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430\")\n\ndata_source = st.sidebar.radio(\"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445\", [\"\u0414\u0435\u043c\u043e-\u0434\u0430\u043d\u043d\u044b\u0435\", \"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435\"])\n\nif data_source == \"\u0414\u0435\u043c\u043e-\u0434\u0430\u043d\u043d\u044b\u0435\":\n    df = load_demo_data()\n    st.sidebar.info(\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430.\")\nelse:\n    uploaded_file = st.sidebar.file_uploader(\"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 Excel \u0438\u043b\u0438 CSV \u0444\u0430\u0439\u043b\", type=[\"xlsx\", \"xls\", \"csv\"])\n    \n    if uploaded_file is not None:\n        df = load_user_data(uploaded_file)\n    else:\n        st.sidebar.warning(\"\u0424\u0430\u0439\u043b \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0435\u043c\u043e-\u0434\u0430\u043d\u043d\u044b\u0435.\")\n        df = load_demo_data()\n\n<em># \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432<\/em>\nrequired_columns = [\"\u0414\u0430\u0442\u0430\", \"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"]\nif not all(col in df.columns for col in required_columns):\n    st.error(f\"\u0412 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b: {', '.join(required_columns)}\")\n    st.stop()\n\n<em># \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0434\u0430\u0442\u044b<\/em>\nif not pd.api.types.is_datetime64_any_dtype(df[\"\u0414\u0430\u0442\u0430\"]):\n    df[\"\u0414\u0430\u0442\u0430\"] = pd.to_datetime(df[\"\u0414\u0430\u0442\u0430\"])\n\n<em># \u0424\u0438\u043b\u044c\u0442\u0440\u044b<\/em>\nst.sidebar.header(\"\u0424\u0438\u043b\u044c\u0442\u0440\u044b\")\n\n<em># \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434<\/em>\ndate_min = df[\"\u0414\u0430\u0442\u0430\"].min().date()\ndate_max = df[\"\u0414\u0430\u0442\u0430\"].max().date()\n\nstart_date = st.sidebar.date_input(\"\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0430\u0442\u0430\", date_min)\nend_date = st.sidebar.date_input(\"\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0434\u0430\u0442\u0430\", date_max)\n\nif start_date &gt; end_date:\n    st.error(\"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0430\u0442\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439\")\n    st.stop()\n\n<em># \u0424\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c<\/em>\nif \"\u041e\u0442\u0434\u0435\u043b\" in df.columns:\n    departments = [\"\u0412\u0441\u0435\"] + sorted(df[\"\u041e\u0442\u0434\u0435\u043b\"].unique().tolist())\n    selected_dept = st.sidebar.selectbox(\"\u041e\u0442\u0434\u0435\u043b\", departments)\n\nif \"\u0420\u0435\u0433\u0438\u043e\u043d\" in df.columns:\n    regions = [\"\u0412\u0441\u0435\"] + sorted(df[\"\u0420\u0435\u0433\u0438\u043e\u043d\"].unique().tolist())\n    selected_region = st.sidebar.selectbox(\"\u0420\u0435\u0433\u0438\u043e\u043d\", regions)\n\n<em># \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432<\/em>\nfiltered_df = df.copy()\n\nfiltered_df = filtered_df[\n    (filtered_df[\"\u0414\u0430\u0442\u0430\"].dt.date &gt;= start_date) &amp; \n    (filtered_df[\"\u0414\u0430\u0442\u0430\"].dt.date &lt;= end_date)\n]\n\nif \"\u041e\u0442\u0434\u0435\u043b\" in df.columns and selected_dept != \"\u0412\u0441\u0435\":\n    filtered_df = filtered_df[filtered_df[\"\u041e\u0442\u0434\u0435\u043b\"] == selected_dept]\n\nif \"\u0420\u0435\u0433\u0438\u043e\u043d\" in df.columns and selected_region != \"\u0412\u0441\u0435\":\n    filtered_df = filtered_df[filtered_df[\"\u0420\u0435\u0433\u0438\u043e\u043d\"] == selected_region]\n\n<em># \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434<\/em>\nst.title(\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438\")\n\n<em># \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/em>\nst.header(\"\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438\")\ncol1, col2, col3, col4 = st.columns(4)\n\nwith col1:\n    total_revenue = filtered_df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"].sum()\n    st.metric(\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", f\"{total_revenue:,.0f} \u20bd\")\n\nwith col2:\n    total_expenses = filtered_df[\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"].sum()\n    st.metric(\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\", f\"{total_expenses:,.0f} \u20bd\")\n\nwith col3:\n    total_profit = filtered_df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"].sum()\n    st.metric(\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\", f\"{total_profit:,.0f} \u20bd\")\n\nwith col4:\n    avg_margin = (total_profit \/ total_revenue * 100) if total_revenue &gt; 0 else 0\n    st.metric(\"\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043c\u0430\u0440\u0436\u0430\", f\"{avg_margin:.2f}%\")\n\n<em># \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432<\/em>\nst.header(\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\")\n\ntime_grouping = st.radio(\"\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\", [\"\u0414\u0435\u043d\u044c\", \"\u041d\u0435\u0434\u0435\u043b\u044f\", \"\u041c\u0435\u0441\u044f\u0446\", \"\u041a\u0432\u0430\u0440\u0442\u0430\u043b\"], horizontal=True)\n\nif time_grouping == \"\u0414\u0435\u043d\u044c\":\n    time_df = filtered_df.groupby(filtered_df[\"\u0414\u0430\u0442\u0430\"].dt.date).sum().reset_index()\nelif time_grouping == \"\u041d\u0435\u0434\u0435\u043b\u044f\":\n    time_df = filtered_df.groupby(pd.Grouper(key=\"\u0414\u0430\u0442\u0430\", freq=\"W-MON\")).sum().reset_index()\nelif time_grouping == \"\u041c\u0435\u0441\u044f\u0446\":\n    time_df = filtered_df.groupby(pd.Grouper(key=\"\u0414\u0430\u0442\u0430\", freq=\"M\")).sum().reset_index()\nelse:\n    time_df = filtered_df.groupby(pd.Grouper(key=\"\u0414\u0430\u0442\u0430\", freq=\"Q\")).sum().reset_index()\n\n<em># \u0413\u0440\u0430\u0444\u0438\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438<\/em>\nfig = go.Figure()\n\nfig.add_trace(go.Scatter(\n    x=time_df[\"\u0414\u0430\u0442\u0430\"],\n    y=time_df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"],\n    mode=\"lines+markers\",\n    name=\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\",\n    line=dict(width=3, color=\"#2E86C1\")\n))\n\nfig.add_trace(go.Scatter(\n    x=time_df[\"\u0414\u0430\u0442\u0430\"],\n    y=time_df[\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"],\n    mode=\"lines+markers\",\n    name=\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\",\n    line=dict(width=3, color=\"#E74C3C\")\n))\n\nfig.add_trace(go.Bar(\n    x=time_df[\"\u0414\u0430\u0442\u0430\"],\n    y=time_df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"],\n    name=\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\",\n    marker_color=\"#27AE60\"\n))\n\nfig.update_layout(\n    title=\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\",\n    xaxis_title=\"\u041f\u0435\u0440\u0438\u043e\u0434\",\n    yaxis_title=\"\u0421\u0443\u043c\u043c\u0430 (\u20bd)\",\n    legend=dict(\n        orientation=\"h\",\n        yanchor=\"bottom\",\n        y=1.02,\n        xanchor=\"center\",\n        x=0.5\n    ),\n    height=500,\n    hovermode=\"x unified\"\n)\n\nst.plotly_chart(fig, use_container_width=True)\n\n<em># \u0420\u0430\u0437\u0431\u0438\u0432\u043a\u0430 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c<\/em>\nst.header(\"\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\")\n\n<em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432<\/em>\ncol1, col2 = st.columns(2)\n\nwith col1:\n    if \"\u041e\u0442\u0434\u0435\u043b\" in df.columns:\n        dept_df = filtered_df.groupby(\"\u041e\u0442\u0434\u0435\u043b\").sum().reset_index()\n        dept_df = dept_df.sort_values(\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", ascending=False)\n        \n        fig = px.bar(\n            dept_df,\n            x=\"\u041e\u0442\u0434\u0435\u043b\",\n            y=[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"],\n            title=\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430 \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u0430\u043c\",\n            barmode=\"group\"\n        )\n        st.plotly_chart(fig, use_container_width=True)\n\nwith col2:\n    if \"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\" in df.columns:\n        cat_df = filtered_df.groupby(\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\").sum().reset_index()\n        cat_df[\"\u041c\u0430\u0440\u0436\u0430\"] = (cat_df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"] \/ cat_df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] * 100).round(2)\n        cat_df = cat_df.sort_values(\"\u041c\u0430\u0440\u0436\u0430\", ascending=False)\n        \n        fig = px.bar(\n            cat_df,\n            x=\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\",\n            y=\"\u041c\u0430\u0440\u0436\u0430\",\n            title=\"\u041c\u0430\u0440\u0436\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\",\n            text_auto=True,\n            color=\"\u041c\u0430\u0440\u0436\u0430\",\n            color_continuous_scale=\"RdYlGn\"\n        )\n        st.plotly_chart(fig, use_container_width=True)\n\n<em># \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/em>\nst.header(\"\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\")\nst.dataframe(filtered_df.sort_values(\"\u0414\u0430\u0442\u0430\", ascending=False), use_container_width=True)\n\n<em># \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\nst.header(\"\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0434\u0430\u043d\u043d\u044b\u0445\")\n\ncol1, col2 = st.columns(2)\n\nwith col1:\n    if st.button(\"\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Excel\"):\n        output = BytesIO()\n        \n        with pd.ExcelWriter(output, engine=\"xlsxwriter\") as writer:\n            filtered_df.to_excel(writer, sheet_name=\"\u0414\u0430\u043d\u043d\u044b\u0435\", index=False)\n            \n            <em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u0441 \u0438\u0442\u043e\u0433\u0430\u043c\u0438<\/em>\n            summary_df = pd.DataFrame({\n                \"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\": [\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\", \"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\", \"\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043c\u0430\u0440\u0436\u0430\"],\n                \"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\": [\n                    f\"{total_revenue:,.0f} \u20bd\",\n                    f\"{total_expenses:,.0f} \u20bd\",\n                    f\"{total_profit:,.0f} \u20bd\",\n                    f\"{avg_margin:.2f}%\"\n                ]\n            })\n            summary_df.to_excel(writer, sheet_name=\"\u0418\u0442\u043e\u0433\u0438\", index=False)\n            \n            <em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/em>\n            time_df.to_excel(writer, sheet_name=f\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u043e {time_grouping.lower()}\", index=False)\n        \n        output.seek(0)\n        \n        st.download_button(\n            label=\"\u0421\u043a\u0430\u0447\u0430\u0442\u044c Excel \u0444\u0430\u0439\u043b\",\n            data=output,\n            file_name=f\"\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439_\u043e\u0442\u0447\u0435\u0442_{datetime.datetime.now().strftime('%Y-%m-%d')}.xlsx\",\n            mime=\"application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n        )\n\nwith col2:\n    if st.button(\"\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 CSV\"):\n        csv = filtered_df.to_csv(index=False).encode('utf-8')\n        \n        st.download_button(\n            label=\"\u0421\u043a\u0430\u0447\u0430\u0442\u044c CSV \u0444\u0430\u0439\u043b\",\n            data=csv,\n            file_name=f\"\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439_\u043e\u0442\u0447\u0435\u0442_{datetime.datetime.now().strftime('%Y-%m-%d')}.csv\",\n            mime=\"text\/csv\"\n        )\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n\n\n\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 Excel. Python \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0421\u0423\u0411\u0414. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 PostgreSQL:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u043f\u0438\u0442\u043e\u043d<code>import pandas as pd\nimport streamlit as st\nimport psycopg2\nfrom sqlalchemy import create_engine\nimport plotly.express as px\n\n<em># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\ndef get_connection():\n    return psycopg2.connect(\n        host=\"localhost\",\n        database=\"finance_db\",\n        user=\"postgres\",\n        password=\"password\"\n    )\n\n<em># \u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e pandas<\/em>\ndef load_data_from_db():\n    engine = create_engine('postgresql:\/\/postgres:password@localhost:5432\/finance_db')\n    query = \"\"\"\n    SELECT \n        transaction_date as \"\u0414\u0430\u0442\u0430\", \n        department as \"\u041e\u0442\u0434\u0435\u043b\", \n        category as \"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\", \n        region as \"\u0420\u0435\u0433\u0438\u043e\u043d\", \n        revenue as \"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", \n        expenses as \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\",\n        revenue - expenses as \"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"\n    FROM financial_transactions\n    WHERE transaction_date &gt;= NOW() - INTERVAL '1 year'\n    \"\"\"\n    df = pd.read_sql(query, engine)\n    df[\"\u041c\u0430\u0440\u0436\u0430\"] = (df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"] \/ df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] * 100).round(2)\n    return df\n\n<em># \u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0411\u0414<\/em>\ndef save_data_to_db(df):\n    conn = get_connection()\n    cur = conn.cursor()\n    \n    try:\n        <em># \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c DataFrame \u0432 \u0444\u043e\u0440\u043c\u0430\u0442, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 \u0411\u0414<\/em>\n        for index, row in df.iterrows():\n            cur.execute(\n                \"\"\"\n                INSERT INTO financial_transactions \n                (transaction_date, department, category, region, revenue, expenses) \n                VALUES (%s, %s, %s, %s, %s, %s)\n                \"\"\",\n                (\n                    row[\"\u0414\u0430\u0442\u0430\"], \n                    row[\"\u041e\u0442\u0434\u0435\u043b\"], \n                    row[\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\"], \n                    row[\"\u0420\u0435\u0433\u0438\u043e\u043d\"], \n                    row[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"], \n                    row[\"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\"]\n                )\n            )\n        \n        conn.commit()\n        return True\n    except Exception as e:\n        conn.rollback()\n        st.error(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445: {e}\")\n        return False\n    finally:\n        cur.close()\n        conn.close()\n\n<em># \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\ndef upload_interface():\n    st.header(\"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\")\n    \n    uploaded_file = st.file_uploader(\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Excel-\u0444\u0430\u0439\u043b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\", type=[\"xlsx\", \"xls\"])\n    \n    if uploaded_file is not None:\n        df = pd.read_excel(uploaded_file)\n        \n        st.write(\"\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0434\u0430\u043d\u043d\u044b\u0445:\")\n        st.dataframe(df.head(10))\n        \n        if st.button(\"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0430\u0437\u0443\"):\n            success = save_data_to_db(df)\n            if success:\n                st.success(f\"\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e {len(df)} \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445!\")\n            else:\n                st.error(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0444\u0430\u0439\u043b\u0430.\")\n\n<em># \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\ndef analysis_interface(df):\n    st.header(\"\u0410\u043d\u0430\u043b\u0438\u0437 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\")\n    \n    <em># \u0424\u0438\u043b\u044c\u0442\u0440\u044b<\/em>\n    col1, col2, col3 = st.columns(3)\n    \n    with col1:\n        start_date = st.date_input(\n            \"\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0430\u0442\u0430\", \n            min(df[\"\u0414\u0430\u0442\u0430\"]).date() if not df.empty else None\n        )\n    \n    with col2:\n        end_date = st.date_input(\n            \"\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0434\u0430\u0442\u0430\", \n            max(df[\"\u0414\u0430\u0442\u0430\"]).date() if not df.empty else None\n        )\n    \n    with col3:\n        if \"\u041e\u0442\u0434\u0435\u043b\" in df.columns:\n            departments = [\"\u0412\u0441\u0435\"] + sorted(df[\"\u041e\u0442\u0434\u0435\u043b\"].unique().tolist())\n            selected_dept = st.selectbox(\"\u041e\u0442\u0434\u0435\u043b\", departments)\n    \n    <em># \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432<\/em>\n    filtered_df = df.copy()\n    filtered_df = filtered_df[\n        (filtered_df[\"\u0414\u0430\u0442\u0430\"].dt.date &gt;= start_date) &amp; \n        (filtered_df[\"\u0414\u0430\u0442\u0430\"].dt.date &lt;= end_date)\n    ]\n    \n    if \"\u041e\u0442\u0434\u0435\u043b\" in df.columns and selected_dept != \"\u0412\u0441\u0435\":\n        filtered_df = filtered_df[filtered_df[\"\u041e\u0442\u0434\u0435\u043b\"] == selected_dept]\n    \n    <em># \u041c\u0435\u0442\u0440\u0438\u043a\u0438<\/em>\n    col1, col2, col3 = st.columns(3)\n    \n    with col1:\n        st.metric(\"\u041e\u0431\u0449\u0430\u044f \u0432\u044b\u0440\u0443\u0447\u043a\u0430\", f\"{filtered_df['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'].sum():,.0f} \u20bd\")\n    \n    with col2:\n        st.metric(\"\u041e\u0431\u0449\u0438\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b\", f\"{filtered_df['\u0420\u0430\u0441\u0445\u043e\u0434\u044b'].sum():,.0f} \u20bd\")\n    \n    with col3:\n        profit = filtered_df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"].sum()\n        revenue = filtered_df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"].sum()\n        margin = (profit \/ revenue * 100) if revenue &gt; 0 else 0\n        st.metric(\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\", f\"{profit:,.0f} \u20bd\", f\"\u041c\u0430\u0440\u0436\u0430: {margin:.2f}%\")\n    \n    <em># \u0413\u0440\u0430\u0444\u0438\u043a\u0438<\/em>\n    st.subheader(\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\")\n    \n    <em># \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043c\u0435\u0441\u044f\u0446\u0430\u043c<\/em>\n    monthly_df = filtered_df.groupby(pd.Grouper(key=\"\u0414\u0430\u0442\u0430\", freq=\"M\")).sum().reset_index()\n    \n    fig = px.line(\n        monthly_df, \n        x=\"\u0414\u0430\u0442\u0430\", \n        y=[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\", \"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"],\n        title=\"\u041f\u043e\u043c\u0435\u0441\u044f\u0447\u043d\u0430\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\"\n    )\n    st.plotly_chart(fig, use_container_width=True)\n    \n    <em># \u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c<\/em>\n    if \"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\" in filtered_df.columns:\n        st.subheader(\"\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\")\n        \n        cat_df = filtered_df.groupby(\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\").agg({\n            \"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\": \"sum\",\n            \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\": \"sum\",\n            \"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\": \"sum\"\n        }).reset_index()\n        \n        cat_df[\"\u041c\u0430\u0440\u0436\u0430\"] = (cat_df[\"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"] \/ cat_df[\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\"] * 100).round(2)\n        cat_df = cat_df.sort_values(\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\", ascending=False)\n        \n        fig = px.bar(\n            cat_df,\n            x=\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\",\n            y=\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430\",\n            color=\"\u041c\u0430\u0440\u0436\u0430\",\n            title=\"\u0412\u044b\u0440\u0443\u0447\u043a\u0430 \u0438 \u043c\u0430\u0440\u0436\u0430 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\",\n            text_auto=True,\n            color_continuous_scale=\"RdYlGn\"\n        )\n        st.plotly_chart(fig, use_container_width=True)\n\n<em># \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/em>\ndef main():\n    st.set_page_config(page_title=\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\", layout=\"wide\")\n    \n    st.sidebar.title(\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430\")\n    page = st.sidebar.radio(\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\", [\"\u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445\", \"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"])\n    \n    if page == \"\u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445\":\n        try:\n            df = load_data_from_db()\n            analysis_interface(df)\n        except Exception as e:\n            st.error(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b: {e}\")\n            st.info(\"\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.\")\n    else:\n        upload_interface()\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"python\">\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Python-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432<\/h2>\n\n\n\n<p>\u041e\u0434\u043d\u043e \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 Excel \u043a Python \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0447\u0451\u0442\u043e\u0432. \u0414\u043b\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a cron \u0432 Linux \u0438\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0432 Windows.<\/p>\n\n\n\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u0447\u0435\u0442\u0430 \u043f\u043e email:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u043f\u0438\u0442\u043e\u043d<code><em>#!\/usr\/bin\/env python3<\/em>\n<em># daily_report.py<\/em>\n\nimport pandas as pd\nimport numpy as np\nfrom datetime import datetime, timedelta\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport smtplib\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.text import MIMEText\nfrom email.mime.application import MIMEApplication\nimport os\nimport logging\n\n<em># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/em>\nlogging.basicConfig(\n    filename='daily_report.log',\n    level=logging.INFO,\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n)\nlogger = logging.getLogger('daily_report')\n\ndef load_data():\n    \"\"\"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (\u0411\u0414, \u0444\u0430\u0439\u043b \u0438 \u0442.\u0434.)\"\"\"\n    try:\n        <em># \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414<\/em>\n        <em># \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0430\u0439\u043b<\/em>\n        df = pd.read_excel(\"sales_data.xlsx\")\n        logger.info(f\"\u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b, {len(df)} \u0437\u0430\u043f\u0438\u0441\u0435\u0439\")\n        return df\n    except Exception as e:\n        logger.error(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445: {e}\")\n        raise\n\ndef process_data(df):\n    \"\"\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n    try:\n        <em># \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u0442\u044b<\/em>\n        df['\u0414\u0430\u0442\u0430'] = pd.to_datetime(df['\u0414\u0430\u0442\u0430'])\n        \n        <em># \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u0435\u0441\u044f\u0446<\/em>\n        today = datetime.now()\n        month_ago = today - timedelta(days=30)\n        df_month = df[df['\u0414\u0430\u0442\u0430'] &gt;= month_ago]\n        \n        <em># \u0421\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438<\/em>\n        total_revenue = df_month['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'].sum()\n        total_expenses = df_month['\u0420\u0430\u0441\u0445\u043e\u0434\u044b'].sum()\n        total_profit = total_revenue - total_expenses\n        \n        <em># \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0434\u043d\u044f\u043c<\/em>\n        daily_data = df_month.groupby(df_month['\u0414\u0430\u0442\u0430'].dt.date).agg({\n            '\u0412\u044b\u0440\u0443\u0447\u043a\u0430': 'sum',\n            '\u0420\u0430\u0441\u0445\u043e\u0434\u044b': 'sum'\n        }).reset_index()\n        \n        daily_data['\u041f\u0440\u0438\u0431\u044b\u043b\u044c'] = daily_data['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'] - daily_data['\u0420\u0430\u0441\u0445\u043e\u0434\u044b']\n        \n        <em># \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c<\/em>\n        category_data = df_month.groupby('\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f').agg({\n            '\u0412\u044b\u0440\u0443\u0447\u043a\u0430': 'sum',\n            '\u0420\u0430\u0441\u0445\u043e\u0434\u044b': 'sum'\n        }).reset_index()\n        \n        category_data['\u041f\u0440\u0438\u0431\u044b\u043b\u044c'] = category_data['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'] - category_data['\u0420\u0430\u0441\u0445\u043e\u0434\u044b']\n        category_data['\u041c\u0430\u0440\u0436\u0430'] = (category_data['\u041f\u0440\u0438\u0431\u044b\u043b\u044c'] \/ category_data['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'] * 100).round(2)\n        \n        return {\n            'total_revenue': total_revenue,\n            'total_expenses': total_expenses,\n            'total_profit': total_profit,\n            'daily_data': daily_data,\n            'category_data': category_data\n        }\n    except Exception as e:\n        logger.error(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445: {e}\")\n        raise\n\ndef create_report(data):\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0447\u0435\u0442\u0430 \u0441 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438\"\"\"\n    try:\n        <em># \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0438\u043b\u044c<\/em>\n        sns.set(style=\"whitegrid\")\n        \n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c PDF<\/em>\n        today = datetime.now().strftime('%Y-%m-%d')\n        report_file = f\"daily_report_{today}.xlsx\"\n        \n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c Excel writer<\/em>\n        writer = pd.ExcelWriter(report_file, engine='xlsxwriter')\n        \n        <em># \u041b\u0438\u0441\u0442 \u0441 \u043e\u0431\u0449\u0438\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438<\/em>\n        summary_df = pd.DataFrame({\n            '\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c': ['\u0412\u044b\u0440\u0443\u0447\u043a\u0430', '\u0420\u0430\u0441\u0445\u043e\u0434\u044b', '\u041f\u0440\u0438\u0431\u044b\u043b\u044c'],\n            '\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435': [\n                f\"{data['total_revenue']:,.2f}\",\n                f\"{data['total_expenses']:,.2f}\",\n                f\"{data['total_profit']:,.2f}\"\n            ]\n        })\n        \n        summary_df.to_excel(writer, sheet_name='\u041e\u0431\u0449\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438', index=False)\n        \n        <em># \u041b\u0438\u0441\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u0434\u043d\u044f\u043c<\/em>\n        data['daily_data'].to_excel(writer, sheet_name='\u041f\u043e \u0434\u043d\u044f\u043c', index=False)\n        \n        <em># \u041b\u0438\u0441\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c<\/em>\n        data['category_data'].to_excel(writer, sheet_name='\u041f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c', index=False)\n        \n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438<\/em>\n        workbook = writer.book\n        \n        <em># \u0413\u0440\u0430\u0444\u0438\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439<\/em>\n        daily_chart_sheet = workbook.add_worksheet('\u0413\u0440\u0430\u0444\u0438\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438')\n        \n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a<\/em>\n        fig, ax = plt.subplots(figsize=(12, 6))\n        \n        ax.plot(data['daily_data']['\u0414\u0430\u0442\u0430'], data['daily_data']['\u0412\u044b\u0440\u0443\u0447\u043a\u0430'], 'b-', label='\u0412\u044b\u0440\u0443\u0447\u043a\u0430')\n        ax.plot(data['daily_data']['\u0414\u0430\u0442\u0430'], data['daily_data']['\u0420\u0430\u0441\u0445\u043e\u0434\u044b'], 'r-', label='\u0420\u0430\u0441\u0445\u043e\u0434\u044b')\n        ax.plot(data['daily_data']['\u0414\u0430\u0442\u0430'], data['daily_data']['\u041f\u0440\u0438\u0431\u044b\u043b\u044c'], 'g-', label='\u041f\u0440\u0438\u0431\u044b\u043b\u044c')\n        \n        ax.set_title('\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u0435\u0441\u044f\u0446')\n        ax.set_xlabel('\u0414\u0430\u0442\u0430')\n        ax.set_ylabel('\u0421\u0443\u043c\u043c\u0430')\n        ax.legend()\n        ax.grid(True)\n        \n        <em># \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a<\/em>\n        temp_file = 'temp_chart.png'\n        plt.savefig(temp_file, dpi=300, bbox_inches='tight')\n        plt.close()\n        \n        <em># \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a \u0432 Excel<\/em>\n        daily_chart_sheet.insert_image('B2', temp_file)\n        \n        <em># \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c writer<\/em>\n        writer.close()\n        \n        <em># \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/em>\n        os.remove(temp_file)\n        \n        logger.info(f\"\u041e\u0442\u0447\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d: {report_file}\")\n        return report_file\n    except Exception as e:\n        logger.error(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u0430: {e}\")\n        raise\n\ndef send_email(report_file):\n    \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u0442\u0447\u0435\u0442\u0430 \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435\"\"\"\n    try:\n        sender_email = \"your_email@gmail.com\"\n        receiver_emails = [\"recipient1@example.com\", \"recipient2@example.com\"]\n        password = \"your_app_password\"  <em># \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c App Password \u0434\u043b\u044f Gmail<\/em>\n        \n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/em>\n        msg = MIMEMultipart()\n        msg['From'] = sender_email\n        msg['To'] = ', '.join(receiver_emails)\n        \n        today = datetime.now().strftime('%d.%m.%Y')\n        msg['Subject'] = f\"\u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u0437\u0430 {today}\"\n        \n        <em># \u0422\u0435\u043b\u043e \u043f\u0438\u0441\u044c\u043c\u0430<\/em>\n        body = f\"\"\"\n        \u0423\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u0433\u0438,\n        \n        \u0412\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u043f\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043d\u0430 {today}.\n        \n        \u041a\u0440\u0430\u0442\u043a\u0438\u0435 \u0438\u0442\u043e\u0433\u0438:\n        - \u0412\u044b\u0440\u0443\u0447\u043a\u0430 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 30 \u0434\u043d\u0435\u0439: {data['total_revenue']:,.2f} \u0440\u0443\u0431.\n        - \u0420\u0430\u0441\u0445\u043e\u0434\u044b \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 30 \u0434\u043d\u0435\u0439: {data['total_expenses']:,.2f} \u0440\u0443\u0431.\n        - \u041f\u0440\u0438\u0431\u044b\u043b\u044c \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 30 \u0434\u043d\u0435\u0439: {data['total_profit']:,.2f} \u0440\u0443\u0431.\n        \n        \u0414\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u043e\u043c\u0443 Excel-\u0444\u0430\u0439\u043b\u0443.\n        \n        \u0421 \u0443\u0432\u0430\u0436\u0435\u043d\u0438\u0435\u043c,\n        \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0442\u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438\n        \"\"\"\n        \n        msg.attach(MIMEText(body, 'plain'))\n        \n        <em># \u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u043e\u0442\u0447\u0435\u0442<\/em>\n        with open(report_file, 'rb') as f:\n            attach = MIMEApplication(f.read(), _subtype='xlsx')\n            attach.add_header('Content-Disposition', 'attachment', filename=report_file)\n            msg.attach(attach)\n        \n        <em># \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0438\u0441\u044c\u043c\u043e<\/em>\n        server = smtplib.SMTP('smtp.gmail.com', 587)\n        server.starttls()\n        server.login(sender_email, password)\n        server.send_message(msg)\n        server.quit()\n        \n        logger.info(f\"\u041e\u0442\u0447\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u0430 {', '.join(receiver_emails)}\")\n    except Exception as e:\n        logger.error(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 email: {e}\")\n        raise\n\nif __name__ == \"__main__\":\n    try:\n        logger.info(\"\u041d\u0430\u0447\u0430\u043b\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0433\u043e \u043e\u0442\u0447\u0435\u0442\u0430\")\n        \n        <em># \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\n        df = load_data()\n        \n        <em># \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\n        data = process_data(df)\n        \n        <em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0447\u0435\u0442\u0430<\/em>\n        report_file = create_report(data)\n        \n        <em># \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u0442\u0447\u0435\u0442\u0430<\/em>\n        send_email(report_file)\n        \n        logger.info(\"\u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\")\n    except Exception as e:\n        logger.error(f\"\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u0430: {e}\")\n<\/code><\/pre>\n\n\n\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0432 Linux \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c cron:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u0443\u0434\u0430\u0440<code><em># \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c crontab<\/em>\ncrontab -e\n\n<em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u0432 8:00 \u0443\u0442\u0440\u0430<\/em>\n0 8 * * * \/path\/to\/python3 \/path\/to\/daily_report.py &gt;&gt; \/path\/to\/cron_log.txt 2&gt;&amp;1\n<\/code><\/pre>\n\n\n\n<p>\u0412 Windows \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/h2>\n\n\n\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u043e 100 \u0447\u0435\u043b\u043e\u0432\u0435\u043a), \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 Docker<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u0442\u0435\u043a\u0441\u0442<code># Dockerfile \u0434\u043b\u044f Flask-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\nFROM python:3.9-slim\n\nWORKDIR \/app\n\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY . .\n\nEXPOSE 5000\n\nCMD [\"gunicorn\", \"--bind\", \"0.0.0.0:5000\", \"app:app\"]\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u0442\u0435\u043a\u0441\u0442<code># \/etc\/nginx\/sites-available\/analytics\nupstream analytics_app {\n    server 127.0.0.1:5000;\n    server 127.0.0.1:5001;\n    server 127.0.0.1:5002;\n    server 127.0.0.1:5003;\n}\n\nserver {\n    listen 80;\n    server_name analytics.local;\n\n    location \/ {\n        proxy_pass http:\/\/analytics_app;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}\n<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u043f\u0438\u0442\u043e\u043d<code><em># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/em>\ndef optimize_database():\n    conn = get_connection()\n    cur = conn.cursor()\n    \n    try:\n        <em># \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u0434\u0430\u0442\u0435 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438<\/em>\n        cur.execute(\"CREATE INDEX IF NOT EXISTS idx_transaction_date ON financial_transactions (transaction_date)\")\n        \n        <em># \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u0443 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438<\/em>\n        cur.execute(\"CREATE INDEX IF NOT EXISTS idx_department ON financial_transactions (department)\")\n        \n        <em># \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/em>\n        cur.execute(\"CREATE INDEX IF NOT EXISTS idx_date_dept ON financial_transactions (transaction_date, department)\")\n        \n        conn.commit()\n        print(\"\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u044b\")\n    except Exception as e:\n        conn.rollback()\n        print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432: {e}\")\n    finally:\n        cur.close()\n        conn.close()\n<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u043f\u0438\u0442\u043e\u043d<code>import redis\nimport json\nimport hashlib\nfrom functools import wraps\n\n<em># \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Redis<\/em>\nredis_client = redis.Redis(host='localhost', port=6379, db=0)\n\n<em># \u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/em>\ndef cache_result(expire=300):\n    def decorator(func):\n        @wraps(func)\n        def wrapper(*args, **kwargs):\n            <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043c\u0435\u043d\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/em>\n            key_parts = [func.__name__]\n            key_parts.extend([str(arg) for arg in args])\n            key_parts.extend([f\"{k}={v}\" for k, v in sorted(kwargs.items())])\n            \n            key = hashlib.md5(\":\".join(key_parts).encode()).hexdigest()\n            \n            <em># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432 \u043a\u044d\u0448\u0435<\/em>\n            cached_result = redis_client.get(key)\n            \n            if cached_result:\n                return json.loads(cached_result)\n            \n            <em># \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0435\u0442 \u0432 \u043a\u044d\u0448\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0435\u0433\u043e<\/em>\n            result = func(*args, **kwargs)\n            \n            <em># \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u044d\u0448<\/em>\n            redis_client.setex(key, expire, json.dumps(result))\n            \n            return result\n        return wrapper\n    return decorator\n\n<em># \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/em>\n@cache_result(expire=600)  <em># \u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 10 \u043c\u0438\u043d\u0443\u0442<\/em>\ndef get_monthly_sales(department=None, start_date=None, end_date=None):\n    <em># \u0417\u0430\u043f\u0440\u043e\u0441 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445...<\/em>\n    pass\n<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">\u043f\u0438\u0442\u043e\u043d<code>import psutil\nimport time\nimport threading\nfrom influxdb import InfluxDBClient\n\n<em># \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a InfluxDB \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0440\u0438\u043a<\/em>\nclient = InfluxDBClient(host='localhost', port=8086)\nclient.create_database('system_metrics')\nclient.switch_database('system_metrics')\n\ndef collect_metrics():\n    while True:\n        <em># \u0421\u0431\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a<\/em>\n        cpu_percent = psutil.cpu_percent(interval=1)\n        mem = psutil.virtual_memory()\n        disk = psutil.disk_usage('\/')\n        \n        <em># \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0447\u0435\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f InfluxDB<\/em>\n        json_body = [\n            {\n                \"measurement\": \"system_metrics\",\n                \"tags\": {\n                    \"host\": \"analytics_server\"\n                },\n                \"fields\": {\n                    \"cpu_usage\": float(cpu_percent),\n                    \"memory_used_percent\": float(mem.percent),\n                    \"disk_used_percent\": float(disk.percent)\n                }\n            }\n        ]\n        \n        <em># \u0417\u0430\u043f\u0438\u0441\u044c \u043c\u0435\u0442\u0440\u0438\u043a \u0432 InfluxDB<\/em>\n        client.write_points(json_body)\n        \n        <em># \u041f\u0430\u0443\u0437\u0430 \u043f\u0435\u0440\u0435\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u0431\u043e\u0440\u043e\u043c<\/em>\n        time.sleep(60)\n\n<em># \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435<\/em>\nmetrics_thread = threading.Thread(target=collect_metrics, daemon=True)\nmetrics_thread.start()\n<\/code><\/pre>\n\n\n\n<p>\u0421 \u0442\u0430\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043e 100 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u043e\u0442\u0447\u0451\u0442\u0430\u043c.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u041f\u0443\u0442\u044c \u043e\u0442 Excel \u043a Python: \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0448\u0430\u0433\u0438<\/h2>\n\n\n\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 Excel \u043a Python \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u2014 \u044d\u0442\u043e \u043f\u043b\u0430\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041d\u0430\u0447\u0430\u043b\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f Python<\/strong> \u2014 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Pandas, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/li>\n\n\n\n<li><strong>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 Excel \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u044b Python<\/strong> \u2014 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f.<\/li>\n\n\n\n<li><strong>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong> \u2014 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0435 Matplotlib, Seaborn \u0438 Plotly \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439.<\/li>\n\n\n\n<li><strong>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/strong> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Flask \u0438\u043b\u0438 Streamlit \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440.<\/li>\n\n\n\n<li><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/strong> \u2014 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Linux, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/li>\n\n\n\n<li><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong> \u2014 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u043e\u0432.<\/li>\n\n\n\n<li><strong>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/li>\n<\/ol>\n\n\n\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0448\u0430\u0433\u043e\u0432 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 Python<\/h2>\n\n\n\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 Excel \u043a Python \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c<\/strong> \u2014 Python \u043b\u0435\u0433\u043a\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043e\u0431\u044a\u0451\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u044f\u0442 Excel \u0437\u0430\u0432\u0438\u0441\u043d\u0443\u0442\u044c.<\/li>\n\n\n\n<li><strong>\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c<\/strong> \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043a\u043e\u0434\u0435, \u0447\u0442\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0440\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0430\u0443\u0434\u0438\u0442.<\/li>\n\n\n\n<li><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f<\/strong> &#8212; \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b \u0438 \u0430\u043d\u0430\u043b\u0438\u0437 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e.<\/li>\n\n\n\n<li><strong>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c<\/strong> \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445: \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, API, \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438.<\/li>\n\n\n\n<li><strong>\u041a\u043e\u043b\u043b\u0430\u0431\u043e\u0440\u0430\u0446\u0438\u044f<\/strong> \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439 \u0438 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043e\u0431\u0449\u0438\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438.<\/li>\n\n\n\n<li><strong>\u0410\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u043e\u0449\u044c<\/strong> \u2014 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/li>\n\n\n\n<li><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/strong> \u2014 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c\u0443 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e<\/h2>\n\n\n\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0441\u0432\u043e\u0438\u043b \u043e\u0441\u043d\u043e\u0432\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Python \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/strong> \u2014 \u0438\u0437\u0443\u0447\u0438\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 scikit-learn, TensorFlow \u0438\u043b\u0438 PyTorch \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n\n\n\n<li><strong>\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430<\/strong> \u2014 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u0435\u0441\u044c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e D3.js \u0438\u043b\u0438 Plotly Dash.<\/li>\n\n\n\n<li><strong>\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/strong> \u2014 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0432\u0430\u0448\u0435\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u043e\u0431\u043b\u0430\u043a\u043e (AWS, Google Cloud, Azure) \u0434\u043b\u044f \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n\n\n\n<li><strong>\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 DevOps<\/strong> \u2014 \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u0435 CI\/CD \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0448\u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/li>\n\n\n\n<li><strong>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f<\/strong> \u2014 \u0434\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u0443\u0447\u0438\u0442\u0435 Apache Spark, Dask \u0438\u043b\u0438 Ray.<\/li>\n\n\n\n<li><strong>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 BI-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438<\/strong> \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0432\u0430\u0448\u0438 Python-\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438, \u0442\u0430\u043a\u0438\u043c \u043a\u0430\u043a Power BI \u0438\u043b\u0438 Tableau.<\/li>\n<\/ol>\n\n\n\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 Excel \u043a Python \u2014 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043c\u0435\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u0430 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0425\u043e\u0442\u044f \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0443\u0441\u0438\u043b\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438, \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 Excel \u043a Python \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 Python \u0434\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0434\u043b\u044f 100 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0412\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u043e\u0441\u0432\u043e\u0438\u0442\u044c Python \u0441 \u043d\u0443\u043b\u044f, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-1244","post","type-post","status-publish","format-standard","hentry","category-6"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/posts\/1244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1244"}],"version-history":[{"count":2,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/posts\/1244\/revisions"}],"predecessor-version":[{"id":2514,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/posts\/1244\/revisions\/2514"}],"wp:attachment":[{"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}