Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
a23077e
refactor(expr-ir): Make `arrow.functions.py` a package
dangotbanned Dec 31, 2025
14c4fec
refactor(expr-ir): Split `_dtypes`
dangotbanned Dec 31, 2025
3e99ee6
refactor(expr-ir): Split `_categorical`
dangotbanned Dec 31, 2025
e5e7158
refactor(expr-ir): Split `_construction`
dangotbanned Dec 31, 2025
154029d
refactor(expr-ir): Split `_ranges`
dangotbanned Dec 31, 2025
a2b3f91
docs: covert enough for me to miss!
dangotbanned Jan 1, 2026
58759f7
refactor: Split `_repeat`
dangotbanned Jan 1, 2026
c442641
refactor(expr-ir): Split `_bin_op`, `_boolean`, `_common`
dangotbanned Jan 1, 2026
05f343e
refactor(expr-ir): Finish migrating to `_boolean`
dangotbanned Jan 1, 2026
06b42b8
refactor: Just use `flatten` instead
dangotbanned Jan 1, 2026
23a4e3e
refactor(expr-ir): Split `_struct`
dangotbanned Jan 1, 2026
be1f23f
refactor(expr-ir): Split `_strings`
dangotbanned Jan 1, 2026
bd56eaa
refactor: Move `concat_tables` re-export
dangotbanned Jan 1, 2026
cf17cb9
refactor: Split `_cumulative`
dangotbanned Jan 1, 2026
2a9de00
refactor(expr-ir): Split `_multiplex`
dangotbanned Jan 1, 2026
b5edd39
update notes
dangotbanned Jan 1, 2026
042cf1f
chore: Add some missing exports
dangotbanned Jan 1, 2026
040d9af
refactor: Align dtype names with polars
dangotbanned Jan 1, 2026
81838fb
refactor(expr-ir): Split `_sort`
dangotbanned Jan 1, 2026
e34f0c3
typo
dangotbanned Jan 1, 2026
24c8687
refactor(expr-ir): Split `_lists`
dangotbanned Jan 1, 2026
c769732
refactor(expr-ir): Split `_aggregation`
dangotbanned Jan 1, 2026
4afee53
refactor(expr-ir): Split `_arithmetic`, `_horizontal`, `_round`
dangotbanned Jan 1, 2026
5328d17
refactor(expr-ir): Split `_vector`
dangotbanned Jan 2, 2026
0cd4e06
distribute the stragglers
dangotbanned Jan 2, 2026
7c536bb
refactor: Un-suffix export modules
dangotbanned Jan 2, 2026
df28b38
refactor: Add `arrow.functions.__all__`
dangotbanned Jan 2, 2026
1a2ef02
refactor: `any_` , `all_` -> `any`, `all`
dangotbanned Jan 2, 2026
e2cbf84
refactor: `group_by.dictionary_encode` -> `cat.dictionary_encode`
dangotbanned Jan 2, 2026
d733519
oops missed one!
dangotbanned Jan 2, 2026
fcba9ea
docs: `cat.categories`
dangotbanned Jan 2, 2026
ef4451f
docs(typing): Highlight which arrays `dictionary_encode` supports
dangotbanned Jan 2, 2026
5875a49
docs: Note docs improved blocked by (#3204)
dangotbanned Jan 2, 2026
0d8bc1a
`cat.dictionary_encode` -> `cat.encode` + docs
dangotbanned Jan 2, 2026
a395a6d
chore: polish `_dtypes`
dangotbanned Jan 2, 2026
ecdb86a
refactor(expr-ir): Farewell, `_common.py`
dangotbanned Jan 2, 2026
cf1753d
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jan 2, 2026
1e5e02d
docs: `is_between`, `not_`
dangotbanned Jan 2, 2026
db584e2
refactor: Add `meta.call`, speedrun cleanup typing
dangotbanned Jan 2, 2026
bc83fd4
chore: Add `_vector` exports
dangotbanned Jan 2, 2026
00c877c
docs: Add short `_bin_op` docstrings
dangotbanned Jan 2, 2026
e3d137a
docs: Add short `_arithmetic` docstrings
dangotbanned Jan 3, 2026
f806d96
chore(typing): Make `_arithmetic` more complete
dangotbanned Jan 3, 2026
05e9db2
Merge branch 'oh-nodes' into expr-ir/arrow-functions-split
dangotbanned Jan 3, 2026
05cd84c
docs: Add `_vector` docs
dangotbanned Jan 3, 2026
46ff509
chore: Support `pa.Array` in `shift`, `rank`
dangotbanned Jan 3, 2026
b641c39
docs: Add `_round` docs
dangotbanned Jan 3, 2026
a34fdcb
docs: Finish `_sort` docs
dangotbanned Jan 3, 2026
0dfa55c
chore: Finish `_construction`
dangotbanned Jan 3, 2026
d1a8b7b
docs: Add short `_ranges` docs
dangotbanned Jan 3, 2026
b31abd1
docs: Add `_aggregation` docs
dangotbanned Jan 3, 2026
ebd26ce
chore: Finish `_multiplex`
dangotbanned Jan 3, 2026
f81a53b
refactor: Reorder `into_struct` parameters
dangotbanned Jan 3, 2026
cd91cec
nuke those overloads
dangotbanned Jan 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions narwhals/_plan/arrow/acero.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import pyarrow.compute as pc # ignore-banned-import
from pyarrow.acero import Declaration as Decl

from narwhals._plan.arrow.guards import is_expression
from narwhals._plan.common import ensure_list_str, temp
from narwhals._plan.typing import NonCrossJoinStrategy, OneOrSeq
from narwhals._utils import check_column_names_are_unique
Expand All @@ -40,7 +41,7 @@
Sequence,
)

from typing_extensions import TypeAlias, TypeIs
from typing_extensions import TypeAlias

from narwhals._arrow.typing import ( # type: ignore[attr-defined]
AggregateOptions as _AggregateOptions,
Expand Down Expand Up @@ -117,12 +118,8 @@ def cols_iter(names: Iterable[str], /) -> Iterator[Expr]:
yield col(name)


def _is_expr(obj: Any) -> TypeIs[pc.Expression]:
return isinstance(obj, pc.Expression)


def _parse_into_expr(into: IntoExpr, /, *, str_as_lit: bool = False) -> Expr:
if _is_expr(into):
if is_expression(into):
return into
if isinstance(into, str) and not str_as_lit:
return col(into)
Expand Down Expand Up @@ -223,7 +220,7 @@ def project(**named_exprs: IntoExpr) -> Decl:


def _add_column(native: pa.Table, index: int, name: str, values: IntoExpr) -> Decl:
column = values if _is_expr(values) else lit(values)
column = values if is_expression(values) else lit(values)
schema = native.schema
schema_names = schema.names
if index == 0:
Expand Down Expand Up @@ -323,8 +320,8 @@ def _join_asof_strategy_to_tolerance(
if strategy == "nearest":
msg = "Only 'backward' and 'forward' strategies are currently supported for `pyarrow`"
raise NotImplementedError(msg)
lower = fn.min_horizontal(fn.min_(left_on), fn.min_(right_on))
upper = fn.max_horizontal(fn.max_(left_on), fn.max_(right_on))
lower = fn.min_horizontal(fn.min(left_on), fn.min(right_on))
upper = fn.max_horizontal(fn.max(left_on), fn.max(right_on))
scalar = fn.sub(lower, upper) if strategy == "backward" else fn.sub(upper, lower)
tolerance: int = fn.cast(scalar, fn.I64).as_py()
return tolerance
Expand Down
11 changes: 3 additions & 8 deletions narwhals/_plan/arrow/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,22 @@

from __future__ import annotations

from typing import TYPE_CHECKING, Any, ClassVar, Generic
from typing import TYPE_CHECKING, ClassVar, Generic

from narwhals._plan.arrow import compat
from narwhals._plan.arrow.functions import random_indices
from narwhals._plan.arrow.guards import is_series
from narwhals._typing_compat import TypeVar
from narwhals._utils import Implementation, Version, _StoresNative

if TYPE_CHECKING:
import pyarrow as pa
from typing_extensions import Self, TypeIs
from typing_extensions import Self

from narwhals._plan.arrow.namespace import ArrowNamespace
from narwhals._plan.arrow.typing import ChunkedArrayAny, Indices


def is_series(obj: Any) -> TypeIs[_StoresNative[ChunkedArrayAny]]:
from narwhals._plan.arrow.series import ArrowSeries

return isinstance(obj, ArrowSeries)


NativeT = TypeVar("NativeT", "pa.Table", "ChunkedArrayAny")


Expand Down
10 changes: 7 additions & 3 deletions narwhals/_plan/arrow/dataframe.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@
from narwhals._plan.arrow import acero, compat, functions as fn
from narwhals._plan.arrow.common import ArrowFrameSeries as FrameSeries
from narwhals._plan.arrow.expr import ArrowExpr as Expr, ArrowScalar as Scalar
from narwhals._plan.arrow.group_by import ArrowGroupBy as GroupBy, partition_by
from narwhals._plan.arrow.group_by import (
ArrowGroupBy as GroupBy,
partition_by,
unique_keep_boolean_length_preserving,
)
from narwhals._plan.arrow.pivot import pivot_table
from narwhals._plan.arrow.series import ArrowSeries as Series
from narwhals._plan.common import temp
Expand Down Expand Up @@ -142,7 +146,7 @@ def _unique(
[`unsort_indices`]: https://github.com/narwhals-dev/narwhals/blob/9b9122b4ab38a6aebe2f09c29ad0f6191952a7a7/narwhals/_plan/arrow/functions.py#L1666-L1697
"""
subset = tuple(subset or self.columns)
into_column_agg, mask = fn.unique_keep_boolean_length_preserving(keep)
into_column_agg, mask = unique_keep_boolean_length_preserving(keep)
idx_name = temp.column_name(self.columns)
df = self.select_names(*set(subset).union(order_by))
if order_by:
Expand Down Expand Up @@ -227,7 +231,7 @@ def to_struct(self, name: str = "") -> Series:
else:
struct = fn.chunked_array([], pa.struct(native.schema))
else:
struct = fn.struct(native.column_names, native.columns)
struct = fn.struct.into_struct(native.columns, native.column_names)
return Series.from_native(struct, name, version=self.version)

def get_column(self, name: str) -> Series:
Expand Down
Loading
Loading