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
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.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - 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 Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rustpy_toolkit-0.1.3.tar.gz.
File metadata
- Download URL: rustpy_toolkit-0.1.3.tar.gz
- Upload date:
- Size: 49.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5cef2b11367387a8d5c6f186fe87629b8fd96817046330a273d65d3a0690c0f
|
|
| MD5 |
020ba02fa95c8860079637b083fb4f48
|
|
| BLAKE2b-256 |
bf519c83282a730e8365675779755a82e06c94a670138a5b6ecc467e7374b05c
|
File details
Details for the file rustpy_toolkit-0.1.3-cp38-abi3-win_amd64.whl.
File metadata
- Download URL: rustpy_toolkit-0.1.3-cp38-abi3-win_amd64.whl
- Upload date:
- Size: 5.0 MB
- Tags: CPython 3.8+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3c43827267a87360e275bab4baf80751a55bde6e572e439df9f54b1af3c400b
|
|
| MD5 |
baa95181967f594d7b07747bdbe31d8c
|
|
| BLAKE2b-256 |
bab0b76157580dc7c94c04720e03251809d2e8e063f0ab27c61f277cdf84178a
|
File details
Details for the file rustpy_toolkit-0.1.3-cp38-abi3-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: rustpy_toolkit-0.1.3-cp38-abi3-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 4.9 MB
- Tags: CPython 3.8+, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79d6b7e9b1b7eab8e616d9a28e719019deacb8278cf161c6abd7ac58f048a3d1
|
|
| MD5 |
2b8563ca38b07589c06396cb3e8d467c
|
|
| BLAKE2b-256 |
0c04c5ff397d2b19b432246a2dee2aed30c816fc3d6de939aa7014d5f6180105
|