lsst.pipe.tasks  21.0.0-95-g1e789892+c91f73bc7b
_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",)
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  ab_flux_scale = Field(doc="Scaling of ab flux", dtype=float, default=(0*units.ABmag).to_value(units.nJy))
61  coadd_zeropoint = Field(doc="Magnitude zero point", dtype=float, default=27)
62 
63  def __call__(self, df, **kwargs):
64  dataNumber = super().__call__(df, **kwargs)
65  if not (fluxMag0 := kwargs.get('fluxMag0')):
66  fluxMag0 = 1/np.power(10, -0.4*self.coadd_zeropointcoadd_zeropoint)
67  return self.ab_flux_scaleab_flux_scale * dataNumber / fluxMag0
68 
69  def setDefaults(self):
70  super().setDefaults()
71  self.cachecachecache = True # cache this action for future calls
72 
73 
75  flux_mag_err = Field(doc="Error in the magnitude zeropoint", dtype=float, default=0)
76  flux_action = ConfigurableActionField(doc="Action to use if flux is not provided to the call method",
77  default=NanoJansky, dtype=DataFrameAction)
78 
79  @property
80  def columns(self):
81  yield from zip((self.columncolumn,), self.flux_actionflux_action.columns)
82 
83  def __call__(self, df, flux_column=None, flux_mag_err=None, **kwargs):
84  if flux_column is None:
85  flux_column = self.flux_actionflux_action(df, **kwargs)
86  if flux_mag_err is None:
87  flux_mag_err = self.flux_mag_errflux_mag_err
88 
89 
90 _docs = """This is a `DataFrameAction` that is designed to add two columns
91 together and return the result.
92 """
93 SumColumns = makeColumnExpressionAction("SumColumns", "colA+colB",
94  exprDefaults={"colA": SingleColumnAction,
95  "colB": SingleColumnAction},
96  docstring=_docs)
97 
98 _docs = """This is a `MultiColumnAction` that is designed to subtract two columns
99 together and return the result.
100 """
101 SubtractColumns = makeColumnExpressionAction("SubtractColumns", "colA-colB",
102  exprDefaults={"colA": SingleColumnAction,
103  "colB": SingleColumnAction},
104  docstring=_docs)
105 
106 _docs = """This is a `MultiColumnAction` that is designed to multiply two columns
107 together and return the result.
108 """
109 MultiplyColumns = makeColumnExpressionAction("MultiplyColumns", "colA*colB",
110  exprDefaults={"colA": SingleColumnAction,
111  "colB": SingleColumnAction},
112  docstring=_docs)
113 
114 _docs = """This is a `MultiColumnAction` that is designed to multiply two columns
115 together and return the result.
116 """
117 DivideColumns = makeColumnExpressionAction("DivideColumns", "colA/colB",
118  exprDefaults={"colA": SingleColumnAction,
119  "colB": SingleColumnAction},
120  docstring=_docs)
121 
122 
124  aggregator = ConfigurableActionField(doc="This is an instance of a Dataframe action that will be used "
125  "to create a new column", dtype=DataFrameAction)
126  newColumn = Field(doc="Name of the new column to add", dtype=str)
127 
128  @property
129  def columns(self) -> Iterable[str]:
130  yield from self.aggregatoraggregator.columns
131 
132  def __call__(self, df, **kwargs) -> pd.DataFrame:
133  # do your calculation and and
134  df[self.newColumnnewColumn] = self.aggregatoraggregator(df, kwargs)
135  return df
Type[DataFrameAction] makeColumnExpressionAction(str className, str expr, Optional[Mapping[str, Union[DataFrameAction, Type[DataFrameAction]]]] exprDefaults=None, str docstring=None)