| 824 | |
| 825 | |
| 826 | class UFuncElemwise(MapPartitions): |
| 827 | _parameters = [ |
| 828 | "frame", |
| 829 | "func", |
| 830 | "meta", |
| 831 | "transform_divisions", |
| 832 | "kwargs", |
| 833 | ] |
| 834 | enforce_metadata = False |
| 835 | |
| 836 | def __str__(self): |
| 837 | return f"UFunc({funcname(self.func)})" |
| 838 | |
| 839 | @functools.cached_property |
| 840 | def args(self): |
| 841 | return self.operands[len(self._parameters) :] |
| 842 | |
| 843 | @functools.cached_property |
| 844 | def _dfs(self): |
| 845 | return [df for df in self.args if isinstance(df, Expr) and df.ndim > 0] |
| 846 | |
| 847 | @functools.cached_property |
| 848 | def _meta(self): |
| 849 | if self.operand("meta") is not no_default: |
| 850 | meta = self.operand("meta") |
| 851 | else: |
| 852 | meta = _get_meta_ufunc(self._dfs, self.args, self.func) |
| 853 | return make_meta(meta) |
| 854 | |
| 855 | def _divisions(self): |
| 856 | if ( |
| 857 | self.transform_divisions |
| 858 | and isinstance(self._dfs[0], Index) |
| 859 | and len(self._dfs) == 1 |
| 860 | ): |
| 861 | try: |
| 862 | divisions = self.func( |
| 863 | *[ |
| 864 | pd.Index(arg.divisions) if arg is self._dfs[0] else arg |
| 865 | for arg in self.args |
| 866 | ], |
| 867 | **self.kwargs, |
| 868 | ) |
| 869 | if isinstance(divisions, pd.Index): |
| 870 | divisions = methods.tolist(divisions) |
| 871 | except Exception: |
| 872 | pass |
| 873 | else: |
| 874 | if not valid_divisions(divisions): |
| 875 | divisions = [None] * (self._dfs[0].npartitions + 1) |
| 876 | return divisions |
| 877 | |
| 878 | return self._dfs[0].divisions |
| 879 | |
| 880 | |
| 881 | class MapOverlapAlign(Expr): |