Skip to content

dtype error with st.tl.cci.adj_pvals() #350

@durr1602

Description

@durr1602

Hi!

I'm trying to run this tutorial with:

  • stlearn==1.4.0
  • pandas==3.0.2
    on a different dataset.

and I get the following error:

TypeError: Invalid value '[70 68 64 61 55 55 54 45 45 41 38 37 35 35 25 19 19 16 10  3  3  2]' for dtype 'int32'
File ~/envs/stlearn/.venv/lib/python3.13/site-packages/pandas/core/indexing.py:2144, in _iLocIndexer._setitem_single_column(self, loc, value, plane_indexer)
   2143 try:
-> 2144     self.obj._mgr.column_setitem(
   2145         loc, plane_indexer, value, inplace_only=True
   2146     )
   2147 except (ValueError, TypeError, LossySetitemError) as exc:
   2148     # If we're setting an entire column and we can't do it inplace,
   2149     #  then we can use value's dtype (or inferred dtype)
   2150     #  instead of object

Hide Traceback
File ~/envs/stlearn/.venv/lib/python3.13/site-packages/pandas/core/internals/managers.py:1518, in BlockManager.column_setitem(self, loc, idx, value, inplace_only)
   1517 if inplace_only:
-> 1518     col_mgr.setitem_inplace(idx, value)
   1519 else:

File ~/envs/stlearn/.venv/lib/python3.13/site-packages/pandas/core/internals/managers.py:2220, in SingleBlockManager.setitem_inplace(self, indexer, value)
   2217 if isinstance(arr, np.ndarray):
   2218     # Note: checking for ndarray instead of np.dtype means we exclude
   2219     #  dt64/td64, which do their own validation.
-> 2220     value = np_can_hold_element(arr.dtype, value)
   2222 if isinstance(value, np.ndarray) and value.ndim == 1 and len(value) == 1:
   2223     # NumPy 1.25 deprecation: [https://github.com/numpy/numpy/pull/10615]

File ~/envs/stlearn/.venv/lib/python3.13/site-packages/pandas/core/dtypes/cast.py:1739, in np_can_hold_element(dtype, element)
   1738 if dtype.itemsize < tipo.itemsize:
-> 1739     raise LossySetitemError
   1740 if not isinstance(tipo, np.dtype):
   1741     # i.e. nullable IntegerDtype; we can put this into an ndarray
   1742     #  losslessly iff it has no NAs

LossySetitemError: 

The above exception was the direct cause of the following exception:

TypeError                                 Traceback (most recent call last)
Cell In[41], line 5
      1 # ---------------------------------------------------------------------------
      2 # 9. Adjusted p-values
      3 # ---------------------------------------------------------------------------
      4 log.info("\n--- Step 9: Adjusting p-values (FDR BH, spot axis) ---")
----> 5 st.tl.cci.adj_pvals(grid, correct_axis="spot", pval_adj_cutoff=0.05, adj_method="fdr_bh")

File ~/envs/stlearn/.venv/lib/python3.13/site-packages/stlearn/tl/cci/analysis.py:432, in adj_pvals(adata, pval_adj_cutoff, correct_axis, adj_method)
    429 lr_counts_pval = (ps < pval_adj_cutoff).sum(axis=0)
    431 # Re-ranking LRs based on these counts & updating LR ordering #
--> 432 adata.uns["lr_summary"].loc[:, "n_spots_sig"] = lr_counts
    433 adata.uns["lr_summary"].loc[:, "n_spots_sig_pval"] = lr_counts_pval
    434 new_order = np.argsort(-adata.uns["lr_summary"].loc[:, "n_spots_sig"].values)

File ~/envs/stlearn/.venv/lib/python3.13/site-packages/pandas/core/indexing.py:938, in _LocationIndexer.__setitem__(self, key, value)
    933 self._has_valid_setitem_indexer(key)
    935 iloc: _iLocIndexer = (
    936     cast("_iLocIndexer", self) if self.name == "iloc" else self.obj.iloc
    937 )
--> 938 iloc._setitem_with_indexer(indexer, value, self.name)

File ~/envs/stlearn/.venv/lib/python3.13/site-packages/pandas/core/indexing.py:1953, in _iLocIndexer._setitem_with_indexer(self, indexer, value, name)
   1950 # align and set the values
   1951 if take_split_path:
   1952     # We have to operate column-wise
-> 1953     self._setitem_with_indexer_split_path(indexer, value, name)
   1954 else:
   1955     self._setitem_single_block(indexer, value, name)

File ~/envs/stlearn/.venv/lib/python3.13/site-packages/pandas/core/indexing.py:1997, in _iLocIndexer._setitem_with_indexer_split_path(self, indexer, value, name)
   1993     self._setitem_with_indexer_2d_value(indexer, value)
   1995 elif len(ilocs) == 1 and lplane_indexer == len(value) and not is_scalar(pi):
   1996     # We are setting multiple rows in a single column.
-> 1997     self._setitem_single_column(ilocs[0], value, pi)
   1999 elif len(ilocs) == 1 and 0 != lplane_indexer != len(value):
   2000     # We are trying to set N values into M entries of a single
   2001     #  column, which is invalid for N != M
   2002     # Exclude zero-len for e.g. boolean masking that is all-false
   2004     if len(value) == 1 and not is_integer(info_axis):
   2005         # This is a case like df.iloc[:3, [1]] = [0]
   2006         #  where we treat as df.iloc[:3, 1] = 0

File ~/envs/stlearn/.venv/lib/python3.13/site-packages/pandas/core/indexing.py:2163, in _iLocIndexer._setitem_single_column(self, loc, value, plane_indexer)
   2151         dtype = self.obj.dtypes.iloc[loc]
   2152         if dtype not in (np.void, object) and not self.obj.empty:
   2153             # - Exclude np.void, as that is a special case for expansion.
   2154             #   We want to raise for
   (...)   2161             # - Exclude empty initial object with enlargement,
   2162             #   as then there's nothing to be inconsistent with.
-> 2163             raise TypeError(
   2164                 f"Invalid value '{value}' for dtype '{dtype}'"
   2165             ) from exc
   2166         self.obj.isetitem(loc, value)
   2167 else:
   2168     # set value into the column (first attempting to operate inplace, then
   2169     #  falling back to casting if necessary)

It seems that the problem lies in casting (int) in a column that expects float (likely because of initialization). If so, I see two possible solutions:

  • fixing initialization (i'm not sure when adata.uns["lr_summary"] is created.. somewhere in st.tl.cci.run()?
  • casting at line adata.uns["lr_summary"].loc[:, "n_spots_sig"] = lr_counts

I can try preparing a PR if that helps, thx!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions