Polars लाइब्रेरी Rust के लिए: पूरी गाइड
Polars एक हाई-परफॉरमेंस DataFrame लाइब्रेरी है जो Rust में लिखी गई है। यह pandas API से परिचित उपयोगकर्ताओं को एक आसान इंटरफेस देती है, लेकिन स्पीड और मेमोरी उपयोग में pandas से कहीं बेहतर है। जहाँ pandas अक्सर सिंगल-थ्रेडेड एक्जीक्यूशन और RAM की सीमाओं से जूझता है, वहीं Polars शुरू से ही मल्टी-थ्रेडेड मोड में काम करने और लेज़ी कंप्यूटेशन (lazy API) के ज़रिए क्वेरी को ऑप्टिमाइज़ करने के लिए डिज़ाइन किया गया है।
Polars का मुख्य उद्देश्य एक ही नोड पर सैकड़ों मेगाबाइट से लेकर कई टेराबाइट तक के बड़े डेटा को प्रोसेस करना है, बिना Spark जैसे डिस्ट्रीब्यूटेड सिस्टम का सहारा लिए। यह मेमोरी के कुशल उपयोग (ज़ीरो-कॉपी, Apache Arrow बैकएंड), वेक्टराइज़ेशन और ऑटोमैटिक पैरेललाइज़ेशन से संभव होता है। Rust डेवलपर्स के लिए, Polars सिर्फ Python लाइब्रेरी का रैपर नहीं है, बल्कि एक नेटिव लाइब्रेरी है जो Rust की पूरी क्षमता का उपयोग करती है: मेमोरी सेफ्टी, टाइप सिस्टम और परफॉरमेंस।
लाइब्रेरी दो API ऑफर करती है: Eager (तुरंत कंप्यूटेशन) और Lazy (लेज़ी कंप्यूटेशन)। Eager API छोटे डेटासेट और इंटरैक्टिव काम के लिए उपयुक्त है, जहाँ आप तुरंत रिजल्ट देखना चाहते हैं। Lazy API आपको एक क्वेरी प्लान बनाने देता है, जो फिर ऑप्टिमाइज़ होकर एक बार में एक्जीक्यूट होता है - यह जटिल ट्रांसफॉर्मेशन और बड़े डेटा के लिए बहुत ज़रूरी है। Polars CSV, Parquet, JSON, IPC (Arrow) और SQL के ज़रिए डेटाबेस को भी सपोर्ट करता है।
इंस्टॉलेशन
Rust प्रोजेक्ट में Polars जोड़ने के लिए Cargo.toml फ़ाइल में डिपेंडेंसी जोड़ें:
[dependencies]
polars = "0.44.0" # crates.io पर नवीनतम वर्जन चेक करें
अगर आपको एक्स्ट्रा फीचर्स चाहिए (जैसे स्ट्रिंग रेगुलर एक्सप्रेशन, डेट्स के साथ काम, या SQL इंटीग्रेशन), तो फीचर्स का उपयोग करें:
[dependencies]
polars = { version = "0.44.0", features = ["lazy", "strings", "dtype-date", "dtype-datetime", "sql", "parquet", "csv"] }
मुख्य फीचर्स:
lazy— लेज़ी API (गंभीर काम के लिए ज़रूरी)strings— स्ट्रिंग्स के लिए तरीके (contains, replace, extract)dtype-date,dtype-datetime— डेट टाइप्स का सपोर्टsql— SQL इंटरफेसparquet— Parquet पढ़ना/लिखनाcsv— CSV पढ़ना/लिखनाis_in,rank,moment— अतिरिक्त तरीके
डिपेंडेंसी जोड़ने के बाद रन करें:
cargo build
त्वरित शुरुआत
DataFrame बनाने और एक सरल क्वेरी चलाने का न्यूनतम उदाहरण:
use polars::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// वेक्टर से DataFrame बनाएँ
let df = df! [
"name" => &["Alice", "Bob", "Charlie"],
"age" => &[25, 30, 35],
"salary" => &[50000, 60000, 70000]
]?;
println!("Original DataFrame:\n{:?}", df);
// फ़िल्टर: 28 साल से बड़े कौन?
let filtered = df.clone().lazy()
.filter(col("age").gt(lit(28)))
.collect()?;
println!("Filtered (age > 28):\n{:?}", filtered);
// एग्रीगेशन: औसत सैलरी
let avg_salary = df.clone().lazy()
.select([col("salary").mean().alias("avg_salary")])
.collect()?;
println!("Average salary:\n{:?}", avg_salary);
Ok(())
}
यह कोड तीन कॉलम वाली एक टेबल बनाता है, उम्र के हिसाब से रो फ़िल्टर करता है और औसत सैलरी निकालता है। ध्यान दें कि lazy() का उपयोग कैसे किया गया है - साधारण ऑपरेशनों के लिए भी इसकी सिफारिश की जाती है।