Skip to main content

pyvinecopulib

Documentation License: MIT Build Status DOI

Introduction

What are vine copulas?

Sklar's theorem factorizes every joint distribution into one-dimensional marginals and a copula that carries the dependence between variables. A vine copula decomposes that copula into bivariate building blocks — pair copulas — arranged on a sequence of trees called an R-vine (Bedford & Cooke, 2002; Aas et al., 2009). The decomposition makes pair-by-pair estimation scale gracefully into high dimensions and gives a natural place to drop in non-parametric pair-copula estimators like Transformed Local Likelihood (TLL).

A short primer is available on the concepts page; a comprehensive list of publications lives on vine-copula.org.

What is pyvinecopulib?

pyvinecopulib is the Python interface to vinecopulib, a header-only C++ library for vine copula models based on Eigen. It provides high-performance implementations of the core features of the popular VineCopula R library, in particular inference algorithms for both vine copula and bivariate copula models. Advantages over VineCopula are

  • a stand-alone C++ library with interfaces to both R and Python,
  • a sleeker and more modern API,
  • shorter runtimes and lower memory consumption, especially in high dimensions,
  • nonparametric and multi-parameter families.

First core fit

The core package is enough to fit, inspect, evaluate, and sample a model:

import numpy as np
import pyvinecopulib as pv

rng = np.random.default_rng(0)
cov = [[1.0, 0.7, 0.3], [0.7, 1.0, 0.5], [0.3, 0.5, 1.0]]
x = rng.multivariate_normal([0, 0, 0], cov, size=500)

u = pv.to_pseudo_obs(x)  # ranks, on the copula scale
vine = pv.Vinecop.from_data(u)  # selects structure and families
print(vine)  # the fitted trees, pair by pair
vine.loglik(u), vine.bic()  # fit diagnostics
draws = vine.sample(100, seeds=[1])  # new copula-scale observations

For a distribution on the original data scale — no rank transform, no to_pseudo_obs — pair the copula with one margin per variable through pv.Vinedist. It needs no extras: the default margin is a boundary-corrected kernel density.

dist = pv.Vinedist.from_data(y)  # y is data, not pseudo-observations
dist.logpdf(y)  # joint log-density
dist.sample(1000, seeds=[1])  # draws on the original scale

Bound a variable whose range you know, and the kernel density stops padding past it:

dist = pv.Vinedist.from_data(y, supports=[(0.0, None), None])

What a variable is — its bounds, its type — is a declaration about the data, so it travels beside the fit configuration rather than inside it: margin_controls= says how to estimate a margin, supports= and var_types= say what it is estimating.

Notebooks 01, 02 and 03 build out these core workflows, and 07 covers the kernel-density margin they default to.

Optional subpackages

Three opt-in subpackages extend the core library:

  • pyvinecopulib.margins — parametric margins and family selection (SciPyMargin) to pair with Vinedist when a kernel-density margin is not what you want:

    from pyvinecopulib.core import Vinedist
    from pyvinecopulib.margins import FitControlsMargin, SciPyMargin
    
    
    class ParametricVinedist(Vinedist):
      margin_class = SciPyMargin  # a family per column, chosen from the data
    
    
    dist = ParametricVinedist.from_data(
      x, margin_controls=FitControlsMargin(selection_criterion="bic")
    )
    print(dist.margins[0].family_name)
    

    SciPyMargin needs pip install pyvinecopulib[scipy]. Another ecosystem's distributions reach a vine through pyvinecopulib.margins.register_margin_adapter.

  • pyvinecopulib.sklearn — scikit-learn-compatible estimators (VineDensity, VineRegressor). Drop a vine into any sklearn pipeline:

    from pyvinecopulib.sklearn import VineDensity
    
    density = VineDensity().fit(X)  # fits a `Vinedist`
    density.score_samples(X[:3])
    density.cdf(X[:3])
    

    Install with pip install pyvinecopulib[sklearn].

  • pyvinecopulib.torch — pure-PyTorch evaluators and data-scale modules (TorchTllBicop, TorchVinecop, TorchKde1d, TorchDistributionMargin, and TorchVinedist) for GPU placement and autograd:

    import torch
    from pyvinecopulib.torch import TorchVinedist
    
    # Where the model lives is read from the data, so placing the data places
    # the whole distribution -- margins and copula together.
    dist = TorchVinedist.from_data(torch.as_tensor(x, device="cuda"))
    y = torch.as_tensor(x[:5], device="cuda").requires_grad_(True)
    dist.log_prob(y).sum().backward()  # autograd through the whole vine
    print(y.grad)  # d log f / dy, on the GPU
    

    The same evaluator backs the sklearn estimators: pass distribution=TorchVinedist to VineDensity or VineRegressor.

    Install with pip install pyvinecopulib[torch].

API stability

pyvinecopulib.core, pyvinecopulib.families and pyvinecopulib.utils are stable: changes there follow semantic versioning, with a deprecation cycle before anything is removed.

The four contracts and their canonical bases live in core, so they are stable too: BicopLike / BicopBase, VinecopLike / VinecopBase, MarginLike / MarginBase, VinedistLike / VinedistBase. Build a subclass on them with the same confidence as on Vinecop.

What is provisional in 1.x are the implementations in pyvinecopulib.margins, pyvinecopulib.sklearn and pyvinecopulib.torch -- the curated family registry, the selection criteria, and the estimator and controls surfaces -- which may change in a minor version as they meet real data. The torch-to-core evaluation parity is treated as required regardless. Pin an exact version if you depend on those implementation surfaces.

Custom and conditional models

The core evaluators (Bicop / Vinecop / Kde1d / Vinedist, and their torch counterparts) implement four array-agnostic contracts: BicopLike, VinecopLike, MarginLike and VinedistLike. Subclass the matching canonical, pure-Python base -- BicopBase, VinecopBase, MarginBase or VinedistBase (NumPy or PyTorch) -- to plug your own pair copula, margin or whole distribution into the library. Fitting has one shape on all four: fit returns self, from_data constructs, and configuration travels as a ControlsLike (anything with to_dict()).

A contract names everything the library may ask of that part, and everything past its evaluation surface has a default -- so inheriting the protocol directly is the other route: define what you implement, and a member you decline raises naming your class instead of failing somewhere inside a cascade.

A pair may depend on its vine conditioning-set values (a non-simplified vine), on row-aligned external covariates, or on both. Vinedist can compose covariate-dependent margins and such a copula into a full data-scale distribution Y | X.

This joint conditional model is an extension point, not a built-in fitter: Vinedist.from_data(y, x=...) can fit custom conditional margin specifications, but fits an x-independent compiled Vinecop for the copula half. Fit custom conditional pairs through VinecopBase.fit and compose the parts explicitly when dependence must also vary with X. See the concepts page and notebooks examples/10_extending_pyvinecopulib.ipynb and examples/03_vine_distributions.ipynb.

Conditional sampling and likelihood diagnostics

A fitted Vinecop can draw from the conditional distribution of a subset of variables given the rest (sample_conditional), select or reorient a structure so a chosen conditioning set sits at the order tail, and expose its tree-by-tree decomposition with the fitted pair copulas (get_trees). Parametric fits additionally provide analytic log-likelihood scores, gradient, Hessian, and score covariance (scores / gradient / hessian / scores_cov, on both Bicop and Vinecop) for gradient-based inference. See the examples/05_conditional_sampling_and_vines.ipynb notebook.

License

pyvinecopulib is provided under an MIT license that can be found in the LICENSE file. By using, distributing, or contributing to this project, you agree to the terms and conditions of this license.

Contact

If you have any questions regarding the library, feel free to open an issue or send a mail to info@vinecopulib.org.

Installation

On x86-64, the distributed wheels require the x86-64-v3 ISA baseline (AVX2 and FMA). The package checks this before loading its native extension and explains how to use a source build when a CPU or VM masks those features.

With pip

The latest release can be installed using pip:

pip install pyvinecopulib

With conda

Similarly, it can be installed with conda:

conda install conda-forge::pyvinecopulib

Or with mamba:

mamba install conda-forge::pyvinecopulib

From source

Start by cloning this repository, noting the --recursive option which is needed for the vinecopulib, wdm, and kde1d submodules:

git clone --recursive https://github.com/vinecopulib/pyvinecopulib.git
cd pyvinecopulib

The main build time prerequisites are:

  • scikit-build-core (>=0.5.0),
  • nanobind (>=2.7.0),
  • libclang (>=18) — used to regenerate src/include/docstr.hpp from the C++ headers as a step of the build,
  • numpy / matplotlib / networkx — imported by the post-build stub-generation step,
  • a compiler with C++17 support.

When installing via pip install . (the default), all of these are pulled into an isolated build environment automatically via [build-system] requires in pyproject.toml; you don't need to install them yourself.

To install from source, Eigen and Boost also need to be available, and CMake will try to find suitable versions automatically. Both are looked for in config mode -- FindBoost was removed in CMake 3.30 -- so if the configure step cannot find one, either put its prefix on CMAKE_PREFIX_PATH or point the environment variables below at the headers directly. Boost has one extra fallback, because all this package needs of it is headers: where no BoostConfig.cmake is found, a plain search for boost/version.hpp is tried before giving up, so a headers-only package such as conda-forge's libboost-headers works.

The recommended way to install pyvinecopulib from source is to use conda/mamba for the native build prerequisites and uv for the Python side:

mamba create -n pyvinecopulib python=3.11 boost eigen 'python-clang=18.*' uv
mamba activate pyvinecopulib
make sync

See the contributing guide for the full developer workflow.

Alternatively, you can specify manually the location of Eigen and Boost using the environment variables EIGEN3_INCLUDE_DIR and Boost_INCLUDE_DIR respectively. On Linux, you can install the required packages and set the environment variables as follows:

sudo apt-get install libeigen3-dev libboost-all-dev
export Boost_INCLUDE_DIR=/usr/include
export EIGEN3_INCLUDE_DIR=/usr/include/eigen3

Finally, you can build and install pyvinecopulib using pip:

pip install .

The build automatically regenerates src/include/docstr.hpp (from the C++ headers via libclang) and src/pyvinecopulib/__init__.pyi (from the freshly built extension). Both files are gitignored — they're pure build artifacts.

For an editable install (recommended for development), use --no-build-isolation so the conda env's libclang is reused and editable.rebuild = true regenerates everything on each import:

pip install -e . --no-build-isolation

Documentation

Stable docs are published at https://pyvinecopulib.readthedocs.io. They are rebuilt automatically by Read the Docs whenever a new release is tagged on main and published to PyPI.

To build the documentation locally:

make docs           # one-shot HTML build → docs/_build/html/

Contributing

Development setup, the build pipeline, the Makefile + pre-commit conventions, the CI workflow, and the release flow are all documented in the contributing guide.

Release files for pyvinecopulib 1.0.0

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

Source distribution (sdist)

Source distribution for pyvinecopulib 1.0.0
File Size Uploaded
pyvinecopulib-1.0.0.tar.gz 7.4 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for pyvinecopulib 1.0.0
File
pyvinecopulib-1.0.0-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
pyvinecopulib-1.0.0-cp312-abi3-musllinux_1_2_x86_64.whl CPython 3.12 abi3 Linux musl 1.2+ x86-64 Details
pyvinecopulib-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
pyvinecopulib-1.0.0-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details
pyvinecopulib-1.0.0-cp312-abi3-macosx_10_13_x86_64.whl CPython 3.12 abi3 macOS 10.13+ x86-64 Details
pyvinecopulib-1.0.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
pyvinecopulib-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details
pyvinecopulib-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
pyvinecopulib-1.0.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
pyvinecopulib-1.0.0-cp311-cp311-macosx_10_13_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.13+ x86-64 Details

Total release size: 34.1 MB

Release files / pyvinecopulib-1.0.0.tar.gz

Download URL pyvinecopulib-1.0.0.tar.gz
Size 7.4 MB
Tags Source
SHA-256 checksum
How to use checksums
c3bb46512f7280e6ba56451a1e974e774a01571738566cd72cdb8874b525c348
BLAKE2b-256 checksum
How to use checksums
2fa5158f1978c84b552420a6e4c1710027bbab2b879c90d0bc66a377c2d3ff8f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp312-abi3-win_amd64.whl

Download URL pyvinecopulib-1.0.0-cp312-abi3-win_amd64.whl
Size 2.5 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
d599eb410db77660d04b3b3f8db4e7d982acd0e0f366ba3b47dae98506b95eb5
BLAKE2b-256 checksum
How to use checksums
5fe60885c800e4f2494044ad8f3305b5f8efb11126848009fb4dde288c05f432
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp312-abi3-musllinux_1_2_x86_64.whl

Download URL pyvinecopulib-1.0.0-cp312-abi3-musllinux_1_2_x86_64.whl
Size 3.3 MB
Tags CPython 3.12 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
f1129b2ab5eec92aef4b4d4e57039158201383d76d0779e751bb9fc5b7d7da12
BLAKE2b-256 checksum
How to use checksums
046a6783cbdbd76f08e607ebd3bbfa9bcd39264e371e406dc17bebaa29b34a37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pyvinecopulib-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 2.8 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
c03cff5753c1248a24406d4ad87c739682d2b82c765db16d7110efb983abe1a9
BLAKE2b-256 checksum
How to use checksums
4f36039b1605adf6d2e5bd8a9728b42357ad8e6bdbe842c3ca9fdf159acf3899
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp312-abi3-macosx_11_0_arm64.whl

Download URL pyvinecopulib-1.0.0-cp312-abi3-macosx_11_0_arm64.whl
Size 2.3 MB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
228f8347e36be905afbedebca27b27993a1b1e3f08f1cec17d3a060f133cd4cc
BLAKE2b-256 checksum
How to use checksums
8b6a3f4a69b541949e3b698b18683dc874e47dc153d1db931d2a097e5185e893
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp312-abi3-macosx_10_13_x86_64.whl

Download URL pyvinecopulib-1.0.0-cp312-abi3-macosx_10_13_x86_64.whl
Size 2.5 MB
Tags CPython 3.12 abi3 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
4777f7b5b85199bade01c57e4443ad779e418f5f84302585f4d85c9b4b77a693
BLAKE2b-256 checksum
How to use checksums
049921fa8446f129590c4b9f6ad9f2dd586ed3b1f1823b4a848062519c974092
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp311-cp311-win_amd64.whl

Download URL pyvinecopulib-1.0.0-cp311-cp311-win_amd64.whl
Size 2.5 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
fa2c67e148ab54a2a0751006004090abfb4e7a83adb482807fa346da4ee6c660
BLAKE2b-256 checksum
How to use checksums
2407268378b691d5bb5dd7bdbf5958eb00bce4268d75d57ca406a1d26f6a0df1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL pyvinecopulib-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl
Size 3.3 MB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
7500a03ea0298acdc55971491d15f24a2b527e03aad63fe4d547e53e16d0ccfe
BLAKE2b-256 checksum
How to use checksums
b3c11aede5a26aa7eb70649133af5512d11f856c93b65edfebf2cd4cf66b9542
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pyvinecopulib-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 2.8 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
9cb100ea1002799b0a34387a6990171ff4f30de9b407ffcedca0e8e8b1ea804b
BLAKE2b-256 checksum
How to use checksums
7a47cf1477d2e25254d5b23f25308b67bb4389601a40b0ca7fb350c79dc4345d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL pyvinecopulib-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
Size 2.3 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
84844216dceb47bd9f7e3675401c81c52fbb316daeeadebf77b7c1b8d83f65c1
BLAKE2b-256 checksum
How to use checksums
87151802550f2ff383cb430fa9091651cddcec7d2ffa00ebeef073390a73c508
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pyvinecopulib-1.0.0-cp311-cp311-macosx_10_13_x86_64.whl

Download URL pyvinecopulib-1.0.0-cp311-cp311-macosx_10_13_x86_64.whl
Size 2.5 MB
Tags CPython 3.11 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
d04e5cf367dd5189c1698051101a8606cd1bc266a3ae57c1a6cff6aa327b9f54
BLAKE2b-256 checksum
How to use checksums
46cb50aea42795ae51d5e0d20eba56fc7ed62abf3b238e204a3d2eca75821389
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

1.0.0 This release

11 release files

0.7.4

8 release files

0.7.3

17 release files

0.6.8

26 release files

0.6.7

26 release files

0.6.6

41 release files

0.6.5

41 release files

0.6.4

23 release files

0.6.3

13 release files

0.6.2

13 release files

0.6.1

15 release files

0.6.0

15 release files

0.5.5

15 release files

0.5.4

12 release files

0.5.0

9 release files

0.2.0

9 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