jointview
Compare two price or NAV series of a Polars DataFrame, side by side.
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
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()
summary(frame, "balanced", date_col="date") # a formatted two-column frame
metrics(frame, "tech_fund", date_col="date")["Sharpe ratio"] # the raw number
chart = line_chart(frame, "balanced", "tech_fund") # a plain Altair chart
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
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 jointview-0.3.1.tar.gz.
File metadata
- Download URL: jointview-0.3.1.tar.gz
- Upload date:
- Size: 21.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e19dc44d97223e22aea2b659990e478df0937e56d43d5dccd5dc9a3291c3d5b
|
|
| MD5 |
70ed86db05644741446690d1c22eba90
|
|
| BLAKE2b-256 |
b1ca93c6c14c19832a927e56cfe23b574af949f0c28829c4b832ecb813a5b169
|
Provenance
The following attestation bundles were made for jointview-0.3.1.tar.gz:
Publisher:
rhiza_release.yml on Jebel-Quant/jointview
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jointview-0.3.1.tar.gz -
Subject digest:
8e19dc44d97223e22aea2b659990e478df0937e56d43d5dccd5dc9a3291c3d5b - Sigstore transparency entry: 2486814930
- Sigstore integration time:
-
Permalink:
Jebel-Quant/jointview@af2b0a45ecd303df7aae74f9317a49cbdb46faf3 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/Jebel-Quant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
rhiza_release.yml@af2b0a45ecd303df7aae74f9317a49cbdb46faf3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jointview-0.3.1-py3-none-any.whl.
File metadata
- Download URL: jointview-0.3.1-py3-none-any.whl
- Upload date:
- Size: 24.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
400e91c4f5274ceca8ec7aee8abaeff3aa621343ff00908ce17ac99a4660cada
|
|
| MD5 |
f026e3d1cc1bc8c981dfd747ddf70a30
|
|
| BLAKE2b-256 |
d9069b3d4b39d4b054db4bc7d65f19a5c7ca6e6ef09acc0b6f93a4bf0ffd33e5
|
Provenance
The following attestation bundles were made for jointview-0.3.1-py3-none-any.whl:
Publisher:
rhiza_release.yml on Jebel-Quant/jointview
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jointview-0.3.1-py3-none-any.whl -
Subject digest:
400e91c4f5274ceca8ec7aee8abaeff3aa621343ff00908ce17ac99a4660cada - Sigstore transparency entry: 2486815022
- Sigstore integration time:
-
Permalink:
Jebel-Quant/jointview@af2b0a45ecd303df7aae74f9317a49cbdb46faf3 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/Jebel-Quant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
rhiza_release.yml@af2b0a45ecd303df7aae74f9317a49cbdb46faf3 -
Trigger Event:
push
-
Statement type: