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.

Download files

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

Source Distribution

jointview-0.3.2.tar.gz (24.9 kB view details)

Uploaded Source

Built Distribution

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

jointview-0.3.2-py3-none-any.whl (29.0 kB view details)

Uploaded Python 3

File details

Details for the file jointview-0.3.2.tar.gz.

File metadata

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

File hashes

Hashes for jointview-0.3.2.tar.gz
Algorithm Hash digest
SHA256 ec377e178980a6d75c96da76a97150b9a26b3fa6ff5566f7b74645ce3b2ddff4
MD5 360cd7fa450208911950347e81be27e2
BLAKE2b-256 2bc8d3ec225d1580fec6290e703bcfc005d2fc9943ebe5159d2d565211f5e6a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for jointview-0.3.2.tar.gz:

Publisher: rhiza_release.yml on Jebel-Quant/jointview

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

File details

Details for the file jointview-0.3.2-py3-none-any.whl.

File metadata

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

File hashes

Hashes for jointview-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 74a489ce882cbc171da003af1cf0072a69f093fadbe137638fa13fdc332c8db0
MD5 2d94fb44189226507bff7f986a3cfb99
BLAKE2b-256 82b1ab047ec68488402eb0bdd2d3f06260084d741417983dda29c298f20864b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for jointview-0.3.2-py3-none-any.whl:

Publisher: rhiza_release.yml on Jebel-Quant/jointview

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page