Agentic data consultant that runs on your own hardware
Project description
insightsmith
Forging insight from raw data.
An agentic data consultant that runs on your own machine.
0.1.0 is the foundation, not the whole thing
This release ships the parts that need no LLM: format detection, loading and profiling, behind
ismith look. It is useful on its own — point it at a file and it tells you what the file really is and what's wrong with the data.The agentic half — proposing analyses, writing and sandbox-executing code, critiquing the statistics, writing a report — arrives across 0.4.0–0.8.0. Nothing in this release talks to a model or the network.
What it does today
pip install insightsmith
ismith look data/sales.csv
╭──────────────── source ─────────────────╮
│ format csv │
│ encoding cp1252 │
│ dialect delimiter=';' decimal=',' │
│ confidence 95% │
│ assumed read as cp1252; charset- │
│ normalizer suggested cp775 │
╰─────────────────────────────────────────╯
umsatz.csv: 5 rows x 3 columns
columns
┏━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┓
┃ column ┃ dtype ┃ semantic ┃ nulls ┃ unique ┃ detail ┃
┡━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━┩
│ region │ String │ categorical │ - │ 4 │ Nord (2) · Süd (1) │
│ menge │ Int64 │ numeric │ - │ 5 │ min 4 · med 12 · max… │
│ umsatz │ Float64 │ numeric │ - │ 5 │ min 40.75 · med 120.5 │
└────────┴─────────┴─────────────┴───────┴────────┴───────────────────────┘
candidate keys: menge
Add --json for the same profile as machine-readable output.
Format detection doesn't trust the extension. A three-stage cascade — extension
hint, then magic bytes, then a text-dialect probe — where each stage can veto the
one before it. A Parquet file named .csv is loaded as Parquet, and you're told
the extension lied. Every result carries a confidence score and the list of
assumptions behind it; below 80% those assumptions are printed rather than hidden.
It is built for the files that actually turn up: semicolon-delimited cp1252 CSVs with decimal commas and thousands separators, BOMs, comment preambles, quoted fields containing the delimiter, gzip and single-member zip wrappers.
Profiling reports per-column dtype and semantic type, null rates, cardinality, numeric summaries with outlier counts by two different methods, temporal ranges, text lengths, category frequencies, candidate keys, and quality notes: duplicate and near-duplicate rows, constant and near-constant columns, runaway cardinality, class imbalance.
As a library
from insightsmith import load, profile, sniff
spec = sniff("data/sales.csv")
print(spec.format, spec.encoding, spec.confidence, spec.warnings)
frame = load(spec) # a Polars LazyFrame — nothing read yet
result = profile(spec)
print(result.summary())
for issue in result.issues:
print(issue.severity.value, issue.column, issue.message)
Polars LazyFrame is the internal representation throughout, so Parquet, Arrow,
NDJSON and UTF-8 CSV are scanned rather than loaded.
Formats loadable in 0.1.0: csv, tsv, xlsx/xlsm (with [excel]), xls, parquet,
feather/arrow, json, jsonl/ndjson. Detected-but-not-yet-loadable formats — sqlite,
duckdb, xml, html, ods, orc, hdf5, spss, stata, sas — say so, and name the release
that will handle them.
Install
pip install insightsmith # csv, tsv, parquet, arrow, json, jsonl
pip install insightsmith[excel] # + xlsx / xls
pip install insightsmith[pandas] # + a .to_pandas() escape hatch
The base install is four dependencies — polars, typer, rich, charset-normalizer. No torch, no pandas, no agent framework. Extras stay optional on purpose.
What it won't do
Worth stating plainly, in advance:
- Large files are profiled on a sample. Above a size threshold the profile is
built from a strided sample of the rows, and every affected statistic is marked
estimated. Row counts remain exact; distributions are approximate. - Encoding detection is a guess on small files. Single-byte codepages are genuinely ambiguous in a few hundred bytes. Sparse non-ASCII text is read as cp1252 and the substitution is reported, but it can still be wrong.
- Statistics have edges. The IQR fence is degenerate when the middle 50% of a column is a single value, so outliers are counted by a MAD-based modified z-score as well, and both numbers are shown. They disagree usefully.
- "Near-duplicate" means one specific thing — identical once string columns are trimmed and case-folded. It is not fuzzy matching.
- Thousands separators are detected but not stripped. polars has no option for them, so such columns may load as strings.
- No XML row-unit discovery, and zstd payloads aren't inspected (no stdlib decompressor before Python 3.14).
And for the releases still to come: LLMs write wrong code confidently, the sandbox will be defense-in-depth rather than a security boundary, and a statistical critic reduces but does not remove statistical nonsense.
License
Apache-2.0. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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 insightsmith-0.1.0.tar.gz.
File metadata
- Download URL: insightsmith-0.1.0.tar.gz
- Upload date:
- Size: 35.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73bb081f4b6a9bf9eefa6ac7789305bc382adcd0297be8206a9235ed9a58d34d
|
|
| MD5 |
1643281295c525542c078ef60aba2263
|
|
| BLAKE2b-256 |
d85660ff8e07f98c6b0af6d8029473f2ab67ea94e6df636fb404558b1762141b
|
Provenance
The following attestation bundles were made for insightsmith-0.1.0.tar.gz:
Publisher:
release.yml on SofianeOuaari/insightsmith
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
insightsmith-0.1.0.tar.gz -
Subject digest:
73bb081f4b6a9bf9eefa6ac7789305bc382adcd0297be8206a9235ed9a58d34d - Sigstore transparency entry: 2257609863
- Sigstore integration time:
-
Permalink:
SofianeOuaari/insightsmith@9216619e9f9a7e803facdbf6fad15467e0e04e6d -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/SofianeOuaari
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9216619e9f9a7e803facdbf6fad15467e0e04e6d -
Trigger Event:
push
-
Statement type:
File details
Details for the file insightsmith-0.1.0-py3-none-any.whl.
File metadata
- Download URL: insightsmith-0.1.0-py3-none-any.whl
- Upload date:
- Size: 29.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f8e704db546fb3320d2f03d13490507d7de86bb4cd702db7ac9f515e482e10c
|
|
| MD5 |
00933c512e8aded98dd015a98208e6e2
|
|
| BLAKE2b-256 |
770377bf7462034b8cc4724936124ee0cb3050e868be597d1db3b1c532e06a46
|
Provenance
The following attestation bundles were made for insightsmith-0.1.0-py3-none-any.whl:
Publisher:
release.yml on SofianeOuaari/insightsmith
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
insightsmith-0.1.0-py3-none-any.whl -
Subject digest:
9f8e704db546fb3320d2f03d13490507d7de86bb4cd702db7ac9f515e482e10c - Sigstore transparency entry: 2257609920
- Sigstore integration time:
-
Permalink:
SofianeOuaari/insightsmith@9216619e9f9a7e803facdbf6fad15467e0e04e6d -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/SofianeOuaari
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9216619e9f9a7e803facdbf6fad15467e0e04e6d -
Trigger Event:
push
-
Statement type: