Repository: pandas-dev/pandas

Issue:
ERR: give better error message when providing wrong sparse matrix type in from_coo
`pd.Series.sparse.from_coo` only accepts a coo matrix format, but when giving it different matrix type, you get a not so useful error message:

```python
In [11]: import scipy.sparse

In [12]: m = scipy.sparse.csr_matrix(np.array([[0,1],[0,0]]))

In [13]: pd.Series.sparse.from_coo(m)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-b31c13c3a79c> in <module>
----> 1 pd.Series.sparse.from_coo(m)

~/scipy/pandas/pandas/core/arrays/sparse.py in from_coo(cls, A, dense_index)
   2015         from pandas import Series
   2016 
-> 2017         result = _coo_to_sparse_series(A, dense_index=dense_index,
   2018                                        sparse_series=False)
   2019         result = Series(result.array, index=result.index, copy=False)

~/scipy/pandas/pandas/core/sparse/scipy_sparse.py in _coo_to_sparse_series(A, dense_index)
    122     Convert a scipy.sparse.coo_matrix to a SparseSeries.
    123 
--> 124     Parameters
    125     ----------
    126     A : scipy.sparse.coo.coo_matrix

~/miniconda3/envs/dev37/lib/python3.7/site-packages/scipy/sparse/base.py in __getattr__(self, attr)
    687             return self.getnnz()
    688         else:
--> 689             raise AttributeError(attr + " not found")
    690 
    691     def transpose(self, axes=None, copy=False):

AttributeError: row not found
```


Discussion:
Happy to take a look at this!

Resolving patch:
diff --git a/pandas/core/sparse/scipy_sparse.py b/pandas/core/sparse/scipy_sparse.py
--- a/pandas/core/sparse/scipy_sparse.py
+++ b/pandas/core/sparse/scipy_sparse.py
@@ -130,10 +130,19 @@ def _coo_to_sparse_series(A, dense_index: bool = False,
     Returns
     -------
     Series or SparseSeries
+
+    Raises
+    ------
+    TypeError if A is not a coo_matrix
+
     """
     from pandas import SparseDtype
 
-    s = Series(A.data, MultiIndex.from_arrays((A.row, A.col)))
+    try:
+        s = Series(A.data, MultiIndex.from_arrays((A.row, A.col)))
+    except AttributeError:
+        raise TypeError('Expected coo_matrix. Got {} instead.'
+                        .format(type(A).__name__))
     s = s.sort_index()
     if sparse_series:
         # TODO(SparseSeries): remove this and the sparse_series keyword.


Test patch:
diff --git a/pandas/tests/arrays/sparse/test_accessor.py b/pandas/tests/arrays/sparse/test_accessor.py
--- a/pandas/tests/arrays/sparse/test_accessor.py
+++ b/pandas/tests/arrays/sparse/test_accessor.py
@@ -119,3 +119,13 @@ def test_series_from_coo(self, dtype, dense_index):
             )
 
         tm.assert_series_equal(result, expected)
+
+    @td.skip_if_no_scipy
+    def test_series_from_coo_incorrect_format_raises(self):
+        # gh-26554
+        import scipy.sparse
+        m = scipy.sparse.csr_matrix(np.array([[0, 1], [0, 0]]))
+        with pytest.raises(TypeError,
+                           match='Expected coo_matrix. Got csr_matrix instead.'
+                           ):
+            pd.Series.sparse.from_coo(m)