Rust ใน Data Science: วิเคราะห์ข้อมูลด้วย Polars และ Arrow

Sharing is caring!

📊 Rust กับโลก Data Science

หลายคนอาจคุ้นชินกับ Python เมื่อพูดถึง Data Science แต่จริง ๆ แล้ว Rust ก็เป็นภาษาหนึ่งที่กำลังได้รับความนิยมเพิ่มขึ้นในงานวิเคราะห์ข้อมูลเชิงประสิทธิภาพ ด้วยการใช้ไลบรารีอย่าง Polars และ Arrow เราสามารถทำ DataFrame processing ได้แบบเร็วมาก และใช้หน่วยความจำน้อย เหมาะกับงานระดับ production และ pipeline automation

🧰 แนะนำไลบรารีหลัก

  • Polars – DataFrame library ที่มี API คล้าย Pandas แต่เขียนด้วย Rust
  • Arrow – เป็น standard columnar memory format ที่ใช้ร่วมกับหลายภาษา
  • Serde / CSV / JSON – สำหรับโหลดไฟล์เข้าระบบ

🚀 เริ่มต้นโปรเจค Data Science ด้วย Rust

สร้างโปรเจคใหม่:

cargo new rust-data-analysis
cd rust-data-analysis
  

📦 แก้ไข Cargo.toml




[dependencies]

polars = { version = “0.37”, features = [“lazy”, “csv-file”] } arrow = “51.0” serde = { version = “1.0”, features = [“derive”] } serde_json = “1.0”

📁 โหลดและแสดงข้อมูลจาก CSV

use polars::prelude::*;

fn main() -> Result<()> {
    let df = CsvReader::from_path("data.csv")?
        .has_header(true)
        .finish()?;

    println!("{}", df);
    Ok(())
}
  

📊 วิเคราะห์ข้อมูลด้วย LazyFrame

LazyFrame จะช่วย optimize query ได้เหมือนกับ Spark หรือ Dask

fn main() -> Result<()> {
    let lf = LazyCsvReader::new("data.csv")
        .has_header(true)
        .finish()?;

    let result = lf
        .filter(col("age").gt(lit(30)))
        .groupby([col("country")])
        .agg([col("income").mean()])
        .sort("income", Default::default())
        .collect()?;

    println!("{:?}", result);
    Ok(())
}
  

📦 ใช้ Arrow สำหรับ data exchange หรือ memory efficiency

use arrow::array::{Int32Array, ArrayRef};
use arrow::record_batch::RecordBatch;
use arrow::datatypes::{Field, Schema, DataType};
use std::sync::Arc;

fn arrow_example() {
    let schema = Arc::new(Schema::new(vec![
        Field::new("id", DataType::Int32, false),
        Field::new("value", DataType::Int32, false),
    ]));

    let batch = RecordBatch::try_new(
        schema,
        vec![
            Arc::new(Int32Array::from(vec![1, 2, 3])) as ArrayRef,
            Arc::new(Int32Array::from(vec![10, 20, 30])) as ArrayRef,
        ],
    ).unwrap();

    println!("{:?}", batch);
}
  

🧠 เหตุผลที่ Rust เหมาะกับ Data Science

  • Memory safety – ไม่มีปัญหา segmentation fault หรือ memory leak
  • Performance – เร็วกว่า Python หลายเท่า
  • Interop – รองรับ WASM, Python binding, และ cross-platform
  • ใช้งานร่วมกับ Polars ได้ในหลายภาษา เช่น Python → Rust ได้ทันที

🧪 Benchmarks: Rust Polars vs Python Pandas

  • โหลดไฟล์ CSV ขนาด 1 ล้านแถว
  • Filter + Groupby + Aggregate
LanguageLibraryTime (s)
PythonPandas3.2
RustPolars (lazy)0.42

📚 แหล่งเรียนรู้เพิ่มเติม

💬 สรุป

หากคุณกำลังมองหาเครื่องมือวิเคราะห์ข้อมูลที่ทั้งเร็วและปลอดภัย Rust คือทางเลือกใหม่ที่ไม่ควรมองข้าม โดยเฉพาะเมื่อใช้ร่วมกับ Polars และ Arrow คุณจะได้ performance ที่เหนือชั้น และโค้ดที่สะอาด ปลอดภัย พร้อมใช้ใน production หรือ system level data processing อย่างแท้จริง


บทความนี้ใช้เวลาอ่านประมาณ 20 นาที โดยทีมงาน poolsawat.com

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *