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
  • 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]
    

Or install all extras:

pip install articuno[polars,pandas]

🚀 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

📜 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.6.2.tar.gz (9.0 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.6.2-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for articuno-0.6.2.tar.gz
Algorithm Hash digest
SHA256 e0eb138c56b133a927810da201a3cef3107d663300e09101452b3bbe73e7eda6
MD5 79cb2e4216b7dc71174dbf2d0432beb5
BLAKE2b-256 7f193dc3099db946704c8d6401609df8e5a4cf64674987a0d3dd3757b67f7141

See more details on using hashes here.

File details

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

File metadata

  • Download URL: articuno-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 8.6 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.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7b46757cc3b6beab4313c2e38d1049c14410693852e95e7b9acbd9c19000be47
MD5 fc8d21da86de478b3169f3b48445c47d
BLAKE2b-256 c49dd2f624a39349d0953975bcc41eba81e5c274b94f1d1586b510c29f4ca9a2

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