{"id":570094,"date":"2024-07-04T14:58:03","date_gmt":"2024-07-04T13:58:03","guid":{"rendered":"https:\/\/blog.jetbrains.com\/pycharm\/2024\/07\/polars-vs-pandas\/"},"modified":"2025-05-23T20:33:11","modified_gmt":"2025-05-23T19:33:11","slug":"polars-vs-pandas","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/pt-br\/pycharm\/2024\/07\/polars-vs-pandas\/","title":{"rendered":"Polars \u00d7 pandas: qual \u00e9 a diferen\u00e7a?"},"content":{"rendered":"<p>Se voc\u00ea tiver acompanhado os avan\u00e7os em dataframes para Python no \u00faltimo ano, n\u00e3o pode ter deixado de ouvir falar do <a href=\"https:\/\/www.pola.rs\/\" target=\"_blank\" rel=\"noopener\">Polars<\/a>, a poderosa biblioteca de dataframes projetada para trabalhar com grandes conjuntos de dados.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-384206\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/Preview-page-1280x720-2x-1.jpg\" alt=\"\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/dataspell\/\" target=\"_blank\" rel=\"noopener\"><br \/>Experimente o Polars no DataSpell<br \/><\/a><\/p>\n<p>Ao contr\u00e1rio de outras bibliotecas para trabalhar com grandes conjuntos de dados, como <a href=\"https:\/\/spark.apache.org\/\" target=\"_blank\" rel=\"noopener\">Spark<\/a>, <a href=\"https:\/\/www.dask.org\/\" target=\"_blank\" rel=\"noopener\">Dask<\/a> e <a href=\"https:\/\/www.ray.io\/\" target=\"_blank\" rel=\"noopener\">Ray<\/a>, o Polars foi projetado para ser usado em uma s\u00f3 m\u00e1quina, o que provoca muitas compara\u00e7\u00f5es com o <a href=\"https:\/\/pandas.pydata.org\/\" target=\"_blank\" rel=\"noopener\">pandas<\/a>. Por\u00e9m, o Polars \u00e9 diferente do pandas de v\u00e1rias maneiras significativas, incluindo a forma como ele trabalha com os dados e quais s\u00e3o suas aplica\u00e7\u00f5es ideais. No artigo a seguir, vamos explorar os detalhes t\u00e9cnicos que diferenciam essas duas bibliotecas para dataframes e vamos dar uma olhada nos pontos fortes e nas limita\u00e7\u00f5es de cada uma.<\/p>\n<p>Se voc\u00ea quiser saber mais sobre isso do pr\u00f3prio criador do Polars, <a href=\"https:\/\/github.com\/ritchie46\" target=\"_blank\" rel=\"noopener\">Ritchie Vink<\/a>, voc\u00ea tamb\u00e9m pode ver abaixo nossa entrevista com ele!<\/p>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\" title=\"O que \u00e9 o Polars?\" src=\"https:\/\/www.youtube.com\/embed\/QfLzEp-yt_U?feature=oembed\" width=\"500\" height=\"281\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<\/figure>\n<h2 class=\"wp-block-heading\">Por que usar o Polars e n\u00e3o o pandas?<\/h2>\n<p>Em uma palavra: desempenho. O Polars foi criado desde o in\u00edcio para ser incrivelmente r\u00e1pido e poder fazer opera\u00e7\u00f5es comuns de 5 a 10 vezes mais rapidamente que o pandas. Al\u00e9m disso, os requisitos de mem\u00f3ria das opera\u00e7\u00f5es com o Polars s\u00e3o significativamente menores que com o pandas: este requer de 5 a 10 vezes mais RAM que o tamanho do conjunto de dados para fazer suas opera\u00e7\u00f5es, comparado com 2 a 4 vezes no Polars.<\/p>\n<p>Voc\u00ea pode ter <a href=\"https:\/\/duckdblabs.github.io\/db-benchmark\/\" target=\"_blank\" rel=\"noopener\">aqui<\/a> uma ideia do desempenho do Polars em compara\u00e7\u00e3o com outras bibliotecas para dataframes. Como voc\u00ea pode ver, o Polars \u00e9 de 10 a 100 vezes mais r\u00e1pido que o pandas para opera\u00e7\u00f5es comuns e, de fato, \u00e9 uma das mais r\u00e1pidas dentre todas as bibliotecas para dataframes. Al\u00e9m disso, ele consegue trabalhar com conjuntos maiores de dados que o pandas, antes de ocorrerem erros de falta de mem\u00f3ria.<\/p>\n<h2 class=\"wp-block-heading\">Por que o Polars \u00e9 t\u00e3o r\u00e1pido?<\/h2>\n<p>Esses resultados s\u00e3o realmente impressionantes. Ent\u00e3o, voc\u00ea deve estar se perguntando: como o Polars consegue tanto desempenho sendo executado em uma s\u00f3 m\u00e1quina? A biblioteca foi projetada desde o in\u00edcio pensando no desempenho e isso \u00e9 conseguido de algumas maneiras diferentes.<\/p>\n<h3 class=\"wp-block-heading\">Escrito em Rust<\/h3>\n<p>Um dos fatos mais conhecidos sobre o Polars \u00e9 que ele \u00e9 escrito em <a href=\"https:\/\/www.rust-lang.org\/\" target=\"_blank\" rel=\"noopener\">Rust<\/a>, uma linguagem de baixo n\u00edvel quase t\u00e3o r\u00e1pida quanto C e C++. J\u00e1 o pandas foi baseado em bibliotecas de Python, uma delas o <a href=\"https:\/\/numpy.org\/\" target=\"_blank\" rel=\"noopener\">NumPy<\/a>. Embora o n\u00facleo do NumPy seja escrito em C, ele ainda \u00e9 limitado por problemas inerentes \u00e0 maneira como o Python lida com certos tipos na mem\u00f3ria, como strings para dados categ\u00f3ricos. Isso leva a um desempenho ruim ao lidar com esses tipos (veja <a href=\"https:\/\/wesmckinney.com\/blog\/apache-arrow-pandas-internals\/\" target=\"_blank\" rel=\"noopener\">esta fant\u00e1stica postagem de blog<\/a> de <a href=\"https:\/\/wesmckinney.com\/\" target=\"_blank\" rel=\"noopener\">Wes McKinney<\/a> para saber mais detalhes).<\/p>\n<p>Uma das outras vantagens de usar Rust \u00e9 que esta linguagem permite concorr\u00eancia segura; ou seja, ela foi projetada para tornar o paralelismo o mais previs\u00edvel poss\u00edvel. Isso significa que o Polars pode usar com seguran\u00e7a todos os n\u00facleos da sua m\u00e1quina, at\u00e9 mesmo para consultas complexas envolvendo in\u00fameras colunas. Isso levou Ritchie Vink a descrever o desempenho do Polars como &#8220;t\u00e3o paralelo que chega a ser constrangedor&#8221;. Isso d\u00e1 ao Polars um desempenho imensamente maior que o do pandas, que usa apenas um n\u00facleo para executar suas opera\u00e7\u00f5es. Confira <a href=\"https:\/\/www.youtube.com\/watch?v=7xcUvzERwx0&amp;ab_channel=PyData\" target=\"_blank\" rel=\"noopener\">esta excelente palestra<\/a> de Nico Kreiling na PyCon DE deste ano, que entra em mais detalhes sobre como o Polars consegue isso.<\/p>\n<h3 class=\"wp-block-heading\">Baseado no Arrow<\/h3>\n<p>Outro fator que contribui para o desempenho impressionante do Polars \u00e9 o <a href=\"https:\/\/arrow.apache.org\/\" target=\"_blank\" rel=\"noopener\">Apache Arrow<\/a>, um formato de mem\u00f3ria independente da linguagem. Na verdade, o Arrow foi criado em parte por Wes McKinney em resposta a muitos dos problemas que ele via no pandas \u00e0 medida que o tamanho dos dados explodia. O Arrow \u00e9 tamb\u00e9m o back-end do pandas 2.0, uma vers\u00e3o do pandas com melhor desempenho, lan\u00e7ada em 2023. Por\u00e9m, h\u00e1 ligeiras diferen\u00e7as entre os back-ends em Arrow das duas bibliotecas: enquanto o pandas 2.0 foi baseado no PyArrow, a equipe do Polars criou sua pr\u00f3pria implementa\u00e7\u00e3o do Arrow.<\/p>\n<p>Uma das principais vantagens de criar uma biblioteca de dados em Arrow \u00e9 a interoperabilidade. O Arrow foi projetado para padronizar entre bibliotecas o formato de dados usado na mem\u00f3ria e esse formato j\u00e1 \u00e9 usado por diversas bibliotecas e bancos de dados importantes, como voc\u00ea pode ver <a href=\"https:\/\/arrow.apache.org\/overview\/\" target=\"_blank\" rel=\"noopener\">abaixo<\/a>.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-375452\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/07\/arrow.png\" alt=\"\" width=\"574\" height=\"318\" \/><\/figure>\n<\/div>\n<p><a href=\"https:\/\/datapythonista.me\/blog\/pandas-20-and-the-arrow-revolution-part-i\" target=\"_blank\" rel=\"noopener\">Essa interoperabilidade<\/a> acelera o desempenho, porque ela evita a necessidade de converter os dados em um formato diferente para transferi-los entre as diferentes etapas do pipeline de dados (em outras palavras, ela evita a necessidade de serializar e desserializar os dados). Ela tamb\u00e9m resulta em um uso mais eficiente da mem\u00f3ria, porque dois processos podem compartilhar os mesmos dados, sem necessidade de fazer uma c\u00f3pia. Como <a href=\"https:\/\/arrow.apache.org\/faq\/\" target=\"_blank\" rel=\"noopener\">se estima que fazer e desfazer a serializa\u00e7\u00e3o representem 80\u201390% dos custos computacionais<\/a> em fluxos de trabalho de dados, o formato comum de dados do Arrow d\u00e1 ao Polars ganhos significativos de desempenho.<\/p>\n<p>O Arrow tamb\u00e9m incorpora o suporte a uma maior variedade de tipos de dados que no pandas. Como este \u00e9 baseado no NumPy, \u00e9 excelente para lidar com colunas de valores inteiros e de ponto flutuante, mas tem dificuldades com outros tipos de dados. <a href=\"https:\/\/datapythonista.me\/blog\/pandas-20-and-the-arrow-revolution-part-i\" target=\"_blank\" rel=\"noopener\">J\u00e1 o Arrow<\/a> tem um suporte sofisticado a dados de data e hora, booleanos, bin\u00e1rios e at\u00e9 tipos complexos de colunas, como as que cont\u00eam listas. Al\u00e9m disso, o Arrow tem a capacidade de lidar nativamente com dados faltando, o que precisa ser contornado no NumPy.<\/p>\n<p>Finalmente, o Arrow armazena os dados por colunas, o que significa que todas as colunas s\u00e3o armazenadas em um bloco cont\u00ednuo de mem\u00f3ria, independentemente do tipo de dados. Isso n\u00e3o apenas facilita o paralelismo, como tamb\u00e9m acelera a recupera\u00e7\u00e3o dos dados.<\/p>\n<h3 class=\"wp-block-heading\">Otimiza\u00e7\u00e3o de consultas<\/h3>\n<p>Um dos outros pontos centrais do desempenho do Polars \u00e9 a forma como ele avalia o c\u00f3digo. Como padr\u00e3o, o pandas usa <em>eager execution<\/em>, executando as opera\u00e7\u00f5es na ordem em que voc\u00ea as escreveu. J\u00e1 o Polars \u00e9 capaz tanto da <em>eager execution<\/em> quanto da &lt;0&gt;lazy execution&lt;\/0&gt;, na qual um otimizador de consultas avalia todas as opera\u00e7\u00f5es a fazer e mapeia a maneira mais eficiente de executar o c\u00f3digo. Dentre outras coisas, isso pode incluir reescrever a ordem de execu\u00e7\u00e3o das opera\u00e7\u00f5es ou eliminar c\u00e1lculos redundantes. Veja, por exemplo, a express\u00e3o a seguir, usada para obter a m\u00e9dia da coluna <code>Number1<\/code> separadamente para as categorias &#8220;A&#8221; e &#8220;B&#8221; em <code>Category<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">(\ndf\n.groupby(by = \"Category\").agg(pl.col(\"Number1\").mean())\n.filter(pl.col(\"Category\").is_in([\"A\", \"B\"]))\n)<\/pre>\n<p>Se esta express\u00e3o for executada na forma &#8220;eager&#8221;, a opera\u00e7\u00e3o <code>groupby<\/code> ser\u00e1 executada desnecessariamente para o DataFrame inteiro e s\u00f3 depois filtrada por <code>Category<\/code>. Na &#8220;lazy execution&#8221;, o DataFrame pode ser filtrado e <code>groupby<\/code> executado apenas nos dados necess\u00e1rios.<\/p>\n<h3 class=\"wp-block-heading\">API expressiva<\/h3>\n<p>Finalmente, o Polars tem uma API extremamente expressiva, querendo dizer que basicamente qualquer opera\u00e7\u00e3o que voc\u00ea quiser executar pode ser expressa como um m\u00e9todo do Polars. J\u00e1 no pandas, \u00e9 comum precisar passar opera\u00e7\u00f5es mais complexas para o m\u00e9todo <code>apply<\/code> como express\u00f5es lambda. O problema do m\u00e9todo <code>apply<\/code> \u00e9 que ele executa loops sobre as linhas do DataFrame, executando a opera\u00e7\u00e3o sequencialmente em cada uma delas. A possibilidade de usar m\u00e9todos integrados permite que voc\u00ea trabalhe no n\u00edvel das colunas e possa tirar proveito de outra forma de paralelismo, chamada SIMD.<\/p>\n<h2 class=\"wp-block-heading\">Em que situa\u00e7\u00f5es voc\u00ea deve continuar usando o pandas?<\/h2>\n<p>Tudo isso soa t\u00e3o incr\u00edvel que provavelmente voc\u00ea deve estar se perguntando por que sequer pensar no pandas. Calma, devagar com o andor! Embora o Polars seja excelente para realizar transforma\u00e7\u00f5es de dados extremamente eficientes, atualmente ele n\u00e3o \u00e9 a escolha ideal para explora\u00e7\u00e3o de dados ou para ser usado como parte de pipelines de aprendizado de m\u00e1quina. Estas s\u00e3o \u00e1reas nas quais o pandas continua a brilhar.<\/p>\n<p>Uma das raz\u00f5es para isso \u00e9 que embora o Polars tenha excelente interoperabilidade com outros pacotes que usam o Arrow, ele <em>ainda<\/em> n\u00e3o \u00e9 compat\u00edvel com a maioria dos pacotes de visualiza\u00e7\u00e3o de dados em Python e bibliotecas de aprendizado de m\u00e1quina, como <a href=\"https:\/\/scikit-learn.org\/stable\/\" target=\"_blank\" rel=\"noopener\">scikit-learn<\/a> e <a href=\"https:\/\/pytorch.org\/\" target=\"_blank\" rel=\"noopener\">PyTorch<\/a>. A \u00fanica exce\u00e7\u00e3o \u00e9 o <a href=\"https:\/\/plotly.com\/\" target=\"_blank\" rel=\"noopener\">Plotly<\/a>, que permite criar gr\u00e1ficos diretamente a partir de DataFrames do Polars.<\/p>\n<p>Est\u00e1 sendo discutida uma solu\u00e7\u00e3o, que seria usar o <a href=\"https:\/\/data-apis.org\/dataframe-protocol\/latest\/index.html\" target=\"_blank\" rel=\"noopener\">protocolo de interc\u00e2mbio de dataframes do Python<\/a> nesses pacotes, para permitir que eles deem suporte a diversas bibliotecas para dataframes. Isso significaria que fluxos de trabalho de ci\u00eancia de dados e aprendizado de m\u00e1quina n\u00e3o teriam mais o gargalo do pandas. Por\u00e9m, essa \u00e9 uma ideia relativamente nova e vai demorar at\u00e9 que esses projetos a implementem.<\/p>\n<h2 class=\"wp-block-heading\">Ferramentas para Polars e pandas<\/h2>\n<p>Depois de tudo isso, tenho certeza de que voc\u00ea est\u00e1 ansioso para experimentar o Polars! Tanto o DataSpell quanto o <a href=\"https:\/\/www.jetbrains.com\/pycharm\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/www.jetbrains.com\/pycharm\/download\/?section=mac\">PyCharm Professional<\/a> 2023.2 oferecem excelentes ferramentas para trabalhar com o pandas e o Polars em notebooks do Jupyter. Em especial, os DataFrames do pandas e do Polars s\u00e3o mostrados com fun\u00e7\u00f5es interativas, tornando muito mais r\u00e1pido e c\u00f4modo explorar os seus dados.<\/p>\n<p>Dentre os meus recursos favoritos, est\u00e3o a capacidade de rolar por todas as linhas e colunas do DataFrame sem truncamentos, agregar valores do DataFrame com apenas um clique e exportar o DataFrame para uma variedade enorme de formatos (inclusive o Markdown!).<\/p>\n<p>Se voc\u00ea ainda n\u00e3o estiver usando o DataSpell, poder\u00e1 experiment\u00e1-lo por 30 dias seguindo o link abaixo.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/dataspell\/\" target=\"_blank\" rel=\"noopener\"><br \/>Experimente!<br \/><\/a><\/p>\n<p style=\"text-align: left;\" align=\"center\"><em>Artigo original em ingl\u00eas por:<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/BK7A9876_korr_sRGB_8_1000x1500px_square_resized-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Jodie Burchell\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Jodie Burchell<\/h4>\n                                        <p>Dr. Jodie Burchell is the Developer Advocate in Data Science at JetBrains, and was previously a Lead Data Scientist at Verve Group Europe. She completed a PhD in clinical psychology and a postdoc in biostatistics, before leaving academia for a data science career. She has worked for 7 years as a data scientist in both Australia and Germany, developing a range of products including recommendation systems, analysis platforms, search engine improvements and audience profiling. She has held a broad range of responsibilities in her career, doing everything from data analytics to maintaining machine learning solutions in production. She is a long time content creator in data science, across conference and user group presentations, books, webinars, and posts on both her own and JetBrain&#8217;s blogs.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":570101,"comment_status":"closed","ping_status":"closed","template":"","categories":[952,4115,5108],"tags":[566,8152],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570094"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=570094"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570094\/revisions"}],"predecessor-version":[{"id":570117,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/570094\/revisions\/570117"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/570101"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=570094"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=570094"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=570094"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=570094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}