Source code for deimos.grid

import numpy as np
import pandas as pd

import deimos


[docs]def data2grid(features, dims=['mz', 'drift_time', 'retention_time']): ''' Converts data frame representation to a dense, N-dimensional grid. Parameters ---------- features : :obj:`~pandas.DataFrame` Input feature coordinates and intensities. dims : str or list Dimension(s) to create the dense grid (omitted dimensions will be collapsed and summed accross). Returns ------- edges : list of :obj:`~numpy.array` Edges coordinates along each grid axis. grid : :obj:`~numpy.array` Resulting N-dimensional grid. ''' # Safely cast to list dims = deimos.utils.safelist(dims) # Collapse data if necessary if len(dims) < len(deimos.utils.detect_dims(features)): features = deimos.collapse(features, keep=dims, how=np.sum) # Unique indices idx = [np.unique(features.loc[:, d].values, return_inverse=True) for d in dims] idx_i = [x[-1] for x in idx] idx = [x[0] for x in idx] # Populate grid grid = np.zeros([len(x) for x in idx], dtype=float) grid[tuple(idx_i)] = features.loc[:, 'intensity'].values return idx, grid
[docs]def grid2df(edges, grid, dims=['mz', 'drift_time', 'retention_time'], additional=None): ''' Converts dense grid representation to a data frame. Parameters ---------- edges : list of :obj:`~numpy.array` Edges coordinates along each grid axis. grid : :obj:`~numpy.array` N-dimensional dense grid of intensities. dims : str or list Label(s) for each grid dimension. additional : dict or None Additional grids to process. Returns ------- :obj:`~pandas.DataFrame` Feature coordinates, intensities, and any other attributes from `additional`. ''' # Cast to list safely dims = deimos.utils.safelist(dims) # Column labels container cols = dims.copy() # Flatten grid grid = grid.flatten() # Threshold idx = grid > 0 # Reshape grid = grid[idx].reshape(-1, 1) # Edges to grid data = np.meshgrid(*edges, indexing='ij') data = [x.reshape(-1, 1)[idx] for x in data] # Append intensity data.append(grid) cols.append('intensity') # Append additional columns if additional is not None: for k, v in additional.items(): data.append(v.flatten()[idx].reshape(-1, 1)) cols.append(k) del additional, idx return pd.DataFrame(np.hstack(data), columns=cols, dtype=float)