Skip to content

Conversation

@Alvaro-Kothe
Copy link
Member


Similar to #62863. The window is recomputed from scratch on numerical instability and computes the central moments online.

Benchmarks

$ asv continuous -E virtualenv:3.13 upstream/main HEAD -b "rolling.*kurt" -a repeat=20

| Change   | Before [2d73d629] <main>   | After [2bff0061] <fix/polluted-rolling-kurt>   |   Ratio | Benchmark (Parameter)                                                                 |
|----------|----------------------------|------------------------------------------------|---------|---------------------------------------------------------------------------------------|
| +        | 2.34±0.3ms                 | 2.90±0.02ms                                    |    1.24 | rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'kurt')           |
| -        | 2.60±0.3ms                 | 2.27±0.05ms                                    |    0.87 | rolling.ForwardWindowMethods.time_rolling('Series', 1000, 'int', 'kurt')              |
| -        | 4.54±0.06ms                | 3.88±0.02ms                                    |    0.86 | rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'int', 'kurt')          |
| -        | 4.43±0.03ms                | 3.74±0.03ms                                    |    0.84 | rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'kurt')        |
| -        | 3.57±0.3ms                 | 2.99±0.07ms                                    |    0.84 | rolling.VariableWindowMethods.time_method('Series', '1h', 'int', 'kurt')              |
| -        | 3.05±0.05ms                | 2.49±0.02ms                                    |    0.82 | rolling.ForwardWindowMethods.time_rolling('Series', 10, 'float', 'kurt')              |
| -        | 3.24±0.03ms                | 2.66±0.01ms                                    |    0.82 | rolling.Methods.time_method('Series', ('rolling', {'window': 10}), 'int', 'kurt')     |
| -        | 3.16±0.4ms                 | 2.57±0.04ms                                    |    0.81 | rolling.Methods.time_method('Series', ('rolling', {'window': 10}), 'float', 'kurt')   |
| -        | 2.62±0.01ms                | 2.06±0.2ms                                     |    0.79 | rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'kurt')            |
| -        | 34.7±1ms                   | 26.1±0.4ms                                     |    0.75 | rolling.Groupby.time_method('kurt', ('rolling', {'window': 2}))                       |
| -        | 4.05±0.5ms                 | 2.87±0.02ms                                    |    0.71 | rolling.VariableWindowMethods.time_method('Series', '1h', 'float', 'kurt')            |
| -        | 3.67±0.4ms                 | 2.49±0.02ms                                    |    0.68 | rolling.ForwardWindowMethods.time_rolling('Series', 1000, 'float', 'kurt')            |
| -        | 2.51±0.01ms                | 1.69±0.2ms                                     |    0.67 | rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'kurt')          |
| -        | 3.16±0.02ms                | 2.08±0.2ms                                     |    0.66 | rolling.Methods.time_method('Series', ('expanding', {}), 'float', 'kurt')             |
| -        | 3.95±0.04ms                | 2.56±0.02ms                                    |    0.65 | rolling.Methods.time_method('Series', ('rolling', {'window': 1000}), 'float', 'kurt') |
| -        | 4.08±0.05ms                | 2.65±0.03ms                                    |    0.65 | rolling.Methods.time_method('Series', ('rolling', {'window': 1000}), 'int', 'kurt')   |
| -        | 4.39±0.6ms                 | 2.84±0.01ms                                    |    0.65 | rolling.VariableWindowMethods.time_method('Series', '1d', 'int', 'kurt')              |
| -        | 4.30±0.04ms                | 2.77±0.03ms                                    |    0.64 | rolling.VariableWindowMethods.time_method('Series', '1d', 'float', 'kurt')            |
| -        | 3.27±0.1ms                 | 1.99±0.2ms                                     |    0.61 | rolling.Methods.time_method('Series', ('expanding', {}), 'int', 'kurt')               |

Copy link
Member

@mroeschke mroeschke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM just a merge conflict

@Alvaro-Kothe Alvaro-Kothe force-pushed the fix/polluted-rolling-kurt branch from d2ee2ad to da1f7df Compare November 25, 2025 20:21
@Alvaro-Kothe
Copy link
Member Author

Rebased onto main and fixed the merge conflict in whatsnew.

@mroeschke mroeschke added the Window rolling, ewma, expanding label Dec 1, 2025
@mroeschke mroeschke added this to the 3.0 milestone Dec 1, 2025
@mroeschke mroeschke merged commit 55864a0 into pandas-dev:main Dec 1, 2025
46 checks passed
@mroeschke
Copy link
Member

Thanks again @Alvaro-Kothe

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Window rolling, ewma, expanding

Projects

None yet

2 participants