| 3332 | |
| 3333 | |
| 3334 | class Diff(MapOverlap): |
| 3335 | _parameters = ["frame", "periods"] |
| 3336 | _defaults = {"periods": 1} |
| 3337 | func = M.diff |
| 3338 | enforce_metadata = True |
| 3339 | transform_divisions = False |
| 3340 | clear_divisions = False |
| 3341 | align_dataframes = True |
| 3342 | |
| 3343 | def _divisions(self): |
| 3344 | return self.frame.divisions |
| 3345 | |
| 3346 | @functools.cached_property |
| 3347 | def _meta(self): |
| 3348 | return make_meta(meta_nonempty(self.frame._meta).diff(**self.kwargs)) |
| 3349 | |
| 3350 | def _simplify_up(self, parent, dependents): |
| 3351 | if isinstance(parent, Projection): |
| 3352 | return plain_column_projection(self, parent, dependents) |
| 3353 | |
| 3354 | @functools.cached_property |
| 3355 | def kwargs(self): |
| 3356 | return dict(periods=self.periods) |
| 3357 | |
| 3358 | @property |
| 3359 | def before(self): |
| 3360 | return self.periods if self.periods > 0 else 0 |
| 3361 | |
| 3362 | @property |
| 3363 | def after(self): |
| 3364 | return 0 if self.periods > 0 else -self.periods |
| 3365 | |
| 3366 | |
| 3367 | class FillnaCheck(Blockwise): |