Skip to content

Commit 2e8db11

Browse files
authored
Merge pull request #10 from raisadz/increase-coverage
Increase coverage for narwhals.dataframe
2 parents 421494c + e8cf9e2 commit 2e8db11

File tree

2 files changed

+71
-20
lines changed

2 files changed

+71
-20
lines changed

tests/test_common.py

+55-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from typing import Any
44

5+
import numpy as np
56
import pandas as pd
67
import polars as pl
78
import pytest
@@ -11,11 +12,12 @@
1112

1213
df_pandas = pd.DataFrame({"a": [1, 3, 2], "b": [4, 4, 6], "z": [7.0, 8, 9]})
1314
df_polars = pl.DataFrame({"a": [1, 3, 2], "b": [4, 4, 6], "z": [7.0, 8, 9]})
15+
df_lazy = pl.LazyFrame({"a": [1, 3, 2], "b": [4, 4, 6], "z": [7.0, 8, 9]})
1416

1517

1618
@pytest.mark.parametrize(
1719
"df_raw",
18-
[df_pandas, df_polars],
20+
[df_pandas, df_polars, df_lazy],
1921
)
2022
def test_sort(df_raw: Any) -> None:
2123
df = nw.DataFrame(df_raw)
@@ -31,7 +33,7 @@ def test_sort(df_raw: Any) -> None:
3133

3234
@pytest.mark.parametrize(
3335
"df_raw",
34-
[df_pandas, df_polars],
36+
[df_pandas, df_polars, df_lazy],
3537
)
3638
def test_filter(df_raw: Any) -> None:
3739
df = nw.DataFrame(df_raw)
@@ -43,7 +45,7 @@ def test_filter(df_raw: Any) -> None:
4345

4446
@pytest.mark.parametrize(
4547
"df_raw",
46-
[df_pandas, df_polars],
48+
[df_pandas, df_polars, df_lazy],
4749
)
4850
def test_add(df_raw: Any) -> None:
4951
df = nw.DataFrame(df_raw)
@@ -64,7 +66,7 @@ def test_add(df_raw: Any) -> None:
6466

6567
@pytest.mark.parametrize(
6668
"df_raw",
67-
[df_pandas, df_polars],
69+
[df_pandas, df_polars, df_lazy],
6870
)
6971
def test_double(df_raw: Any) -> None:
7072
df = nw.DataFrame(df_raw)
@@ -74,7 +76,7 @@ def test_double(df_raw: Any) -> None:
7476
compare_dicts(result_native, expected)
7577

7678

77-
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars])
79+
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars, df_lazy])
7880
def test_sumh(df_raw: Any) -> None:
7981
df = nw.DataFrame(df_raw)
8082
result = df.with_columns(horizonal_sum=nw.sum_horizontal(nw.col("a"), nw.col("b")))
@@ -88,7 +90,7 @@ def test_sumh(df_raw: Any) -> None:
8890
compare_dicts(result_native, expected)
8991

9092

91-
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars])
93+
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars, df_lazy])
9294
def test_sumh_literal(df_raw: Any) -> None:
9395
df = nw.DataFrame(df_raw)
9496
result = df.with_columns(horizonal_sum=nw.sum_horizontal("a", nw.col("b")))
@@ -102,7 +104,7 @@ def test_sumh_literal(df_raw: Any) -> None:
102104
compare_dicts(result_native, expected)
103105

104106

105-
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars])
107+
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars, df_lazy])
106108
def test_sum_all(df_raw: Any) -> None:
107109
df = nw.DataFrame(df_raw)
108110
result = df.select(nw.all().sum())
@@ -111,10 +113,55 @@ def test_sum_all(df_raw: Any) -> None:
111113
compare_dicts(result_native, expected)
112114

113115

114-
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars])
116+
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars, df_lazy])
115117
def test_double_selected(df_raw: Any) -> None:
116118
df = nw.DataFrame(df_raw)
117119
result = df.select(nw.col("a", "b") * 2)
118120
result_native = nw.to_native(result)
119121
expected = {"a": [2, 6, 4], "b": [8, 8, 12]}
120122
compare_dicts(result_native, expected)
123+
124+
125+
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars, df_lazy])
126+
def test_rename(df_raw: Any) -> None:
127+
df = nw.DataFrame(df_raw)
128+
result = df.rename({"a": "x", "b": "y"})
129+
result_native = nw.to_native(result)
130+
expected = {"x": [1, 3, 2], "y": [4, 4, 6], "z": [7.0, 8, 9]}
131+
compare_dicts(result_native, expected)
132+
133+
134+
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars, df_lazy])
135+
def test_join(df_raw: Any) -> None:
136+
df = nw.DataFrame(df_raw)
137+
df_right = df.rename({"z": "z_right"})
138+
result = df.join(df_right, left_on=["a", "b"], right_on=["a", "b"], how="inner")
139+
result_native = nw.to_native(result)
140+
expected = {"a": [1, 3, 2], "b": [4, 4, 6], "z": [7.0, 8, 9], "z_right": [7.0, 8, 9]}
141+
compare_dicts(result_native, expected)
142+
143+
144+
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars, df_lazy])
145+
def test_schema(df_raw: Any) -> None:
146+
df = nw.DataFrame(df_raw)
147+
result = df.schema
148+
expected = {"a": nw.dtypes.Int64, "b": nw.dtypes.Int64, "z": nw.dtypes.Float64}
149+
assert result == expected
150+
151+
152+
@pytest.mark.parametrize("df_raw", [df_pandas, df_polars, df_lazy])
153+
def test_columns(df_raw: Any) -> None:
154+
df = nw.DataFrame(df_raw)
155+
result = df.columns
156+
expected = ["a", "b", "z"]
157+
assert len(result) == len(expected)
158+
assert all(x == y for x, y in zip(result, expected))
159+
160+
161+
def test_accepted_dataframes() -> None:
162+
array = np.array([[0, 4.0], [2, 5]])
163+
with pytest.raises(
164+
TypeError,
165+
match="Expected pandas or Polars dataframe or lazyframe, got: <class 'numpy.ndarray'>",
166+
):
167+
nw.DataFrame(array)

tests/utils.py

+16-12
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1-
from __future__ import annotations
2-
3-
from typing import Any
4-
5-
6-
def compare_dicts(result: dict[str, Any], expected: dict[str, Any]) -> None:
7-
for key in expected:
8-
for lhs, rhs in zip(result[key], expected[key]):
9-
if isinstance(lhs, float):
10-
assert abs(lhs - rhs) < 1e-6
11-
else:
12-
assert lhs == rhs
1+
from __future__ import annotations
2+
3+
from typing import Any
4+
5+
import polars as pl
6+
7+
8+
def compare_dicts(result: dict[str, Any], expected: dict[str, Any]) -> None:
9+
if isinstance(result, pl.LazyFrame):
10+
result = result.collect()
11+
for key in expected:
12+
for lhs, rhs in zip(result[key], expected[key]):
13+
if isinstance(lhs, float):
14+
assert abs(lhs - rhs) < 1e-6
15+
else:
16+
assert lhs == rhs

0 commit comments

Comments
 (0)