Skip to main content

Time series to network conversion and analysis

Project description

ts2net

PyPI version Documentation Status Tests License: MIT

Time series to networks. Clean API for visibility graphs, recurrence networks, and transition networks.

Install

Basic Installation

pip install ts2net

Optional Dependencies

Install with optional features:

# Performance acceleration (Numba)
pip install ts2net[speed]

# BSTS decomposition (statsmodels)
pip install ts2net[bsts]

# Temporal CNN embeddings (PyTorch)
pip install ts2net[cnn]

# All optional features
pip install ts2net[all]

# Development dependencies
pip install ts2net[dev]

Verify Installation

import ts2net
print(ts2net.__version__)

from ts2net import HVG
import numpy as np
x = np.random.randn(100)
hvg = HVG()
hvg.build(x)
print(f"✓ Installation successful: {hvg.n_nodes} nodes, {hvg.n_edges} edges")

Quick Start

import numpy as np
from ts2net import HVG

x = np.random.randn(1000)

hvg = HVG()
hvg.build(x)

print(hvg.n_nodes, hvg.n_edges)
print(hvg.degree_sequence())

Adjacency Matrix

A = hvg.adjacency_matrix()
print(A.shape)  # (1000, 1000)

NetworkX (Optional)

NetworkX is optional. Convert only if needed:

G = hvg.as_networkx()
import networkx as nx
print(nx.average_clustering(G))

Structural Decomposition and Residual Topology

For time series with predictable structure (seasonality, trends), decompose first, then analyze the residual:

from ts2net.bsts import features, BSTSSpec

# Decompose and analyze residual in one pass
spec = BSTSSpec(
    level=True,
    trend=False,
    seasonal_periods=[24, 168]  # Daily and weekly for hourly data
)

result = features(x, methods=['hvg', 'transition'], bsts=spec)

# Access three feature blocks
raw_stats = result.raw_stats              # Basic series statistics
structural_stats = result.structural_stats # Component variances, seasonal strength
residual_network_stats = result.residual_network_stats  # Network features from residual

Use cases:

  • Compare meters/wells without seasonal confounds
  • Flag series where structural model fails (high residual complexity)
  • Separate predictable structure from irregular dynamics

Installation:

pip install ts2net[bsts]  # Installs statsmodels

See examples/bsts_features.py for complete examples.

Large Series

For large series, use output modes to control memory usage:

# Degrees only (most memory efficient)
hvg = HVG(output="degrees")
hvg.build(x)
degrees = hvg.degree_sequence()  # Fast, no edge storage

# Stats only (summary statistics without edges)
hvg = HVG(output="stats")
hvg.build(x)
stats = hvg.stats()  # n_nodes, n_edges, avg_degree, etc.

# Full edges (default, use for small-medium series)
hvg = HVG(output="edges")
hvg.build(x)
edges = hvg.edges  # Full edge list

Scale Guidelines

Series Length Method Recommended Settings Memory Risk
n < 10k All methods output="edges" Safe
10k < n < 100k HVG output="edges" or output="degrees" Safe with sparse
10k < n < 100k NVG limit=2000-5000, output="degrees" Use horizon limit
10k < n < 100k Recurrence rule='knn', k=10-30 Avoid exact all-pairs
n > 100k HVG output="degrees" or output="stats" Safe
n > 100k NVG limit=2000-5000, max_edges=1e6, output="degrees" Required limits
n > 100k Recurrence rule='knn', k=10-30, output="degrees" kNN only

Critical Warnings:

  • Dense adjacency matrices are disabled by default for n > 50k (prevents 63GB+ memory blowup)
  • NVG without limit can create millions of edges for smooth series
  • Recurrence exact all-pairs is O(n²) memory - use kNN for large n
  • NetworkX conversion refused for n > 200k (use force=True to override)

Memory Estimates:

  • Dense adjacency: ~8 * n² bytes (e.g., 90k nodes = 63 GB)
  • Sparse adjacency: ~16 * m bytes where m = edges (e.g., 100k edges = 1.6 MB)
  • Edge list: ~16 * m bytes (similar to sparse)
  • Degrees only: ~8 * n bytes (e.g., 90k nodes = 720 KB)

Methods

Visibility Graphs

HVG - Horizontal Visibility Graph

from ts2net import HVG

hvg = HVG(weighted=False, limit=None)
hvg.build(x)

NVG - Natural Visibility Graph

from ts2net import NVG

# For large series, use horizon limit and bounded work
nvg = NVG(weighted=False, limit=5000, max_edges=1_000_000, output="degrees")
nvg.build(x)

# Or with memory limit
nvg = NVG(limit=2000, max_memory_mb=100)  # Caps at ~100MB
nvg.build(x)

Recurrence Networks

Phase space recurrence:

from ts2net import RecurrenceNetwork

rn = RecurrenceNetwork(m=3, tau=1, rule='knn', k=5)
rn.build(x)

Parameters:

  • m: embedding dimension (None = auto via FNN)
  • tau: time delay
  • rule: 'knn', 'epsilon', 'radius'
  • k: neighbors for k-NN
  • epsilon: threshold for epsilon-recurrence

Transition Networks

Symbolic dynamics:

from ts2net import TransitionNetwork

tn = TransitionNetwork(symbolizer='ordinal', order=3)
tn.build(x)

Symbolizers:

  • 'ordinal': ordinal patterns
  • 'equal_width': equal-width bins
  • 'equal_freq': equal-frequency bins (quantiles)
  • 'kmeans': k-means clustering

Compare Methods

from ts2net import build_network

x = np.random.randn(1000)

for method in ['hvg', 'nvg', 'recurrence', 'transition']:
    if method == 'recurrence':
        g = build_network(x, method, m=3, rule='knn', k=5)
    elif method == 'transition':
        g = build_network(x, method, symbolizer='ordinal', order=3)
    else:
        g = build_network(x, method)
    
    print(f"{method}: {g.n_edges} edges")

Output:

hvg: 1979 edges
nvg: 2931 edges
recurrence: 3159 edges
transition: 18 edges

Multivariate

Multiple time series → network where nodes = time series:

from ts2net.multivariate import ts_dist, net_knn

X = np.random.randn(30, 1000)  # 30 series, 1000 points each

D = ts_dist(X, method='dtw', n_jobs=-1)
G = net_knn(D, k=5)

print(G.n_nodes, G.n_edges)

Distance methods: 'correlation', 'dtw', 'nmi', 'voi', 'es', 'vr'

Network builders: net_knn, net_enn, net_weighted

Performance

With Numba (recommended):

pip install numba

Speedups:

  • HVG: 100x faster
  • NVG: 180x faster
  • Recurrence: 10x faster

API

All methods follow the same pattern:

builder = Method(**params)
builder.build(x)

# Access results
builder.n_nodes
builder.n_edges
builder.edges                # list of tuples
builder.degree_sequence()    # numpy array
builder.adjacency_matrix()   # numpy array
builder.as_networkx()        # optional conversion

Troubleshooting

Common Issues

Memory errors with large time series:

  • Use output="degrees" or output="stats" instead of output="edges"
  • For NVG, always set limit parameter (e.g., limit=5000)
  • For recurrence networks, use rule='knn' with small k (10-30) instead of exact all-pairs

Slow performance:

  • Install Numba: pip install numba (100-180x speedup for visibility graphs)
  • Use output="degrees" if you don't need full edge lists
  • For multivariate, use n_jobs=-1 for parallel distance computation

Import errors:

  • Ensure you're using Python 3.12+
  • If Rust extension fails to build, install Rust: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • For development, run maturin develop --release after installing Rust

NetworkX conversion refused:

  • For very large graphs (n > 200k), NetworkX conversion is disabled by default
  • Use force=True to override: hvg.as_networkx(force=True)
  • Consider using output="degrees" or output="stats" instead

Getting Help

Citation

Multivariate methods based on:

Ferreira, L.N. (2024). From time series to networks in R with the ts2net package. Applied Network Science, 9(1), 32. https://doi.org/10.1007/s41109-024-00642-2

Contributing

Contributions are welcome! See CONTRIBUTING.md for guidelines.

License

MIT

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

ts2net-0.7.0-cp313-cp313-win_amd64.whl (549.5 kB view details)

Uploaded CPython 3.13Windows x86-64

ts2net-0.7.0-cp313-cp313-manylinux_2_24_x86_64.whl (655.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64

ts2net-0.7.0-cp313-cp313-macosx_11_0_arm64.whl (450.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

ts2net-0.7.0-cp312-cp312-win_amd64.whl (549.5 kB view details)

Uploaded CPython 3.12Windows x86-64

ts2net-0.7.0-cp312-cp312-manylinux_2_24_x86_64.whl (655.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64

ts2net-0.7.0-cp312-cp312-macosx_11_0_arm64.whl (450.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

Details for the file ts2net-0.7.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: ts2net-0.7.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 549.5 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ts2net-0.7.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 516b6f2621983beb2ccc087a623b2c601ed31bf2d121b734eaea105f9b6adaf8
MD5 72de3576f5fa898645bc261dfac6c8ac
BLAKE2b-256 a1d0500d7c9fb80d33bb7b5b44032b97567fbf90076ee0a60225d0c1885bb64b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ts2net-0.7.0-cp313-cp313-win_amd64.whl:

Publisher: publish-pypi.yml on kylejones200/ts2net

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

File details

Details for the file ts2net-0.7.0-cp313-cp313-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for ts2net-0.7.0-cp313-cp313-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 cca09e1d9a96393591a119c845dc152b00c4a5ee910d39767f6678d23ad5789b
MD5 095a7a24f14f042c96b0ce08b8d20e11
BLAKE2b-256 9404b6c68e6db9f598b50ea1abfa4a18a4bd60b4bf02241d100ad6bc5a582603

See more details on using hashes here.

Provenance

The following attestation bundles were made for ts2net-0.7.0-cp313-cp313-manylinux_2_24_x86_64.whl:

Publisher: publish-pypi.yml on kylejones200/ts2net

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

File details

Details for the file ts2net-0.7.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ts2net-0.7.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9ecc2af30d7131cceb1d498304322c4c6ac1fd3047b523506c627b573992c749
MD5 30b735b73b46dcf27b8f17d2cf6784a3
BLAKE2b-256 d81163f4f92b59f125be30b0e914d3f194bd829ffbdb81b10b9b83257ae0fb09

See more details on using hashes here.

Provenance

The following attestation bundles were made for ts2net-0.7.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on kylejones200/ts2net

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

File details

Details for the file ts2net-0.7.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ts2net-0.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 549.5 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ts2net-0.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 93d19671f311104059f20c451df9cb6d4fd33c5dec679d4deee4987367260e39
MD5 53a7cd1b4f7639466503da88cf2d21b9
BLAKE2b-256 5cfed866bba171c449c310aa244de202f79677ae2ea878ad8d52c554cb5e1e21

See more details on using hashes here.

Provenance

The following attestation bundles were made for ts2net-0.7.0-cp312-cp312-win_amd64.whl:

Publisher: publish-pypi.yml on kylejones200/ts2net

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

File details

Details for the file ts2net-0.7.0-cp312-cp312-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for ts2net-0.7.0-cp312-cp312-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 f4e5bd74a16493f33fe916910bc74a4189f3d0bc436742a521bdd8d5fd2784b3
MD5 f91f40f355edbdbd4a2e42e7f1b7f635
BLAKE2b-256 c6652a8ee8fb2e6cc8d16cc68de672e9ff619242f45930628bd31f95d34ab42d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ts2net-0.7.0-cp312-cp312-manylinux_2_24_x86_64.whl:

Publisher: publish-pypi.yml on kylejones200/ts2net

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

File details

Details for the file ts2net-0.7.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ts2net-0.7.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ed8a409fa6298b68e7cdf3a601c4677548df88151f1bf9f595568135636a9f63
MD5 f7012f763444129b64e2a276ea49981d
BLAKE2b-256 9a4df532ce999ff0f057a486bc26b481b5453dd6a72dc1043cbc7d8c477c5c8f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ts2net-0.7.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on kylejones200/ts2net

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 Pingdom Monitoring Sentry Error logging StatusPage Status page