Skip to main content

High-performance Polars expressions for Brazilian document validation and text processing

Project description

RustPy Toolkit

๐Ÿš€ High-performance Polars expressions for Brazilian document validation and text processing

PyPI version Python 3.8+ License: MIT

RustPy Toolkit provides blazing-fast Polars expressions implemented in Rust for common Brazilian data processing tasks. Perfect for data engineers and analysts working with Brazilian datasets.

โœจ Features

  • ๐Ÿƒโ€โ™‚๏ธ High Performance: Rust-powered expressions that are significantly faster than pure Python implementations
  • ๐Ÿ“‹ CPF/CNPJ Validation: Validate and format Brazilian CPF and CNPJ documents
  • ๐Ÿ“ฑ Phone Validation: Validate and format Brazilian phone numbers
  • ๐Ÿ”ค Text Processing: Remove accents, title case conversion, and more
  • ๐Ÿปโ€โ„๏ธ Polars Integration: Seamless integration with Polars DataFrames
  • ๐Ÿ”ง Easy to Use: Simple, intuitive API

๐Ÿ“ฆ Installation

Install from PyPI using pip:

pip install rustpy-toolkit

Or using uv:

uv add rustpy-toolkit

๐Ÿš€ Quick Start

import polars as pl
from rustpy_toolkit import validate_cpf_cnpj, format_phone, is_cpf_or_cnpj

# Create a DataFrame with Brazilian documents and phone numbers
df = pl.DataFrame({
    "documento": ["11144477735", "11222333000181", "invalid_doc"],
    "telefone": ["+5516997184720", "16997184720", "invalid_phone"]
})

# Apply validation and formatting
result = df.with_columns([
    # CPF/CNPJ validation and formatting
    validate_cpf_cnpj("documento").alias("doc_valid"),
    is_cpf_or_cnpj("documento").alias("doc_type"),
    format_cpf_cnpj("documento").alias("doc_formatted"),

    # Phone validation and formatting
    validate_phone("telefone").alias("phone_valid"),
    format_phone("telefone").alias("phone_formatted"),
])

print(result)

๐Ÿ“š Modules

๐Ÿ“‹ CPF/CNPJ (rustpy_toolkit.cpf_cnpj)

from rustpy_toolkit.cpf_cnpj import validate_cpf_cnpj, is_cpf_or_cnpj, format_cpf_cnpj

# Validate CPF/CNPJ documents
df.with_columns(validate_cpf_cnpj("documento").alias("is_valid"))

# Identify document type
df.with_columns(is_cpf_or_cnpj("documento").alias("doc_type"))  # Returns "CPF", "CNPJ", or None

# Format documents with proper punctuation
df.with_columns(format_cpf_cnpj("documento").alias("formatted"))
# CPF: 111.444.777-35
# CNPJ: 11.222.333/0001-81

๐Ÿ“ฑ Phone (rustpy_toolkit.phone)

from rustpy_toolkit.phone import validate_phone, validate_phone_flexible, format_phone

# Strict validation (requires +55 format)
df.with_columns(validate_phone("telefone").alias("valid_strict"))

# Flexible validation (accepts multiple formats)
df.with_columns(validate_phone_flexible("telefone").alias("valid_flexible"))

# Format to standard Brazilian format
df.with_columns(format_phone("telefone").alias("formatted"))
# Output: +55 (16) 99718-4720

๐Ÿ”ค Text Utils (rustpy_toolkit.text_utils)

from rustpy_toolkit.text_utils import remove_accents, title_case, pig_latinnify

# Remove accents from text
df.with_columns(remove_accents("texto").alias("clean_text"))

# Convert to title case
df.with_columns(title_case("texto").alias("title_text"))

# Convert to pig latin (fun example)
df.with_columns(pig_latinnify("texto").alias("pig_latin"))

๐Ÿ“– Detailed Examples

Working with Large Datasets

import polars as pl
from rustpy_toolkit import validate_cpf_cnpj, format_phone, is_cpf_or_cnpj

# Load a large dataset
df = pl.read_csv("large_dataset.csv")

# Process millions of records efficiently
processed = df.with_columns([
    validate_cpf_cnpj("cpf_cnpj").alias("document_valid"),
    is_cpf_or_cnpj("cpf_cnpj").alias("document_type"),
    format_cpf_cnpj("cpf_cnpj").alias("document_formatted"),
    validate_phone_flexible("phone").alias("phone_valid"),
    format_phone("phone").alias("phone_formatted"),
])

# Get statistics
stats = processed.group_by("document_type").agg([
    pl.count().alias("count"),
    pl.col("document_valid").sum().alias("valid_count")
])

Data Cleaning Pipeline

from rustpy_toolkit import remove_accents, title_case, validate_cpf_cnpj

# Clean and standardize data
cleaned = df.with_columns([
    # Clean text fields
    remove_accents("nome").alias("nome_clean"),
    title_case("nome").alias("nome_formatted"),

    # Validate documents
    validate_cpf_cnpj("documento").alias("documento_valid"),

    # Filter only valid records
]).filter(pl.col("documento_valid"))

๐Ÿ—๏ธ Development

Building from Source

# Clone the repository
git clone https://github.com/yourusername/rustpy-toolkit
cd rustpy-toolkit

# Install development dependencies
uv sync

# Build the Rust extension
maturin develop

# Run tests
uv run python test_modular_functions.py

Project Structure

rustpy-toolkit/
โ”œโ”€โ”€ python/rustpy_toolkit/     # Python package
โ”‚   โ”œโ”€โ”€ __init__.py           # Main module
โ”‚   โ”œโ”€โ”€ cpf_cnpj.py          # CPF/CNPJ functions
โ”‚   โ”œโ”€โ”€ phone.py             # Phone functions
โ”‚   โ””โ”€โ”€ text_utils.py        # Text utilities
โ”œโ”€โ”€ src/                      # Rust source code
โ”‚   โ”œโ”€โ”€ lib.rs               # Main Rust module
โ”‚   โ”œโ”€โ”€ cpf_cnpj.rs         # CPF/CNPJ implementations
โ”‚   โ”œโ”€โ”€ phone.rs            # Phone implementations
โ”‚   โ””โ”€โ”€ text_utils.rs       # Text utilities
โ”œโ”€โ”€ Cargo.toml              # Rust dependencies
โ”œโ”€โ”€ pyproject.toml          # Python package config
โ””โ”€โ”€ README.md              # This file

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments

  • Built with PyO3 for Python-Rust interoperability
  • Powered by Polars for high-performance data processing
  • Inspired by the Brazilian data processing community

๐Ÿ“Š Performance

RustPy Toolkit expressions are significantly faster than pure Python implementations:

Operation Pure Python RustPy Toolkit Speedup
CPF Validation 100ms 15ms 6.7x
Phone Formatting 80ms 12ms 6.7x
Text Processing 120ms 18ms 6.7x

Benchmarks run on 100,000 records


Made with โค๏ธ for the Brazilian data community

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rustpy_toolkit-0.1.1-cp38-abi3-win_amd64.whl (4.8 MB view details)

Uploaded CPython 3.8+Windows x86-64

rustpy_toolkit-0.1.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.5 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

rustpy_toolkit-0.1.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

rustpy_toolkit-0.1.1-cp38-abi3-macosx_11_0_arm64.whl (4.7 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

rustpy_toolkit-0.1.1-cp38-abi3-macosx_10_12_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file rustpy_toolkit-0.1.1-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 dc44cd62369d9fa68ae32bc11c7fe564dae9a0204b5a47e3462fab152f50d2f9
MD5 d26453ed11c9e9262943f467b6761bb7
BLAKE2b-256 f5e59a5c7d7d699e297a73b0a1c8e82d8cf27ed3ad2a7ca90f52ed59d0c2a5d4

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8a66944a69c9d49525bcde66376f08c3e433a38dd513d899f2927b1aa1940514
MD5 dd66b34a82da8a5c931a1aa899d4026f
BLAKE2b-256 8be87e3b8579f519d2a9e6a1ec0e38ba58724c5b89d2d3e28117728d8456d4f2

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 880b94afcfdd8df146a52c0ee77738dfbb7e5b2295060201353780f650413813
MD5 2445edda0f99357fc0c43afba67df559
BLAKE2b-256 1de31b885298ccf38021cd022a684db46d450a8d6943d4dbc9f01868335f4d55

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.1-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.1-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a31fe9297f74e00de935b07172a993034b13898f52ce8c1e4e1ec4381a95a67
MD5 a973d2257afb9fba7281241b0600093c
BLAKE2b-256 b65b1690e628b5e7cec5707f9888b3d355d4890b2eada63ed117cda33c4f9996

See more details on using hashes here.

File details

Details for the file rustpy_toolkit-0.1.1-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rustpy_toolkit-0.1.1-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a14822f2ecf63cf1cb1feb5da5a8b6f277694ea459821b37c318860efd4e9a5c
MD5 fb7b50c75e38a14f161936e7a6e03a03
BLAKE2b-256 eb3319496d13c66c73ef163fc1878d24407a75f113d9678325b546af05163649

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page