Skip to main content

jointview

Compare two price or NAV series of a Polars DataFrame, side by side.

PyPI version

License: Apache-2.0 Python versions CI Coverage Code style: ruff uv marimo CodeFactor Rhiza Downloads

Run it

uvx jointview

That is the whole installation. uvx fetches the package and its dependencies for the length of the run and leaves nothing behind.

uvx jointview navs.parquet               # your own data
uvx jointview navs.parquet --height 900  # taller plot for a taller screen

jointview comparing two funds of the demo frame

Pick a series on each side. Both are drawn on one pair of axes, and each summary table describes exactly the rows in the plot — the common sample, where both series are present.

Why both lines share an axis

A second scale would invent a relationship that is not in the data. So both series are indexed to 100 at their first shared date, which is how a fund priced at 49 and one priced at 1,450 become comparable. The switch above the plot turns that off when the levels already share a scale.

Options

jointview the generated demo frame
jointview <file> .parquet, .csv, .tsv, .json, .ndjson, .arrow, .ipc, .feather
--height plot height in pixels (default 700)
--edit open the notebook itself, from a clone
-- … everything after a bare -- goes to marimo: -- --port 8080 --headless

The first temporal column becomes the x-axis; without one the rows are numbered. Every numeric column is offered as a series.

The pieces on their own

Neither the chart nor the statistics need marimo. uvx runs the app; to import the pieces, install the package from PyPI:

uv add jointview      # or: pip install jointview

Statistics come from jQuantStats, so the frame carries its period column into summary — the annualisation factor is read from the spacing of the observations rather than assumed.

from jointview import demo_frame, line_chart, metrics, summary

frame = demo_frame()

table = summary(frame, "balanced", date_col="date")                    # a formatted two-column frame
sharpe = metrics(frame, "tech_fund", date_col="date")["Sharpe ratio"]  # the raw number
chart = line_chart(frame, "balanced", "tech_fund")                     # a plain Altair chart

print(table.columns, table.height, dict(table.iter_rows())["Max drawdown"])
print(f"{sharpe:.2f}")
print(type(chart).__name__)
['metric', 'value'] 17 -15.90%
0.52
LayerChart

One line per claim above, in the same order — the table is two columns of formatted strings, the metric is a bare float, and the chart is Altair's own type rather than a marimo widget. The block is executed on every commit and its output compared against the result printed here, so a figure that drifts is a failing test rather than a stale README.

Seventeen figures per series — returns, volatility, Sharpe, Sortino, Calmar, drawdown, Ulcer index, value at risk, and the shape of the period returns. A figure that cannot be formed shows as — rather than blanking the table.

Metadata

Release files for jointview 0.3.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jointview 0.3.3
File Size Uploaded
jointview-0.3.3.tar.gz 25.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jointview 0.3.3
File Interpreter ABI Platform
jointview-0.3.3-py3-none-any.whl Python 3 none any Details

Total release size: 54.1 kB

Release files / jointview-0.3.3.tar.gz

Download URL jointview-0.3.3.tar.gz
Size 25.1 kB
Tags Source
SHA-256 checksum
How to use checksums
e6d9d52d6f8ebddb80b1018fb1f738a8ef278ecc16a2845648cad45b5492e1c1
BLAKE2b-256 checksum
How to use checksums
c6de8931496e86bd41ea457c4135e56a479d7e30133da071c5993eb12741f9e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.

Transparency log

Release files / jointview-0.3.3-py3-none-any.whl

Download URL jointview-0.3.3-py3-none-any.whl
Size 29.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ef4fcc218c5c7645e9bfb33a274f499f0287454880d0bbb9873f83695a45d49b
BLAKE2b-256 checksum
How to use checksums
00193eeb100da3529db71132b52bdfec4db714d357a9857937881ef95aefdb67
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 18, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.3 This release

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release 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