{"id":474957,"date":"2025-09-14T15:01:24","date_gmt":"2025-09-14T15:01:24","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=474957"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=474957","title":{"rendered":"<span>Polars \u2014 \u00ab\u0443\u0431\u0438\u0439\u0446\u0430 Pandas\u00bb \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043a\u0430\u0445<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0410\u043d\u0434\u0440\u0435\u0435\u0432, \u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Polars &#8212; \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u0435 Pandas, \u043b\u044e\u0431\u0438\u043c\u043e\u0439 \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u0438 \u0434\u0430\u0442\u0430-\u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432 \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.<\/em><\/p>\n<p>\u0412 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0443\u0441\u044c \u043e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Polars \u0434\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 \u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. <\/p>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: \u043e\u0442\u043a\u0443\u0434\u0430 \u0438 \u0437\u0430\u0447\u0435\u043c<\/h3>\n<p>\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Python \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0433\u0438\u0435 \u0433\u043e\u0434\u044b \u0431\u0435\u0437\u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e \u0433\u043e\u0441\u043f\u043e\u0434\u0441\u0442\u0432\u043e\u0432\u0430\u043b Pandas. \u042d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f ETL-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u0441 \u0440\u043e\u0441\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f Pandas \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0432\u044b\u0448\u0435\u043b Polars \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u0438 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 API.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0440\u0438\u044f Polars \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0432 2020 \u0433\u043e\u0434\u0443, \u043a\u043e\u0433\u0434\u0430 \u0420\u0438\u0447\u0438 \u0412\u0438\u043d\u043a (Ritchie Vink) \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u0430 \u0438 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u043b\u0435\u0433\u0430\u0441\u0438-\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u0417\u0430 \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u0435\u0435 34000 \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 GitHub, \u0438 \u043d\u044b\u043d\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442. <\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Polars \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0442\u0430\u043a\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439<\/h3>\n<p>Polars \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 dataframe-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 OLAP Query Engine, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Rust \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 Apache Arrow \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. <\/p>\n<p>Rust \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438\u0433\u0440\u0430\u0435\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 Polars. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Pandas, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u043e\u0432\u0435\u0440\u0445 NumPy \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b Python \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, Polars \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. Rust \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0431\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 Polars \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u043e\u0439 \u0441 C \u0438 C++, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 Apache Arrow \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\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. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u044d\u0448 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c SIMD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, Arrow \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c zero-copy \u043e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, Arrow \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0441\u043f\u0435\u043a\u0442\u0440 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Polars \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. <\/p>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0432 Polars \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a Pandas \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432\u0440\u043e\u0434\u0435 Dask \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f, Polars \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0420\u0438\u0447\u0438 \u0412\u0438\u043d\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c Polars \u043a\u0430\u043a &#171;embarrassingly parallel&#187; \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. <\/p>\n<h3>\u041b\u0435\u043d\u0438\u0432\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f &#8212; \u043e\u0441\u043d\u043e\u0432\u0430 \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/h3>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043c\u043e\u0449\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Polars \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: eager (\u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e) \u0438 lazy (\u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e). \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a eager API \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u043e Pandas, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435, lazy API \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c.<\/p>\n<pre><code class=\"python\"># \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:  # Eager \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (\u043a\u0430\u043a \u0432 Pandas) df = pl.read_csv(\"large_file.csv\") filtered = df.filter(pl.col(\"amount\") &gt; 100) result = filtered.group_by(\"category\").agg(pl.col(\"amount\").sum())  # Lazy \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 result = (     pl.scan_csv(\"large_file.csv\")  # \u041d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0441\u0440\u0430\u0437\u0443     .filter(pl.col(\"amount\") &gt; 100)     .group_by(\"category\")     .agg(pl.col(\"amount\").sum())     .collect()  # \u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 )<\/code><\/pre>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 lazy \u0440\u0435\u0436\u0438\u043c\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u0441\u044c \u043f\u043b\u0430\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0443, \u0430 \u0437\u0430\u0442\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043d\u0438\u043c. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u0434\u043d\u0443 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0445\u043d\u0438\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 lazy \u0440\u0435\u0436\u0438\u043c\u0435:<\/p>\n<p><strong>Predicate Pushdown<\/strong> \u2014 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u0440\u043e\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043b\u0438\u0436\u0435 \u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0432\u044b \u0447\u0438\u0442\u0430\u0435\u0442\u0435 Parquet \u0444\u0430\u0439\u043b \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u0444\u0438\u043b\u044c\u0442\u0440, Polars \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 row groups, \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c.<\/p>\n<p><strong>Projection Pushdown<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, Polars \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p><strong>Common Subexpression Elimination<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<p><strong>Query Reordering<\/strong> \u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f.<\/p>\n<p>\u0414\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>explain()<\/code>.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e streaming engine, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Polars \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \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. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 in-memory engine, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, streaming engine \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0440\u0446\u0438\u043e\u043d\u043d\u043e (\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c\u0438 &#171;\u0447\u0430\u043d\u043a\u0430\u043c\u0438&#187;), \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 \u0441\u043e\u0442\u043d\u0438 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. <\/p>\n<pre><code class=\"python\"># \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 streaming engine pl.Config.set_streaming_chunk_size(10_000)  # \u0420\u0430\u0437\u043c\u0435\u0440 \u0447\u0430\u043d\u043a\u0430  # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 result = (     pl.scan_csv(\"100gb_file.csv\")     .filter(pl.col(\"status\") == \"active\")     .group_by(\"region\")     .agg(pl.col(\"revenue\").sum())     .collect(streaming=True)  # \u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f streaming \u0440\u0435\u0436\u0438\u043c\u0430 )<\/code><\/pre>\n<h3>\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b: \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f<\/h3>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u043c\u043d\u043e\u0433\u043e \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 &#171;Polars \u043f\u0440\u043e\u0442\u0438\u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432&#187;, \u0430 \u0437\u0434\u0435\u0441\u044c \u0434\u0430\u043c \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0432\u044b\u0436\u0438\u043c\u043a\u0443 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0438\u0437\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u044e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432. <\/em><\/p>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 PDS-H \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0445 (\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445 \u043e\u0442 TPC-H), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u044e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, Polars \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 SF-10 (\u043e\u043a\u043e\u043b\u043e 10 \u0413\u0411 \u0434\u0430\u043d\u043d\u044b\u0445) Polars streaming engine \u0438 DuckDB \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043e\u043f\u0435\u0440\u0435\u0436\u0430\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e SF-100 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e streaming engine \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e CPU-\u043a\u044d\u0448\u0430 \u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 memory-bound \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 Polars \u043e\u043f\u0435\u0440\u0435\u0436\u0430\u0435\u0442 Pandas \u0432 5-10 \u0440\u0430\u0437 \u043d\u0430 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0438 \u0434\u043e 30 \u0440\u0430\u0437 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435 Covertype \u0438\u0437 scikit-learn \u0441 581,012 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 \u0432 Polars \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0432 22 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0432 Pandas. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432 2.6 \u0440\u0430\u0437\u0430, \u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 11.7 \u0440\u0430\u0437.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430:<\/p>\n<p><strong>\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b (&lt; 10,000 \u0441\u0442\u0440\u043e\u043a):<\/strong> Pandas \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0435\u043d\u044c\u0448\u0435\u043c\u0443 overhead \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p><strong>\u0421\u0440\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b (10,000 &#8212; 1,000,000 \u0441\u0442\u0440\u043e\u043a):<\/strong> Polars \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 2-5 \u0440\u0430\u0437 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u0438 join&#8217;\u0430\u0445.<\/p>\n<p><strong>\u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b (&gt; 1,000,000 \u0441\u0442\u0440\u043e\u043a):<\/strong> \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e Polars \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c \u2014 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432 10-30 \u0440\u0430\u0437 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u043e\u0439. \u041d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Pandas \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0438\u0437-\u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a Polars \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.<\/p>\n<p><strong>\u041e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b (&gt; RAM):<\/strong> \u0417\u0434\u0435\u0441\u044c Polars \u0441 streaming engine \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u0434\u043b\u044f Pandas \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 Dask.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 (\u043c\u0435\u043d\u0435\u0435 10,000 \u0441\u0442\u0440\u043e\u043a) Pandas \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0435\u043d\u044c\u0448\u0435\u043c\u0443 overhead \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e Polars \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c.<\/p>\n<h3>Polars vs Pandas: \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043c\u0435\u0436\u0434\u0443 Pandas \u0438 Polars \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b. Pandas \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 NumPy \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. Python \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u043b\u043e\u0445\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. Polars, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e Rust \u0438 Arrow, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0445\u0440\u0430\u043d\u044f \u0438\u0445 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\"># Eager \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (\u043a\u0430\u043a \u0432 Pandas) df = pl.read_csv(\"large_file.csv\") filtered = df.filter(pl.col(\"amount\") &gt; 100) result = filtered.group_by(\"category\").agg(pl.col(\"amount\").sum())  # Lazy \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 result = (     pl.scan_csv(\"large_file.csv\")  # \u041d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0441\u0440\u0430\u0437\u0443     .filter(pl.col(\"amount\") &gt; 100)     .group_by(\"category\")     .agg(pl.col(\"amount\").sum())     .collect()  # \u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 )<\/code><\/pre>\n<p>API \u0438 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432 Polars \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u043f\u044b\u0442\u0430 Pandas, \u043d\u043e \u0441 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u043d\u043e\u0433\u0438\u0445 \u0435\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u0412 Pandas \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 apply \u0441 lambda-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. Polars \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u0433\u0430\u0442\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 SIMD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"python\"># Pandas - \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 apply (\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e) df_pandas['complex_calc'] = df_pandas.apply(     lambda row: row['value'] * 2 if row['category'] == 'A'                  else row['value'] * 1.5 if row['category'] == 'B'                 else row['value'],     axis=1 )  # Polars - \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u0431\u044b\u0441\u0442\u0440\u043e) df_polars = df_polars.with_columns(     pl.when(pl.col('category') == 'A')     .then(pl.col('value') * 2)     .when(pl.col('category') == 'B')     .then(pl.col('value') * 1.5)     .otherwise(pl.col('value'))     .alias('complex_calc') )<\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435. Pandas \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432 5-10 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0430\u043c\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. Polars \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u0432 2-4 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 streaming \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<p>\u0422\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0441\u0445\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Polars \u0441\u0442\u0440\u043e\u0436\u0435, \u0447\u0435\u043c \u0432 Pandas. Polars \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c, \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0438 \u043b\u0443\u0447\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u0441\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0443 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<h3>Polars vs PySpark<\/h3>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 PySpark \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u044b \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b.<\/p>\n<p>PySpark \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043c\u0430\u0448\u0438\u043d. \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u0435\u043c\u0443 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 overhead \u043d\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044e \u0443\u0437\u043b\u043e\u0432, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0414\u043b\u044f \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b (\u0430 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 100+ \u0413\u0411 \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435), Polars \u0447\u0430\u0441\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 PySpark \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e overhead.<\/p>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c, \u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 10 \u0413\u0411 Polars \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 2-6 \u0440\u0430\u0437 \u0432\u044b\u0448\u0435, \u0447\u0435\u043c Spark \u0441 Native Execution Engine. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043b\u043e\u0445\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044f\u0442\u0441\u044f \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0412\u0430\u0436\u043d\u044b\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438. Polars \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e Python-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 pip \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 Python. PySpark \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 executor&#8217;\u043e\u0432 \u0438 driver&#8217;\u0430. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Spark \u043d\u0435 \u043e\u043f\u0440\u0430\u0432\u0434\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0432 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438.<\/p>\n<h3>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Polars \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438<\/h3>\n<p>\u0412\u0430\u0436\u043d\u044b\u043c \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u043c \u043b\u044e\u0431\u043e\u0439 \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 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Polars \u043d\u0430\u0442\u0438\u0432\u043d\u043e \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 CSV, Parquet, JSON, Arrow IPC, Delta Lake \u0438 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 Parquet \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0435\u0441\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Arrow. Polars \u043c\u043e\u0436\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c Parquet \u0444\u0430\u0439\u043b\u044b \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0438 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442\u0441\u044f. Polars \u0443\u0436\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 plotly, matplotlib (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Series), seaborn, altair \u0438 hvplot. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0441 Polars. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 scikit-learn 1.4.0, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u043e\u0432 \u043a\u0430\u043a Polars DataFrames. \u0422\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0432 PyTorch \u0442\u0435\u043d\u0437\u043e\u0440\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u0425\u043e\u0442\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0435\u0449\u0435 \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u0430\u044f, \u043a\u0430\u043a \u0443 Pandas, \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u0434\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<h3>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f Polars: \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434<\/h3>\n<p>\u041f\u0440\u0438 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u0445 Polars, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0432\u0430\u0448 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a.<\/p>\n<h4>\u0417\u0440\u0435\u043b\u043e\u0441\u0442\u044c \u0443\u0441\u0442\u043e\u044f\u0432\u0448\u0435\u0439\u0441\u044f \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0435\u0442\u0435 \u0432 \u043d\u043e\u0432\u044b\u0439 \u0433\u043e\u0440\u043e\u0434. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0435\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0436\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430, \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u043a\u0443\u0447\u0430\u0442\u044c \u043f\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u043c, \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u043c \u0438 \u0443\u0441\u0442\u043e\u044f\u0432\u0448\u0438\u043c\u0441\u044f \u0441\u0432\u044f\u0437\u044f\u043c. \u041f\u043e\u0445\u043e\u0436\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043e\u0442 Pandas \u043a Polars. \u0417\u0430 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f Pandas \u043d\u0430\u043a\u043e\u043f\u0438\u043b \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0437\u043d\u0430\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0430\u0442\u0435\u0439, \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0430 Stack Overflow, \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0435\u0441\u044c \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0432 Pandas, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043b\u0438\u0437\u043a\u0430 \u043a 100%. \u0421 Polars \u0432\u0430\u043c \u0447\u0430\u0449\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u0446\u0435\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435.<\/p>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 Pandas DataFrames. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u044f\u0434\u0430\u043c\u0438 \u0438\u043b\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438\u0437 Polars \u0432 Pandas \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0425\u043e\u0442\u044f \u044d\u0442\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Apache Arrow, \u043e\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u0432 \u0432\u0430\u0448 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c \u043f\u0440\u0438 \u0447\u0430\u0441\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<h4>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439<\/h4>\n<p>Polars \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 Pandas, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u043c\u0438. \u0421\u0430\u043c\u044b\u0439 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438. \u0412 Pandas \u0438\u043d\u0434\u0435\u043a\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0412 Polars \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u044b \u043e\u0442 0 \u0434\u043e n-1, \u0438 \u044d\u0442\u0430 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0434\u0435 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0412 Pandas \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u0442\u0443 \u043a\u0430\u043a \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u044f\u0434\u0430\u043c\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a resample \u0438\u043b\u0438 rolling \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438. \u0412 Polars \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0441 \u0434\u0430\u0442\u043e\u0439 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\"># \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 import polars as pl # \u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 expr = pl.col(\"value\") # \u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 complex_expr = (pl.col(\"value\")                 .filter(pl.col(\"category\") == \"A\")                 .sum()                 .over(\"department\")  # \u041e\u043a\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f    .alias(\"dept_sum_A\") ) # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 when-then-otherwise \u0434\u043b\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 conditional_expr = (pl.when(pl.col(\"score\") &gt; 90)                     .then(\"excellent\")                     .when(pl.col(\"score\") &gt; 70)                     .then(\"good\")                     .when(pl.col(\"score\") &gt; 50)                     .then(\"average\")                     .otherwise(\"needs improvement\")                     .alias(\"grade\") )<\/code><\/pre>\n<p>\u0414\u0440\u0443\u0433\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u2014 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435. \u0412 Pandas \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u0435\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043a\u0443, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0447\u0438\u0441\u043b\u0430, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 None \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u042d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u0440\u0443\u0434\u043d\u043e\u0443\u043b\u043e\u0432\u0438\u043c\u044b\u043c \u043e\u0448\u0438\u0431\u043a\u0430\u043c, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0440\u044f\u0437\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. Polars \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u0431\u044b\u043b\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0447\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0441 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0440\u0430\u043d\u0435\u0435.<\/p>\n<h4>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 Polars \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u043e \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 Pandas \u0432\u044b \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0435 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u2014 \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u044d\u0442\u043e, \u0437\u0430\u0442\u0435\u043c \u0442\u043e, \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0435 \u0447\u0442\u043e-\u0442\u043e. \u0412 Polars \u0432\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0430\u043c\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c. \u042d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0445 \u0438\u0437 \u043c\u0438\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u043e\u0432\u0438\u0447\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c DataFrame \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u043a\u0430\u043a \u0432 Pandas:<\/p>\n<pre><code class=\"python\"># \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c DataFrame \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 (\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 Polars) df['new_column'] = df['old_column'] * 2  # \u041e\u0448\u0438\u0431\u043a\u0430!  # \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 Polars - \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e DataFrame df = df.with_columns(     (pl.col('old_column') * 2).alias('new_column') )<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u2014 \u043e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c \u0438 \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0443. \u041d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f (\u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e &#171;\u0441\u043a\u0430\u043b\u0438\u0441\u0442&#187;, \u0442\u043e \u0435\u0441\u0442\u044c \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c \u044f\u0437\u044b\u043a\u0430 Scala \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u044c\u0438, \u0442\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0442\u044c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f).<\/p>\n<h4>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445<\/h4>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 Polars \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0431\u043e\u0433\u0430\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u043a\u0430\u043a Pandas. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0443\u043b\u044c\u0442\u0438\u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u044f\u0434\u0430\u043c\u0438, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u0432 \u044d\u0442\u0438\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445 Pandas \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u0425\u043e\u0442\u044f Polars \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0434\u043b\u044f \u0443\u0437\u043a\u043e\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0435\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<h3>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 Polars<\/h3>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0432 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u0432\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Polars. \u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0441 Polars \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0435\u043c, \u043a\u0442\u043e \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438 Pandas, \u0438 PySpark. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430.<\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 DataFrame<\/h4>\n<p>Polars \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f DataFrame. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438.<\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044f df = pl.DataFrame({     'name': ['Alice', 'Bob', 'Charlie', 'Diana'],     'age': [25, 30, 35, 28],     'city': ['NYC', 'LA', 'Chicago', 'NYC'],     'salary': [70000, 85000, 95000, 72000] })  print(df) # shape: (4, 4) # \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 # \u2502 name    \u2506 age \u2506 city    \u2506 salary \u2502 # \u2502 ---     \u2506 --- \u2506 ---     \u2506 ---    \u2502 # \u2502 str     \u2506 i64 \u2506 str     \u2506 i64    \u2502 # \u255e\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561 # \u2502 Alice   \u2506 25  \u2506 NYC     \u2506 70000  \u2502 # \u2502 Bob     \u2506 30  \u2506 LA      \u2506 85000  \u2502 # \u2502 Charlie \u2506 35  \u2506 Chicago \u2506 95000  \u2502 # \u2502 Diana   \u2506 28  \u2506 NYC     \u2506 72000  \u2502 # \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u0445\u0435\u043c\u044b df_with_schema = pl.DataFrame(     data=[[1, \"a\"], [2, \"b\"], [3, \"c\"]],     schema=[\"id\", \"letter\"],     orient=\"row\"  # \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c )  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0433\u043e DataFrame \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 schema = {     \"id\": pl.Int32,     \"name\": pl.Utf8,     \"score\": pl.Float64,     \"active\": pl.Boolean } empty_df = pl.DataFrame(schema=schema)<\/code><\/pre>\n<h4>\u0427\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<p>Polars \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<pre><code class=\"python\"># \u0427\u0442\u0435\u043d\u0438\u0435 CSV \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432 df_csv = pl.read_csv(     \"data.csv\",     has_header=True,     separator=\",\",     try_parse_dates=True  # \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0430\u0440\u0441\u0438\u0442 \u0434\u0430\u0442\u044b )  # \u041b\u0435\u043d\u0438\u0432\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 CSV - \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 lazy_df = pl.scan_csv(\"large_file.csv\") # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f result = (     lazy_df     .filter(pl.col(\"amount\") &gt; 1000)     .group_by(\"category\")     .agg(pl.col(\"amount\").sum())     .collect()  # \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0435\u0441\u044c )  # \u0427\u0442\u0435\u043d\u0438\u0435 Parquet - \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 df_parquet = pl.read_parquet(\"data.parquet\")  # \u0427\u0442\u0435\u043d\u0438\u0435 JSON df_json = pl.read_json(\"data.json\")  # \u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b df.write_csv(\"output.csv\") df.write_parquet(\"output.parquet\", compression=\"snappy\") df.write_json(\"output.json\")  # \u0427\u0442\u0435\u043d\u0438\u0435 Excel (\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 xlsx2csv \u0438\u043b\u0438 openpyxl) df_excel = pl.read_excel(\"data.xlsx\", sheet_name=\"Sheet1\")<\/code><\/pre>\n<h4>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>Polars \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>pl.col()<\/code><\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c DataFrame \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 df = pl.DataFrame({     'product': ['Apple', 'Banana', 'Orange', 'Apple', 'Banana', 'Orange'],     'store': ['Store A', 'Store A', 'Store A', 'Store B', 'Store B', 'Store B'],     'quantity': [10, 15, 8, 12, 20, 6],     'price': [1.5, 0.5, 0.8, 1.4, 0.6, 0.9],     'date': [date(2024, 1, 1), date(2024, 1, 1), date(2024, 1, 1),              date(2024, 1, 2), date(2024, 1, 2), date(2024, 1, 2)] })  # \u0412\u044b\u0431\u043e\u0440 \u043a\u043e\u043b\u043e\u043d\u043e\u043a selected = df.select([     pl.col(\"product\"),     pl.col(\"quantity\"),     pl.col(\"price\") ])  # \u0412\u044b\u0431\u043e\u0440 \u0441 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c renamed = df.select([     pl.col(\"product\").alias(\"item\"),     pl.col(\"quantity\").alias(\"qty\"),     (pl.col(\"quantity\") * pl.col(\"price\")).alias(\"total\") ])  # \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f filtered = df.filter(pl.col(\"quantity\") &gt; 10)  # \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f complex_filter = df.filter(     (pl.col(\"quantity\") &gt; 8) &amp;      (pl.col(\"price\") &lt; 1.0) |     (pl.col(\"product\") == \"Apple\") )  # \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c is_in stores_filter = df.filter(     pl.col(\"store\").is_in([\"Store A\", \"Store C\"]) )  # \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443 \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 pattern_filter = df.filter(     pl.col(\"product\").str.contains(\"an\")  # Apple \u0438 Banana )<\/code><\/pre>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043a\u043e\u043b\u043e\u043d\u043e\u043a<\/h4>\n<p>Polars \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0449\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445.<\/p>\n<pre><code class=\"python\"># \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0441 with_columns df_enhanced = df.with_columns([     # \u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435     (pl.col(\"quantity\") * pl.col(\"price\")).alias(\"revenue\"),          # \u0423\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430     pl.when(pl.col(\"quantity\") &gt; 10)       .then(pl.lit(\"High\"))       .when(pl.col(\"quantity\") &gt; 5)       .then(pl.lit(\"Medium\"))       .otherwise(pl.lit(\"Low\"))       .alias(\"stock_level\"),          # \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0430\u0442\u0430\u043c\u0438     pl.col(\"date\").dt.day_of_week().alias(\"weekday\"),     pl.col(\"date\").dt.month().alias(\"month\"),          # \u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438     (pl.col(\"price\") * 1.2).round(2).alias(\"price_with_tax\") ])  # \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a df_modified = df.with_columns([     pl.col(\"price\").round(1),  # \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435     pl.col(\"product\").str.to_uppercase()  # \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 ])  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 df_complex = df.with_columns([     # \u0420\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f     pl.col(\"quantity\").rank().over(\"store\").alias(\"rank_in_store\"),          # \u041f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0443     (pl.col(\"quantity\") \/ pl.col(\"quantity\").sum().over(\"store\") * 100)       .round(2)       .alias(\"percent_of_store\") ])<\/code><\/pre>\n<h4>\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f<\/h4>\n<p>\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. Polars \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0451 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0439.<\/p>\n<pre><code class=\"python\"># \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 grouped = df.group_by(\"product\").agg([     pl.col(\"quantity\").sum().alias(\"total_quantity\"),     pl.col(\"price\").mean().alias(\"avg_price\"),     pl.col(\"store\").n_unique().alias(\"num_stores\") ])  # \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c multi_grouped = df.group_by([\"store\", \"product\"]).agg([     pl.col(\"quantity\").sum().alias(\"total_qty\"),     (pl.col(\"quantity\") * pl.col(\"price\")).sum().alias(\"revenue\") ])  # \u0411\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 advanced_agg = df.group_by(\"store\").agg([     # \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438     pl.col(\"quantity\").mean().alias(\"mean_qty\"),     pl.col(\"quantity\").std().alias(\"std_qty\"),     pl.col(\"quantity\").quantile(0.75).alias(\"q75_qty\"),          # \u0421\u043f\u0438\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439     pl.col(\"product\").unique().alias(\"products_list\"),          # \u0423\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438     pl.col(\"quantity\").filter(pl.col(\"product\") == \"Apple\").sum().alias(\"apple_qty\"),          # \u041f\u0435\u0440\u0432\u043e\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435     pl.col(\"price\").first().alias(\"first_price\"),     pl.col(\"price\").last().alias(\"last_price\") ])  # \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a df_with_group_stats = df.with_columns([     pl.col(\"quantity\").mean().over(\"store\").alias(\"store_avg_qty\"),     pl.col(\"quantity\").max().over(\"store\").alias(\"store_max_qty\") ])<\/code><\/pre>\n<h4>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 (Joins)<\/h4>\n<p>Polars \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438.<\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 products = pl.DataFrame({     'product_id': [1, 2, 3, 4],     'product_name': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],     'category': ['Electronics', 'Accessories', 'Accessories', 'Electronics'] })  sales = pl.DataFrame({     'sale_id': [101, 102, 103, 104, 105],     'product_id': [1, 2, 1, 3, 5],     'quantity': [2, 5, 1, 3, 1],     'date': [date(2024, 1, 1), date(2024, 1, 2), date(2024, 1, 3),               date(2024, 1, 3), date(2024, 1, 4)] })  # Inner join - \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 inner_joined = sales.join(     products,     on='product_id',     how='inner' )  # Left join - \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b left_joined = sales.join(     products,     on='product_id',     how='left' )  # Outer join - \u0432\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u043e\u0431\u0435\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 outer_joined = sales.join(     products,     on='product_id',     how='outer' )  # Semi join - \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u0439 semi_joined = sales.join(     products,     on='product_id',     how='semi' )  # Anti join - \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u041d\u0415 \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0432 \u043f\u0440\u0430\u0432\u043e\u0439 anti_joined = sales.join(     products,     on='product_id',     how='anti' )  # Join \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a\u043e\u043b\u043e\u043d\u043e\u043a customers = pl.DataFrame({     'customer_id': [1, 2, 3],     'name': ['Alice', 'Bob', 'Charlie'] })  orders = pl.DataFrame({     'order_id': [1001, 1002, 1003],     'cust_id': [1, 2, 1],  # \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438     'amount': [100, 200, 150] })  joined_different_names = orders.join(     customers,     left_on='cust_id',     right_on='customer_id',     how='inner' )<\/code><\/pre>\n<h4>\u041e\u043a\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<p>\u041e\u043a\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0434 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435.<\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 sales_data = pl.DataFrame({     'date': [date(2024, 1, i) for i in range(1, 16)],     'store': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B',                'A', 'B', 'A', 'B', 'A'],     'sales': [100, 150, 110, 160, 120, 140, 130, 170, 125, 165,                135, 175, 140, 180, 145] })  # \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u043a\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 windowed = sales_data.with_columns([     # \u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0435     pl.col(\"sales\").rolling_mean(window_size=3).alias(\"rolling_avg\"),          # \u041a\u0443\u043c\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430     pl.col(\"sales\").cum_sum().alias(\"cumulative_sales\"),          # \u0420\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435     pl.col(\"sales\").rank().alias(\"overall_rank\"),          # \u0420\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b     pl.col(\"sales\").rank().over(\"store\").alias(\"store_rank\"),          # \u041f\u0440\u043e\u0446\u0435\u043d\u0442\u0438\u043b\u0438     pl.col(\"sales\").quantile(0.5).over(\"store\").alias(\"store_median\"),          # \u041b\u0430\u0433 \u0438 \u043b\u0438\u0434 (\u0441\u0434\u0432\u0438\u0433 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439)     pl.col(\"sales\").shift(1).alias(\"prev_sales\"),     pl.col(\"sales\").shift(-1).alias(\"next_sales\"),          # \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c     (pl.col(\"sales\") - pl.col(\"sales\").shift(1)).alias(\"sales_change\"),          # \u041f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0442 \u0441\u0443\u043c\u043c\u044b \u0433\u0440\u0443\u043f\u043f\u044b     (pl.col(\"sales\") \/ pl.col(\"sales\").sum().over(\"store\") * 100)       .round(2)       .alias(\"percent_of_store_total\") ])  # \u0411\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043e\u043a\u043e\u043d\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f advanced_window = sales_data.with_columns([     # \u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0435\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435     pl.col(\"sales\").rolling_std(window_size=5).alias(\"rolling_std\"),          # Min \u0438 max \u0432 \u043e\u043a\u043d\u0435     pl.col(\"sales\").rolling_min(window_size=3).alias(\"rolling_min\"),     pl.col(\"sales\").rolling_max(window_size=3).alias(\"rolling_max\"),          # \u041f\u0435\u0440\u0432\u043e\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435     pl.col(\"sales\").first().over(\"store\").alias(\"first_store_sale\"),     pl.col(\"sales\").last().over(\"store\").alias(\"last_store_sale\"),          # Z-score \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b     ((pl.col(\"sales\") - pl.col(\"sales\").mean().over(\"store\")) \/       pl.col(\"sales\").std().over(\"store\")).alias(\"z_score\") ])<\/code><\/pre>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u044f\u0434\u0430\u043c\u0438<\/h4>\n<p>Polars \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u0433\u0430\u0442\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u0442\u0430\u043c\u0438 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c.<\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430 start_date = datetime(2024, 1, 1) dates = [start_date + timedelta(hours=i) for i in range(168)]  # \u043d\u0435\u0434\u0435\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445  time_series = pl.DataFrame({     'timestamp': dates,     'value': np.random.randn(168).cumsum() + 100,     'category': np.random.choice(['A', 'B', 'C'], 168) })  # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u0430\u0442\u044b\/\u0432\u0440\u0435\u043c\u0435\u043d\u0438 time_features = time_series.with_columns([     pl.col(\"timestamp\").dt.year().alias(\"year\"),     pl.col(\"timestamp\").dt.month().alias(\"month\"),     pl.col(\"timestamp\").dt.day().alias(\"day\"),     pl.col(\"timestamp\").dt.hour().alias(\"hour\"),     pl.col(\"timestamp\").dt.day_of_week().alias(\"day_of_week\"),     pl.col(\"timestamp\").dt.week().alias(\"week_number\"),     pl.col(\"timestamp\").dt.quarter().alias(\"quarter\") ])  # \u0420\u0435\u0441\u0435\u043c\u043f\u043b\u0438\u043d\u0433 (\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u044f\u0434\u0430) hourly_avg = (     time_series     .group_by_dynamic(         \"timestamp\",         every=\"1h\",  # \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0447\u0430\u0441\u0430\u043c         period=\"1h\",  # \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430         by=\"category\"  # \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430     )     .agg([         pl.col(\"value\").mean().alias(\"avg_value\"),         pl.col(\"value\").max().alias(\"max_value\"),         pl.col(\"value\").min().alias(\"min_value\")     ]) )  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u044f\u0434\u043e\u0432 time_series_lags = time_series.sort(\"timestamp\").with_columns([     pl.col(\"value\").shift(1).alias(\"lag_1h\"),     pl.col(\"value\").shift(24).alias(\"lag_1d\"),     pl.col(\"value\").shift(168).alias(\"lag_1w\") ])  # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u0438\u0446 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 events = pl.DataFrame({     'event_id': [1, 2, 3, 4, 5],     'start_time': [         datetime(2024, 1, 1, 10, 0),         datetime(2024, 1, 1, 11, 30),         datetime(2024, 1, 1, 14, 0),         datetime(2024, 1, 2, 9, 0),         datetime(2024, 1, 2, 15, 30)     ],     'end_time': [         datetime(2024, 1, 1, 11, 0),         datetime(2024, 1, 1, 12, 45),         datetime(2024, 1, 1, 16, 30),         datetime(2024, 1, 2, 11, 30),         datetime(2024, 1, 2, 17, 0)     ] })  events_duration = events.with_columns([     (pl.col(\"end_time\") - pl.col(\"start_time\")).alias(\"duration\"),     (pl.col(\"end_time\") - pl.col(\"start_time\")).dt.total_seconds().alias(\"duration_seconds\"),     (pl.col(\"end_time\") - pl.col(\"start_time\")).dt.total_minutes().alias(\"duration_minutes\") ])<\/code><\/pre>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438<\/h4>\n<p>Polars \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c DataFrame \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 text_df = pl.DataFrame({     'email': ['john.doe@example.com', 'jane_smith@company.org',                'bob.wilson@email.co.uk', 'alice@domain.com'],     'full_name': ['John Doe', 'Jane Smith', 'Bob Wilson', 'Alice Johnson'],     'phone': ['+1-555-0100', '555.0200', '(555) 0300', '555-0400'],     'description': ['Senior Developer', 'junior analyst', 'PROJECT MANAGER', 'data scientist'] })  # \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 text_processed = text_df.with_columns([     # \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430     pl.col(\"full_name\").str.to_uppercase().alias(\"name_upper\"),     pl.col(\"description\").str.to_lowercase().alias(\"desc_lower\"),     pl.col(\"description\").str.to_titlecase().alias(\"desc_title\"),          # \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438     pl.col(\"email\").str.len_chars().alias(\"email_length\"),          # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438     pl.col(\"email\").str.contains(\"@company\").alias(\"is_company_email\"),          # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a     pl.col(\"email\").str.split(\"@\").list.get(0).alias(\"username\"),     pl.col(\"email\").str.split(\"@\").list.get(1).alias(\"domain\"),          # \u0417\u0430\u043c\u0435\u043d\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a     pl.col(\"phone\").str.replace_all(r\"[^\\d]\", \"\").alias(\"phone_digits\"),          # \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432     pl.col(\"description\").str.strip_chars().alias(\"desc_trimmed\") ])  # \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f regex_df = text_df.with_columns([     # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443     pl.col(\"email\").str.extract(r\"([^@]+)@([^.]+)\\.(.+)\", 1).alias(\"user\"),     pl.col(\"email\").str.extract(r\"([^@]+)@([^.]+)\\.(.+)\", 2).alias(\"domain_name\"),     pl.col(\"email\").str.extract(r\"([^@]+)@([^.]+)\\.(.+)\", 3).alias(\"tld\"),          # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443     pl.col(\"phone\").str.contains(r\"^\\+\\d\").alias(\"has_country_code\"),          # \u0417\u0430\u043c\u0435\u043d\u0430 \u043f\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443     pl.col(\"phone\").str.replace(r\"^\\+1-?\", \"\").alias(\"phone_without_country\") ])  # \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u0441\u0442\u0440\u043e\u043a name_parts = text_df.with_columns([     # \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438     pl.col(\"full_name\").str.split(\" \").alias(\"name_parts\"),          # \u041f\u0435\u0440\u0432\u043e\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043b\u043e\u0432\u043e     pl.col(\"full_name\").str.split(\" \").list.get(0).alias(\"first_name\"),     pl.col(\"full_name\").str.split(\" \").list.get(-1).alias(\"last_name\"),          # \u0421\u0440\u0435\u0437\u044b \u0441\u0442\u0440\u043e\u043a     pl.col(\"email\").str.slice(0, 5).alias(\"email_prefix\"),          # \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f\/\u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441     pl.col(\"description\").str.starts_with(\"Senior\").alias(\"is_senior\"),     pl.col(\"email\").str.ends_with(\".com\").alias(\"is_dotcom\") ])<\/code><\/pre>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/h4>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 null \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c DataFrame \u0441 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 df_with_nulls = pl.DataFrame({     'id': [1, 2, 3, 4, 5],     'name': ['Alice', None, 'Charlie', 'Diana', None],     'age': [25, 30, None, 28, 35],     'salary': [70000, None, 95000, None, 80000],     'department': ['IT', 'HR', 'IT', None, 'Finance'] })  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 null null_check = df_with_nulls.with_columns([     pl.col(\"name\").is_null().alias(\"name_is_null\"),     pl.col(\"age\").is_not_null().alias(\"age_is_not_null\") ])  # \u041f\u043e\u0434\u0441\u0447\u0451\u0442 null \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 null_counts = df_with_nulls.select([     pl.all().null_count() ])  # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0441 null df_no_nulls = df_with_nulls.drop_nulls()  # \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043b\u044e\u0431\u044b\u043c null df_no_nulls_subset = df_with_nulls.drop_nulls(subset=[\"name\", \"age\"])  # \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c  # \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 null \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 df_filled = df_with_nulls.with_columns([     # \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439     pl.col(\"name\").fill_null(\"Unknown\"),          # \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c     pl.col(\"age\").fill_null(pl.col(\"age\").mean()),          # \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0434\u0438\u0430\u043d\u043e\u0439     pl.col(\"salary\").fill_null(pl.col(\"salary\").median()),          # \u041f\u0440\u044f\u043c\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (forward fill)     pl.col(\"department\").forward_fill() ])  # \u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0434\u043b\u044f \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 numeric_series = pl.DataFrame({     'time': range(10),     'value': [1.0, None, None, 4.0, 5.0, None, 7.0, 8.0, None, 10.0] })  interpolated = numeric_series.with_columns([     pl.col(\"value\").interpolate().alias(\"linear_interp\") ])  # \u0423\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 conditional_fill = df_with_nulls.with_columns([     pl.when(pl.col(\"department\") == \"IT\")       .then(pl.col(\"salary\").fill_null(85000))       .otherwise(pl.col(\"salary\").fill_null(75000))       .alias(\"salary_filled\") ])<\/code><\/pre>\n<h4>\u0421\u0432\u043e\u0434\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 reshape \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>Polars \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f pivot \u0438 melt.<\/p>\n<pre><code class=\"python\"># \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0434\u043b\u0438\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 sales_long = pl.DataFrame({     'date': ['2024-01-01', '2024-01-01', '2024-01-01',               '2024-01-02', '2024-01-02', '2024-01-02'],     'product': ['A', 'B', 'C', 'A', 'B', 'C'],     'store': ['Store1', 'Store1', 'Store1', 'Store1', 'Store1', 'Store1'],     'sales': [100, 150, 120, 110, 160, 130] })  # Pivot - \u0438\u0437 \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u0432 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 sales_wide = sales_long.pivot(     values='sales',     index='date',     columns='product' ) print(sales_wide) # \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2510 # \u2502 date       \u2506 A   \u2506 B   \u2506 C   \u2502 # \u2502 ---        \u2506 --- \u2506 --- \u2506 --- \u2502 # \u2502 str        \u2506 i64 \u2506 i64 \u2506 i64 \u2502 # \u255e\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2561 # \u2502 2024-01-01 \u2506 100 \u2506 150 \u2506 120 \u2502 # \u2502 2024-01-02 \u2506 110 \u2506 160 \u2506 130 \u2502 # \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2518  # Melt - \u0438\u0437 \u0448\u0438\u0440\u043e\u043a\u043e\u0433\u043e \u0432 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 melted = sales_wide.melt(     id_vars=['date'],     value_vars=['A', 'B', 'C'],     variable_name='product',     value_name='sales' )  # \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 transposed = pl.DataFrame({     'metric': ['revenue', 'cost', 'profit'],     'Q1': [1000, 600, 400],     'Q2': [1200, 700, 500],     'Q3': [1100, 650, 450],     'Q4': [1300, 750, 550] }).transpose(include_header=True, header_name=\"quarter\")<\/code><\/pre>\n<h3>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 Polars<\/h3>\n<p>\u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0430\u0442\u044c\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Polars. <\/p>\n<h4>\u041f\u0443\u043d\u043a\u0442 1: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0437\u0434\u0435 \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u043c<\/h4>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 DataFrame \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 large_df = pl.DataFrame({     'id': range(1_000_000),     'group': np.random.choice(['A', 'B', 'C', 'D'], 1_000_000),     'value1': np.random.randn(1_000_000),     'value2': np.random.randn(1_000_000),     'value3': np.random.randn(1_000_000) })  # Eager (\u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0435) \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 - \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 eager_result = (     large_df     .filter(pl.col(\"value1\") &gt; 0)     .with_columns([         (pl.col(\"value2\") * 2).alias(\"value2_doubled\")     ])     .group_by(\"group\")     .agg([         pl.col(\"value1\").mean(),         pl.col(\"value2_doubled\").sum()     ]) )  # Lazy (\u043b\u0435\u043d\u0438\u0432\u043e\u0435) \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 - \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c lazy_result = (     large_df.lazy()  # \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c     .filter(pl.col(\"value1\") &gt; 0)     .with_columns([         (pl.col(\"value2\") * 2).alias(\"value2_doubled\")     ])     .group_by(\"group\")     .agg([         pl.col(\"value1\").mean(),         pl.col(\"value2_doubled\").sum()     ])     .collect()  # \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e pipeline )  # \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u043b\u0430\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f query_plan = (     large_df.lazy()     .filter(pl.col(\"value1\") &gt; 0)     .select([pl.col(\"group\"), pl.col(\"value1\")])     .group_by(\"group\")     .agg(pl.col(\"value1\").mean()) )  # \u041d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043b\u0430\u043d print(query_plan.explain(optimized=False))  # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043b\u0430\u043d print(query_plan.explain(optimized=True))  # \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0439 parallel_agg = (     large_df.lazy()     .group_by(\"group\")     .agg([         # \u0412\u0441\u0435 \u044d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e         pl.col(\"value1\").mean().alias(\"v1_mean\"),         pl.col(\"value1\").std().alias(\"v1_std\"),         pl.col(\"value2\").min().alias(\"v2_min\"),         pl.col(\"value2\").max().alias(\"v2_max\"),         pl.col(\"value3\").sum().alias(\"v3_sum\"),         pl.count().alias(\"count\")     ])     .collect() )<\/code><\/pre>\n<h4>\u041f\u0443\u043d\u043a\u0442 2: \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/h4>\n<p>Polars \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434. <\/p>\n<pre><code class=\"python\">import os # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u044f\u0434\u0435\u0440 print(f\"\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430: {os.cpu_count()}\")  # \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 n_rows = 10_000_000 df_parallel = pl.DataFrame({     'group': np.random.choice(list('ABCDEFGH'), n_rows),  # 8 \u0433\u0440\u0443\u043f\u043f \u0434\u043b\u044f 8 \u044f\u0434\u0435\u0440     'value': np.random.randn(n_rows),     'amount': np.random.randint(1, 1000, n_rows) })  # \u0425\u041e\u0420\u041e\u0428\u041e: \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044f\u0442\u0441\u044f # \u041a\u0430\u0436\u0434\u043e\u0435 \u044f\u0434\u0440\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e parallel_friendly = (     df_parallel.lazy()     .with_columns([         # \u042d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445         pl.col('value').abs().alias('abs_value'),         pl.col('value').pow(2).alias('squared'),         (pl.col('value') * pl.col('amount')).alias('weighted'),         pl.when(pl.col('value') &gt; 0)           .then(pl.lit('positive'))           .otherwise(pl.lit('negative'))           .alias('sign')     ])     .collect() )  # \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 - Polars \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u0435\u0436\u0434\u0443 \u044f\u0434\u0440\u0430\u043c\u0438 grouped_parallel = (     df_parallel.lazy()     .group_by('group')     .agg([         # \u041a\u0430\u0436\u0434\u043e\u0435 \u044f\u0434\u0440\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0433\u0440\u0443\u043f\u043f\u044b         pl.col('value').mean(),         pl.col('value').std(),         pl.col('amount').sum()     ])     .collect() )  # \u0412\u0410\u0416\u041d\u041e: \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 partition_by \u0434\u043b\u044f \u044f\u0432\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u043e\u043c # \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 def process_partition(partition_df):     \"\"\"\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438\"\"\"     return partition_df.with_columns([         pl.col('value').rolling_mean(window_size=100).alias('rolling_avg'),         pl.col('value').rank().alias('rank')     ])  # \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e partitions = df_parallel.partition_by('group', maintain_order=False) print(f\"\u0421\u043e\u0437\u0434\u0430\u043d\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439: {len(partitions)}\")  # \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e # \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Polars \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u044f\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e processed_partitions = [process_partition(p) for p in partitions] result_partitioned = pl.concat(processed_partitions)  # \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430 \u0447\u0435\u0440\u0435\u0437 streaming # \u0414\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c streaming_query = (     pl.scan_csv(\"huge_file.csv\")  # \u041d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0446\u0435\u043b\u0438\u043a\u043e\u043c     .filter(pl.col('value') &gt; 0)     .group_by('category')     .agg([         pl.col('amount').sum(),         pl.col('value').mean()     ])     # streaming=True \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0442\u0447\u0430\u043c\u0438     .collect(streaming=True) )  # \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 def measure_parallel_efficiency(df, operation):     \"\"\"\u0418\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u0430\u0446\u0438\u0438\"\"\"     import time     import multiprocessing          # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u0432     thread_counts = [1, 2, 4, 8]     times = []          for n_threads in thread_counts:         # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u043b\u044f Polars         os.environ['POLARS_MAX_THREADS'] = str(n_threads)                  start = time.time()         result = operation(df)         elapsed = time.time() - start         times.append(elapsed)                  print(f\"\u041f\u043e\u0442\u043e\u043a\u043e\u0432: {n_threads}, \u0412\u0440\u0435\u043c\u044f: {elapsed:.2f}s\")          # \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e     del os.environ['POLARS_MAX_THREADS']          # \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f     speedup = [times[0] \/ t for t in times]     efficiency = [s \/ threads for s, threads in zip(speedup, thread_counts)]          for threads, eff in zip(thread_counts, efficiency):         print(f\"\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0441 {threads} \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438: {eff:.1%}\")<\/code><\/pre>\n<h4>\u041f\u0443\u043d\u043a\u0442 3: \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e<\/h4>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. Polars \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. <\/p>\n<pre><code class=\"python\"># \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f 1: \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 def process_large_csv_incrementally(file_path, batch_size=100_000):     \"\"\"     \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 CSV \u0444\u0430\u0439\u043b \u0431\u0430\u0442\u0447\u0430\u043c\u0438, \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u0435\u0433\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c     \"\"\"          # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c lazy reading \u0441 \u0431\u0430\u0442\u0447\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c     lazy_df = pl.scan_csv(file_path)          # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443     processed = (         lazy_df         .filter(pl.col('value') &gt; 0)         .group_by('category')         .agg([             pl.col('amount').sum().alias('total_amount'),             pl.col('value').mean().alias('avg_value')         ])     )          # collect(streaming=True) \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0442\u0447\u0430\u043c\u0438     result = processed.collect(streaming=True)     return result  # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f 2: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 sink_parquet \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 def process_and_save_large_data():     \"\"\"     \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0435\u0437 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0441\u0435\u0433\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u044c     \"\"\"          # sink_parquet \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430 \u0434\u0438\u0441\u043a     (         pl.scan_csv(\"huge_input.csv\")         .filter(pl.col('important') == True)         .with_columns([             pl.col('value').rolling_mean(100).alias('smoothed')         ])         .sink_parquet(\"processed_output.parquet\")     )     # \u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u043f\u0430\u043c\u044f\u0442\u044c!  # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f 3: \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 def memory_efficient_pipeline():     \"\"\"     \u042f\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u043c pipeline     \"\"\"     import gc          # \u0428\u0430\u0433 1: \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430     df1 = pl.read_csv(\"data1.csv\")     processed1 = df1.filter(pl.col('value') &gt; 0)     del df1  # \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     gc.collect()  # \u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430          # \u0428\u0430\u0433 2: \u0412\u0442\u043e\u0440\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430     df2 = pl.read_csv(\"data2.csv\")     processed2 = df2.group_by('key').agg(pl.col('amount').sum())     del df2     gc.collect()          # \u0428\u0430\u0433 3: \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435     result = processed1.join(processed2, on='key')     del processed1, processed2  # \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b     gc.collect()          return result  # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f 4: \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 def monitor_memory_usage():     \"\"\"     \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f     \"\"\"     import psutil     import os          process = psutil.Process(os.getpid())          def get_memory_mb():         return process.memory_info().rss \/ 1024 \/ 1024          print(f\"\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c: {get_memory_mb():.1f} MB\")          # \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 DataFrame     df = pl.DataFrame({         'data': np.random.randn(10_000_000)     })     print(f\"\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f DataFrame: {get_memory_mb():.1f} MB\")          # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438     df_expanded = df.with_columns([         pl.col('data').pow(2).alias('squared'),         pl.col('data').abs().alias('absolute'),         pl.col('data').rolling_mean(100).alias('rolling')     ])     print(f\"\u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f: {get_memory_mb():.1f} MB\")          # \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c     del df     gc.collect()     print(f\"\u041f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e: {get_memory_mb():.1f} MB\")          return df_expanded  # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f 5: \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 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a def optimize_string_memory():     \"\"\"     \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438     \"\"\"     n = 1_000_000          # \u041c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u0440\u043e\u043a     string_data = np.random.choice(         ['Customer_' + str(i) for i in range(1000)],  # 1000 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439         n     )          # \u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438     df_strings = pl.DataFrame({         'customer': string_data,         'value': np.random.randn(n)     })          # \u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438     df_categorical = pl.DataFrame({         'customer': pl.Series(string_data, dtype=pl.Categorical),         'value': np.random.randn(n)     })          print(f\"\u0420\u0430\u0437\u043c\u0435\u0440 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438: {df_strings.estimated_size('mb'):.2f} MB\")     print(f\"\u0420\u0430\u0437\u043c\u0435\u0440 \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438: {df_categorical.estimated_size('mb'):.2f} MB\")     print(f\"\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f: {(1 - df_categorical.estimated_size() \/ df_strings.estimated_size()) * 100:.1f}%\")          # \u0412\u0410\u0416\u041d\u041e: \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0442\u043e\u0436\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435!     start = time.time()     grouped_strings = df_strings.group_by('customer').agg(pl.col('value').sum())     print(f\"\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0442\u0440\u043e\u043a: {time.time() - start:.3f}s\")          start = time.time()     grouped_categorical = df_categorical.group_by('customer').agg(pl.col('value').sum())     print(f\"\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439: {time.time() - start:.3f}s\")<\/code><\/pre>\n<h4>\u041f\u0443\u043d\u043a\u0442 4: \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (Joins)<\/h4>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. Polars \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0443\u043c\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u0440\u0430\u0437\u044b.<\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f n_left = 5_000_000 n_right = 1_000_000  left_table = pl.DataFrame({     'key': np.random.randint(0, 500_000, n_left),     'value_left': np.random.randn(n_left),     'category': np.random.choice(['A', 'B', 'C'], n_left) })  right_table = pl.DataFrame({     'key': np.random.randint(0, 500_000, n_right),     'value_right': np.random.randn(n_right),     'info': np.random.choice(['X', 'Y', 'Z'], n_right) })  # \u0421\u0422\u0420\u0410\u0422\u0415\u0413\u0418\u042f 1: \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043b\u044f sort-merge join # \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b, join \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 print(\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f:\")  # \u041d\u0435\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 start = time.time() unsorted_join = left_table.join(right_table, on='key', how='inner') print(f\"Join \u0431\u0435\u0437 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438: {time.time() - start:.2f}s\")  # \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 start = time.time() left_sorted = left_table.sort('key') right_sorted = right_table.sort('key') sorted_join = left_sorted.join(right_sorted, on='key', how='inner') print(f\"Join \u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439: {time.time() - start:.2f}s\")  # \u0421\u0422\u0420\u0410\u0422\u0415\u0413\u0418\u042f 2: \u0423\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c # \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0439\u0442\u0435 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0414\u041e join efficient_join = (     left_table.lazy()     .filter(pl.col('category') == 'A')  # \u0424\u0438\u043b\u044c\u0442\u0440 \u0414\u041e join     .select(['key', 'value_left'])  # \u0422\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438     .join(         right_table.lazy()         .filter(pl.col('info') != 'Z')  # \u0424\u0438\u043b\u044c\u0442\u0440 \u0441\u043f\u0440\u0430\u0432\u0430 \u0442\u043e\u0436\u0435         .select(['key', 'value_right']),         on='key',         how='inner'     )     .collect() )  # \u0421\u0422\u0420\u0410\u0422\u0415\u0413\u0418\u042f 3: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 join_asof \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u044f\u0434\u043e\u0432 # \u0414\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 join_asof \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 trades = pl.DataFrame({     'time': pl.date_range(         datetime(2024, 1, 1),          datetime(2024, 1, 2),          interval='1s',         eager=True     )[:10000],     'price': np.random.uniform(100, 200, 10000) }).sort('time')  quotes = pl.DataFrame({     'time': pl.date_range(         datetime(2024, 1, 1),          datetime(2024, 1, 2),          interval='100ms',         eager=True     )[:100000],     'bid': np.random.uniform(99, 199, 100000) }).sort('time')  # join_asof \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 asof_result = trades.join_asof(     quotes,     on='time',     strategy='backward'  # \u0411\u0435\u0440\u0451\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u0435\u0440\u0435\u0434 \u0441\u0434\u0435\u043b\u043a\u043e\u0439 )  # \u0421\u0422\u0420\u0410\u0422\u0415\u0413\u0418\u042f 4: Broadcast join \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043f\u0440\u0430\u0432\u0430 # \u0415\u0441\u043b\u0438 \u043f\u0440\u0430\u0432\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f, Polars \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043e\u0441\u043b\u0430\u0442\u044c \u0435\u0451 \u043a\u043e\u043f\u0438\u0438 \u0432\u0441\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u0430\u043c small_lookup = pl.DataFrame({     'category_id': [1, 2, 3, 4, 5],     'category_name': ['Electronics', 'Books', 'Clothing', 'Food', 'Sports'] })  large_transactions = pl.DataFrame({     'transaction_id': range(1_000_000),     'category_id': np.random.randint(1, 6, 1_000_000),     'amount': np.random.uniform(10, 1000, 1_000_000) })  # Polars \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442, \u0447\u0442\u043e small_lookup \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f # \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 broadcast join broadcast_join = large_transactions.join(     small_lookup,     on='category_id',     how='left' )  # \u041f\u0420\u041e\u0414\u0412\u0418\u041d\u0423\u0422\u0410\u042f \u041e\u041f\u0422\u0418\u041c\u0418\u0417\u0410\u0426\u0418\u042f: \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 join \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 def optimize_multi_join():     \"\"\"     \u041f\u0440\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 join \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435!     \u041d\u0430\u0447\u0438\u043d\u0430\u0439\u0442\u0435 \u0441 \u0441\u0430\u043c\u044b\u0445 \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 join (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435)     \"\"\"          # \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430     huge_table = pl.DataFrame({         'id': range(10_000_000),         'key1': np.random.randint(0, 1000, 10_000_000),         'key2': np.random.randint(0, 100, 10_000_000),         'value': np.random.randn(10_000_000)     })          medium_table = pl.DataFrame({         'key1': range(1000),         'info1': np.random.choice(['A', 'B', 'C'], 1000)     })          small_table = pl.DataFrame({         'key2': range(100),         'info2': np.random.choice(['X', 'Y'], 100)     })          # \u041f\u0420\u0410\u0412\u0418\u041b\u042c\u041d\u042b\u0419 \u043f\u043e\u0440\u044f\u0434\u043e\u043a: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 join \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439     efficient_order = (         huge_table.lazy()         .join(small_table.lazy(), on='key2', how='inner')  # \u0421\u0438\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440         .join(medium_table.lazy(), on='key1', how='inner')  # \u0417\u0430\u0442\u0435\u043c \u0441\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0439         .collect()     )          return efficient_order<\/code><\/pre>\n<h4>\u041f\u0443\u043d\u043a\u0442 5: \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0439 \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043e\u043a<\/h4>\n<p>\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u2014 \u043e\u0434\u043d\u0438 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 &#171;\u0442\u044f\u0436\u0435\u043b\u044b\u0445&#187; \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.  Polars \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438. \u041a\u043b\u044e\u0447 \u043a \u0443\u0441\u043f\u0435\u0445\u0443 \u2014 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Polars \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u0435\u043c\u0443 \u0432 \u044d\u0442\u043e\u043c. <\/p>\n<pre><code class=\"python\"># \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 n = 10_000_000 df_agg = pl.DataFrame({     'group_high_card': np.random.randint(0, 100_000, n),  # \u041c\u043d\u043e\u0433\u043e \u0433\u0440\u0443\u043f\u043f     'group_low_card': np.random.choice(['A', 'B', 'C', 'D'], n),  # \u041c\u0430\u043b\u043e \u0433\u0440\u0443\u043f\u043f     'value1': np.random.randn(n),     'value2': np.random.uniform(0, 100, n),     'value3': np.random.randint(0, 1000, n) })  # \u041f\u0420\u0418\u041d\u0426\u0418\u041f 1: \u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u0434\u0430\u043d\u043d\u044b\u043c # \u041f\u041b\u041e\u0425\u041e - \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 start = time.time() result1 = df_agg.group_by('group_low_card').agg(pl.col('value1').mean()) result2 = df_agg.group_by('group_low_card').agg(pl.col('value2').sum()) result3 = df_agg.group_by('group_low_card').agg(pl.col('value3').max()) bad_result = result1.join(result2, on='group_low_card').join(result3, on='group_low_card') print(f\"\u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438: {time.time() - start:.2f}s\")  # \u0425\u041e\u0420\u041e\u0428\u041e - \u043e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f\u043c\u0438 start = time.time() good_result = df_agg.group_by('group_low_card').agg([     pl.col('value1').mean(),     pl.col('value2').sum(),     pl.col('value3').max() ]) print(f\"\u041e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430: {time.time() - start:.2f}s\")  # \u041f\u0420\u0418\u041d\u0426\u0418\u041f 2: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 def compare_aggregation_methods():     \"\"\"     \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0434\u0440\u0443\u0433\u0438\u0445     \"\"\"          # \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 (O(n))     efficient_aggs = df_agg.group_by('group_low_card').agg([         pl.col('value1').sum(),      # \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0443\u043c\u043c\u0430         pl.col('value1').mean(),     # \u0421\u0440\u0435\u0434\u043d\u0435\u0435         pl.col('value1').min(),      # \u041c\u0438\u043d\u0438\u043c\u0443\u043c         pl.col('value1').max(),      # \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c         pl.col('value1').count(),    # \u041f\u043e\u0434\u0441\u0447\u0451\u0442         pl.col('value1').first(),    # \u041f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435         pl.col('value1').last(),     # \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435     ])          # \u041c\u0435\u043d\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 (\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u043b\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439)     expensive_aggs = df_agg.group_by('group_low_card').agg([         pl.col('value1').median(),           # \u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438         pl.col('value1').quantile(0.75),     # \u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438         pl.col('value1').std(),              # \u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0432\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0430         pl.col('value1').unique().len(),     # \u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439         pl.col('value1').sort().list(),      # \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439     ])          return efficient_aggs, expensive_aggs  # \u041f\u0420\u0418\u041d\u0426\u0418\u041f 3: \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f\u0445 # \u0412\u043c\u0435\u0441\u0442\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438, \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0439\u0442\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 better_aggregation = df_agg.group_by('group_low_card').agg([     # \u0423\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f - \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e!     pl.col('value1').filter(pl.col('value1') &gt; 0).sum().alias('positive_sum'),     pl.col('value1').filter(pl.col('value1') &lt; 0).sum().alias('negative_sum'),          # \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c     (pl.col('value2') &gt; 50).sum().alias('count_above_50'),          # \u0412\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u043e\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0435     (pl.col('value1') * pl.col('value3')).sum() \/ pl.col('value3').sum() ])  # \u041f\u0420\u0418\u041d\u0426\u0418\u041f 4: \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c def optimize_high_cardinality_groupby():     \"\"\"     \u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f, \u0432\u0430\u0436\u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f     \"\"\"          # \u0414\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 streaming     high_card_result = (         df_agg.lazy()         .group_by('group_high_card')         .agg([             pl.col('value1').mean(),             pl.col('value2').sum()         ])         .collect(streaming=True)  # \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0442\u0447\u0430\u043c\u0438     )          # \u0418\u043b\u0438 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430     n_partitions = 10     partition_size = 10_000          results = []     for i in range(n_partitions):         mask = (pl.col('group_high_card') &gt;= i * partition_size) &amp; \\                (pl.col('group_high_card') &lt; (i + 1) * partition_size)                  partial_result = (             df_agg.lazy()             .filter(mask)             .group_by('group_high_card')             .agg(pl.col('value1').mean())             .collect()         )         results.append(partial_result)          final_result = pl.concat(results)     return final_result  # \u041f\u0420\u0418\u041d\u0426\u0418\u041f 5: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 rolling aggregations \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u044f\u0434\u043e\u0432 time_series_df = pl.DataFrame({     'timestamp': pl.date_range(         datetime(2024, 1, 1),         datetime(2024, 12, 31),         interval='1h',         eager=True     ),     'value': np.random.randn(8760),  # \u0427\u0430\u0441\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u0433\u043e\u0434     'category': np.random.choice(['A', 'B'], 8760) })  # \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 rolling_result = time_series_df.with_columns([     # \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043e\u043a\u043d\u043e     pl.col('value').rolling_mean(window_size=24).alias('daily_avg'),          # \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438     pl.col('value').rolling_mean_by(         'timestamp',         window_size='7d',  # 7 \u0434\u043d\u0435\u0439         closed='left'     ).alias('weekly_avg') ])  # \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 grouped_rolling = time_series_df.with_columns([     pl.col('value')       .rolling_mean(window_size=24)       .over('category')       .alias('daily_avg_by_category') ])<\/code><\/pre>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>Polars \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e &#171;\u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438&#187;, \u0430 \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435. \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0441 \u043d\u0443\u043b\u044f \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u0430, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u044d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0440\u0430\u0437\u044b, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u0438 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 Polars \u043c\u043e\u0436\u043d\u043e \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. <\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Rust, \u043d\u043e \u0441 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e\u043c Python API. <\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. <\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c RAM, \u0447\u0435\u0440\u0435\u0437 streaming engine. <\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0449\u043d\u044b\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u043f\u043b\u0430\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. <\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 SQL \u0434\u043b\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. <\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u043e\u0433\u0430\u044f \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0441\u043d\u0438\u0436\u0430\u044e\u0449\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 Polars \u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u0414\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u0430, \u0433\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430 \u0438\u0434\u0435\u0442 \u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u043c\u0438 \u043e\u0442 \u0441\u043e\u0442\u0435\u043d \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0434\u043e \u0441\u043e\u0442\u0435\u043d \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442, \u0433\u0434\u0435 \u0432\u0430\u0436\u043d\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u2014 Polars \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c. <\/p>\n<p>\u0414\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 ad-hoc \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u0432, \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0442\u0435\u0441\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441 Pandas, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e Polars \u0438 Pandas \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u043c\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: Polars \u0434\u043b\u044f \u0442\u044f\u0436\u0435\u043b\u044b\u0445 ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, Pandas \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u0433\u043a\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432\u043f\u043e\u043b\u043d\u0435 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c.<\/p>\n<p>\u0411\u0443\u0434\u0443\u0449\u0435\u0435 Polars \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435. \u0421 \u0440\u0430\u0441\u0442\u0443\u0449\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 streaming engine \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439. \u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 Polars Cloud \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u2014 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 Polars \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 data-\u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041c\u044b \u0436\u0438\u0432\u0435\u043c \u0432 \u044d\u043f\u043e\u0445\u0443, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u0442\u0443\u0442 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0430 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0441\u0432\u043e\u0438\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0435\u043b\u043e\u0432. Polars \u2014 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u044b \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u044d\u0440\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0435\u0433\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0442\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 Polars, \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u0442\u044c! \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u0435\u043d, \u0430 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0430\u0448\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. <\/p>\n<p>\u0418 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u043e\u0442 \u0430\u0432\u0442\u043e\u0440\u0430: \u0441\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0434\u043e \u043a\u043e\u043d\u0446\u0430!<\/p>\n<p><em>\u0410 \u0435\u0441\u043b\u0438 \u043c\u043e\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043c\u043e\u0439 \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u043e\u043b\u043e\u0434\u043e\u0439, \u043d\u043e \u0431\u0443\u0434\u0443\u0449\u0438\u0439 <\/em><a href=\"https:\/\/t.me\/s\/bigdatabig\" rel=\"noopener noreferrer nofollow\"><em>\u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b &#171;\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e-\u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443&#187;<\/em><\/a><em> \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438 \u043f\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e!), \u043e\u0431\u0437\u043e\u0440\u0430\u043c\u0438 \u043d\u0430 \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0435 \u043a\u043d\u0438\u0433\u0438 \u0438 \u043d\u043e\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 DE\/DS\/ML, \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u043c\u0435\u043c\u0430\u043c\u0438 \u043e\u0431 \u0430\u0439\u0442\u0438\u0448\u043a\u0435 \u0438 \u043e\u043a\u043e\u043b\u043e\u0430\u0439\u0442\u0438\u0448\u043a\u0435.<\/em><\/p>\n<hr\/>\n<h3>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 1: \u0432\u0441\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 Polars \u043f\u0440\u043e\u0442\u0438\u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/h3>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b PDS-H \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/h4>\n<ul>\n<li>\n<p><strong>\u0417\u0430 2025 \u0433\u043e\u0434<\/strong>: <a href=\"https:\/\/pola.rs\/posts\/benchmarks\/\" rel=\"noopener noreferrer nofollow\">https:\/\/pola.rs\/posts\/benchmarks\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430 2024 \u0433\u043e\u0434<\/strong>: <a href=\"https:\/\/pola.rs\/posts\/benchmarks-2024\/\" rel=\"noopener noreferrer nofollow\">https:\/\/pola.rs\/posts\/benchmarks-2024\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430 2023 \u0433\u043e\u0434<\/strong>: <a href=\"https:\/\/pola.rs\/posts\/benchmarks-2023\/\" rel=\"noopener noreferrer nofollow\">https:\/\/pola.rs\/posts\/benchmarks-2023\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/strong>: <a href=\"https:\/\/github.com\/pola-rs\/polars-benchmark\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/pola-rs\/polars-benchmark<\/a><\/p>\n<\/li>\n<\/ul>\n<h4>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Polars \u0438 Pandas<\/h4>\n<ul>\n<li>\n<p><strong>Statology Comprehensive Benchmarks<\/strong>: <a href=\"https:\/\/www.statology.org\/pandas-vs-polars-performance-benchmarks-for-common-data-operations\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.statology.org\/pandas-vs-polars-performance-benchmarks-for-common-data-operations\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Independent Speed Comparison (Towards Data Science)<\/strong>: <a href=\"https:\/\/towardsdatascience.com\/polars-vs-pandas-an-independent-speed-comparison\/\" rel=\"noopener noreferrer nofollow\">https:\/\/towardsdatascience.com\/polars-vs-pandas-an-independent-speed-comparison\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Syntax and Speed Comparison<\/strong>: <a href=\"https:\/\/towardsdatascience.com\/pandas-vs-polars-a-syntax-and-speed-comparison-5aa54e27497e\/\" rel=\"noopener noreferrer nofollow\">https:\/\/towardsdatascience.com\/pandas-vs-polars-a-syntax-and-speed-comparison-5aa54e27497e\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>JetBrains Technical Analysis<\/strong>: <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/07\/polars-vs-pandas\/\" rel=\"noopener noreferrer nofollow\">https:\/\/blog.jetbrains.com\/pycharm\/2024\/07\/polars-vs-pandas\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Analytics Vidhya Comprehensive Guide<\/strong>: <a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2024\/08\/pandas-vs-polars\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.analyticsvidhya.com\/blog\/2024\/08\/pandas-vs-polars\/<\/a><\/p>\n<\/li>\n<\/ul>\n<h4>Polars \u043f\u0440\u043e\u0442\u0438\u0432 DuckDB<\/h4>\n<ul>\n<li>\n<p><strong>Independent GitHub Study<\/strong>: <a href=\"https:\/\/github.com\/prrao87\/duckdb-study\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/prrao87\/duckdb-study<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Medium Performance Analysis<\/strong>: <a href=\"https:\/\/medium.com\/@yukithejapanese\/duckdb-vs-polars-which-one-is-faster-61e73a7680e0\" rel=\"noopener noreferrer nofollow\">https:\/\/medium.com\/@yukithejapanese\/duckdb-vs-polars-which-one-is-faster-61e73a7680e0<\/a><\/p>\n<\/li>\n<li>\n<p><strong>MotherDuck Developer Analysis<\/strong>: <a href=\"https:\/\/motherduck.com\/blog\/duckdb-versus-pandas-versus-polars\/\" rel=\"noopener noreferrer nofollow\">https:\/\/motherduck.com\/blog\/duckdb-versus-pandas-versus-polars\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Data Engineering Perspective<\/strong>: <a href=\"https:\/\/www.confessionsofadataguy.com\/duckdb-vs-polars-for-data-engineering\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.confessionsofadataguy.com\/duckdb-vs-polars-for-data-engineering\/<\/a><\/p>\n<\/li>\n<\/ul>\n<h4>Polars \u043f\u0440\u043e\u0442\u0438\u0432 PySpark<\/h4>\n<ul>\n<li>\n<p><strong>Multi-Tool Analysis<\/strong>: <a href=\"https:\/\/medium.com\/@ignacio.cplatas\/comparing-pandas-polars-and-pyspark-a-benchmark-analysis-7102d565638c\" rel=\"noopener noreferrer nofollow\">https:\/\/medium.com\/@ignacio.cplatas\/comparing-pandas-polars-and-pyspark-a-benchmark-analysis-7102d565638c<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Real-World ETL Comparison<\/strong>: <a href=\"https:\/\/medium.com\/@benpinner1997\/data-processing-pandas-vs-pyspark-vs-polars-fc1cdcb28725\" rel=\"noopener noreferrer nofollow\">https:\/\/medium.com\/@benpinner1997\/data-processing-pandas-vs-pyspark-vs-polars-fc1cdcb28725<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Practical Engineering Guide<\/strong>: <a href=\"https:\/\/www.confessionsofadataguy.com\/polars-vs-spark-real-talk\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.confessionsofadataguy.com\/polars-vs-spark-real-talk\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Enterprise Scale Analysis<\/strong>: <a href=\"https:\/\/milescole.dev\/data-engineering\/2024\/12\/12\/Should-You-Ditch-Spark-DuckDB-Polars.html\" rel=\"noopener noreferrer nofollow\">https:\/\/milescole.dev\/data-engineering\/2024\/12\/12\/Should-You-Ditch-Spark-DuckDB-Polars.html<\/a><\/p>\n<\/li>\n<\/ul>\n<h4>\u0415\u0449\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/h4>\n<ul>\n<li>\n<p><strong>H2O.ai Database Benchmark<\/strong>: <a href=\"https:\/\/h2oai.github.io\/db-benchmark\/\" rel=\"noopener noreferrer nofollow\">https:\/\/h2oai.github.io\/db-benchmark\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>H2O.ai Benchmark Repository<\/strong>: <a href=\"https:\/\/github.com\/h2oai\/db-benchmark\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/h2oai\/db-benchmark<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Ibis Project TPC-H Benchmarks<\/strong>: <a href=\"https:\/\/ibis-project.org\/posts\/ibis-bench\/\" rel=\"noopener noreferrer nofollow\">https:\/\/ibis-project.org\/posts\/ibis-bench\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>FireDucks Performance Evaluation<\/strong>: <a href=\"https:\/\/fireducks-dev.github.io\/docs\/benchmarks\/\" rel=\"noopener noreferrer nofollow\">https:\/\/fireducks-dev.github.io\/docs\/benchmarks\/<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 2: \u043a\u043d\u0438\u0433\u0438 \u0438 \u043a\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f<\/h3>\n<h4>\u041a\u043d\u0438\u0433\u0438<\/h4>\n<ul>\n<li>\n<p><strong>Python Polars: The Definitive Guide (O&#8217;Reilly)<\/strong> <\/p>\n<ul>\n<li>\n<p>\u0418\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e O&#8217;Reilly: <a href=\"https:\/\/www.oreilly.com\/library\/view\/python-polars-the\/9781098156077\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.oreilly.com\/library\/view\/python-polars-the\/9781098156077\/<\/a><\/p>\n<\/li>\n<li>\n<p>GitHub: <a href=\"https:\/\/github.com\/jeroenjanssens\/python-polars-the-definitive-guide\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/jeroenjanssens\/python-polars-the-definitive-guide<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Modern Polars (\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u043a\u043d\u0438\u0433\u0430)<\/strong> <\/p>\n<ul>\n<li>\n<p>\u0421\u0430\u0439\u0442: <a href=\"https:\/\/kevinheavey.github.io\/modern-polars\/\" rel=\"noopener noreferrer nofollow\">https:\/\/kevinheavey.github.io\/modern-polars\/<\/a><\/p>\n<\/li>\n<li>\n<p>GitHub: <a href=\"https:\/\/github.com\/kevinheavey\/modern-polars\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/kevinheavey\/modern-polars<\/a> <a href=\"https:\/\/github.com\/kevinheavey\/modern-polars\" rel=\"noopener noreferrer nofollow\">GitHub<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>Polars Cookbook (Packt)<\/strong> <\/p>\n<ul>\n<li>\n<p>\u0418\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e Packt: <a href=\"https:\/\/www.packtpub.com\/en-us\/product\/polars-cookbook-9781805121152\" rel=\"noopener noreferrer nofollow\">https:\/\/www.packtpub.com\/en-us\/product\/polars-cookbook-9781805121152<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Effective Polars<\/strong> <\/p>\n<ul>\n<li>\n<p>Amazon: <a href=\"https:\/\/www.amazon.com\/Effective-Polars-Optimized-Manipulation-Treading\/dp\/B0CYPZ8Q5H\" rel=\"noopener noreferrer nofollow\">https:\/\/www.amazon.com\/Effective-Polars-Optimized-Manipulation-Treading\/dp\/B0CYPZ8Q5H<\/a><\/p>\n<\/li>\n<li>\n<p>GitHub: <a href=\"https:\/\/github.com\/mattharrison\/effective_polars_book\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/mattharrison\/effective_polars_book<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>\u041a\u0443\u0440\u0441\u044b \u0438 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u044b<\/h4>\n<ul>\n<li>\n<p><strong>DataCamp Introduction to Polars<\/strong>: <a href=\"https:\/\/www.datacamp.com\/courses\/introduction-to-polars\" rel=\"noopener noreferrer nofollow\">https:\/\/www.datacamp.com\/courses\/introduction-to-polars<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Polars Academy<\/strong>: <a href=\"https:\/\/pola.rs\/academy\/\" rel=\"noopener noreferrer nofollow\">https:\/\/pola.rs\/academy\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Real Python Tutorial<\/strong>: <a href=\"https:\/\/realpython.com\/polars-python\/\" rel=\"noopener noreferrer nofollow\">https:\/\/realpython.com\/polars-python\/<\/a><\/p>\n<\/li>\n<li>\n<p><strong>DataCamp Blog Introduction<\/strong>: <a href=\"https:\/\/www.datacamp.com\/blog\/an-introduction-to-polars-python-s-tool-for-large-scale-data-analysis\" rel=\"noopener noreferrer nofollow\">https:\/\/www.datacamp.com\/blog\/an-introduction-to-polars-python-s-tool-for-large-scale-data-analysis<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Polars Code Academy (YouTube)<\/strong>: <a href=\"https:\/\/www.youtube.com\/@PolarsCodeAcademy\" rel=\"noopener noreferrer nofollow\">https:\/\/www.youtube.com\/@PolarsCodeAcademy<\/a> <\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0449\u0438\u0445:<\/h4>\n<ul>\n<li>\n<p><strong>Polars Cookbook (Community)<\/strong>: <a href=\"https:\/\/github.com\/escobar-west\/polars-cookbook\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/escobar-west\/polars-cookbook<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Awesome Polars Resource List<\/strong>: <a href=\"https:\/\/github.com\/ddotta\/awesome-polars\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/ddotta\/awesome-polars<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Polars Learning Path<\/strong>: <a href=\"https:\/\/github.com\/qcversity\/Polars-Learning-Path\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/qcversity\/Polars-Learning-Path<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Python-Polars Tips and Tricks<\/strong>: <a href=\"https:\/\/github.com\/StuffbyYuki\/Python-Polars-Tips-and-Tricks\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/StuffbyYuki\/Python-Polars-Tips-and-Tricks<\/a><\/p>\n<\/li>\n<li>\n<p><strong>Polars Rust Examples<\/strong>: <a href=\"https:\/\/github.com\/gbih\/polars-rust-examples\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/gbih\/polars-rust-examples<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/946788\/\"> https:\/\/habr.com\/ru\/articles\/946788\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0410\u043d\u0434\u0440\u0435\u0435\u0432, \u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Polars &#8212; \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u0435 Pandas, \u043b\u044e\u0431\u0438\u043c\u043e\u0439 \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0434\u0430\u0442\u0430-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u0438 \u0434\u0430\u0442\u0430-\u0441\u0430\u0435\u043d\u0442\u0438\u0441\u0442\u043e\u0432 \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.<\/em><\/p>\n<p>\u0412 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0443\u0441\u044c \u043e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Polars \u0434\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 \u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. <\/p>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: \u043e\u0442\u043a\u0443\u0434\u0430 \u0438 \u0437\u0430\u0447\u0435\u043c<\/h3>\n<p>\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Python \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0433\u0438\u0435 \u0433\u043e\u0434\u044b \u0431\u0435\u0437\u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e \u0433\u043e\u0441\u043f\u043e\u0434\u0441\u0442\u0432\u043e\u0432\u0430\u043b Pandas. \u042d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f ETL-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u0441 \u0440\u043e\u0441\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f Pandas \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0432\u044b\u0448\u0435\u043b Polars \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u0438 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 API.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0440\u0438\u044f Polars \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0432 2020 \u0433\u043e\u0434\u0443, \u043a\u043e\u0433\u0434\u0430 \u0420\u0438\u0447\u0438 \u0412\u0438\u043d\u043a (Ritchie Vink) \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0436\u0435\u043b\u0435\u0437\u0430 \u0438 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u043b\u0435\u0433\u0430\u0441\u0438-\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u0417\u0430 \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u0435\u0435 34000 \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 GitHub, \u0438 \u043d\u044b\u043d\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442. <\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Polars \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0442\u0430\u043a\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439<\/h3>\n<p>Polars \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 dataframe-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 OLAP Query Engine, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Rust \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 Apache Arrow \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. <\/p>\n<p>Rust \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438\u0433\u0440\u0430\u0435\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 Polars. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Pandas, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u043e\u0432\u0435\u0440\u0445 NumPy \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b Python \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, Polars \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. Rust \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0431\u0435\u0437 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 Polars \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u043e\u0439 \u0441 C \u0438 C++, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 Apache Arrow \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\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. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u044d\u0448 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c SIMD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, Arrow \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c zero-copy \u043e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, Arrow \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0441\u043f\u0435\u043a\u0442\u0440 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Polars \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. <\/p>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0432 Polars \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a Pandas \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432\u0440\u043e\u0434\u0435 Dask \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f, Polars \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0420\u0438\u0447\u0438 \u0412\u0438\u043d\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c Polars \u043a\u0430\u043a &#171;embarrassingly parallel&#187; \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. <\/p>\n<h3>\u041b\u0435\u043d\u0438\u0432\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f &#8212; \u043e\u0441\u043d\u043e\u0432\u0430 \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/h3>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043c\u043e\u0449\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Polars \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: eager (\u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e) \u0438 lazy (\u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e). \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a eager API \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u043e Pandas, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435, lazy API \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c.<\/p>\n<pre><code class=\"python\"># \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:  # Eager \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (\u043a\u0430\u043a \u0432 Pandas) df = pl.read_csv(\"large_file.csv\") filtered = df.filter(pl.col(\"amount\") &gt; 100) result = filtered.group_by(\"category\").agg(pl.col(\"amount\").sum())  # Lazy \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 result = (     pl.scan_csv(\"large_file.csv\")  # \u041d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0441\u0440\u0430\u0437\u0443     .filter(pl.col(\"amount\") &gt; 100)     .group_by(\"category\")     .agg(pl.col(\"amount\").sum())     .collect()  # \u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 )<\/code><\/pre>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 lazy \u0440\u0435\u0436\u0438\u043c\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u0441\u044c \u043f\u043b\u0430\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0443, \u0430 \u0437\u0430\u0442\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043d\u0438\u043c. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u0434\u043d\u0443 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0445\u043d\u0438\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 lazy \u0440\u0435\u0436\u0438\u043c\u0435:<\/p>\n<p><strong>Predicate Pushdown<\/strong> \u2014 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u0440\u043e\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043b\u0438\u0436\u0435 \u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0432\u044b \u0447\u0438\u0442\u0430\u0435\u0442\u0435 Parquet \u0444\u0430\u0439\u043b \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u0444\u0438\u043b\u044c\u0442\u0440, Polars \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 row groups, \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c.<\/p>\n<p><strong>Projection Pushdown<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, Polars \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p><strong>Common Subexpression Elimination<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<p><strong>Query Reordering<\/strong> \u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0443\u043f\u043f.<\/p>\n<p>\u0414\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>explain()<\/code>.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e streaming engine, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Polars \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \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. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 in-memory engine, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, streaming engine \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0440\u0446\u0438\u043e\u043d\u043d\u043e (\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c\u0438 &#171;\u0447\u0430\u043d\u043a\u0430\u043c\u0438&#187;), \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 \u0441\u043e\u0442\u043d\u0438 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. <\/p>\n<pre><code class=\"python\"># \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 streaming engine pl.Config.set_streaming_chunk_size(10_000)  # \u0420\u0430\u0437\u043c\u0435\u0440 \u0447\u0430\u043d\u043a\u0430  # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 result = (     pl.scan_csv(\"100gb_file.csv\")     .filter(pl.col(\"status\") == \"active\")     .group_by(\"region\")     .agg(pl.col(\"revenue\").sum())     .collect(streaming=True)  # \u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f streaming \u0440\u0435\u0436\u0438\u043c\u0430 )<\/code><\/pre>\n<h3>\u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b: \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f<\/h3>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u043c\u043d\u043e\u0433\u043e \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 &#171;Polars \u043f\u0440\u043e\u0442\u0438\u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432&#187;, \u0430 \u0437\u0434\u0435\u0441\u044c \u0434\u0430\u043c \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0432\u044b\u0436\u0438\u043c\u043a\u0443 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0438\u0437\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u044e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432. <\/em><\/p>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 PDS-H \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0445 (\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445 \u043e\u0442 TPC-H), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u044e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, Polars \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 SF-10 (\u043e\u043a\u043e\u043b\u043e 10 \u0413\u0411 \u0434\u0430\u043d\u043d\u044b\u0445) Polars streaming engine \u0438 DuckDB \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043e\u043f\u0435\u0440\u0435\u0436\u0430\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e SF-100 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e streaming engine \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e CPU-\u043a\u044d\u0448\u0430 \u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 memory-bound \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 Polars \u043e\u043f\u0435\u0440\u0435\u0436\u0430\u0435\u0442 Pandas \u0432 5-10 \u0440\u0430\u0437 \u043d\u0430 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0438 \u0434\u043e 30 \u0440\u0430\u0437 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435 Covertype \u0438\u0437 scikit-learn \u0441 581,012 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 \u0432 Polars \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0432 22 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0432 Pandas. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432 2.6 \u0440\u0430\u0437\u0430, \u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 11.7 \u0440\u0430\u0437.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430:<\/p>\n<p><strong>\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b (&lt; 10,000 \u0441\u0442\u0440\u043e\u043a):<\/strong> Pandas \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0435\u043d\u044c\u0448\u0435\u043c\u0443 overhead \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p><strong>\u0421\u0440\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b (10,000 &#8212; 1,000,000 \u0441\u0442\u0440\u043e\u043a):<\/strong> Polars \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 2-5 \u0440\u0430\u0437 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u0438 join&#8217;\u0430\u0445.<\/p>\n<p><strong>\u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b (&gt; 1,000,000 \u0441\u0442\u0440\u043e\u043a):<\/strong> \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e Polars \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c \u2014 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432 10-30 \u0440\u0430\u0437 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u043e\u0439. \u041d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Pandas \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0438\u0437-\u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a Polars \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.<\/p>\n<p><strong>\u041e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b (&gt; RAM):<\/strong> \u0417\u0434\u0435\u0441\u044c Polars \u0441 streaming engine \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u0434\u043b\u044f Pandas \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 Dask.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 (\u043c\u0435\u043d\u0435\u0435 10,000 \u0441\u0442\u0440\u043e\u043a) Pandas \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0435\u043d\u044c\u0448\u0435\u043c\u0443 overhead \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e Polars \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c.<\/p>\n<h3>Polars vs Pandas: \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043c\u0435\u0436\u0434\u0443 Pandas \u0438 Polars \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b. Pandas \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 NumPy \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. Python \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u043b\u043e\u0445\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. Polars, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e Rust \u0438 Arrow, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0445\u0440\u0430\u043d\u044f \u0438\u0445 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\"># Eager \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (\u043a\u0430\u043a \u0432 Pandas) df = pl.read_csv(\"large_file.csv\") filtered = df.filter(pl.col(\"amount\") &gt; 100) result = filtered.group_by(\"category\").agg(pl.col(\"amount\").sum())  # Lazy \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 result = (     pl.scan_csv(\"large_file.csv\")  # \u041d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0441\u0440\u0430\u0437\u0443     .filter(pl.col(\"amount\") &gt; 100)     .group_by(\"category\")     .agg(pl.col(\"amount\").sum())     .collect()  # \u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 )<\/code><\/pre>\n<p>API \u0438 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432 Polars \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u043f\u044b\u0442\u0430 Pandas, \u043d\u043e \u0441 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u043d\u043e\u0433\u0438\u0445 \u0435\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u0412 Pandas \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 apply \u0441 lambda-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. Polars \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u0433\u0430\u0442\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 SIMD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"python\">#<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-474957","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/474957","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=474957"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/474957\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=474957"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=474957"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=474957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}