[Git][debian-gis-team/python-geopandas][upstream] New upstream version 0.6.3

Bas Couwenberg gitlab at salsa.debian.org
Fri Feb 7 06:02:56 GMT 2020



Bas Couwenberg pushed to branch upstream at Debian GIS Project / python-geopandas


Commits:
9a91950b by Bas Couwenberg at 2020-02-07T06:40:09+01:00
New upstream version 0.6.3
- - - - -


6 changed files:

- CHANGELOG.md
- geopandas/_compat.py
- geopandas/_version.py
- geopandas/array.py
- geopandas/tests/test_api.py
- geopandas/tests/test_pandas_methods.py


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -1,6 +1,16 @@
 Changes
 =======
 
+Version 0.6.3 (February 6, 2020)
+---------------------------------
+
+Small bug-fix release:
+
+- Compatibility with Shapely 1.7 and pandas 1.0 (#1244).    
+- Fix `GeoDataFrame.fillna` to accept non-geometry values again when there are
+  no missing values in the geometry column. This should make it easier to fill
+  the numerical columns of the GeoDataFrame (#1279).
+
 
 Version 0.6.2 (November 18, 2019)
 ---------------------------------


=====================================
geopandas/_compat.py
=====================================
@@ -9,6 +9,7 @@ import six
 
 PANDAS_GE_024 = str(pd.__version__) >= LooseVersion("0.24.0")
 PANDAS_GE_025 = str(pd.__version__) >= LooseVersion("0.25.0")
+PANDAS_GE_10 = str(pd.__version__) >= LooseVersion("0.26.0.dev")
 
 
 # -----------------------------------------------------------------------------


=====================================
geopandas/_version.py
=====================================
@@ -22,8 +22,8 @@ def get_keywords():
     # setup.py/versioneer.py will grep for the variable names, so they must
     # each be defined on a line of their own. _version.py will just call
     # get_keywords().
-    git_refnames = " (tag: v0.6.2, 0.6.x)"
-    git_full = "34fe94357b8131afb49da76b1e5b14d9477f9e37"
+    git_refnames = " (tag: v0.6.3, 0.6.x)"
+    git_full = "280195d3ee0208c5ff8d25b2982b71bf5f04e9f1"
     keywords = {"refnames": git_refnames, "full": git_full}
     return keywords
 


=====================================
geopandas/array.py
=====================================
@@ -13,7 +13,7 @@ from shapely.geometry.base import BaseGeometry
 import shapely.ops
 import shapely.wkt
 
-from ._compat import PANDAS_GE_024, Iterable
+from ._compat import PANDAS_GE_024, PANDAS_GE_10, Iterable
 
 
 class GeometryDtype(ExtensionDtype):
@@ -23,10 +23,16 @@ class GeometryDtype(ExtensionDtype):
 
     @classmethod
     def construct_from_string(cls, string):
-        if string == cls.name:
+        if not isinstance(string, str):
+            raise TypeError(
+                "'construct_from_string' expects a string, got {}".format(type(string))
+            )
+        elif string == cls.name:
             return cls()
         else:
-            raise TypeError("Cannot construct a '{}' from '{}'".format(cls, string))
+            raise TypeError(
+                "Cannot construct a '{}' from '{}'".format(cls.__name__, string)
+            )
 
     @classmethod
     def construct_array_type(cls):
@@ -230,7 +236,10 @@ def _binary_geo(op, left, right):
         # intersection can return empty GeometryCollections, and if the
         # result are only those, numpy will coerce it to empty 2D array
         data = np.empty(len(left), dtype=object)
-        data[:] = [getattr(s, op)(right) if s and right else None for s in left.data]
+        data[:] = [
+            getattr(s, op)(right) if s is not None and right is not None else None
+            for s in left.data
+        ]
         return GeometryArray(data)
     elif isinstance(right, GeometryArray):
         if len(left) != len(right):
@@ -240,7 +249,9 @@ def _binary_geo(op, left, right):
             raise ValueError(msg)
         data = np.empty(len(left), dtype=object)
         data[:] = [
-            getattr(this_elem, op)(other_elem) if this_elem and other_elem else None
+            getattr(this_elem, op)(other_elem)
+            if this_elem is not None and other_elem is not None
+            else None
             for this_elem, other_elem in zip(left.data, right.data)
         ]
         return GeometryArray(data)
@@ -432,12 +443,21 @@ class GeometryArray(ExtensionArray):
     def __getitem__(self, idx):
         if isinstance(idx, numbers.Integral):
             return self.data[idx]
-        elif isinstance(idx, (Iterable, slice)):
+        # array-like, slice
+        if PANDAS_GE_10:
+            # for pandas >= 1.0, validate and convert IntegerArray/BooleanArray
+            # to numpy array, pass-through non-array-like indexers
+            idx = pd.api.indexers.check_array_indexer(self, idx)
+        if isinstance(idx, (Iterable, slice)):
             return GeometryArray(self.data[idx])
         else:
             raise TypeError("Index type not supported", idx)
 
     def __setitem__(self, key, value):
+        if PANDAS_GE_10:
+            # for pandas >= 1.0, validate and convert IntegerArray/BooleanArray
+            # keys to numpy array, pass-through non-array-like indexers
+            key = pd.api.indexers.check_array_indexer(self, key)
         if isinstance(value, pd.Series):
             value = value.values
         if isinstance(value, (list, np.ndarray)):
@@ -836,18 +856,17 @@ class GeometryArray(ExtensionArray):
         if method is not None:
             raise NotImplementedError("fillna with a method is not yet supported")
 
-        if _isna(value):
-            value = None
-        elif not isinstance(value, BaseGeometry):
-            raise NotImplementedError(
-                "fillna currently only supports filling with a scalar geometry"
-            )
-
         mask = self.isna()
         new_values = self.copy()
 
         if mask.any():
             # fill with value
+            if _isna(value):
+                value = None
+            elif not isinstance(value, BaseGeometry):
+                raise NotImplementedError(
+                    "fillna currently only supports filling with a scalar geometry"
+                )
             new_values = new_values._fill(mask, value)
 
         return new_values


=====================================
geopandas/tests/test_api.py
=====================================
@@ -1,22 +1,40 @@
 import subprocess
 import sys
 
+from geopandas._compat import PANDAS_GE_10
+
 
 def test_no_additional_imports():
     # test that 'import geopandas' does not import any of the optional or
     # development dependencies
+    blacklist = {
+        "pytest",
+        "py",
+        "ipython",
+        # 'matplotlib',  # matplotlib gets imported by pandas, see below
+        "descartes",
+        "mapclassify",
+        # 'rtree',  # rtree actually gets imported if installed
+        "sqlalchemy",
+        "psycopg2",
+        "geopy",
+    }
+    if PANDAS_GE_10:
+        # pandas > 0.25 stopped importing matplotlib by default
+        blacklist.add("matplotlib")
+
     code = """
 import sys
 import geopandas
-blacklist = {'pytest', 'py', 'ipython',
-             'matplotlib' 'descartes','mapclassify',
-             # 'rtree',  # rtree actually gets imported if installed
-             'sqlalchemy', 'psycopg2', 'geopy'}
+blacklist = {0!r}
+
 mods = blacklist & set(m.split('.')[0] for m in sys.modules)
 if mods:
-    sys.stderr.write('err: geopandas should not import: {}'.format(', '.join(mods)))
+    sys.stderr.write('err: geopandas should not import: {{}}'.format(', '.join(mods)))
     sys.exit(len(mods))
-"""
+""".format(
+        blacklist
+    )
     call = [sys.executable, "-c", code]
     # TODO(py3) update with subprocess.run once python 2.7 is dropped
     returncode = subprocess.call(call, stderr=subprocess.STDOUT)


=====================================
geopandas/tests/test_pandas_methods.py
=====================================
@@ -322,7 +322,7 @@ def test_select_dtypes(df):
 # Missing values
 
 
-def test_fillna(s):
+def test_fillna(s, df):
     s2 = GeoSeries([Point(0, 0), None, Point(2, 2)])
     res = s2.fillna(Point(1, 1))
     assert_geoseries_equal(res, s)
@@ -332,6 +332,21 @@ def test_fillna(s):
     res = s2.fillna(np.nan)
     assert_geoseries_equal(res, s2)
 
+    # raise exception if trying to fill missing geometry w/ non-geometry
+    df2 = df.copy()
+    df2["geometry"] = s2
+    res = df2.fillna(Point(1, 1))
+    assert_geodataframe_equal(res, df)
+    with pytest.raises(NotImplementedError):
+        df2.fillna(0)
+
+    # allow non-geometry fill value if there are no missing values
+    # https://github.com/geopandas/geopandas/issues/1149
+    df3 = df.copy()
+    df3.loc[0, "value1"] = np.nan
+    res = df3.fillna(0)
+    assert_geodataframe_equal(res.astype({"value1": "int64"}), df)
+
 
 def test_dropna():
     s2 = GeoSeries([Point(0, 0), None, Point(2, 2)])



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-geopandas/commit/9a91950b15256358063097da2883bfecf36fe928

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-geopandas/commit/9a91950b15256358063097da2883bfecf36fe928
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20200207/899d4b5b/attachment-0001.html>


More information about the Pkg-grass-devel mailing list