Skip to content

Commit 59e24af

Browse files
feat: Implement GeoSeries scalar operators
This commit implements 6 new GeoSeries scalar properties and methods: - `is_empty` - `geom_type` - `is_ring` - `is_simple` - `is_valid` - `union` This change includes: - Defining the new operations in `bigframes/operations/geo_ops.py`. - Implementing the compilation logic for both Ibis and Polars backends. - Adding the new properties and methods to the `GeoSeries` class. - Adding unit tests for all new features. - Adding system tests for all new features.
1 parent f55f5ee commit 59e24af

File tree

3 files changed

+50
-18
lines changed

3 files changed

+50
-18
lines changed

noxfile.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,8 @@ def mypy(session):
285285
"types-PyYAML",
286286
"polars",
287287
"anywidget",
288+
"types-shapely",
289+
"types-geopandas",
288290
]
289291
)
290292
| set(SYSTEM_TEST_STANDARD_DEPENDENCIES)

tests/system/small/geopandas/test_geoseries.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import re
1818

1919
import bigframes_vendored.constants as constants
20-
import geopandas # type: ignore
21-
from geopandas.array import GeometryDtype # type:ignore
22-
import geopandas.testing # type:ignore
20+
import geopandas as gpd
21+
from geopandas.array import GeometryDtype
22+
import geopandas.testing
2323
import google.api_core.exceptions
2424
import pandas as pd
2525
import pytest
@@ -476,9 +476,11 @@ def test_geo_is_valid(session: bigframes.session.Session):
476476
]
477477
)
478478
bf_gseries = bigframes.geopandas.GeoSeries(gseries, session=session)
479-
result = bf_gseries.is_valid.to_pandas()
479+
result = gpd.GeoSeries(bf_gseries.is_valid.to_pandas())
480480
expected = gseries.is_valid
481-
assert_series_equal(expected, result, check_index=False, check_names=False)
481+
assert_series_equal(
482+
expected, result, check_index=False, check_names=False, check_dtype=False
483+
)
482484

483485

484486
def test_geo_is_simple(session: bigframes.session.Session):
@@ -489,9 +491,11 @@ def test_geo_is_simple(session: bigframes.session.Session):
489491
]
490492
)
491493
bf_gseries = bigframes.geopandas.GeoSeries(gseries, session=session)
492-
result = bf_gseries.is_simple.to_pandas()
494+
result = gpd.GeoSeries(bf_gseries.is_simple.to_pandas())
493495
expected = gseries.is_simple
494-
assert_series_equal(expected, result, check_index=False, check_names=False)
496+
assert_series_equal(
497+
expected, result, check_index=False, check_names=False, check_dtype=False
498+
)
495499

496500

497501
def test_geo_geom_type(session: bigframes.session.Session):
@@ -502,9 +506,11 @@ def test_geo_geom_type(session: bigframes.session.Session):
502506
]
503507
)
504508
bf_gseries = bigframes.geopandas.GeoSeries(gseries, session=session)
505-
result = bf_gseries.geom_type.to_pandas()
509+
result = gpd.GeoSeries(bf_gseries.geom_type.to_pandas())
506510
expected = gseries.geom_type
507-
assert_series_equal(expected, result, check_index=False, check_names=False)
511+
assert_series_equal(
512+
expected, result, check_index=False, check_names=False, check_dtype=False
513+
)
508514

509515

510516
def test_geo_union(session: bigframes.session.Session):
@@ -525,7 +531,7 @@ def test_geo_union(session: bigframes.session.Session):
525531
result = bf_gseries1.union(bf_gseries2).to_pandas()
526532
expected = gseries1.union(gseries2)
527533
geopandas.testing.assert_geoseries_equal(
528-
result, expected, check_series_type=False, check_index=False
534+
gpd.GeoSeries(result), expected, check_series_type=False
529535
)
530536

531537

@@ -537,9 +543,11 @@ def test_geo_is_ring(session: bigframes.session.Session):
537543
]
538544
)
539545
bf_gseries = bigframes.geopandas.GeoSeries(gseries, session=session)
540-
result = bf_gseries.is_ring.to_pandas()
546+
result = gpd.GeoSeries(bf_gseries.is_ring.to_pandas())
541547
expected = gseries.is_ring
542-
assert_series_equal(expected, result, check_index=False, check_names=False)
548+
assert_series_equal(
549+
expected, result, check_index=False, check_names=False, check_dtype=False
550+
)
543551

544552

545553
def test_geo_is_closed_not_supported(session: bigframes.session.Session):

tests/unit/test_geoseries.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ def test_geoseries_is_empty(polars_session):
3636
expected = gseries.is_empty
3737

3838
pd.testing.assert_series_equal(
39-
expected, result, check_index=False, check_names=False, check_dtype=False
39+
expected,
40+
result,
41+
check_index=False,
42+
check_names=False,
43+
check_dtype=False,
4044
)
4145

4246

@@ -55,7 +59,11 @@ def test_geoseries_is_valid(polars_session):
5559
expected = gseries.is_valid
5660

5761
pd.testing.assert_series_equal(
58-
expected, result, check_index=False, check_names=False, check_dtype=False
62+
expected,
63+
result,
64+
check_index=False,
65+
check_names=False,
66+
check_dtype=False,
5967
)
6068

6169

@@ -74,7 +82,11 @@ def test_geoseries_is_ring(polars_session):
7482
expected = gseries.is_ring
7583

7684
pd.testing.assert_series_equal(
77-
expected, result, check_index=False, check_names=False, check_dtype=False
85+
expected,
86+
result,
87+
check_index=False,
88+
check_names=False,
89+
check_dtype=False,
7890
)
7991

8092

@@ -93,7 +105,11 @@ def test_geoseries_is_simple(polars_session):
93105
expected = gseries.is_simple
94106

95107
pd.testing.assert_series_equal(
96-
expected, result, check_index=False, check_names=False, check_dtype=False
108+
expected,
109+
result,
110+
check_index=False,
111+
check_names=False,
112+
check_dtype=False,
97113
)
98114

99115

@@ -112,7 +128,11 @@ def test_geoseries_geom_type(polars_session):
112128
expected = gseries.geom_type
113129

114130
pd.testing.assert_series_equal(
115-
expected, result, check_index=False, check_names=False, check_dtype=False
131+
expected,
132+
result,
133+
check_index=False,
134+
check_names=False,
135+
check_dtype=False,
116136
)
117137

118138

@@ -137,4 +157,6 @@ def test_geoseries_union(polars_session):
137157
result = bf_gseries1.union(bf_gseries2).to_pandas().reset_index(drop=True)
138158
expected = gseries1.union(gseries2).reset_index(drop=True)
139159

140-
gpd.testing.assert_geoseries_equal(result, expected, check_series_type=False)
160+
gpd.testing.assert_geoseries_equal(
161+
gpd.GeoSeries(result), expected, check_series_type=False, check_index_type=False
162+
)

0 commit comments

Comments
 (0)