Coverage for python/lsst/analysis/tools/actions/scalar/scalarActions.py: 66%
52 statements
« prev ^ index » next coverage.py v6.4.2, created at 2022-08-04 03:18 -0700
« prev ^ index » next coverage.py v6.4.2, created at 2022-08-04 03:18 -0700
1from __future__ import annotations
3from typing import cast
5import numpy as np
6import scipy.stats as sps
7from lsst.pex.config import Field
9from ...interfaces import KeyedData, KeyedDataSchema, Scalar, ScalarAction, Vector
12class MedianAction(ScalarAction):
13 vectorKey = Field[str]("Key of Vector to median")
15 def getInputSchema(self) -> KeyedDataSchema:
16 return ((self.vectorKey, Vector),)
18 def __call__(self, data: KeyedData, **kwargs) -> Scalar:
19 mask = self.getMask(**kwargs)
20 return np.nanmedian(cast(Vector, data[self.vectorKey.format(**kwargs)])[mask])
23class MeanAction(ScalarAction):
24 vectorKey = Field[str]("Key of Vector from which to calculate mean")
26 def getInputSchema(self) -> KeyedDataSchema:
27 return ((self.vectorKey, Vector),)
29 def __call__(self, data: KeyedData, **kwargs) -> Scalar:
30 mask = self.getMask(**kwargs)
31 return np.nanmean(cast(Vector, data[self.vectorKey.format(**kwargs)])[mask])
34class StdevAction(ScalarAction):
35 vectorKey = Field[str]("Key of Vector from which to calculate std deviation")
37 def getInputSchema(self) -> KeyedDataSchema:
38 return ((self.vectorKey, Vector),)
40 def __call__(self, data: KeyedData, **kwargs) -> Scalar:
41 mask = self.getMask(**kwargs)
42 return np.nanstd(cast(Vector, data[self.vectorKey.format(**kwargs)])[mask])
45class SigmaMadAction(ScalarAction):
46 vectorKey = Field[str]("Key of Vector to median")
48 def getInputSchema(self) -> KeyedDataSchema:
49 return ((self.vectorKey, Vector),)
51 def __call__(self, data: KeyedData, **kwargs) -> Scalar:
52 mask = self.getMask(**kwargs)
53 return sps.median_abs_deviation(
54 cast(Vector, data[self.vectorKey.format(**kwargs)])[mask],
55 scale="normal", # type: ignore
56 nan_policy="omit",
57 )
60class CountAction(ScalarAction):
61 vectorKey = Field[str]("Key of Vector to median")
63 def getInputSchema(self) -> KeyedDataSchema:
64 return ((self.vectorKey, Vector),)
66 def __call__(self, data: KeyedData, **kwargs) -> Scalar:
67 mask = self.getMask(**kwargs)
68 arr = cast(Vector, data[self.vectorKey.format(**kwargs)])[mask]
69 arr = arr[~np.isnan(arr)]
70 return len(arr) # type: ignore
73class ApproxFloor(ScalarAction):
74 vectorKey = Field[str](doc="Key for the vector to perform action on", optional=False)
76 def getInputSchema(self) -> KeyedDataSchema:
77 return ((self.vectorKey, Vector),)
79 def __call__(self, data: KeyedData, **kwargs) -> Scalar:
80 mask = self.getMask(**kwargs)
81 value = np.sort(data[self.vectorKey.format(**kwargs)][mask]) # type: ignore
82 x = len(value) // 10
83 return np.nanmedian(value[-x:])