LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
LSST Data Management Base Package
_actions.py
Go to the documentation of this file.
1 from __future__ import annotations
2 
3 __all__ = ("SingleColumnAction", "MultiColumnAction", "CoordColumn", "MagColumnDN", "SumColumns", "AddColumn",
4  "DivideColumns", "SubtractColumns", "MultiplyColumns", "MagColumnNanoJansky",)
5 
6 from typing import Iterable
7 
8 import numpy as np
9 import pandas as pd
10 from astropy import units
11 
12 from ..configurableActions import ConfigurableActionStructField, ConfigurableActionField
13 from ._baseDataFrameActions import DataFrameAction
14 from ._evalColumnExpression import makeColumnExpressionAction
15 
16 from lsst.pex.config import Field
17 
18 
20  column = Field(doc="Column to load for this action", dtype=str, optional=False)
21 
22  @property
23  def columns(self) -> Iterable[str]:
24  return (self.columncolumn, )
25 
26  def __call__(self, df, **kwargs):
27  return df[self.columncolumn]
28 
29 
31  actions = ConfigurableActionStructField(doc="Configurable actions to use in a joint action")
32 
33  @property
34  def columns(self) -> Iterable[str]:
35  yield from (column for action in self.actionsactions for column in action.columns)
36 
37 
39  inRadians = Field(doc="Return the column in radians if true", default=True, dtype=bool)
40 
41  def __call__(self, df):
42  col = super().__call__(df)
43  return col * 180 / np.pi if self.inRadiansinRadians else col
44 
45 
47  coadd_zeropoint = Field(doc="Magnitude zero point", dtype=float, default=27)
48 
49  def __call__(self, df: pd.DataFrame, **kwargs):
50  if not (fluxMag0 := kwargs.get('fluxMag0')):
51  fluxMag0 = 1/np.power(10, -0.4*self.coadd_zeropointcoadd_zeropoint)
52 
53  with np.warnings.catch_warnings():
54  np.warnings.filterwarnings('ignore', r'invalid value encountered')
55  np.warnings.filterwarnings('ignore', r'divide by zero')
56  return -2.5 * np.log10(df[self.columncolumn] / fluxMag0)
57 
58 
60 
61  def __call__(self, df: pd.DataFrame, **kwargs):
62 
63  with np.warnings.catch_warnings():
64  np.warnings.filterwarnings('ignore', r'invalid value encountered')
65  np.warnings.filterwarnings('ignore', r'divide by zero')
66  return -2.5 * np.log10((df[self.columncolumn] * 1e-9) / 3631.0)
67 
68 
70  ab_flux_scale = Field(doc="Scaling of ab flux", dtype=float, default=(0*units.ABmag).to_value(units.nJy))
71  coadd_zeropoint = Field(doc="Magnitude zero point", dtype=float, default=27)
72 
73  def __call__(self, df, **kwargs):
74  dataNumber = super().__call__(df, **kwargs)
75  if not (fluxMag0 := kwargs.get('fluxMag0')):
76  fluxMag0 = 1/np.power(10, -0.4*self.coadd_zeropointcoadd_zeropoint)
77  return self.ab_flux_scaleab_flux_scale * dataNumber / fluxMag0
78 
79  def setDefaults(self):
80  super().setDefaults()
81  self.cachecachecache = True # cache this action for future calls
82 
83 
85  flux_mag_err = Field(doc="Error in the magnitude zeropoint", dtype=float, default=0)
86  flux_action = ConfigurableActionField(doc="Action to use if flux is not provided to the call method",
87  default=NanoJansky, dtype=DataFrameAction)
88 
89  @property
90  def columns(self):
91  yield from zip((self.columncolumn,), self.flux_actionflux_action.columns)
92 
93  def __call__(self, df, flux_column=None, flux_mag_err=None, **kwargs):
94  if flux_column is None:
95  flux_column = self.flux_actionflux_action(df, **kwargs)
96  if flux_mag_err is None:
97  flux_mag_err = self.flux_mag_errflux_mag_err
98 
99 
100 _docs = """This is a `DataFrameAction` that is designed to add two columns
101 together and return the result.
102 """
103 SumColumns = makeColumnExpressionAction("SumColumns", "colA+colB",
104  exprDefaults={"colA": SingleColumnAction,
105  "colB": SingleColumnAction},
106  docstring=_docs)
107 
108 _docs = """This is a `MultiColumnAction` that is designed to subtract two columns
109 together and return the result.
110 """
111 SubtractColumns = makeColumnExpressionAction("SubtractColumns", "colA-colB",
112  exprDefaults={"colA": SingleColumnAction,
113  "colB": SingleColumnAction},
114  docstring=_docs)
115 
116 _docs = """This is a `MultiColumnAction` that is designed to multiply two columns
117 together and return the result.
118 """
119 MultiplyColumns = makeColumnExpressionAction("MultiplyColumns", "colA*colB",
120  exprDefaults={"colA": SingleColumnAction,
121  "colB": SingleColumnAction},
122  docstring=_docs)
123 
124 _docs = """This is a `MultiColumnAction` that is designed to multiply two columns
125 together and return the result.
126 """
127 DivideColumns = makeColumnExpressionAction("DivideColumns", "colA/colB",
128  exprDefaults={"colA": SingleColumnAction,
129  "colB": SingleColumnAction},
130  docstring=_docs)
131 
132 
134  aggregator = ConfigurableActionField(doc="This is an instance of a Dataframe action that will be used "
135  "to create a new column", dtype=DataFrameAction)
136  newColumn = Field(doc="Name of the new column to add", dtype=str)
137 
138  @property
139  def columns(self) -> Iterable[str]:
140  yield from self.aggregatoraggregator.columns
141 
142  def __call__(self, df, **kwargs) -> pd.DataFrame:
143  # do your calculation and and
144  df[self.newColumnnewColumn] = self.aggregatoraggregator(df, kwargs)
145  return df
Type[DataFrameAction] makeColumnExpressionAction(str className, str expr, Optional[Mapping[str, Union[DataFrameAction, Type[DataFrameAction]]]] exprDefaults=None, str docstring=None)