Skip to main content

Polarscope — x-ray your Polars DataFrames: summary stats, distribution nanoplots, outliers and correlations in one table

🔬 Polarscope - describe() on steroids

One call, one table: a full profile of any Polars DataFrame. No pandas, anywhere, ever.

import polars as pl
import polarscope as ps

df = pl.read_csv('your-data.csv')
ps.xray(df)

polarscope xray() profiling 70,000 rows in 21 ms

70,000 rows × 13 columns profiled in 21 ms — every column's dtype, nulls, quartiles, outliers, skew and distribution in a single call.

PyPI PyPI - Python Version License: MIT PyPI Downloads

Simple data inspection tools for Polars 🐻‍❄️

Polarscope is a basic data analysis library for Polars DataFrames. It provides an xray() function for data inspection and some plotting utilities. Still early in development with more features planned.


✨ Current Features

🔬 Dataframe Summary Statistics (xray)

  • Summary statistics for numeric columns by default; include='all' covers every dtype.
  • Statistics for String/Categorical/Enum columns: top value and frequency, min/median/avg/max length, mode share, top-3 values, and value samples.
  • Boolean columns analyzed as 0/1 (Mean = share of True); temporal columns report earliest/latest timestamps.
  • Distribution nanoplot per column.
  • Optional title for summary table (title=Your Title).
  • Optional correlation (corr_target=column_name) against target for every column with nanoplot visualization.
  • Optional expanded output (expanded=True) with normality/uniformity tests, outlier metrics and modelling usability flags.
  • Optional compact mode (compact=True) that shortens big numbers to K (thousands) and M (millions) and decimal precision (decimals=int)
  • Great Tables output by default or plain Polars DataFrame output (great_tables=False).

With include="all", string and categorical columns get their own statistics alongside the numeric ones:

xray() on a DataFrame with correlation to target column enabled

🧹 Cleaning & Optimization (fix)

  • ps.fix(df) cleans and optimizes in one call: column renaming (case="snake"/"camel"/"pascal"/"kebab"/"upper"/"lower"), whitespace stripping (empty strings → null), dtype shrinking, and empty-column removal — with a compact report of what changed.
  • Opt-in extras: drop_duplicate_rows, missing_threshold, drop_constant_columns, outliers="iqr"/"zscore".
  • Lossless by default: anything that removes or alters data must be switched on explicitly.
  • Building blocks also available standalone: clean_column_names, convert_datatypes, drop_missing.

📈 Plots

  • Correlation/missing/distribution/categorical plots (plotly or altair backends)

📊 Built-in Datasets

  • Three datasets ship with the package: ps.titanic(), ps.diabetes(), and ps.cardio().
  • Also available via from polarscope.datasets import titanic, diabetes, cardio, with loader functions.

✅ Polars-Only Data Handling

  • Data handling is implemented with Polars.
  • No Pandas, anywhere, ever.

🔍 How Polarscope compares

polarscope 1.9.5 skimpy 0.0.21 ydata-profiling 4.18.4 klib 1.4.1
Takes a Polars DataFrame directly ❌ convert to pandas first ❌ convert to pandas first
Requires/converts to pandas ✅ never ❌ hard dependency
Core dependencies 3 12 21 8
Minimum Python 3.9 3.11 3.10 3.10
Primary output Great Tables HTML, or Polars DataFrame terminal (rich) standalone HTML report matplotlib/seaborn figures
String / categorical stats partial
One-call cleaning and dtype optimization ps.fix()

Where the others are the better choice:

  • ydata-profiling produces a far deeper report in one call — variable interactions, correlation matrices, alerts and warnings. If you want an exhaustive standalone HTML artifact and don't mind the 21 dependencies or the pandas conversion, it does more than polarscope does.
  • skimpy also reads Polars natively and prints straight to the terminal, which is the nicer fit for CLI and script workflows. Polarscope targets notebooks with presentation ready outputs.
  • klib has a mature pandas cleaning and plotting suite. Polarscope's plotting API is openly modelled on it.

Where polarscope wins: it is the only one of the four with no pandas anywhere in its dependency tree, and the only one installable on Python 3.9 — which matters if your environment is locked down and you cannot pull in pandas, seaborn and numba just to look at a table.

Verified 2026-08-10 against each project's published PyPI metadata (requires_dist, requires_python) at the versions listed. Dependency counts exclude optional extras. Corrections welcome — please open an issue.


🚀 Quick Start

Installation

pip install polarscope

Optional extras:

pip install "polarscope[altair]"   # optional Altair plotting backend
pip install "polarscope[plotly]"   # Kaleido support for static Plotly images
pip install "polarscope[scipy]"    # statistical tests
pip install "polarscope[all]"      # all optional features
pip install "polarscope[dev]"      # pytest + coverage tools

Plotly is included in the base installation and is the default plotting backend.

Basic Usage

import polars as pl
import polarscope as ps

# Use a built-in dataset or load your own
df = ps.titanic()          # also: ps.diabetes(), ps.cardio()
# df = pl.read_csv("your_data.csv")

# Get basic data summary (all column types)
ps.xray(df, include="all")

# More detailed analysis
ps.xray(df, include="all", expanded=True)

# Custom title and correlation analysis
ps.xray(df, title="My Data Analysis", corr_target="Survived")

# Clean & optimize in one call (snake_case names, trimmed strings,
# shrunk dtypes, empty columns dropped - with a report)
df = ps.fix(df)

# Or opt in to deeper cleaning
df = ps.fix(df, case="camel", drop_duplicate_rows=True, missing_threshold=0.9)

Common xray() Options

ps.xray(
    df,
    include="all",                # include all columns (not only numeric)
    expanded=True,                # additional stats/tests/quality fields
    corr_target="column_name",    # correlation against target column
    outlier_method="iqr",         # or "percentile"/"zscore"
    percentiles=[0.1, 0.5, 0.9],  # custom percentiles
    decimals=2,
    great_tables=False            # return Polars DataFrame
)

🤝 Contributing

Contributions are welcome! Feel free to report bugs or suggest improvements.


📄 License

MIT License - see LICENSE file for details.


🙏 Acknowledgments

Inspired by klib and built with Polars and great_tables.


🔬 A quick and lightweight tool for Polars dataframe stats and visualizations.

Download files

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

Source Distribution

polarscope-1.9.5.tar.gz (540.3 kB view details)

Uploaded Source

Built Distribution

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

polarscope-1.9.5-py3-none-any.whl (520.7 kB view details)

Uploaded Python 3

File details

Details for the file polarscope-1.9.5.tar.gz.

File metadata

  • Download URL: polarscope-1.9.5.tar.gz
  • Upload date:
  • Size: 540.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for polarscope-1.9.5.tar.gz
Algorithm Hash digest
SHA256 795c148210d8f9622d73a798375f98c0d77f7a519d2e45bebecd09cd9ab5f90f
MD5 c85c2062da95f369137ff3fc7c426a5d
BLAKE2b-256 a9baaf3cbef40f7be899b184fcb50d00261b143cf5fa327649d07adf0f7e9dd7

See more details on using hashes here.

Provenance

The following attestation bundles were made for polarscope-1.9.5.tar.gz:

Publisher: publish.yml on pytoned/polarscope

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file polarscope-1.9.5-py3-none-any.whl.

File metadata

  • Download URL: polarscope-1.9.5-py3-none-any.whl
  • Upload date:
  • Size: 520.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for polarscope-1.9.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7b71d3bba38e7c842d28a5821490380c9496ba611d31611a4352bdc702270e19
MD5 d9e451719c314e8e829250a7597af290
BLAKE2b-256 07545945aff9a75065cbca44b8342434eaa226eef9eda06e1c4554d941aeb4f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for polarscope-1.9.5-py3-none-any.whl:

Publisher: publish.yml on pytoned/polarscope

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.9.6

2 files

This release

1.9.5 This release

2 files

1.9.4

2 files

1.9.2

2 files

1.9.1

2 files

1.9.0

2 files

1.7.0

2 files

1.6.1

2 files

1.5.1

2 files

1.5.0

2 files

1.4.7

2 files

1.4.5

2 files

1.4.2

2 files

1.4.1

2 files

1.4.0

2 files

1.3.14

2 files

1.3.4

2 files

1.3.3

2 files

1.3.2

2 files

1.3.1

2 files

1.3.0

2 files

1.2.0

2 files

1.1.4

2 files

1.1.3

2 files

1.1.2

2 files

1.1.1

2 files

1.1.0

2 files

1.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page