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

1from __future__ import annotations 

2 

3from typing import cast 

4 

5import numpy as np 

6import scipy.stats as sps 

7from lsst.pex.config import Field 

8 

9from ...interfaces import KeyedData, KeyedDataSchema, Scalar, ScalarAction, Vector 

10 

11 

12class MedianAction(ScalarAction): 

13 vectorKey = Field[str]("Key of Vector to median") 

14 

15 def getInputSchema(self) -> KeyedDataSchema: 

16 return ((self.vectorKey, Vector),) 

17 

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]) 

21 

22 

23class MeanAction(ScalarAction): 

24 vectorKey = Field[str]("Key of Vector from which to calculate mean") 

25 

26 def getInputSchema(self) -> KeyedDataSchema: 

27 return ((self.vectorKey, Vector),) 

28 

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]) 

32 

33 

34class StdevAction(ScalarAction): 

35 vectorKey = Field[str]("Key of Vector from which to calculate std deviation") 

36 

37 def getInputSchema(self) -> KeyedDataSchema: 

38 return ((self.vectorKey, Vector),) 

39 

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]) 

43 

44 

45class SigmaMadAction(ScalarAction): 

46 vectorKey = Field[str]("Key of Vector to median") 

47 

48 def getInputSchema(self) -> KeyedDataSchema: 

49 return ((self.vectorKey, Vector),) 

50 

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 ) 

58 

59 

60class CountAction(ScalarAction): 

61 vectorKey = Field[str]("Key of Vector to median") 

62 

63 def getInputSchema(self) -> KeyedDataSchema: 

64 return ((self.vectorKey, Vector),) 

65 

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 

71 

72 

73class ApproxFloor(ScalarAction): 

74 vectorKey = Field[str](doc="Key for the vector to perform action on", optional=False) 

75 

76 def getInputSchema(self) -> KeyedDataSchema: 

77 return ((self.vectorKey, Vector),) 

78 

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:])