1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
from __future__ import annotations
from typing import Iterable, Sequence
class NarwhalsError(ValueError):
"""Base class for all Narwhals exceptions."""
class FormattedKeyError(KeyError):
"""KeyError with formatted error message.
Python's `KeyError` has special casing around formatting
(see https://bugs.python.org/issue2651). Use this class when the error
message has newlines and other special format characters.
Needed by https://github.com/tensorflow/tensorflow/issues/36857.
"""
def __init__(self, message: str) -> None:
self.message = message
def __str__(self) -> str:
return self.message
class ColumnNotFoundError(FormattedKeyError, NarwhalsError):
"""Exception raised when column name isn't present."""
def __init__(self, message: str) -> None:
self.message = message
super().__init__(self.message)
@classmethod
def from_missing_and_available_column_names(
cls, missing_columns: Iterable[str], available_columns: Sequence[str], /
) -> ColumnNotFoundError:
message = (
f"The following columns were not found: {sorted(missing_columns)}"
f"\n\nHint: Did you mean one of these columns: {list(available_columns)}?"
)
return ColumnNotFoundError(message)
class ComputeError(NarwhalsError):
"""Exception raised when the underlying computation could not be evaluated."""
class ShapeError(NarwhalsError):
"""Exception raised when trying to perform operations on data structures with incompatible shapes."""
class MultiOutputExpressionError(NarwhalsError):
"""Exception raised when using multi-output expression in unsupported context."""
class DuplicateError(NarwhalsError):
"""Exception when duplicate column names are encountered."""
class InvalidOperationError(NarwhalsError):
"""Exception raised during invalid operations."""
class InvalidIntoExprError(TypeError, NarwhalsError):
"""Exception raised when object can't be converted to expression."""
def __init__(self, message: str) -> None:
self.message = message
super().__init__(self.message)
@classmethod
def from_invalid_type(cls: type, invalid_type: type) -> InvalidIntoExprError:
message = (
f"Expected an object which can be converted into an expression, got {invalid_type}\n\n"
"Hint:\n"
"- if you were trying to select a column which does not have a string\n"
" column name, then you should explicitly use `nw.col`.\n"
" For example, `df.select(nw.col(0))` if you have a column named `0`.\n"
"- if you were trying to create a new literal column, then you \n"
" should explicitly use `nw.lit`.\n"
" For example, `df.select(nw.lit(0))` if you want to create a new\n"
" column with literal value `0`."
)
return InvalidIntoExprError(message)
class AnonymousExprError(NarwhalsError): # pragma: no cover
"""Exception raised when trying to perform operations on anonymous expressions."""
def __init__(self, message: str) -> None:
self.message = message
super().__init__(self.message)
@classmethod
def from_expr_name(cls: type, expr_name: str) -> AnonymousExprError:
message = (
f"Anonymous expressions are not supported in `{expr_name}`.\n"
"Instead of `nw.all()`, try using a named expression, such as "
"`nw.col('a', 'b')`"
)
return AnonymousExprError(message)
class OrderDependentExprError(NarwhalsError):
"""Exception raised when trying to use an order-dependent expressions with LazyFrames."""
def __init__(self, message: str) -> None:
self.message = message
super().__init__(self.message)
class LengthChangingExprError(NarwhalsError):
"""Exception raised when trying to use an expression which changes length with LazyFrames."""
def __init__(self, message: str) -> None:
self.message = message
super().__init__(self.message)
class UnsupportedDTypeError(NarwhalsError):
"""Exception raised when trying to convert to a DType which is not supported by the given backend."""
class NarwhalsUnstableWarning(UserWarning):
"""Warning issued when a method or function is considered unstable in the stable api."""
|