Альтернативы DataFrame DataFrame на поляры: встречайте Elusion v4.0.0

Альтернативы DataFrame DataFrame на поляры: встречайте Elusion v4.0.0

13 августа 2025 г.

В экосистеме ржавчины наблюдается огромный рост библиотек обработки данных, причем поляры ведут заряд как яростно быструю библиотеку данных.

Тем не менее, появился новый соперник, который использует принципиально иной подход к разработке и анализу данных:УхладкаПолем

В то время как Polars фокусируется на чистой производительности и эффективности памяти с помощью своего столбчатого двигателя на основе стрелков Apache, Elusion позиционирует себя как равную, посвященную производительности и эффективности памяти, а также с помощью Appache Arrow и Freabusion, а также комплексной платформы для технических данных, которая приоритет гибкости, простоте использования и интеграции наряду с высокой производительностью.

Философия архитектуры: разные подходы к одинаковым целям

Поляры: Первый дизайн

Поляры написаны с нуля в ржавчине, разработанной близко к машине и без внешних зависимостей. Он основан на модели памяти Apache Arrow, обеспечивая очень эффективные конструкции столбцов данных и фокусируется на:

Ультрастрабильное выполнение запросов с помощью SIMD Оптимизации, эффективная память.

Элазия: гибкость-первый дизайн

Элазия использует другой подход, определяя приоритет опыта разработчика и интеграции:

  • Основная философия:"Элайда хочет, чтобы ты был тобой!"

В отличие от традиционных библиотек данных, которые обеспечивают конкретные закономерности, Elusion предлагает гибкость в построении запросов без применения определенных закономерностей или цепочек. Вы можете построить свои запросы в любой последовательности, которая имеет смысл для вас, написание функций в любом порядке, а улалование обеспечивает последовательные результаты независимо от порядка вызова функции.

Загрузка файлов в DataFrames:

Регулярная загрузка: ~ 4,95 секунды для сложных запросов на 900 тыс.

CustomDataFrame::new()

Потоковая загрузка: ~ 3,62 секунды для тех же операций

CustomDataFrame::new_with_stream()

Повышение производительности: на 26,9% быстрее при потоковом подходе

  • Подход Polars:
let df = LazyFrame::scan_csv("data.csv", ScanArgsCSV::default())?
    .filter(col("amount").gt(100))
    .select([col("customer"), col("amount")])
    .collect()?;
  • Подход к уравнению - Гибкий заказ:
let df = CustomDataFrame::new("data.csv", "sales").await?
    .filter("amount > 100")           
    .select(["customer", "amount"]) 
    .elusion("result").await?;

// Or reorder as you find fit - same result
let df = CustomDataFrame::new("data.csv", "sales").await?
    .select(["customer", "amount"])   // Select first
    .filter("amount > 100")           // Filter second
    .elusion("result").await?;

Polars Базовая загрузка файлов:

let df = LazyFrame::scan_csv("data.csv", ScanArgsCSV::default())?
    .collect()?;

// Parquet with options
let df = LazyFrame::scan_parquet("data.parquet", ScanArgsParquet::default())?
    .collect()?;

Нагрузка данных по уплавке - всеобъемлющие источники:

use elusion::prelude::*;

Локальные файлы с автоматическим признанием

let df = CustomDataFrame::new("data.csv", "sales").await?;
let df = CustomDataFrame::new("data.xlsx", "sales").await?;  // Excel support
let df = CustomDataFrame::new("data.parquet", "sales").await?;

Потоковая передача для больших файлов (в настоящее время поддерживает только файлы .csv)

let df = CustomDataFrame::new_with_stream("large_data.csv", "sales").await?;

Загрузите все папки

let df = CustomDataFrame::load_folder(
    "/path/to/folder",
    Some(vec!["csv", "xlsx"]), // Filter file types or `None` for all types
    "combined_data"
).await?;

Azure Blob Blob Storage (в настоящее время поддерживает файлы CSV и JSON)

let df = CustomDataFrame::from_azure_with_sas_token(
    "https://account.blob.core.windows.net/container",
    "sas_token",
    Some("folder/file.csv"), //or keep `None` to take everything from folder
    "azure_data"
).await?;

SharePoint

let df = CustomDataFrame::load_from_sharepoint(
    "tenant-id",
    "client-id", 
    "https://company.sharepoint.com/sites/Site",
    "Documents/data.xlsx",
    "sharepoint_data"
).await?;

REST API в DataFrame

let api = ElusionApi::new();

api.from_api_with_headers(
    "https://api.example.com/data",
    headers,
    "/path/to/output.json"
).await?;

let df = CustomDataFrame::new("/path/to/output.json", "api_data").await?;

Соединения базы данных

let postgres_df = CustomDataFrame::from_postgres(&conn, query, "pg_data").await?;

let mysql_df = CustomDataFrame::from_mysql(&conn, query, "mysql_data").await?;

Поляры: структурированный подход

Поляры требуют логического упорядочения

let result = df
    .lazy()
    .filter(col("amount").gt(100))
    .group_by([col("category")])
    .agg([col("amount").sum().alias("total")])
    .sort("total", SortMultipleOptions::default())
    .collect()?;

Элазия: гибкость любого порядка

Все это дает один и тот же результат:

Традиционный заказ:

let result1 = df
    .select(["category", "amount"])
    .filter("amount > 100")
    .agg(["SUM(amount) as total"])
    .group_by(["category"])
    .order_by(["total"], ["DESC"])
    .elusion("result").await?;

Фильтр первым

let result2 = df
    .filter("amount > 100")
    .agg(["SUM(amount) as total"])
    .select(["category", "amount"])
    .group_by(["category"])
    .order_by(["total"], ["DESC"])
    .elusion("result").await?;

Агрегация первой

let result3 = df
    .agg(["SUM(amount) as total"])
    .filter("amount > 100")
    .group_by(["category"])
    .select(["category", "amount"])
    .order_by(["total"], ["DESC"])
    .elusion("result").await?;

Все дают идентичные результаты!

Усовершенствованные функции: где сияет улавка

  • Встроенная визуализация и отчет
let plots = [
    (&line_plot, "Sales Timeline"),
    (&bar_chart, "Category Performance"),
    (&histogram, "Distribution Analysis"),
];

let tables = [
    (&summary_table, "Summary Stats"),
    (&detail_table, "Transaction Details")
];

CustomDataFrame::create_report(
    Some(&plots),
    Some(&tables),
    "Sales Analysis Dashboard",
    "dashboard.html",
    Some(layout_config),
    Some(table_options)
).await?;
  • Автоматизированное расписание расписания трубопроводов
let scheduler = PipelineScheduler::new("5min", || async {
    // Load from Azure
    let df = CustomDataFrame::from_azure_with_sas_token(
        azure_url, sas_token, Some("folder/"), "raw_data"
    ).await?;
    
    // Process data
    let processed = df
        .select(["date", "amount", "category"])
        .agg(["SUM(amount) as total", "COUNT(*) as transactions"])
        .group_by(["date", "category"])
        .order_by(["date"], ["ASC"])
        .elusion("processed").await?;
    
    // Write results
    processed.write_to_parquet(
        "overwrite",
        "output/processed_data.parquet",
        None
    ).await?;
    
    Ok(())
}).await?;

Усовершенствованная обработка JSON может обрабатывать сложные структуры JSON с массивами и объектами

let df = CustomDataFrame::new("complex_data.json", "json_data").await?;

Если в ваших файлах есть поля JSON/столбцы, вы можете их взорвать:

  • Извлеките простые поля JSON:
let simple = df.json([
    "metadata.'$timestamp' AS event_time",
    "metadata.'$user_id' AS user",
    "data.'$amount' AS transaction_amount"
]);
  • Выдержка из массивов JSON:
let complex = df.json_array([
    "events.'$value:id=purchase' AS purchase_amount",
    "events.'$timestamp:id=login' AS login_time",
    "events.'$status:type=payment' AS payment_status"
]);

Когда выбирать, что

  • Выберите Polars, когда: Чистая производительность - это основной приоритет, который вы предпочитаете структурированные, оптимизированные шаблоны запросов. Эффективность памяти имеет решающее значение, вам нужны минимальные зависимости
  • Выберите Elusion, когда: вам нужна гибкость интеграции (облачное хранилище, API, базы данных). Опыт разработчика и гибкость запроса, которые вы хотите, вам нужны встроенная визуализация и отчет

Установка и начало работы

  • Поляр
[dependencies]
polars = { version = "0.50.0", features = ["lazy"] }
  • Элазия [зависимости]
elusion = "4.0.0"
tokio = { version = "1.45.0", features = ["rt-multi-thread"] }
  • Элазия с конкретными особенностями
elusion = { version = "4.0.0", features = ["dashboard", "azure", "postgres"] }

Требование версии ржавчины:

Polars: >= 1.80
Elusion: >= 1.81

Пример реального мира: Анализ данных продаж. Реализация Polars:

use polars::prelude::*;

let df = LazyFrame::scan_csv("sales.csv", ScanArgsCSV::default())?
    .filter(col("amount").gt(100))
    .group_by([col("category")])
    .agg([
        col("amount").sum().alias("total_sales"),
        col("amount").mean().alias("avg_sale"),
        col("customer_id").n_unique().alias("unique_customers")
    ])
    .sort("total_sales", SortMultipleOptions::default().with_order_descending(true))
    .collect()?;

println!("{}", df);

Реализация Elusion: Используйте Elusion :: Prelude ::*;

#[tokio::main]
async fn main() -> ElusionResult<()> {
    // Load data (flexible source)
    let df = CustomDataFrame::new("sales.csv", "sales").await?;
    
    // Build query in any order that makes sense to you
    let analysis = df
        .filter("amount > 100")                
        .agg([                                    
            "SUM(amount) as total_sales",
            "AVG(amount) as avg_sale", 
            "COUNT(DISTINCT customer_id) as unique_customers"
        ])
        .group_by(["category"])                
        .order_by(["total_sales"], ["DESC"])       
        .elusion("sales_analysis").await?;
    
    // If you like to display result
       analysis.display().await?;
    
    // Create visualization
    let bar_chart = analysis.plot_bar(
        "category",
        "total_sales", 
        Some("Sales by Category")
    ).await?;
    
    // Generate report
    CustomDataFrame::create_report(
        Some(&[(&bar_chart, "Sales Performance")]),
        Some(&[(&analysis, "Summary Table")]),
        "Sales Analysis Report",
        "sales_report.html",
        None,
        None
    ).await?;
    
    Ok(())
}

Заключение

Elusion v4.0.0 представляет собой сдвиг парадигмы в библиотеках DataFrame, определяющий приоритет опыта разработчиков, гибкость интеграции и комплексные возможности для разработки данных. Выбор между полярами и уравнением зависит от ваших приоритетов:

Для необработанных вычислительных характеристик и эффективности памяти: поляры для комплексной разработки данных с гибкой разработкой: улавка

Строительство запросов «любого порядка» Elusion, обширные возможности интеграции, встроенная визуализация и автоматическое планирование делают его особенно привлекательным для команд, которые должны работать с различными источниками данных и хотят более интуитивно понятный опыт разработки. Обе библиотеки демонстрируют силу ржавчины в пространстве обработки данных, предлагая разработчикам высокопроизводительные альтернативы традиционным решениям на основе Python. Экосистема Rust DataFrame процветает, и наличие нескольких подходов гарантирует, что различные варианты использования и предпочтения хорошо обслуживаются.

Попробуйте Elusion v4.0.0 сегодня:

cargo add elusion@4.0.0

Для получения дополнительной информации и примеров посетите репозиторий Elusion Github:Управление репозиторияи присоединиться к растущему сообществу инженеров Rust Data, которые обнаруживают гибкость и мощность операций DataFrame любого порядка.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE