Skip to main content

Convert Polars or Pandas DataFrames to lists of Pydantic models with schema inference

Project description

❄️ Articuno ❄️

Convert Polars or Pandas DataFrames to Pydantic models with schema inference — and generate clean Python class code.


✨ Features

  • Infer Pydantic models dynamically from Polars or Pandas DataFrames
  • Support for nested structs, optional fields, and common data types
  • Generate clean Python model code using datamodel-code-generator
  • Optional support for Patito models
  • Lightweight, dependency-flexible design

📦 Installation

Install the core package:

pip install articuno

Add optional dependencies as needed:

  • Polars support:

    pip install articuno[polars]
    
  • Pandas support:

    pip install articuno[pandas]
    
  • Patito support:

    pip install articuno[patito]
    

Or install all extras:

pip install articuno[polars,pandas,patito]

🚀 Usage

🔍 Infer a Pydantic model from a DataFrame

from articuno import df_to_pydantic
import polars as pl

df = pl.DataFrame({
    "id": [1, 2, 3],
    "name": ["Alice", "Bob", "Charlie"],
    "score": [95.5, 88.0, 92.3]
})

models = df_to_pydantic(df)
print(models[0])

Output:

id=1 name='Alice' score=95.5

You can also infer a model class without creating instances:

from articuno.models import infer_pydantic_model

Model = infer_pydantic_model(df, model_name="MyModel")
print(Model.schema_json(indent=2))

Output (abbreviated):

{
  "title": "MyModel",
  "type": "object",
  "properties": {
    "id": { "title": "Id", "type": "integer" },
    "name": { "title": "Name", "type": "string" },
    "score": { "title": "Score", "type": "number" }
  },
  "required": ["id", "name", "score"]
}

🧾 Generate Python class code from a Pydantic model

from articuno.codegen import generate_class_code

code = generate_class_code(Model)
print(code)

Output (example):

from pydantic import BaseModel

class AutoPolarsModel(BaseModel):
    id: int
    name: str
    score: float

🦜 Optional Support for Patito Models

If you use Patito, Articuno can infer Patito models as well:

from articuno.models import df_to_patito
import polars as pl

df = pl.DataFrame({"a": [1, 2, 3]})
patito_models = df_to_patito(df)
print(patito_models[0])

Output:

a=1

📜 Patito vs Articuno

Feature 🦜 Patito ❄️ Articuno
Polars–Pydantic bridge ✅ Declarative schema ✅ Dynamic inference
Validation constraints ✅ Unique, bounds ⚠️ Basic types, nullables
Nested Structs ❌ Not supported ✅ Fully recursive
Code generation ✅ via datamodel-code-gen
Example/mock data .examples
Direct Pandas/Polars support ❌ Indirect via dicts ✅ Native support with inference

Patito is ideal for static schema validation with custom constraints and ETL pipelines.

Articuno excels at dynamic schema inference, nested model generation, and code export for API use cases.


⚙️ Supported Type Mappings

Polars Type Pandas Type Pydantic Type
pl.Int*, pl.UInt* int64, int32, Int64 (nullable int) int
pl.Float* float64, float32 float
pl.Utf8 object (string) str
pl.Boolean bool, boolean (nullable bool) bool
pl.Date datetime64[ns] (date only) datetime.date
pl.Datetime datetime64[ns] (timestamp) datetime.datetime
pl.Duration timedelta64[ns] datetime.timedelta
pl.List list, object with lists List[...]
pl.Struct dict, object with nested dicts Nested Pydantic model
pl.Null NaN, None (nullable fields) Optional[...]

🛠️ Development

To install development dependencies:

pip install articuno[dev]

Run tests with:

pytest

🔗 Links


📄 License

MIT © Odos Matthews

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

articuno-0.5.0.tar.gz (9.3 kB view details)

Uploaded Source

Built Distribution

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

articuno-0.5.0-py3-none-any.whl (8.9 kB view details)

Uploaded Python 3

File details

Details for the file articuno-0.5.0.tar.gz.

File metadata

  • Download URL: articuno-0.5.0.tar.gz
  • Upload date:
  • Size: 9.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for articuno-0.5.0.tar.gz
Algorithm Hash digest
SHA256 01a56275307a032502aeafaff9c74d6fa63b6efcd9dc835747dbe6fd82a8d94f
MD5 4a9f760f32ad20f38d0aea7ce8cf5f23
BLAKE2b-256 d965b8a751ad412f0a98ed979811b20ea956b01d6c5446cec3a6b4456a81342b

See more details on using hashes here.

File details

Details for the file articuno-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: articuno-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 8.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for articuno-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6de1317d06c41cab27ca6177666f5720b403cbcf3d9ad613c764b7651e494c14
MD5 8ab04e97f8e53a25c07d507b6a715a04
BLAKE2b-256 ddfc3295e554941b05cc73d79cb2dbfcda2096d7d033df8861c347220d6f9c8f

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