Repository: geopandas/geopandas

Issue:
BUG: Create unintialized GeoSeries
- [X] I have checked that this issue has not already been reported.

- [X] I have confirmed this bug exists on the latest version of geopandas.

- [ ] (optional) I have confirmed this bug exists on the master branch of geopandas.

---

**Note**: Please read [this guide](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports) detailing how to provide the necessary information for us to reproduce your bug.

#### Code Sample, a copy-pastable example

```python
# these return dtype float64, should return dtype geometry:
gpd.GeoSeries(index=range(3))
gpd.GeoSeries(index=range(3), dtype='geometry')
gpd.GeoSeries(None, index=range(3), dtype='geometry')

# these work-arounds return dtype geometry:
pd.Series(index=range(3), dtype='geometry')
gpd.GeoSeries([None] * 3)
gpd.GeoSeries(index=range(3)).astype('geometry')

```

<details>

SYSTEM INFO
-----------
python     : 3.8.6 | packaged by conda-forge | (default, Oct  7 2020, 18:22:52) [MSC v.1916 64 bit (AMD64)]
executable : C:\Daten2\Anaconda\python.exe
machine    : Windows-10-10.0.19041-SP0

GEOS, GDAL, PROJ INFO
---------------------
GEOS       : None
GEOS lib   : None
GDAL       : 3.1.4
GDAL data dir: None
PROJ       : 7.1.1
PROJ data dir: C:\Daten2\Anaconda\Library\share\proj

PYTHON DEPENDENCIES
-------------------
geopandas  : 0.8.1
pandas     : 1.1.4
fiona      : 1.8.17
numpy      : 1.19.2
shapely    : 1.7.1
rtree      : 0.9.4
pyproj     : 2.6.1.post1
matplotlib : 3.3.2
mapclassify: None
geopy      : None
psycopg2   : 2.8.6 (dt dec pq3 ext lo64)
geoalchemy2: None
pyarrow    : None

</details>



Discussion:
Thanks for the notice! This is indeed something worth fixing. Not only because of this, but also to avoid that warning we raise during (and potential deprecation in the future).

```
FutureWarning:     You are passing non-geometry data to the GeoSeries constructor. Currently,
    it falls back to returning a pandas Series. But in the future, we will start
    to raise a TypeError instead.
```

Our constructor should check for this case and return proper GeoSeries in this case:

https://github.com/geopandas/geopandas/blob/cdb42821ababcf29b6f7f94dd66fa9cb5a8f6071/geopandas/geoseries.py#L103

Resolving patch:
diff --git a/geopandas/geoseries.py b/geopandas/geoseries.py
--- a/geopandas/geoseries.py
+++ b/geopandas/geoseries.py
@@ -201,7 +201,7 @@ def __new__(cls, data=None, index=None, crs=None, **kwargs):
                 s = pd.Series(data, index=index, name=name, **kwargs)
             # prevent trying to convert non-geometry objects
             if s.dtype != object:
-                if s.empty:
+                if s.empty or data is None:
                     s = s.astype(object)
                 else:
                     warnings.warn(_SERIES_WARNING_MSG, FutureWarning, stacklevel=2)


Test patch:
diff --git a/geopandas/tests/test_geoseries.py b/geopandas/tests/test_geoseries.py
--- a/geopandas/tests/test_geoseries.py
+++ b/geopandas/tests/test_geoseries.py
@@ -376,6 +376,10 @@ def test_empty(self):
         s = GeoSeries()
         check_geoseries(s)
 
+    def test_data_is_none(self):
+        s = GeoSeries(index=range(3))
+        check_geoseries(s)
+
     def test_from_series(self):
         shapes = [
             Polygon([(random.random(), random.random()) for _ in range(3)])