Skip to main content

Rust-powered collection of financial functions for Python.

Project description

rust-lang.org License pypi versions

PyXIRR

Rust-powered collection of financial functions.

Features:

  • correct
  • blazingly fast
  • works with iterators
  • works with unordered input
  • no external dependencies

PyXIRR contains many functions from numpy-financial, such as IRR, NPV, etc.

Installation

pip install pyxirr

Benchmarks

Rust implementation has been tested against existing xirr package (uses scipy.optimize under the hood) and the implementation from the Stack Overflow (pure python).

bench

PyXIRR is ~10-20x faster in XIRR calculation than another implementations.

Powered by github-action-benchmark and plotly.js.

Live benchmarks are hosted on Github Pages.

Examples

from datetime import date
from pyxirr import xirr

dates = [date(2020, 1, 1), date(2021, 1, 1), date(2022, 1, 1)]
amounts = [-1000, 1000, 1000]

# feed columnar data
xirr(dates, amounts)
# feed iterators
xirr(iter(dates), (x / 2 for x in amounts))
# feed an iterable of tuples
xirr(zip(dates, amounts))
# feed a dictionary
xirr(dict(zip(dates, amounts)))

Numpy and Pandas support

import numpy as np
import pandas as pd

# feed numpy array
xirr(np.array([dates, amounts]))
xirr(np.array(dates), np.array(amounts))

# feed DataFrame (columns names doesn't matter; ordering matters)
xirr(pd.DataFrame({"a": dates, "b": amounts}))

# feed Series with DatetimeIndex
xirr(pd.Series(amounts, index=pd.to_datetime(dates)))

# bonus: apply xirr to a DataFrame with DatetimeIndex:
df = pd.DataFrame(
    index=pd.date_range("2021", "2022", freq="MS", closed="left"),
    data={
        "one": [-100] + [20] * 11,
        "two": [-80] + [19] * 11,
    },
)
df.apply(xirr)  # Series(index=["one", "two"], data=[5.09623547168478, 8.780801977141174])

API reference

See the docs

Roadmap

  • Implement all functions from numpy-financial
  • Improve docs, add more tests
  • Type hints
  • Compile library for rust/javascript/python
  • Vectorized versions of numpy-financial functions.

Development

Running tests with pyo3 is a bit tricky. In short, you need to compile your tests without extension-module feature to avoid linking errors. See the following issues for the details: #341, #771.

If you are using pyenv, make sure you have the shared library installed (check for ${PYENV_ROOT}/versions/<version>/lib/libpython3.so file).

$ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install <version>

Install dev-requirements

$ pip install -r dev-requirements.txt

Building

$ maturin develop

Testing

$ LD_LIBRARY_PATH=${PYENV_ROOT}/versions/3.8.6/lib cargo test --no-default-features --features tests

Building and distribution

This library uses maturin to build and distribute python wheels.

$ docker run --rm -v $(pwd):/io konstin2/maturin build --release --manylinux 2010 --strip
$ maturin upload target/wheels/pyxirr-${version}*

Project details


Download files

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

Source Distribution

pyxirr-0.6.4.tar.gz (119.9 kB view hashes)

Uploaded Source

Built Distributions

pyxirr-0.6.4-cp310-none-win_amd64.whl (134.6 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

pyxirr-0.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl (187.6 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.5+ x86-64

pyxirr-0.6.4-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (346.8 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64) macOS 10.9+ x86-64 macOS 11.0+ ARM64

pyxirr-0.6.4-cp39-none-win_amd64.whl (134.6 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

pyxirr-0.6.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (242.1 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

pyxirr-0.6.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (322.1 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

pyxirr-0.6.4-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (331.3 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64

pyxirr-0.6.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (193.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

pyxirr-0.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (185.1 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

pyxirr-0.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (187.6 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.5+ x86-64

pyxirr-0.6.4-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (346.8 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64) macOS 10.9+ x86-64 macOS 11.0+ ARM64

pyxirr-0.6.4-cp38-none-win_amd64.whl (134.6 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

pyxirr-0.6.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (242.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

pyxirr-0.6.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (322.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

pyxirr-0.6.4-cp38-cp38-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (331.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64

pyxirr-0.6.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (193.1 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARMv7l

pyxirr-0.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (185.1 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

pyxirr-0.6.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (187.7 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.5+ x86-64

pyxirr-0.6.4-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (346.8 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64) macOS 10.9+ x86-64 macOS 11.0+ ARM64

pyxirr-0.6.4-cp37-none-win_amd64.whl (134.5 kB view hashes)

Uploaded CPython 3.7 Windows x86-64

pyxirr-0.6.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl (242.0 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ s390x

pyxirr-0.6.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (322.2 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ppc64le

pyxirr-0.6.4-cp37-cp37m-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (331.3 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ppc64

pyxirr-0.6.4-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (193.1 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARMv7l

pyxirr-0.6.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (185.2 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

pyxirr-0.6.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (187.7 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.5+ x86-64

pyxirr-0.6.4-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (346.8 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ universal2 (ARM64, x86-64) macOS 10.9+ x86-64 macOS 11.0+ ARM64

pyxirr-0.6.4-cp36-none-win_amd64.whl (134.9 kB view hashes)

Uploaded CPython 3.6 Windows x86-64

pyxirr-0.6.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl (241.6 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ s390x

pyxirr-0.6.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (322.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ppc64le

pyxirr-0.6.4-cp36-cp36m-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (331.1 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ppc64

pyxirr-0.6.4-cp36-cp36m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (193.0 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARMv7l

pyxirr-0.6.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (185.5 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARM64

pyxirr-0.6.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (187.7 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.5+ x86-64

pyxirr-0.6.4-cp36-cp36m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (347.0 kB view hashes)

Uploaded CPython 3.6m macOS 10.9+ universal2 (ARM64, x86-64) macOS 10.9+ x86-64 macOS 11.0+ ARM64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page