jluethi / napari-feature-visualization

Visualizing feature measurements on label images in napari
BSD 3-Clause "New" or "Revised" License
10 stars 4 forks source link

Deal with non-numeric columns in dataframe during contrast limit calculation #5

Open jluethi opened 3 years ago

jluethi commented 3 years ago

Some contents of a dataframe may not be numeric, e.g. strings. Catch this when the calculations for contrast limits are made Probably just don't calculate a new limit.

What to do if a user runs the plugin while a string column is selected?

Traceback (most recent call last):
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/widgets/_bases/value_widget.py", line 47, in _on_value_change
    self.changed(value=args[0] if args else None)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/events.py", line 656, in __call__
    self._invoke_callback(cb, event)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/events.py", line 677, in _invoke_callback
    _handle_exception(
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/events.py", line 141, in _handle_exception
    raise value
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/events.py", line 675, in _invoke_callback
    cb(event)
  File "/Users/joel/Dropbox/Joel/PelkmansLab/Code/napari-feature-visualization/napari_feature_visualization/feature_vis.py", line 100, in update_rescaling
    widget.lower_contrast_limit.value = df[event.value].quantile(quantiles[0])
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/series.py", line 2267, in quantile
    result = df.quantile(q=q, interpolation=interpolation, numeric_only=False)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/frame.py", line 9266, in quantile
    result = data._mgr.quantile(
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/internals/managers.py", line 491, in quantile
    block = b.quantile(axis=axis, qs=qs, interpolation=interpolation)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/internals/blocks.py", line 1592, in quantile
    result = nanpercentile(
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/nanops.py", line 1675, in nanpercentile
    return np.percentile(values, q, axis=axis, interpolation=interpolation)
  File "<__array_function__ internals>", line 5, in percentile
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 3818, in percentile
    return _quantile_unchecked(
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 3937, in _quantile_unchecked
    r, k = _ureduce(a, func=_quantile_ureduce_func, q=q, axis=axis, out=out,
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 3515, in _ureduce
    r = func(a, **kwargs)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 4064, in _quantile_ureduce_func
    r = _lerp(x_below, x_above, weights_above, out=out)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 3961, in _lerp
    diff_b_a = subtract(b, a)
TypeError: unsupported operand type(s) for -: 'str' and 'str'
jluethi commented 3 years ago

Same issue with booleans:

Traceback (most recent call last):
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/widgets/_bases/value_widget.py", line 47, in _on_value_change
    self.changed(value=args[0] if args else None)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/events.py", line 656, in __call__
    self._invoke_callback(cb, event)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/events.py", line 677, in _invoke_callback
    _handle_exception(
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/events.py", line 141, in _handle_exception
    raise value
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/magicgui/events.py", line 675, in _invoke_callback
    cb(event)
  File "/Users/joel/Dropbox/Joel/PelkmansLab/Code/napari-feature-visualization/napari_feature_visualization/feature_vis.py", line 100, in update_rescaling
    widget.lower_contrast_limit.value = df[event.value].quantile(quantiles[0])
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/series.py", line 2267, in quantile
    result = df.quantile(q=q, interpolation=interpolation, numeric_only=False)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/frame.py", line 9266, in quantile
    result = data._mgr.quantile(
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/internals/managers.py", line 491, in quantile
    block = b.quantile(axis=axis, qs=qs, interpolation=interpolation)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/internals/blocks.py", line 1592, in quantile
    result = nanpercentile(
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/pandas/core/nanops.py", line 1675, in nanpercentile
    return np.percentile(values, q, axis=axis, interpolation=interpolation)
  File "<__array_function__ internals>", line 5, in percentile
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 3818, in percentile
    return _quantile_unchecked(
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 3937, in _quantile_unchecked
    r, k = _ureduce(a, func=_quantile_ureduce_func, q=q, axis=axis, out=out,
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 3515, in _ureduce
    r = func(a, **kwargs)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 4064, in _quantile_ureduce_func
    r = _lerp(x_below, x_above, weights_above, out=out)
  File "/Users/joel/opt/miniconda3/envs/hiPSC/lib/python3.9/site-packages/numpy/lib/function_base.py", line 3961, in _lerp
    diff_b_a = subtract(b, a)
TypeError: numpy boolean subtract, the `-` operator, is not supported, use the bitwise_xor, the `^` operator, or the logical_xor function instead.
jluethi commented 3 years ago

Also an issue if nan's exist in the column:

Traceback (most recent call last):
  File "/Users/joel/opt/miniconda3/envs/napari/lib/python3.9/site-packages/magicgui/widgets/_bases/value_widget.py", line 47, in _on_value_change
    self.changed(value=args[0] if args else None)
  File "/Users/joel/opt/miniconda3/envs/napari/lib/python3.9/site-packages/magicgui/events.py", line 656, in __call__
    self._invoke_callback(cb, event)
  File "/Users/joel/opt/miniconda3/envs/napari/lib/python3.9/site-packages/magicgui/events.py", line 677, in _invoke_callback
    _handle_exception(
  File "/Users/joel/opt/miniconda3/envs/napari/lib/python3.9/site-packages/magicgui/events.py", line 141, in _handle_exception
    raise value
  File "/Users/joel/opt/miniconda3/envs/napari/lib/python3.9/site-packages/magicgui/events.py", line 675, in _invoke_callback
    cb(event)
  File "/Users/joel/Dropbox/Joel/PelkmansLab/Code/napari-feature-visualization/napari_feature_visualization/feature_vis.py", line 52, in update_rescaling
    widget.lower_contrast_limit.value = df[event.value].quantile(quantiles[0])
  File "/Users/joel/opt/miniconda3/envs/napari/lib/python3.9/site-packages/magicgui/widgets/_bases/ranged_widget.py", line 58, in value
    raise ValueError(
ValueError: value nan is outside of the allowed range: (-100000000.0, 100000000.0)