Skip to content

Releases: RayforceDB/rayforce-py

2.1.0

Choose a tag to compare

@protocolstardust protocolstardust released this 23 Jun 09:16

New Features

  • Restored WebSocket support. The WSClient / WSServer classes and the rayforce.network.websocket module are back (they were removed in 2.0.0). The server is an async Python implementation, built on the websockets library, that evaluates Rayforce queries in-process. Install with the websocket extra (pip install rayforce-py[websocket]). See the WebSocket guide.
  • Added the PyArrow plugin. from_arrow() converts a pyarrow.Table into a Rayforce Table, mirroring the Polars / Pandas plugins. A column of strings maps to String by default, or to Symbol via the opt-in strings_as_symbols=True flag. Requires the parquet extra (pip install rayforce-py[parquet]).

Bug fixes

  • Fixed mis-scaled Parquet timestamps. load_parquet() now reads microsecond- and millisecond-precision timestamp columns at the correct precision; previously non-nanosecond units were mis-scaled. Parquet reading now shares the PyArrow plugin's conversion path.

2026-06-22 | 🔗 PyPI | 🔗 GitHub

2.0.2

Choose a tag to compare

@protocolstardust protocolstardust released this 18 Jun 20:38

2.0.2

New Features

  • Added the ungroup verb. Table.ungroup() flattens nested LIST columns
    into row form — each list cell expands to one row, with atom columns replicated
    per element (the inverse of a by-grouping). Also available as a deferred step
    on select queries: t.select(...).by(...).ungroup().execute().

Bug fixes

  • Fixed a bug when the Timestamp type didn't account for TZ offset when using from_csv handler

2026-06-18 | 🔗 PyPI | 🔗 GitHub

2.0.1

Choose a tag to compare

@protocolstardust protocolstardust released this 18 Jun 20:38

Bug Fixes

Fix Type error when attempting to insert/upsert into an empty table.

2026-06-17 | 🔗 PyPI | 🔗 GitHub

2.0.0

Choose a tag to compare

@protocolstardust protocolstardust released this 12 Jun 15:33

First release against the Rayforce v2 C core. This is a major release with
breaking changes to the type system, the network layer, and the plugin surface.
The 1.0.x line continues to be maintained against the v1 core.

Breaking Changes

  • Built against the Rayforce v2 C core. The bundled engine, build pipeline
    (make app), and binary protocol all target v2. Code written against the v1
    core may need updates — see the items below.

  • Removed the C8 / Char type. v2 has no standalone character type; a
    single character is now a length-1 String.
    C8 is no longer importable from rayforce.

  • Removed WebSocket support. The WSClient / WSServer classes and the
    entire rayforce.network.websocket module have been removed. Use
    TCP IPC (TCPClient / TCPServer) for networked queries.

  • Renamed the KDB+ plugin. rayforce.plugins.raykx is now
    rayforce.plugins.kdb; import KDBEngine
    from the new path.

  • Renumbered scalar type codes to match the v2 core. Atoms use the negative
    of these values (see the Data Types overview):

    Type v1 code v2 code
    Symbol 6 12
    F64 10 7
    Date 7 8
    Time 8 9
    Timestamp 9 10
    String 13
    F32 6

New Features

  • Added the F32 (32-bit floating-point) type. Arithmetic on F32 promotes
    to F64.
  • Added the RayforceLimitError exception class (core EC_LIMIT).

Notes

  • String is now a first-class type (no longer modeled as a vector of C8).

2026-06-12 | 🔗 PyPI | 🔗 GitHub

2.0.0a1

2.0.0a1 Pre-release
Pre-release

Choose a tag to compare

@protocolstardust protocolstardust released this 28 Apr 20:43

First alpha against the Rayforce v2 C core. The 1.0.x line continues to be maintained against v1 core.

2026-04-28 | 🔗 PyPI | 🔗 GitHub

1.0.0

Choose a tag to compare

@protocolstardust protocolstardust released this 20 Apr 12:38
  • Project has came out of beta. Stable release

2026-04-20 | 🔗 PyPI | 🔗 GitHub

0.6.3

Choose a tag to compare

@protocolstardust protocolstardust released this 15 Apr 12:02

Bug Fixes

  • Integer null sentinel handling: I16, I32, and I64 scalars now correctly recognize null sentinels (0Nh, 0Ni, 0Nj) and return None from to_python(). This fixes null comparisons in operations where unmatched rows returned raw sentinel values (e.g., -9223372036854775808) instead of None.

2026-04-15 | 🔗 PyPI | 🔗 GitHub

0.6.2

Choose a tag to compare

@protocolstardust protocolstardust released this 13 Apr 14:07

Bug Fixes

  • Now library passes correct contiguous numpy arrays within from_numpy function
  • F64 vectors can now be used in median calculations

2026-03-15 | 🔗 PyPI | 🔗 GitHub

0.6.1

Choose a tag to compare

@protocolstardust protocolstardust released this 03 Mar 14:18

New Features

  • Fancy indexing for Tables: Table.__getitem__ now supports multiple indexing modes beyond column access:

    • Expression filter: table[Column("age") > 35] — filter rows by condition. Supports & (and) and | (or) for combining expressions.
    • Integer row access: table[0], table[-1] — access a single row by index, returns a Dict.
    • Slicing: table[1:3], table[:5], table[-2:] — row slicing backed by the C-level TAKE operation.
    • Index list: table[[0, 2, 5]] — select specific rows by position.
  • Vector.from_numpy() auto-widening: Unsupported numpy dtypes are now automatically widened to the nearest supported type: float32/float16F64, int8I16, uint16I32, uint32I64.

  • Vector.from_numpy() bytes and UUID support: Byte string arrays (dtype='S') are automatically decoded to Symbol vectors. Object arrays of uuid.UUID values are detected and converted to GUID vectors.

  • NaT preservation: NaT (Not-a-Time) values in numpy datetime64 and timedelta64 arrays now survive round-trips through Vector.from_numpy() and Vector.to_numpy().

Bug Fixes

  • Table.to_numpy() with Timestamp columns: Fixed DTypePromotionError when calling to_numpy() on tables containing a mix of incompatible column types (e.g., integers, strings, and timestamps). Mixed-type tables now gracefully fall back to object dtype.

  • Filtering F64 by distinct - fixed

  • Vector.__getitem__ for U8 vectors: Fixed U8 vector elements being returned as B8(True/False) instead of U8(value). Both types are 1-byte, causing the C-level at_idx to misinterpret the type.

  • Vector.from_numpy() with explicit ray_type for temporal arrays: Fixed ValueError: cannot include dtype 'M' in a buffer when passing ray_type=Timestamp, ray_type=Date, or ray_type=Time with datetime64/timedelta64 arrays.

2026-03-03 | 🔗 PyPI | 🔗 GitHub

0.6.0

Choose a tag to compare

@protocolstardust protocolstardust released this 21 Feb 14:42

New Features

  • Vector.from_numpy() classmethod: Create vectors from NumPy arrays via bulk memory copy. Supports numeric types (int16, int32, int64, float64, uint8, bool), string arrays, and temporal types (datetime64Timestamp/Date, timedelta64Time). Handles epoch adjustment between NumPy (1970-01-01) and Rayforce (2000-01-01) automatically.

  • Vector.to_numpy() method: Export vector data to a NumPy array via bulk memory copy.

  • Vector.to_list() method: Export vector data to a Python list via bulk memory copy from the underlying C buffer.

  • Table.from_dict() classmethod: Create tables from a dictionary of NumPy arrays, Python lists, or Vectors.

  • Table.to_dict() method: Export table data to a Python dictionary of lists via bulk memory copy.

  • Table.to_numpy() method: Export table data to a 2D NumPy array via bulk memory copy.

  • select("*", col=value) fix: Using "*" with computed columns in select() now correctly preserves all existing columns

Dependencies

  • NumPy (>=2.0.0) is now a required dependency.

2026-02-21 | 🔗 PyPI | 🔗 GitHub