Polars
(pola.rs)- यह एक ओपन सोर्स DataFrame लाइब्रेरी है, जिसे ऐसे वातावरण के लिए बनाया गया है जहाँ single machine पर तेज़ data processing की ज़रूरत होती है, और इसने 57.5 करोड़+ downloads तथा 38,000+ GitHub stars दर्ज किए हैं
- इसकी performance का मुख्य आधार Rust-आधारित multithreaded query engine है, साथ ही column-oriented processing, vectorization, SIMD और parallel execution भी शामिल हैं
- यह MIT लाइसेंस के तहत लगातार उपलब्ध रहने वाली open source लाइब्रेरी है, और उसी API के साथ production workloads तक scale करने के लिए Polars Cloud भी उपलब्ध है
- यह pandas की तुलना में 30x से अधिक performance improvement का दावा करता है, और derived TPC-H benchmark को c3-highmem-22 पर scale factor 10 तथा I/O शामिल शर्तों के साथ चलाया गया था
- यह CSV, JSON, Parquet, Delta Lake, AVRO, Excel, Arrow, प्रमुख databases, S3 और Azure storage को support करता है, इसलिए मौजूदा data stack में जोड़ना आसान है
Polars कैसे उपलब्ध कराया जाता है
- Polars data manipulation के लिए एक open source लाइब्रेरी है, और single machine पर सबसे तेज़ data processing solutions में से एक के रूप में स्थापित है
- यह structured और typed API प्रदान करता है, और expressiveness तथा ease of use दोनों को साथ लेकर चलने का लक्ष्य रखता है
- वर्तमान public metrics इस प्रकार हैं
- 575M+ downloads
- 38k+ GitHub stars
- शुरुआत के दस्तावेज़ Get started में देखे जा सकते हैं
-
ओपन सोर्स Polars
- Polars MIT लाइसेंस के तहत मुफ़्त में उपयोग की जा सकने वाली open source लाइब्रेरी है
- इसे high-performance DataFrame लाइब्रेरी के रूप में उपलब्ध कराया जाता है और इसकी installation भी सरल है
- installation के उदाहरण इस प्रकार हैं
- Python:
pip install polars - Rust:
polars = { version = "x", features = ["lazy", ...]} - Node.js:
const pl = require('nodejs-polars');
- Python:
-
Polars Cloud
- Polars Cloud एक managed solution है, जो notebook environment में Polars queries को cloud या on-premise production workloads तक scale करता है
- उसी API का उपयोग करके बिना code changes के scale किया जा सकता है
- deployment modes में Cloud और On-Prem दोनों supported हैं
- billing केवल query execution पर होती है
- इसे Polars Cloud पर आज़माया जा सकता है
Performance मॉडल और data integration
- Polars की performance की नींव इसका Rust-आधारित multithreaded query engine और parallel processing design है
- vectorization और column-oriented processing आधुनिक processors पर cache-coherent algorithms और उच्च performance को संभव बनाते हैं
- derived independent TPC-H benchmark में इसकी कई solutions से तुलना की गई, जिसका उद्देश्य वास्तविक data cleaning tasks को पुनर्निर्मित करना है
- pandas की तुलना में 30x से अधिक performance improvement संभव है
- benchmark को c3-highmem-22 पर scale factor 10 और I/O शामिल शर्तों के साथ चलाया गया था
- queries open source के रूप में सार्वजनिक हैं
- अधिक जानकारी Learn more में देखी जा सकती है
-
Usability और execution optimization
- उपयोगकर्ता queries को अपनी इच्छित शैली में लिखते हैं, और Polars का query optimizer कुशल execution method तय करता है
- यह उपलब्ध CPU cores में काम बाँटकर बिना अतिरिक्त settings या serialization overhead के parallel execution करता है
- यह Apache Arrow memory model का उपयोग करता है, जिससे मौजूदा data tools के साथ integration संभव होता है
- zero-copy data sharing से tools के बीच collaboration cost कम की जा सकती है
- इसे external dependencies के बिना machine के काफ़ी करीब डिज़ाइन किया गया है, ताकि API, memory और execution पर नियंत्रण रखा जा सके
- memory से बड़े datasets को streaming API के ज़रिए process किया जा सकता है, इसलिए पूरे data को memory में लोड करना ज़रूरी नहीं है
-
समर्थित data formats
- Polars सामान्य data formats के read और write को support करता है, इसलिए इसे मौजूदा data stack के साथ integrate किया जा सकता है
- support का दायरा इस प्रकार है
- Text: CSV, JSON
- Binary: Parquet, Delta Lake, AVRO, Excel
- IPC: Feather, Arrow
- Databases: MySQL, Postgres, SQL Server, Sqlite, Redshift, Oracle
- Cloud storage: S3, Azure Blob, Azure File
1 टिप्पणियां
Hacker News की राय
यह साफ़ दिखता है कि यह पेज उन लोगों के लिए लिखा गया है जो पहले से जानते हैं कि वे क्या देख रहे हैं। पहले ही वाक्य से टूल क्या है यह समझाने के बजाय “Polars is written from the ground up with performance in mind” जैसी गुणवत्ता की बात शुरू हो जाती है, और बाकी भी उसी तरह चलता है
क्या कोई इसे 5 साल के बच्चे को समझाने की तरह बता सकता है कि यह क्या है और किस ज़रूरत के लिए अच्छा समाधान है?
संपादन: आखिरकार मैंने इसे Pandas DataFrame के एक वैकल्पिक implementation के रूप में समझा। Google पर मिली https://realpython.com/pandas-dataframe/ व्याख्या के अनुसार, DataFrame 2-आयामी डेटा और labels रखने की एक संरचना है, और data science, machine learning, scientific computing जैसे data-intensive क्षेत्रों में व्यापक रूप से इस्तेमाल होता है, SQL table या Excel/Calc spreadsheet जैसा
मैं Polars का लक्ष्य पाठक हूँ और कई महीनों से इसे आज़माने का सोच रहा हूँ, लेकिन टालता जा रहा हूँ। Pandas के निर्माता Wes McKinney ने आम analysis tools को समझाने वाली उपयोगी किताब https://wesmckinney.com/book/ लिखी है, इसलिए Pandas के प्रति मेरी कुछ वफ़ादारी बनी हुई है
फिर pandas, modin, vaex जैसी चीज़ों से तुलना वाले ग्राफ़ आते हैं, और मैं उन्हें भी बिल्कुल नहीं जानता, तो लगता है कि यह मेरे लिए नहीं है। मुझे नई तकनीकें और प्रोजेक्ट्स पढ़ना और सीखना पसंद है, लेकिन यहाँ मेरे लिए पकड़ने लायक कुछ नहीं है
जब मैं अपने मामूली web development की बातें करता हूँ, तब आम लोगों को शायद ऐसा ही महसूस होता होगा
Polars की दिलचस्प बात यह है कि यह Pandas जैसा है, लेकिन ज़्यादा efficient Rust backend Arrow का उपयोग करता है, और इसमें query planner जैसी चीज़ें हैं जो operations के संयोजन को अधिक कुशल बनाती हैं। आम तौर पर Polars, Pandas की तुलना में काफ़ी अधिक efficient होता है, इसलिए जिन कामों के लिए पहले जटिल infrastructure चाहिए होता था, वे अब अक्सर एक ही मशीन पर हो जाते हैं
यह Pandas के मुख्य डेवलपर द्वारा बनाई गई बहुत दोस्ताना प्रतिस्पर्धा है, और देखने में लगता है कि सबको यह पसंद है; समय के साथ इसके Pandas की जगह लेने की संभावना काफ़ी बड़ी दिखती है
संबंधित लेख:
Detailed Comparison Between Polars, DuckDB, Pandas, Modin, Ponder, Fugue, Daft - https://news.ycombinator.com/item?id=37087279 - अगस्त 2023
Polars: Company Formation Announcement - https://news.ycombinator.com/item?id=36984611 - अगस्त 2023
Replacing Pandas with Polars - https://news.ycombinator.com/item?id=34452526 - जनवरी 2023
Fast DataFrames for Ruby - https://news.ycombinator.com/item?id=34423221 - जनवरी 2023
Modern Polars: A comparison of the Polars and Pandas dataframe libraries - https://news.ycombinator.com/item?id=34275818 - जनवरी 2023
Rust polars 0.26 is released - https://news.ycombinator.com/item?id=34092566 - दिसंबर 2022
Polars: Fast DataFrame library for Rust and Python - https://news.ycombinator.com/item?id=29584698 - दिसंबर 2021
Polars: Rust DataFrames Based on Apache Arrow - https://news.ycombinator.com/item?id=23768227 - जुलाई 2020
मैंने Pandas कई साल इस्तेमाल किया, लेकिन हमेशा ऐसा लगा जैसे गेंद को पहाड़ी पर ऊपर की ओर लुढ़का रहा हूँ। join जैसे सरल कामों में भी यही महसूस होता था, और index reset करना न भूलो यह भी याद रखना पड़ता था
Polars लगभग हर मामले में Pandas से बेहतर लगता है। यह तेज़ है, multi-core का उपयोग करता है, कम memory लेता है, और इसका API ज़्यादा intuitive है। यह अभी अपेक्षाकृत नई library है, इसलिए कुछ कमियाँ हैं, लेकिन अगर नया project है तो कम से कम इसे evaluate करना बनता है
Rust ecosystem को आसानी से इस्तेमाल कर पाना भी शानदार है। मैंने खुद plugin इस्तेमाल करके functions को parallelize किया और कुछ geospatial code को 100x तेज़ बना दिया
Pandas पर शुरुआत में R की terminology और usage patterns का काफ़ी असर था, और R में “merge” पहले से “join” के अर्थ में आम था। अगर तुमने 2015 के आसपास Pandas सीखना शुरू किया और R पहले से नहीं जानते थे, तो इसे जल्दी सीखना मुश्किल रहा होगा
Queries को सिर्फ Polars और Pandas ही नहीं, बल्कि DuckDB, ClickHouse, BigQuery, Redshift, Postgres, Trino/Presto, SQLite जैसे किसी भी मनचाहे SQL-compatible execution engine पर चलाया जा सकता है
join की syntax और semantics सबसे मुश्किल हिस्सों में से एक है, इसलिए इस पर हाल में फिर चर्चा हो रही है। यह relational algebra का core है, और PRQL के R पर भी लागू होता है। PRQL के ज़्यादातर basic transforms map, filter, reduce जैसी simple list operations हैं, लेकिन join में monad composition को preserve करने के लिए सावधानी चाहिए। अपने विचार यहाँ छोड़े हैं: https://github.com/PRQL/prql/issues/3782#issuecomment-1811312787
वह issue बंद हो चुका है, लेकिन अगर नया issue खोलो या @snth को tag करके अपनी राय दो तो अच्छा लगेगा। संदर्भ के लिए, मैं PRQL contributor हूँ
जब मैंने evaluate किया, तो सबसे बड़ा फायदा यह लगा कि इसका API Pandas की तुलना में काफ़ी ज़्यादा consistent और समझने में आसान था। शायद यह स्वाभाविक भी है, क्योंकि मैंने Pandas को उसके 20 बड़े versions के दौरान देखते-सीखते इस्तेमाल किया है
लेकिन चूँकि इसका उपयोग अभी बहुत कम है, Copilot Polars code अच्छी तरह नहीं लिख पाया। इसलिए फिलहाल मैं Pandas और Copilot ही इस्तेमाल कर रहा हूँ। नई libraries के साथ इस तरह की बाधा होती है, यह बात मुझे पहली बार महसूस हुई
फिर भी Copilot repository के भीतर बहुत तेज़ी से सीखता है। मैं एक बेहद custom stack इस्तेमाल करता हूँ, जो TS-Plus नाम के TypeScript fork पर बना है, जिसे उसके author भी न इस्तेमाल करते हैं न recommend करते हैं, फिर भी Copilot काफ़ी अच्छा TS-Plus code निकाल लेता है
कुछ examples देखने के बाद, यह कम करके नहीं आँकना चाहिए कि boilerplate वाले चरण में Copilot काफ़ी अच्छा हो सकता है
docs पढ़कर काम चल जाता था, इसलिए यह कोई बड़ी समस्या नहीं थी, लेकिन जो चाहिए वह Copilot तुरंत न दे पाए तो झुंझलाहट होती थी
मैं Pandas API लंबे समय से इस्तेमाल करता रहा हूँ और मुझे वह पसंद नहीं था। सीखने, tools, mindset और skills को लगातार बेहतर करने के मामले में मैं काफ़ी proactive हूँ
with_columnबदलकरwith_columnsहो गया है, और docs की सामग्री भी जोड़कर, मुझे ChatGPT से काफ़ी अच्छे नतीजे मिले हैंजब Deno ने Jupyter support लॉन्च किया था, तब
nodejs-polarssupported core data science libraries में से एक थाhttps://blog.jupyter.org/bringing-modern-javascript-to-the-jupyter-notebook-fc998095081e
मैं व्यक्तिगत रूप से data science का आदमी नहीं हूँ, लेकिन JS/Jupyter ecosystem अभी शुरुआती दौर में है, यह देखते हुए TypeScript में pola.rs-आधारित analysis शुरू करना हैरान करने वाली तेजी से संभव था
JS bindings में निश्चित रूप से सुधार की गुंजाइश है, लेकिन accessibility बढ़ी है तो उम्मीद है कि इस पर लगातार iteration होगी
Polars वाकई रोमांचक है और इसकी speed performance भी प्रभावशाली है, लेकिन vaex, modin, dask को उसी benchmark में compare करना खटकता है
ये सभी libraries out-of-core data processing को target करती हैं, यानी जब data इतना बड़ा हो कि computation कई machines पर फैले। इन्हें single-machine dataframe library से compare करना अजीब है, और overhead ज़्यादा होने के कारण ये स्वाभाविक रूप से धीमी होंगी
ऐसे libraries वाले context में Polars इस्तेमाल करने की नौबत कम ही आती है, इसलिए benchmark में इन्हें समकक्ष की तरह दिखाना थोड़ा हास्यास्पद है। ऊपर से DuckDB, जिसे Polars जैसे context में इस्तेमाल किया जा सकता है और जो कई मामलों में उससे तेज़ भी है, benchmark में है ही नहीं
Polars की software engineering बेहतरीन काम है, और इसे ऐसे भ्रामक benchmarks की ज़रूरत नहीं है
बिना किसी configuration के Pandas के मुकाबले 2x performance improvement मिल सकता है, और कुछ operations में मैंने 5x तक देखा है
मैं Polars को सीधे इस्तेमाल नहीं करता, बल्कि DuckDB workflow में इसे materialization format के रूप में इस्तेमाल करता हूँ
duckdb.query(sql).pl(),duckdb.query(sql).df()की तुलना में बहुत तेज़ है। Polars में यह zero-copy होने की वजह से लगभग तुरंत खत्म हो जाता है, लेकिन Pandas में DataFrame बड़ा हो तो काफी समय लगता है। और syntax थोड़ा अलग होने के अलावा इसे Pandas DataFrame की तरह manipulate भी किया जा सकता हैबड़े dataset संभालने के लिए यह बहुत अच्छा है
लगता है Greenspun के दसवें नियम(https://en.wikipedia.org/wiki/Greenspun's_tenth_rule)) का कोई corollary होना चाहिए। कुछ ऐसा कि पर्याप्त रूप से जटिल data analysis library आखिरकार SQL का आधा हिस्सा ad-hoc, unofficial spec, bug-prone और slow तरीके से implement करने लगती है
मैं कभी-कभी Pandas इस्तेमाल करता हूँ, और शायद इसे भी इस्तेमाल करूँगा, लेकिन हमेशा सोचता हूँ कि काश मैंने जिस data पर काम कर रहा हूँ उसे सीधे Postgres में डालकर शुरू किया होता
मैं database expert भी नहीं हूँ और Python मुझे कहीं ज़्यादा सहज लगता है, फिर भी tabular data को select, sort, filter और join करने में SQL कहीं बेहतर है
duckdb-prqlextension देखने की सलाह दूँगाDuckDB data की copy या duplication के बिना Polars, Pandas, और Arrow format के data को सीधे SQL से संभालने देता है
duckdb-prqlआपको PRQL(prql-lang.org) इस्तेमाल करने देता है, और मेरी नज़र में यह SQL की ताकत और सार्वभौमिकता को Polars या Pandas जैसी usability और developer experience के साथ जोड़ता है। बता दूँ कि मैं PRQL contributor हूँइसकी जगह DuckDB देखना बेहतर होगा। इसका SQL implementation न ad-hoc है, न bug से भरा, न slow, न अधूरा। spec कितना formal है, यह पक्का नहीं कह सकता, लेकिन यह Polars के साथ compatible है
इस तरह के engine से की जाने वाली queries में Postgres, OLAP query engine की तुलना में single-digit multiple से धीमा होगा
Python dataframe और SQL को साथ इस्तेमाल करने का यह बेहतर तरीका है
कुछ महीने पहले मैंने एक बड़ा Pandas codebase Polars में migrate करने की कोशिश की थी। मुझे Python में analysis या data pipelining करना खास पसंद नहीं है, और complex transformations में Pandas, Julia या R(dataframes.jl, dplyr इस्तेमाल करते हुए) की तुलना में 2~5 गुना ज़्यादा समय लेता है
दुर्भाग्य से Polars भी इसका जवाब नहीं निकला। standard operations में bugs बहुत थे, और Pandas के साथ interoperability अस्थिर थी। कई libraries input के रूप में Pandas DataFrame मांगती हैं, इसलिए यह समस्या है। API भी modern dataframe library के हिसाब से काफी verbose है, हालांकि फिर भी Pandas से बेहतर है
उम्मीद है समय के साथ यह सुधरेगा, लेकिन अभी के लिए Pandas के ऊपर DuckDB इस्तेमाल करना सबसे बेहतर लगा। यह Polars जितना तेज़ है, लेकिन ज़्यादा stable है और interoperability भी बेहतर है
उम्मीद है कि किसी दिन Python dataframe ecosystem भी R की तरह उस मुकाम पर पहुँचेगा जहाँ intuitive API वाली analysis-oriented dataframe library(dplyr) और high-performance dataframe library(data.table) को साथ में आसानी से इस्तेमाल किया जा सके
शायद मैं इसे exploratory data analysis या research के लिए इस्तेमाल न करूँ, लेकिन बेहतर performance की वजह से कुछ production scripts में इसका इस्तेमाल शुरू किया है
R का dplyr + data.table संयोजन अब भी मुझे data manipulation का सबसे अच्छा अनुभव देता है। बस काश R में Matplotlib जैसी कोई चीज़ होती। ggplot बहुत high-level है और base graphics बहुत low-level। Scikit-Learn भी Caret की तुलना में कहीं ज़्यादा modular है, इसलिए Caret की कमी महसूस नहीं होती
मेरी नज़र में यह dplyr, Polars, Pandas के developer experience को SQL की ताकत और सार्वभौमिकता के साथ जोड़ता है। Queries को आप Polars, Pandas ही नहीं बल्कि DuckDB, ClickHouse, BigQuery, Redshift, Postgres, Trino/Presto, SQLite जैसे किसी भी SQL-compatible execution engine पर चला सकते हैं
GitHub discussion(https://github.com/PRQL/prql/discussions) या Discord(https://discord.com/invite/XWxbCrWr) पर आपकी राय सुनना चाहूँगा। बता दूँ कि मैं PRQL contributor हूँ
हमारी data science टीम ने Polars का मूल्यांकन किया, लेकिन नतीजे मिले-जुले रहे। अगर कोई ऐसा हिस्सा है जहाँ performance बहुत महत्वपूर्ण है, तो इसे अपनाने पर विचार करेंगे, लेकिन इसके अलावा दर्जनों projects में Pandas को बदलने की लागत की वजह से रुख थोड़ा नकारात्मक था
API में अभी भी कुछ ऐसे breaking changes हैं जिनकी अपेक्षा की जा सकती है, और अगर यह कई projects में फैला हो तो maintenance का बोझ बन सकता है। फिर भी API पहले से ज़्यादा consistent लगती है, और कुल मिलाकर दिशा सही लगती है
खासकर क्योंकि Pandas interoperability की लागत बहुत कम है, और Arrow backend इस्तेमाल करने पर Pandas में zero-copy conversion भी काफ़ी आसानी से संभव है