def calculate_column(self, formula, name, groups=None): """Calculate a new column based on `formula` store as `name`. The new column is joined to `dframe` and stored in `self.dataset`. The `group_str` is only applicable to aggregations and groups for aggregations. .. note:: This can result in race-conditions when: - deleting ``controllers.Datasets.DELETE`` - updating ``controllers.Datasets.POST([dataset_id])`` Therefore, perform these actions asychronously. :param formula: The formula parsed by `self.parser` and applied to `self.dframe`. :param name: The name of the new column or aggregate column. :param groups: A list of columns to group on for aggregate calculations. """ self._ensure_dframe() aggregation, new_columns = self.make_columns(formula, name) if aggregation: agg = Aggregator(self.dataset, self.dataset.dframe(), groups, aggregation, name) agg.save(new_columns) else: self.dataset.replace_observations(self.dframe.join(new_columns[0])) # propagate calculation to any merged child datasets for merged_dataset in self.dataset.merged_datasets: merged_calculator = Calculator(merged_dataset) merged_calculator.propagate_column(self.dataset)