From f3d1e25d4fbf049a80890df351b61bceff8e6178 Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Wed, 9 Mar 2022 18:43:56 +0100 Subject: [PATCH 01/46] [ewma] better management of nans when time-series starts with nans. Use count state only for adjust='linear' --- wax/modules/ewma.py | 51 +++++++++++++++++++------------------- wax/modules/ewma_test.py | 53 ++++++++++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 41 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 107bda5..19fabdc 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -12,8 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. """Compute exponentioal moving average.""" + import haiku as hk -import jax.numpy as jnp +from jax import numpy as jnp class EWMA(hk.Module): @@ -48,19 +49,6 @@ def __call__(self, x): dtype=x.dtype, init=lambda shape, dtype: jnp.full(shape, self.initial_value, dtype), ) - is_initialized = hk.get_state( - "is_initialized", - shape=x.shape, - dtype=bool, - init=lambda shape, dtype: jnp.full(shape, False, dtype), - ) - count = hk.get_state( - "count", - shape=x.shape, - dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, 0.0, dtype), - ) - alpha = hk.get_parameter( "alpha", shape=[], @@ -69,21 +57,28 @@ def __call__(self, x): ) # initialization on first non-nan value - mean = jnp.where(is_initialized, mean, x) - is_initialized = jnp.where(jnp.isnan(x), is_initialized, True) - hk.set_state("is_initialized", is_initialized) - + mean = jnp.where(jnp.isnan(mean), x, mean) isnan_x = jnp.isnan(x) + isnan_mean = jnp.isnan(mean) + + # fillna by zero to avoid nans in gradient computations x = jnp.nan_to_num(x) mean = jnp.nan_to_num(mean) - count = jnp.where(isnan_x, count, count + 1) - # alpha adjustement scheme if self.adjust == "linear": + count = hk.get_state( + "count", + shape=x.shape, + dtype=x.dtype, + init=lambda shape, dtype: jnp.full(shape, 0.0, dtype), + ) + count = jnp.where(isnan_x, count, count + 1) + hk.set_state("count", count) + tscale = 1.0 / alpha tscale = jnp.where(count < tscale, count, tscale) - alpha = jnp.where(tscale > 0, 1.0 / tscale, jnp.nan) + alpha_eff = jnp.where(tscale > 0, 1.0 / tscale, jnp.nan) elif self.adjust: rho_pow = hk.get_state( "rho_pow", @@ -92,14 +87,18 @@ def __call__(self, x): init=lambda shape, dtype: jnp.full(shape, 1.0, dtype), ) # exponential scheme (as in pandas) - rho_pow = jnp.where(isnan_x, rho_pow, rho_pow * (1 - self.alpha)) eps = jnp.finfo(x.dtype).resolution - alpha = jnp.where(count > 0, alpha / (eps + 1.0 - rho_pow), 1.0) + rho_pow = jnp.where(isnan_x, rho_pow, rho_pow * (1 - alpha)) + alpha_eff = jnp.where(isnan_x, alpha, alpha / (eps + 1.0 - rho_pow)) hk.set_state("rho_pow", rho_pow) + else: + alpha_eff = alpha + # update mean if x is not nan - mean = jnp.where(isnan_x, mean, (1.0 - alpha) * mean + alpha * x) + mean = jnp.where(isnan_x, mean, (1.0 - alpha_eff) * mean + alpha_eff * x) + + # restore nan + mean = jnp.where(jnp.logical_and(isnan_x, isnan_mean), jnp.nan, mean) - mean = jnp.where(is_initialized, mean, self.initial_value) hk.set_state("mean", mean) - hk.set_state("count", count) return mean diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index a869bfb..5dddaee 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -11,16 +11,19 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from functools import partial + import haiku as hk import jax import jax.numpy as jnp +import numpy as onp import pandas as pd import pytest from jax.config import config from wax.compile import jit_init_apply from wax.modules.ewma import EWMA -from wax.unroll import dynamic_unroll_fori_loop, unroll +from wax.unroll import dynamic_unroll_fori_loop, unroll, unroll_transform_with_state @pytest.mark.parametrize("dtype", ["float32", "float64"]) @@ -143,33 +146,53 @@ def model(x): @pytest.mark.parametrize("adjust", [False, True, "linear"]) def test_grad_ewma(adjust): - from functools import partial - - import jax - import jax.numpy as jnp - - from wax.unroll import unroll_transform_with_state rng = jax.random.PRNGKey(42) x = jax.random.normal(rng, (10, 3)) - _, rng = jax.random.split(rng) - params = {"w": jax.random.normal(rng, (10,))} - # put some nan values - x = jax.ops.index_update(x, 0, jnp.nan) + x = x.at[0].set(jnp.nan) + + _, rng = jax.random.split(rng) @partial(unroll_transform_with_state, dynamic=False) def fun(x): return EWMA(1 / 10, adjust=adjust)(x) - # print("init") params, state = fun.init(rng, x) + res, final_state = fun.apply(params, state, rng, x) + + @jax.value_and_grad + def batch(params): + res, final_state = fun.apply(params, state, rng, x) + return res.mean() - # print("apply") + score, grad = batch(params) + assert not jnp.isnan(grad["ewma"]["alpha"]) + + +@pytest.mark.parametrize("adjust", [False, True]) +def test_nan_at_beginning(adjust): + config.update("jax_enable_x64", True) + + T = 20 + x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1) + + @partial(unroll_transform_with_state, dynamic=True) + def fun(x): + return EWMA(1 / 10, adjust=adjust)(x) + + rng = jax.random.PRNGKey(42) + params, state = fun.init(rng, x) res, final_state = fun.apply(params, state, rng, x) - # print(res) + res = pd.DataFrame(onp.array(res)) + + ref_res = ( + pd.DataFrame(onp.array(x)) + .ewm(alpha=1 / 10, adjust=adjust, ignore_na=True) + .mean() + ) + pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) - # print("gradient") @jax.value_and_grad def batch(params): res, final_state = fun.apply(params, state, rng, x) From 1c8f86dcf88b7b70340cfd148a7479eeebf9b393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Thu, 10 Mar 2022 07:46:00 +0100 Subject: [PATCH 02/46] add ignore_na and return_info options --- wax/modules/ewma.py | 92 ++++++++++++++++++++++++++++++++++------ wax/modules/ewma_test.py | 12 +++--- 2 files changed, 85 insertions(+), 19 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 19fabdc..d01d510 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -21,7 +21,12 @@ class EWMA(hk.Module): """Compute exponentioal moving average.""" def __init__( - self, alpha: float, adjust: bool = True, initial_value=jnp.nan, name: str = None + self, alpha: float, + adjust: bool = True, + initial_value=jnp.nan, + ignore_na: bool = False, + return_info: bool = False, + name: str = None, ): """Initialize module. @@ -35,7 +40,9 @@ def __init__( super().__init__(name=name) self.alpha = alpha self.adjust = adjust + self.ignore_na = ignore_na self.initial_value = initial_value + self.return_info = return_info def __call__(self, x): """Compute EWMA. @@ -43,12 +50,8 @@ def __call__(self, x): Args: x: input data. """ - mean = hk.get_state( - "mean", - shape=x.shape, - dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, self.initial_value, dtype), - ) + info = {} + alpha = hk.get_parameter( "alpha", shape=[], @@ -56,8 +59,17 @@ def __call__(self, x): init=lambda *_: jnp.array(self.alpha), ) - # initialization on first non-nan value + mean = hk.get_state( + "mean", + shape=x.shape, + dtype=x.dtype, + init=lambda shape, dtype: jnp.full(shape, self.initial_value, dtype), + ) + + # initialization on first non-nan value if initial_value is nan mean = jnp.where(jnp.isnan(mean), x, mean) + + # get status isnan_x = jnp.isnan(x) isnan_mean = jnp.isnan(mean) @@ -65,6 +77,18 @@ def __call__(self, x): x = jnp.nan_to_num(x) mean = jnp.nan_to_num(mean) + if not self.ignore_na: + is_initialized = hk.get_state( + "is_initialized", + shape=x.shape, + dtype=bool, + init=lambda shape, dtype: jnp.full(shape, False, dtype), + ) + + is_initialized = jnp.where(is_initialized, is_initialized, jnp.logical_not(isnan_x)) + info["is_initialized"] = is_initialized + hk.set_state("is_initialized", is_initialized) + # alpha adjustement scheme if self.adjust == "linear": count = hk.get_state( @@ -73,7 +97,10 @@ def __call__(self, x): dtype=x.dtype, init=lambda shape, dtype: jnp.full(shape, 0.0, dtype), ) - count = jnp.where(isnan_x, count, count + 1) + if self.ignore_na: + count = jnp.where(isnan_x, count, count + 1) + else: + count = count + 1 hk.set_state("count", count) tscale = 1.0 / alpha @@ -88,17 +115,56 @@ def __call__(self, x): ) # exponential scheme (as in pandas) eps = jnp.finfo(x.dtype).resolution - rho_pow = jnp.where(isnan_x, rho_pow, rho_pow * (1 - alpha)) - alpha_eff = jnp.where(isnan_x, alpha, alpha / (eps + 1.0 - rho_pow)) + if self.ignore_na: + rho_pow = jnp.where(isnan_x, rho_pow, rho_pow * (1 - alpha)) + alpha_eff = jnp.where(isnan_x, alpha, alpha / (eps + 1.0 - rho_pow)) + else: + rho_pow = jnp.where(is_initialized, rho_pow * (1 - alpha), rho_pow) + alpha_eff = jnp.where(is_initialized, alpha / (eps + 1.0 - rho_pow), 1.) hk.set_state("rho_pow", rho_pow) else: alpha_eff = alpha # update mean if x is not nan - mean = jnp.where(isnan_x, mean, (1.0 - alpha_eff) * mean + alpha_eff * x) + if self.ignore_na: + mean = jnp.where(isnan_x, mean, (1.0 - alpha_eff) * mean + alpha_eff * x) + else: + norm = hk.get_state( + "norm", + shape=x.shape, + dtype=x.dtype, + init=lambda shape, dtype: jnp.full(shape, 1.0, dtype), + ) + mean = jnp.where(is_initialized, (1.0 - alpha_eff) * mean + alpha_eff * x, mean) + norm = jnp.where(is_initialized, (1.0 - alpha_eff) * norm + alpha_eff * jnp.logical_not(isnan_x), norm) + hk.set_state("norm", norm) # restore nan mean = jnp.where(jnp.logical_and(isnan_x, isnan_mean), jnp.nan, mean) hk.set_state("mean", mean) - return mean + + if self.ignore_na: + last_mean = mean + else: + last_mean = hk.get_state( + "last_mean", + shape=x.shape, + dtype=x.dtype, + init=lambda shape, dtype: jnp.full(shape, self.initial_value, dtype), + ) + + # update only if + last_mean = jnp.where(isnan_x, last_mean, mean / norm) + hk.set_state("last_mean", last_mean) + info["mean"] = mean + info["x"] = x + + info["alpha_eff"] = alpha_eff + + info["norm"] = norm + + if self.return_info: + return last_mean, info + else: + return last_mean diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index 5dddaee..8154d63 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -170,8 +170,8 @@ def batch(params): assert not jnp.isnan(grad["ewma"]["alpha"]) -@pytest.mark.parametrize("adjust", [False, True]) -def test_nan_at_beginning(adjust): +@pytest.mark.parametrize("adjust, ignore_na", [(False, False), (True, False), (True, True)]) +def test_nan_at_beginning(adjust, ignore_na): config.update("jax_enable_x64", True) T = 20 @@ -179,23 +179,23 @@ def test_nan_at_beginning(adjust): @partial(unroll_transform_with_state, dynamic=True) def fun(x): - return EWMA(1 / 10, adjust=adjust)(x) + return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True,)(x) rng = jax.random.PRNGKey(42) params, state = fun.init(rng, x) - res, final_state = fun.apply(params, state, rng, x) + (res, info), final_state = fun.apply(params, state, rng, x) res = pd.DataFrame(onp.array(res)) ref_res = ( pd.DataFrame(onp.array(x)) - .ewm(alpha=1 / 10, adjust=adjust, ignore_na=True) + .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) .mean() ) pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) @jax.value_and_grad def batch(params): - res, final_state = fun.apply(params, state, rng, x) + (res, info), final_state = fun.apply(params, state, rng, x) return res.mean() score, grad = batch(params) From c8a76250efe03b8da1d73453c3e858c37fa08af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Thu, 10 Mar 2022 09:17:30 +0100 Subject: [PATCH 03/46] simplify implementation --- wax/modules/ewma.py | 48 +++++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index d01d510..2e7d124 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -89,39 +89,31 @@ def __call__(self, x): info["is_initialized"] = is_initialized hk.set_state("is_initialized", is_initialized) - # alpha adjustement scheme - if self.adjust == "linear": - count = hk.get_state( - "count", + com = 1. / alpha - 1. + if self.adjust: + com_eff = hk.get_state( + "com_eff", shape=x.shape, dtype=x.dtype, init=lambda shape, dtype: jnp.full(shape, 0.0, dtype), ) - if self.ignore_na: - count = jnp.where(isnan_x, count, count + 1) + alpha_eff = 1. / (1. + com_eff) + info["com_eff"] = com_eff + + # adjustement scheme + if self.adjust == "linear": + if self.ignore_na: + com_eff = jnp.where(isnan_x, com_eff, com_eff + 1) + else: + com_eff = jnp.where(is_initialized, com_eff + 1, com_eff) + com_eff = jnp.minimum(com_eff, com) else: - count = count + 1 - hk.set_state("count", count) - - tscale = 1.0 / alpha - tscale = jnp.where(count < tscale, count, tscale) - alpha_eff = jnp.where(tscale > 0, 1.0 / tscale, jnp.nan) - elif self.adjust: - rho_pow = hk.get_state( - "rho_pow", - shape=x.shape, - dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, 1.0, dtype), - ) - # exponential scheme (as in pandas) - eps = jnp.finfo(x.dtype).resolution - if self.ignore_na: - rho_pow = jnp.where(isnan_x, rho_pow, rho_pow * (1 - alpha)) - alpha_eff = jnp.where(isnan_x, alpha, alpha / (eps + 1.0 - rho_pow)) - else: - rho_pow = jnp.where(is_initialized, rho_pow * (1 - alpha), rho_pow) - alpha_eff = jnp.where(is_initialized, alpha / (eps + 1.0 - rho_pow), 1.) - hk.set_state("rho_pow", rho_pow) + # exponential scheme (as in pandas) + if self.ignore_na: + com_eff = jnp.where(isnan_x, com_eff, alpha * com + (1 - alpha) * com_eff) + else: + com_eff = jnp.where(is_initialized, alpha * com + (1 - alpha) * com_eff, com_eff) + hk.set_state("com_eff", com_eff) else: alpha_eff = alpha From 96437dd84dac96bf27fcf0eaf1105d49d48e5d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Thu, 10 Mar 2022 09:21:07 +0100 Subject: [PATCH 04/46] fix --- wax/modules/ewma.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 2e7d124..b96d251 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -89,8 +89,9 @@ def __call__(self, x): info["is_initialized"] = is_initialized hk.set_state("is_initialized", is_initialized) - com = 1. / alpha - 1. if self.adjust: + # adjustement scheme + com = 1. / alpha - 1. com_eff = hk.get_state( "com_eff", shape=x.shape, @@ -100,7 +101,6 @@ def __call__(self, x): alpha_eff = 1. / (1. + com_eff) info["com_eff"] = com_eff - # adjustement scheme if self.adjust == "linear": if self.ignore_na: com_eff = jnp.where(isnan_x, com_eff, com_eff + 1) From bea91a879ef7ac7568b50cddc4f00e1ee57f5be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Thu, 10 Mar 2022 10:23:22 +0100 Subject: [PATCH 05/46] clean code --- wax/modules/ewma.py | 60 ++++++++++++++++++++++++++-------------- wax/modules/ewma_test.py | 11 ++++++-- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index b96d251..4376389 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -21,12 +21,13 @@ class EWMA(hk.Module): """Compute exponentioal moving average.""" def __init__( - self, alpha: float, - adjust: bool = True, - initial_value=jnp.nan, - ignore_na: bool = False, - return_info: bool = False, - name: str = None, + self, + alpha: float, + adjust: bool = True, + initial_value=jnp.nan, + ignore_na: bool = False, + return_info: bool = False, + name: str = None, ): """Initialize module. @@ -85,21 +86,25 @@ def __call__(self, x): init=lambda shape, dtype: jnp.full(shape, False, dtype), ) - is_initialized = jnp.where(is_initialized, is_initialized, jnp.logical_not(isnan_x)) - info["is_initialized"] = is_initialized + is_initialized = jnp.where( + is_initialized, is_initialized, jnp.logical_not(isnan_x) + ) + if self.return_info: + info["is_initialized"] = is_initialized hk.set_state("is_initialized", is_initialized) if self.adjust: # adjustement scheme - com = 1. / alpha - 1. + com = 1.0 / alpha - 1.0 com_eff = hk.get_state( "com_eff", shape=x.shape, dtype=x.dtype, init=lambda shape, dtype: jnp.full(shape, 0.0, dtype), ) - alpha_eff = 1. / (1. + com_eff) - info["com_eff"] = com_eff + if self.return_info: + info["com_eff"] = com_eff + alpha_eff = 1.0 / (1.0 + com_eff) if self.adjust == "linear": if self.ignore_na: @@ -110,13 +115,20 @@ def __call__(self, x): else: # exponential scheme (as in pandas) if self.ignore_na: - com_eff = jnp.where(isnan_x, com_eff, alpha * com + (1 - alpha) * com_eff) + com_eff = jnp.where( + isnan_x, com_eff, alpha * com + (1 - alpha) * com_eff + ) else: - com_eff = jnp.where(is_initialized, alpha * com + (1 - alpha) * com_eff, com_eff) + com_eff = jnp.where( + is_initialized, alpha * com + (1 - alpha) * com_eff, com_eff + ) hk.set_state("com_eff", com_eff) else: alpha_eff = alpha + if self.return_info: + info["alpha_eff"] = alpha_eff + # update mean if x is not nan if self.ignore_na: mean = jnp.where(isnan_x, mean, (1.0 - alpha_eff) * mean + alpha_eff * x) @@ -128,9 +140,21 @@ def __call__(self, x): init=lambda shape, dtype: jnp.full(shape, 1.0, dtype), ) - mean = jnp.where(is_initialized, (1.0 - alpha_eff) * mean + alpha_eff * x, mean) - norm = jnp.where(is_initialized, (1.0 - alpha_eff) * norm + alpha_eff * jnp.logical_not(isnan_x), norm) + mean = jnp.where( + is_initialized, (1.0 - alpha_eff) * mean + alpha_eff * x, mean + ) + norm = jnp.where( + is_initialized, + (1.0 - alpha_eff) * norm + alpha_eff * jnp.logical_not(isnan_x), + norm, + ) + + if self.return_info: + info["mean"] = mean + info["norm"] = norm + hk.set_state("norm", norm) + # restore nan mean = jnp.where(jnp.logical_and(isnan_x, isnan_mean), jnp.nan, mean) @@ -149,12 +173,6 @@ def __call__(self, x): # update only if last_mean = jnp.where(isnan_x, last_mean, mean / norm) hk.set_state("last_mean", last_mean) - info["mean"] = mean - info["x"] = x - - info["alpha_eff"] = alpha_eff - - info["norm"] = norm if self.return_info: return last_mean, info diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index 8154d63..78d0403 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -170,7 +170,9 @@ def batch(params): assert not jnp.isnan(grad["ewma"]["alpha"]) -@pytest.mark.parametrize("adjust, ignore_na", [(False, False), (True, False), (True, True)]) +@pytest.mark.parametrize( + "adjust, ignore_na", [(False, False), (True, False), (True, True)] +) def test_nan_at_beginning(adjust, ignore_na): config.update("jax_enable_x64", True) @@ -179,7 +181,12 @@ def test_nan_at_beginning(adjust, ignore_na): @partial(unroll_transform_with_state, dynamic=True) def fun(x): - return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True,)(x) + return EWMA( + 1 / 10, + adjust=adjust, + ignore_na=ignore_na, + return_info=True, + )(x) rng = jax.random.PRNGKey(42) params, state = fun.init(rng, x) From 2076209b91fd6a437803f8c2aad46d9f85e0123a Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Thu, 10 Mar 2022 16:24:44 +0100 Subject: [PATCH 06/46] add min_periods option --- wax/modules/ewma.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 4376389..df90b5b 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -26,6 +26,7 @@ def __init__( adjust: bool = True, initial_value=jnp.nan, ignore_na: bool = False, + min_periods=None, return_info: bool = False, name: str = None, ): @@ -43,6 +44,7 @@ def __init__( self.adjust = adjust self.ignore_na = ignore_na self.initial_value = initial_value + self.min_periods = min_periods self.return_info = return_info def __call__(self, x): @@ -78,7 +80,7 @@ def __call__(self, x): x = jnp.nan_to_num(x) mean = jnp.nan_to_num(mean) - if not self.ignore_na: + if not self.ignore_na or self.min_periods: is_initialized = hk.get_state( "is_initialized", shape=x.shape, @@ -93,6 +95,21 @@ def __call__(self, x): info["is_initialized"] = is_initialized hk.set_state("is_initialized", is_initialized) + if self.min_periods: + count = hk.get_state( + "count", + shape=x.shape, + dtype=x.dtype, + init=lambda shape, dtype: jnp.full(shape, 0.0, dtype), + ) + if self.return_info: + info["count"] = count + if self.ignore_na: + count = jnp.where(isnan_x, count, count + 1) + else: + count = jnp.where(is_initialized, count + 1, count) + hk.set_state("count", count) + if self.adjust: # adjustement scheme com = 1.0 / alpha - 1.0 @@ -174,6 +191,9 @@ def __call__(self, x): last_mean = jnp.where(isnan_x, last_mean, mean / norm) hk.set_state("last_mean", last_mean) + if self.min_periods: + last_mean = jnp.where(count< self.min_periods, jnp.nan, last_mean) + if self.return_info: return last_mean, info else: From d63cf063859dfc93b084ac2d548e72c757026bfc Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Fri, 11 Mar 2022 11:31:48 +0100 Subject: [PATCH 07/46] add com parameter and docstring --- wax/modules/ewma.py | 77 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index df90b5b..0ae0a0b 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -22,29 +22,81 @@ class EWMA(hk.Module): def __init__( self, - alpha: float, + alpha: float = None, + com: float = None, + min_periods : int = 0, adjust: bool = True, - initial_value=jnp.nan, ignore_na: bool = False, - min_periods=None, + initial_value=jnp.nan, return_info: bool = False, name: str = None, ): """Initialize module. Args: - alpha: alpha parameter of the exponential moving average. - adjust: if true, implement a non-stationary filter with exponential initialization - scheme. If "linear", implement a non-stationary filter with linear initialization. - initial_value: initial value for the state. + alpha: Specify smoothing factor :math:`\alpha` directly + :math:`0 < \alpha \leq 1`. + com : Specify decay in terms of center of mass + :math:`\alpha = 1 / (1 + com)`, for :math:`com \geq 0`. + + min_periods : Minimum number of observations in window required to have a value; + otherwise, result is ``np.nan``. + + + adjust : Divide by decaying adjustment factor in beginning periods to account + for imbalance in relative weightings (viewing EWMA as a moving average). + - When ``adjust=True`` (default), the EW function is calculated using weights + :math:`w_i = (1 - \alpha)^i`. For example, the EW moving average of the series + [:math:`x_0, x_1, ..., x_t`] would be: + .. math:: + y_t = \frac{x_t + (1 - \alpha)x_{t-1} + (1 - \alpha)^2 x_{t-2} + ... + (1 - + \alpha)^t x_0}{1 + (1 - \alpha) + (1 - \alpha)^2 + ... + (1 - \alpha)^t} + - When ``adjust=False``, the exponentially weighted function is calculated + recursively: + .. math:: + \begin{split} + y_0 &= x_0\\ + y_t &= (1 - \alpha) y_{t-1} + \alpha x_t, + \end{split} + The effective center of mass (com) interpolate exponentially between 0 and the + nominal center of mass. + + - When ``adjust='linear'`` the effective center of mass (com) interpolate linearly + between 0 and the nominal center of mass. + + ignore_na : Ignore missing values when calculating weights. + - When ``ignore_na=False`` (default), weights are based on absolute positions. + For example, the weights of :math:`x_0` and :math:`x_2` used in calculating + the final weighted average of [:math:`x_0`, None, :math:`x_2`] are + :math:`(1-\alpha)^2` and :math:`1` if ``adjust=True``, and + :math:`(1-\alpha)^2` and :math:`\alpha` if ``adjust=False``. + - When ``ignore_na=True``, weights are based + on relative positions. For example, the weights of :math:`x_0` and :math:`x_2` + used in calculating the final weighted average of + [:math:`x_0`, None, :math:`x_2`] are :math:`1-\alpha` and :math:`1` if + ``adjust=True``, and :math:`1-\alpha` and :math:`\alpha` if ``adjust=False``. + + + initial_value : initial value for the state. + + return_info : if true, a dictionary is returned in addition to the module output which + contains additional variables. + name : name of the module instance. """ super().__init__(name=name) - self.alpha = alpha + if com is not None: + assert alpha is None + elif alpha is not None: + assert com is None + com = 1. / alpha - 1. + assert com > 0 + + self.com = com + self.min_periods = min_periods self.adjust = adjust self.ignore_na = ignore_na self.initial_value = initial_value - self.min_periods = min_periods self.return_info = return_info def __call__(self, x): @@ -55,11 +107,11 @@ def __call__(self, x): """ info = {} - alpha = hk.get_parameter( + com = hk.get_parameter( "alpha", shape=[], dtype=x.dtype, - init=lambda *_: jnp.array(self.alpha), + init=lambda *_: jnp.array(self.com), ) mean = hk.get_state( @@ -80,6 +132,8 @@ def __call__(self, x): x = jnp.nan_to_num(x) mean = jnp.nan_to_num(mean) + alpha = 1.0 / (1.0 + com) + if not self.ignore_na or self.min_periods: is_initialized = hk.get_state( "is_initialized", @@ -112,7 +166,6 @@ def __call__(self, x): if self.adjust: # adjustement scheme - com = 1.0 / alpha - 1.0 com_eff = hk.get_state( "com_eff", shape=x.shape, From f8d8e1df6396c2291b658b545806301a606b2177 Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Fri, 11 Mar 2022 13:51:09 +0100 Subject: [PATCH 08/46] rename haiku param alpha in com --- wax/modules/ewma.py | 4 ++-- wax/modules/ewma_test.py | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 0ae0a0b..b588399 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -108,10 +108,10 @@ def __call__(self, x): info = {} com = hk.get_parameter( - "alpha", + "com", shape=[], dtype=x.dtype, - init=lambda *_: jnp.array(self.com), + init=lambda shape, dtype: jnp.array(self.com, dtype), ) mean = hk.get_state( diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index 78d0403..50b5842 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -40,7 +40,7 @@ def test_init_and_first_step_ema(dtype): @jit_init_apply @hk.transform_with_state def model(x): - return EWMA(0.1, adjust=True)(x) + return EWMA(alpha=0.1, adjust=True)(x) params, state = model.init(next(seq), x) ema, state = model.apply(params, state, next(seq), x) @@ -57,7 +57,7 @@ def test_run_ema_vs_pandas_not_adjust(): @jit_init_apply @hk.transform_with_state def model(x): - return EWMA(0.1, adjust=False)(x) + return EWMA(alpha=0.1, adjust=False)(x) ema, state = unroll(model, dynamic=False, return_final_state=True)(x) @@ -76,7 +76,7 @@ def test_dynamic_unroll_fori_loop(): @jit_init_apply @hk.transform_with_state def model(x): - return EWMA(0.1, adjust=True)(x) + return EWMA(alpha=0.1, adjust=True)(x) ema, state = unroll(model, dynamic=False, return_final_state=True)(x) @@ -95,7 +95,7 @@ def test_dynamic_unroll(): @jit_init_apply @hk.transform_with_state def model(x): - return EWMA(0.1, adjust=True)(x) + return EWMA(alpha=0.1, adjust=True)(x) ema, state = unroll(model, dynamic=False, return_final_state=True)(x) @@ -115,7 +115,7 @@ def test_run_ema_vs_pandas_adjust(): @jit_init_apply @hk.transform_with_state def model(x): - return EWMA(0.1, adjust=True)(x) + return EWMA(alpha=0.1, adjust=True)(x) ema, state = unroll(model, return_final_state=True)(x) @@ -133,7 +133,7 @@ def test_run_ema_vs_pandas_adjust_finite(): @jit_init_apply @hk.transform_with_state def model(x): - return EWMA(0.1, adjust="linear")(x) + return EWMA(alpha=0.1, adjust="linear")(x) ema, state = unroll(model, return_final_state=True)(x) pandas_ema_adjust = pd.DataFrame(x).ewm(alpha=0.1, adjust=True).mean() @@ -167,7 +167,7 @@ def batch(params): return res.mean() score, grad = batch(params) - assert not jnp.isnan(grad["ewma"]["alpha"]) + assert not jnp.isnan(grad["ewma"]["com"]) @pytest.mark.parametrize( @@ -182,7 +182,7 @@ def test_nan_at_beginning(adjust, ignore_na): @partial(unroll_transform_with_state, dynamic=True) def fun(x): return EWMA( - 1 / 10, + com=10, adjust=adjust, ignore_na=ignore_na, return_info=True, @@ -195,7 +195,7 @@ def fun(x): ref_res = ( pd.DataFrame(onp.array(x)) - .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) + .ewm(com=10, adjust=adjust, ignore_na=ignore_na) .mean() ) pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) @@ -206,4 +206,4 @@ def batch(params): return res.mean() score, grad = batch(params) - assert not jnp.isnan(grad["ewma"]["alpha"]) + assert not jnp.isnan(grad["ewma"]["com"]) From 12ea2c5d03848fd34d68fc2df686ff461b4937fc Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Fri, 11 Mar 2022 18:17:20 +0100 Subject: [PATCH 09/46] use logcom as haiku parameter. Add test with training --- wax/modules/ewma.py | 15 +++++----- wax/modules/ewma_test.py | 62 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index b588399..346b8d2 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -24,7 +24,7 @@ def __init__( self, alpha: float = None, com: float = None, - min_periods : int = 0, + min_periods: int = 0, adjust: bool = True, ignore_na: bool = False, initial_value=jnp.nan, @@ -89,7 +89,7 @@ def __init__( assert alpha is None elif alpha is not None: assert com is None - com = 1. / alpha - 1. + com = 1.0 / alpha - 1.0 assert com > 0 self.com = com @@ -107,12 +107,13 @@ def __call__(self, x): """ info = {} - com = hk.get_parameter( - "com", + logcom = hk.get_parameter( + "logcom", shape=[], dtype=x.dtype, - init=lambda shape, dtype: jnp.array(self.com, dtype), + init=lambda shape, dtype: jnp.array(jnp.log(self.com), dtype), ) + com = jnp.exp(logcom) mean = hk.get_state( "mean", @@ -132,7 +133,7 @@ def __call__(self, x): x = jnp.nan_to_num(x) mean = jnp.nan_to_num(mean) - alpha = 1.0 / (1.0 + com) + alpha = 1.0 / (1.0 + com) if not self.ignore_na or self.min_periods: is_initialized = hk.get_state( @@ -245,7 +246,7 @@ def __call__(self, x): hk.set_state("last_mean", last_mean) if self.min_periods: - last_mean = jnp.where(count< self.min_periods, jnp.nan, last_mean) + last_mean = jnp.where(count < self.min_periods, jnp.nan, last_mean) if self.return_info: return last_mean, info diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index 50b5842..f09fc3c 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -167,7 +167,7 @@ def batch(params): return res.mean() score, grad = batch(params) - assert not jnp.isnan(grad["ewma"]["com"]) + assert not jnp.isnan(grad["ewma"]["logcom"]) @pytest.mark.parametrize( @@ -203,7 +203,63 @@ def fun(x): @jax.value_and_grad def batch(params): (res, info), final_state = fun.apply(params, state, rng, x) - return res.mean() + return jnp.nanmean(res) score, grad = batch(params) - assert not jnp.isnan(grad["ewma"]["com"]) + assert not jnp.isnan(grad["ewma"]["logcom"]) + + +def test_train_ewma(): + import optax + from tqdm.auto import tqdm + + COM_INIT = 100 + COM_TARGET = 10 + T = 1000 + n_epochs = 100 + + def train(): + def model(x): + return EWMA(1 / COM_INIT, adjust=False, ignore_na=True)(x) + + @jax.jit + def loss(y, y_ref): + return jnp.nanmean((y - y_ref) ** 2) + + @jax.jit + def loss_p(params, state, x, y_ref): + y_pred, state = model.apply(params, state, rng, x) + return loss(y_pred, y_ref) + + rng = jax.random.PRNGKey(42) + x = jax.random.normal(rng, (T,)) + + y_ref = unroll(lambda x: EWMA(1 / COM_TARGET, adjust=False, ignore_na=True)(x))( + x + ) + + model = unroll_transform_with_state(model) + params, state = model.init(rng, x) + + y_pred, _ = model.apply(params, state, rng, x) + + opt = optax.adagrad(1.0e-1) + opt_state = opt.init(params) + for e in tqdm(range(n_epochs)): + # params, state = model.init(rng, x) + _, state = model.init(rng, x) + y_pred, state = model.apply(params, state, rng, x) + l_ = loss(y_pred, y_ref) + grad = jax.grad(loss_p)(params, state, x, y_ref) + logcom = params["ewma"]["logcom"] + if e % 100 == 0: + print( + f"e={e}, logcom={logcom}, com={jnp.exp(logcom)}, grad={grad['ewma']['logcom']}, loss = {l_}" + ) + updates, opt_state = opt.update(grad, opt_state) + params = optax.apply_updates(params, updates) + print( + f"logcom={logcom}, com={jnp.exp(logcom)}, grad={grad['ewma']['logcom']}, loss = {l_}" + ) + + train() From 6eec139502692b24e67d9742b760e17a2fb91bf8 Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Fri, 11 Mar 2022 18:29:40 +0100 Subject: [PATCH 10/46] refine test for training ewma --- wax/modules/ewma_test.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index f09fc3c..f5395d7 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -220,7 +220,7 @@ def test_train_ewma(): def train(): def model(x): - return EWMA(1 / COM_INIT, adjust=False, ignore_na=True)(x) + return EWMA(1 / COM_INIT, adjust=True, ignore_na=False)(x) @jax.jit def loss(y, y_ref): @@ -232,9 +232,9 @@ def loss_p(params, state, x, y_ref): return loss(y_pred, y_ref) rng = jax.random.PRNGKey(42) - x = jax.random.normal(rng, (T,)) + x = jax.random.normal(rng, (T,)).at[T // 2].set(jnp.nan) - y_ref = unroll(lambda x: EWMA(1 / COM_TARGET, adjust=False, ignore_na=True)(x))( + y_ref = unroll(lambda x: EWMA(1 / COM_TARGET, adjust=True, ignore_na=False)(x))( x ) @@ -245,6 +245,7 @@ def loss_p(params, state, x, y_ref): opt = optax.adagrad(1.0e-1) opt_state = opt.init(params) + losses = [] for e in tqdm(range(n_epochs)): # params, state = model.init(rng, x) _, state = model.init(rng, x) @@ -258,8 +259,8 @@ def loss_p(params, state, x, y_ref): ) updates, opt_state = opt.update(grad, opt_state) params = optax.apply_updates(params, updates) - print( - f"logcom={logcom}, com={jnp.exp(logcom)}, grad={grad['ewma']['logcom']}, loss = {l_}" - ) + losses.append(l_) + return jnp.array(losses) - train() + losses = train() + assert losses[-1] < losses[0] From 4227cf5f4a512ef27769666266b65876c8750145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Sat, 12 Mar 2022 18:25:53 +0100 Subject: [PATCH 11/46] format code --- wax/modules/ewma.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 346b8d2..e7ef65f 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. """Compute exponentioal moving average.""" +from typing import Dict, Tuple, Union, cast import haiku as hk from jax import numpy as jnp @@ -90,7 +91,7 @@ def __init__( elif alpha is not None: assert com is None com = 1.0 / alpha - 1.0 - assert com > 0 + assert cast(float, com) > 0.0 self.com = com self.min_periods = min_periods @@ -99,11 +100,18 @@ def __init__( self.initial_value = initial_value self.return_info = return_info - def __call__(self, x): + def __call__( + self, x: jnp.ndarray + ) -> Union[jnp.ndarray, Tuple[jnp.ndarray, Dict[str, jnp.ndarray]]]: """Compute EWMA. Args: x: input data. + + Returns: + last_mean : value of the mean + + info: A dictionnary with additionnal variables. It is returned if `return_info` is true. """ info = {} From f15b30d58a7092e690ffc052f18426fc33690e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Sun, 13 Mar 2022 01:09:27 +0100 Subject: [PATCH 12/46] replace isnan_x by ~is_observation --- wax/modules/ewma.py | 25 +++++++++++++----------- wax/modules/ewma_test.py | 42 ++++++++++++++++++++++++++++------------ 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index e7ef65f..995185f 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -86,6 +86,9 @@ def __init__( name : name of the module instance. """ super().__init__(name=name) + assert ( + com is not None or alpha is not None + ), "com or alpha parameters must be specified." if com is not None: assert alpha is None elif alpha is not None: @@ -134,7 +137,7 @@ def __call__( mean = jnp.where(jnp.isnan(mean), x, mean) # get status - isnan_x = jnp.isnan(x) + is_observation = ~jnp.isnan(x) isnan_mean = jnp.isnan(mean) # fillna by zero to avoid nans in gradient computations @@ -151,9 +154,7 @@ def __call__( init=lambda shape, dtype: jnp.full(shape, False, dtype), ) - is_initialized = jnp.where( - is_initialized, is_initialized, jnp.logical_not(isnan_x) - ) + is_initialized = jnp.where(is_initialized, is_initialized, is_observation) if self.return_info: info["is_initialized"] = is_initialized hk.set_state("is_initialized", is_initialized) @@ -168,7 +169,7 @@ def __call__( if self.return_info: info["count"] = count if self.ignore_na: - count = jnp.where(isnan_x, count, count + 1) + count = jnp.where(is_observation, count + 1, count) else: count = jnp.where(is_initialized, count + 1, count) hk.set_state("count", count) @@ -187,7 +188,7 @@ def __call__( if self.adjust == "linear": if self.ignore_na: - com_eff = jnp.where(isnan_x, com_eff, com_eff + 1) + com_eff = jnp.where(is_observation, com_eff + 1, com_eff) else: com_eff = jnp.where(is_initialized, com_eff + 1, com_eff) com_eff = jnp.minimum(com_eff, com) @@ -195,7 +196,7 @@ def __call__( # exponential scheme (as in pandas) if self.ignore_na: com_eff = jnp.where( - isnan_x, com_eff, alpha * com + (1 - alpha) * com_eff + is_observation, alpha * com + (1 - alpha) * com_eff, com_eff ) else: com_eff = jnp.where( @@ -210,7 +211,9 @@ def __call__( # update mean if x is not nan if self.ignore_na: - mean = jnp.where(isnan_x, mean, (1.0 - alpha_eff) * mean + alpha_eff * x) + mean = jnp.where( + is_observation, (1.0 - alpha_eff) * mean + alpha_eff * x, mean + ) else: norm = hk.get_state( "norm", @@ -224,7 +227,7 @@ def __call__( ) norm = jnp.where( is_initialized, - (1.0 - alpha_eff) * norm + alpha_eff * jnp.logical_not(isnan_x), + (1.0 - alpha_eff) * norm + alpha_eff * is_observation, norm, ) @@ -235,7 +238,7 @@ def __call__( hk.set_state("norm", norm) # restore nan - mean = jnp.where(jnp.logical_and(isnan_x, isnan_mean), jnp.nan, mean) + mean = jnp.where(jnp.logical_and(~is_observation, isnan_mean), jnp.nan, mean) hk.set_state("mean", mean) @@ -250,7 +253,7 @@ def __call__( ) # update only if - last_mean = jnp.where(isnan_x, last_mean, mean / norm) + last_mean = jnp.where(is_observation, mean / norm, last_mean) hk.set_state("last_mean", last_mean) if self.min_periods: diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index f5395d7..6b2992a 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -171,7 +171,7 @@ def batch(params): @pytest.mark.parametrize( - "adjust, ignore_na", [(False, False), (True, False), (True, True)] + "adjust, ignore_na", [(False, True), (True, False), (True, True)] # (False, False), ) def test_nan_at_beginning(adjust, ignore_na): config.update("jax_enable_x64", True) @@ -179,25 +179,43 @@ def test_nan_at_beginning(adjust, ignore_na): T = 20 x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1) + compare_nan_at_beginning(x, com=10, adjust=adjust, ignore_na=ignore_na) + + # check min_periods option with random variable + rng = jax.random.PRNGKey(42) + x = jax.random.normal(rng, (5,)) + compare_nan_at_beginning( + x, + com=10, + adjust=adjust, + ignore_na=ignore_na, + min_periods=2, + ) + + # check random variable with nans + rng = jax.random.PRNGKey(42) + x = jax.random.normal(rng, (6,)).at[3].set(jnp.nan) + x = jnp.ones((6,), "float64").at[0].set(-1).at[3].set(jnp.nan) + + compare_nan_at_beginning( + x, + com=10, + adjust=adjust, + ignore_na=ignore_na, + ) + + +def compare_nan_at_beginning(x, **ewma_kwargs): @partial(unroll_transform_with_state, dynamic=True) def fun(x): - return EWMA( - com=10, - adjust=adjust, - ignore_na=ignore_na, - return_info=True, - )(x) + return EWMA(return_info=True, **ewma_kwargs)(x) rng = jax.random.PRNGKey(42) params, state = fun.init(rng, x) (res, info), final_state = fun.apply(params, state, rng, x) res = pd.DataFrame(onp.array(res)) - ref_res = ( - pd.DataFrame(onp.array(x)) - .ewm(com=10, adjust=adjust, ignore_na=ignore_na) - .mean() - ) + ref_res = pd.DataFrame(onp.array(x)).ewm(**ewma_kwargs).mean() pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) @jax.value_and_grad From a22a0c18abc7a66a5374f2b54a66ffc275f515f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Sun, 13 Mar 2022 22:57:41 +0100 Subject: [PATCH 13/46] Align implementation with pandas --- wax/modules/ewma.py | 142 ++++++++++++--------------------------- wax/modules/ewma_test.py | 11 +-- 2 files changed, 49 insertions(+), 104 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 995185f..7dde827 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -133,9 +133,6 @@ def __call__( init=lambda shape, dtype: jnp.full(shape, self.initial_value, dtype), ) - # initialization on first non-nan value if initial_value is nan - mean = jnp.where(jnp.isnan(mean), x, mean) - # get status is_observation = ~jnp.isnan(x) isnan_mean = jnp.isnan(mean) @@ -146,120 +143,67 @@ def __call__( alpha = 1.0 / (1.0 + com) - if not self.ignore_na or self.min_periods: - is_initialized = hk.get_state( - "is_initialized", - shape=x.shape, - dtype=bool, - init=lambda shape, dtype: jnp.full(shape, False, dtype), - ) - - is_initialized = jnp.where(is_initialized, is_initialized, is_observation) - if self.return_info: - info["is_initialized"] = is_initialized - hk.set_state("is_initialized", is_initialized) - - if self.min_periods: - count = hk.get_state( - "count", - shape=x.shape, - dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, 0.0, dtype), - ) - if self.return_info: - info["count"] = count - if self.ignore_na: - count = jnp.where(is_observation, count + 1, count) - else: - count = jnp.where(is_initialized, count + 1, count) - hk.set_state("count", count) - if self.adjust: - # adjustement scheme - com_eff = hk.get_state( - "com_eff", - shape=x.shape, - dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, 0.0, dtype), - ) - if self.return_info: - info["com_eff"] = com_eff - alpha_eff = 1.0 / (1.0 + com_eff) - - if self.adjust == "linear": - if self.ignore_na: - com_eff = jnp.where(is_observation, com_eff + 1, com_eff) - else: - com_eff = jnp.where(is_initialized, com_eff + 1, com_eff) - com_eff = jnp.minimum(com_eff, com) - else: - # exponential scheme (as in pandas) - if self.ignore_na: - com_eff = jnp.where( - is_observation, alpha * com + (1 - alpha) * com_eff, com_eff - ) - else: - com_eff = jnp.where( - is_initialized, alpha * com + (1 - alpha) * com_eff, com_eff - ) - hk.set_state("com_eff", com_eff) + new_wt = 1.0 else: - alpha_eff = alpha + new_wt = alpha - if self.return_info: - info["alpha_eff"] = alpha_eff + old_wt = hk.get_state( + "old_wt", + shape=x.shape, + dtype=x.dtype, + init=lambda shape, dtype: jnp.full(shape, 1.0, dtype), + ) + + if self.adjust == "linear": + # com_eff grow linearly when there is observation but + # decrease exponentially when there is nans. + old_wt_factor = jnp.where(is_observation, 1.0, 1.0 - alpha) + old_wt = jnp.minimum(old_wt, com) + else: + old_wt_factor = 1.0 - alpha - # update mean if x is not nan if self.ignore_na: - mean = jnp.where( - is_observation, (1.0 - alpha_eff) * mean + alpha_eff * x, mean - ) + old_wt = jnp.where(is_observation, old_wt * old_wt_factor, old_wt) else: - norm = hk.get_state( - "norm", - shape=x.shape, - dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, 1.0, dtype), - ) + old_wt = old_wt * old_wt_factor - mean = jnp.where( - is_initialized, (1.0 - alpha_eff) * mean + alpha_eff * x, mean - ) - norm = jnp.where( - is_initialized, - (1.0 - alpha_eff) * norm + alpha_eff * is_observation, - norm, - ) + old_wt = jnp.where(isnan_mean, 0.0, old_wt) - if self.return_info: - info["mean"] = mean - info["norm"] = norm + mean = jnp.where( + is_observation, (old_wt * mean + new_wt * x) / (old_wt + new_wt), mean + ) - hk.set_state("norm", norm) + if self.return_info: + info["com_eff"] = old_wt / new_wt + + if self.adjust: + old_wt = jnp.where(is_observation, old_wt + new_wt, old_wt) + else: + old_wt = jnp.where(is_observation, 1.0, old_wt) # restore nan mean = jnp.where(jnp.logical_and(~is_observation, isnan_mean), jnp.nan, mean) + hk.set_state("old_wt", old_wt) hk.set_state("mean", mean) - if self.ignore_na: - last_mean = mean - else: - last_mean = hk.get_state( - "last_mean", + if self.min_periods: + nobs = hk.get_state( + "nobs", shape=x.shape, dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, self.initial_value, dtype), + init=lambda shape, dtype: jnp.full(shape, 0.0, dtype=dtype), ) - - # update only if - last_mean = jnp.where(is_observation, mean / norm, last_mean) - hk.set_state("last_mean", last_mean) - - if self.min_periods: - last_mean = jnp.where(count < self.min_periods, jnp.nan, last_mean) + nobs = jnp.where(is_observation, nobs + 1, nobs) + if self.return_info: + info["nobs"] = nobs + hk.set_state("nobs", nobs) + result = jnp.where(nobs >= self.min_periods, mean, jnp.nan) + else: + result = mean if self.return_info: - return last_mean, info + return result, info else: - return last_mean + return result diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index 6b2992a..c7ad356 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -123,8 +123,7 @@ def model(x): assert jnp.allclose(ema, pandas_ema.values) -def test_run_ema_vs_pandas_adjust_finite(): - +def off_test_run_ema_vs_pandas_adjust_finite(): config.update("jax_enable_x64", True) seq = hk.PRNGSequence(42) @@ -171,7 +170,8 @@ def batch(params): @pytest.mark.parametrize( - "adjust, ignore_na", [(False, True), (True, False), (True, True)] # (False, False), + "adjust, ignore_na", + [(False, False), (False, True), (True, False), (True, True)], # , ) def test_nan_at_beginning(adjust, ignore_na): config.update("jax_enable_x64", True) @@ -194,8 +194,9 @@ def test_nan_at_beginning(adjust, ignore_na): # check random variable with nans rng = jax.random.PRNGKey(42) - x = jax.random.normal(rng, (6,)).at[3].set(jnp.nan) - x = jnp.ones((6,), "float64").at[0].set(-1).at[3].set(jnp.nan) + # x = jax.random.normal(rng, (6,)).at[3].set(jnp.nan) + # x = jnp.ones((6,), "float64").at[0].set(-1).at[3].set(jnp.nan) + x = jnp.ones((30,), "float64").at[0].set(-1).at[5:20].set(jnp.nan) compare_nan_at_beginning( x, From dc8454e3d1b447a9f7750a1942d45d067096fec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Mon, 14 Mar 2022 09:17:31 +0100 Subject: [PATCH 14/46] set dtype int for nobs --- wax/modules/ewma.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 7dde827..b8d529b 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -193,7 +193,7 @@ def __call__( "nobs", shape=x.shape, dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, 0.0, dtype=dtype), + init=lambda shape, dtype: jnp.full(shape, 0, dtype=int), ) nobs = jnp.where(is_observation, nobs + 1, nobs) if self.return_info: From a07f23ebfec24c75aa235c9fd26a9897eed8930e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Mon, 14 Mar 2022 10:14:49 +0100 Subject: [PATCH 15/46] decrease linearly when adjust=linear --- wax/modules/ewma.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index b8d529b..60085c9 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -157,8 +157,10 @@ def __call__( if self.adjust == "linear": # com_eff grow linearly when there is observation but - # decrease exponentially when there is nans. - old_wt_factor = jnp.where(is_observation, 1.0, 1.0 - alpha) + # decrease linearly when there is nans. + old_wt_factor = jnp.where( + is_observation, 1.0, jnp.maximum(0.0, (old_wt - 1.0) / old_wt) + ) old_wt = jnp.minimum(old_wt, com) else: old_wt_factor = 1.0 - alpha From e094ed3dc5ae73dba8b23e7b1dc67063aa9d188c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Mon, 14 Mar 2022 11:12:07 +0100 Subject: [PATCH 16/46] add numba ewma with linear adjustement --- wax/modules/ewma_numba.py | 189 +++++++++++++++++++++++++++++++++ wax/modules/ewma_numba_test.py | 68 ++++++++++++ 2 files changed, 257 insertions(+) create mode 100644 wax/modules/ewma_numba.py create mode 100644 wax/modules/ewma_numba_test.py diff --git a/wax/modules/ewma_numba.py b/wax/modules/ewma_numba.py new file mode 100644 index 0000000..379f566 --- /dev/null +++ b/wax/modules/ewma_numba.py @@ -0,0 +1,189 @@ +# Copyright 2021 The WAX-ML Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Compute exponentioal moving average.""" +from typing import Any, NamedTuple, cast + +import numba +import numpy as np + + +class State(NamedTuple): + mean: Any + old_wt: Any + nobs: Any + + +def init(x): + x = x[0] + + dtype = x.dtype + shape = x.shape + + state = State( + mean=np.full(shape, np.nan, dtype), + old_wt=np.full(shape, 1.0, dtype), + nobs=np.full(shape, 0.0, dtype=dtype), + ) + return state + + +def ewma( + alpha: float = None, + com: float = None, + min_periods: int = 0, + adjust: bool = True, + ignore_na: bool = False, + initial_value=np.nan, + return_info: bool = False, + name: str = None, +): + """Compute exponentioal moving average. + + Args: + alpha: Specify smoothing factor :math:`\alpha` directly + :math:`0 < \alpha \leq 1`. + com : Specify decay in terms of center of mass + :math:`\alpha = 1 / (1 + com)`, for :math:`com \geq 0`. + + min_periods : Minimum number of observations in window required to have a value; + otherwise, result is ``np.nan``. + + + adjust : Divide by decaying adjustment factor in beginning periods to account + for imbalance in relative weightings (viewing EWMA as a moving average). + - When ``adjust=True`` (default), the EW function is calculated using weights + :math:`w_i = (1 - \alpha)^i`. For example, the EW moving average of the series + [:math:`x_0, x_1, ..., x_t`] would be: + .. math:: + y_t = \frac{x_t + (1 - \alpha)x_{t-1} + (1 - \alpha)^2 x_{t-2} + ... + (1 - + \alpha)^t x_0}{1 + (1 - \alpha) + (1 - \alpha)^2 + ... + (1 - \alpha)^t} + - When ``adjust=False``, the exponentially weighted function is calculated + recursively: + .. math:: + \begin{split} + y_0 &= x_0\\ + y_t &= (1 - \alpha) y_{t-1} + \alpha x_t, + \end{split} + The effective center of mass (com) interpolate exponentially between 0 and the + nominal center of mass. + + - When ``adjust='linear'`` the effective center of mass (com) interpolate linearly + between 0 and the nominal center of mass. + + ignore_na : Ignore missing values when calculating weights. + - When ``ignore_na=False`` (default), weights are based on absolute positions. + For example, the weights of :math:`x_0` and :math:`x_2` used in calculating + the final weighted average of [:math:`x_0`, None, :math:`x_2`] are + :math:`(1-\alpha)^2` and :math:`1` if ``adjust=True``, and + :math:`(1-\alpha)^2` and :math:`\alpha` if ``adjust=False``. + - When ``ignore_na=True``, weights are based + on relative positions. For example, the weights of :math:`x_0` and :math:`x_2` + used in calculating the final weighted average of + [:math:`x_0`, None, :math:`x_2`] are :math:`1-\alpha` and :math:`1` if + ``adjust=True``, and :math:`1-\alpha` and :math:`\alpha` if ``adjust=False``. + + + initial_value : initial value for the state. + + return_info : if true, a dictionary is returned in addition to the module output which + contains additional variables. + + name : name of the module instance. + """ + assert ( + com is not None or alpha is not None + ), "com or alpha parameters must be specified." + if com is not None: + assert alpha is None + elif alpha is not None: + assert com is None + com = 1.0 / alpha - 1.0 + assert cast(float, com) > 0.0 + alpha = 1.0 / (1.0 + com) + + def apply(values, state): + mean = state.mean + old_wt = state.old_wt + nobs = state.nobs + + res, mean, old_wt, nobs = numba_apply(values, mean, old_wt, nobs) + state = State(mean, old_wt, nobs) + return res, state + + @numba.jit(nopython=True, nogil=True, parallel=False) + def numba_apply(values, mean, old_wt, nobs): + + """ + Compute online exponentially weighted mean per column over 2D values. + + Takes the first observation as is, then computes the subsequent + exponentially weighted mean accounting minimum periods. + """ + minimum_periods = min_periods + + if adjust: + new_wt = 1.0 + else: + new_wt = alpha + + # deltas = np.ones(values.shape) + + result = np.empty(values.shape) + weighted_avg = values[0].copy() + nobs = (~np.isnan(weighted_avg)).astype(np.int64) + result[0] = np.where(nobs >= minimum_periods, weighted_avg, np.nan) + + for i in range(1, len(values)): + cur = values[i] + is_observations = ~np.isnan(cur) + nobs += is_observations.astype(np.int64) + for j in numba.prange(len(cur)): + if not np.isnan(weighted_avg[j]): + if adjust == "linear": + if is_observations[j]: + old_wt_factor = 1.0 + else: + if old_wt[j] > 0: + old_wt_factor = np.maximum( + 0.0, (old_wt[j] - 1.0) / old_wt[j] + ) + else: + old_wt_factor = 0.0 + old_wt[j] = np.minimum(old_wt[j], com) + else: + old_wt_factor = 1.0 - alpha + + if is_observations[j] or not ignore_na: + + # note that len(deltas) = len(vals) - 1 and deltas[i] is to be + # used in conjunction with vals[i+1] + old_wt[j] *= old_wt_factor # ** deltas[j - 1] + if is_observations[j]: + # avoid numerical errors on constant series + if weighted_avg[j] != cur[j]: + weighted_avg[j] = ( + (old_wt[j] * weighted_avg[j]) + (new_wt * cur[j]) + ) / (old_wt[j] + new_wt) + if adjust: + old_wt[j] += new_wt + else: + old_wt[j] = 1.0 + elif is_observations[j]: + weighted_avg[j] = cur[j] + + result[i] = np.where(nobs >= minimum_periods, weighted_avg, np.nan) + + return result, mean, old_wt, nobs + + return apply diff --git a/wax/modules/ewma_numba_test.py b/wax/modules/ewma_numba_test.py new file mode 100644 index 0000000..959c2f9 --- /dev/null +++ b/wax/modules/ewma_numba_test.py @@ -0,0 +1,68 @@ +import numpy as np +import pandas as pd +import pytest + +from wax.modules.ewma_numba import ewma, init + + +def test_ewma_numba(): + + x = np.ones((30,), "float64") + x[0] = np.nan + + x[1] = -1 + + x[5:20] = np.nan + x = x.reshape(-1, 1) + state = init(x) + res, state = ewma(com=10, adjust="linear")(x, state) + pd.DataFrame(res).plot() + + +@pytest.mark.parametrize( + "adjust, ignore_na", + [(False, False), (False, True), (True, False), (True, True)], # , +) +def test_nan_at_beginning(adjust, ignore_na): + + T = 20 + x = np.full((T,), np.nan) + x[2] = 1 + x[10] = -1 + + compare_nan_at_beginning(x, com=10, adjust=adjust, ignore_na=ignore_na) + + # check min_periods option with random variable + random_state = np.random.RandomState(42) + x = random_state.normal(size=(5,)) + + compare_nan_at_beginning( + x, + com=10, + adjust=adjust, + ignore_na=ignore_na, + min_periods=2, + ) + + # check random variable with nans + x = np.ones((30,), "float64") + x[0] = np.nan + x[1] = -1 + x[5:20] = np.nan + + compare_nan_at_beginning( + x, + com=10, + adjust=adjust, + ignore_na=ignore_na, + ) + + +def compare_nan_at_beginning(x, **ewma_kwargs): + x = x.reshape(-1, 1) + state = init(x) + res, state = ewma(**ewma_kwargs)(x, state) + res = pd.DataFrame(np.array(res)) + + ref_res = pd.DataFrame(x).ewm(**ewma_kwargs).mean() + pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) From 59c931f855bc6acb3c06d9a0f7e9f26232bdd413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Mon, 14 Mar 2022 11:18:55 +0100 Subject: [PATCH 17/46] add EWMA demo notebook --- docs/notebooks/09_EWMA_options.ipynb | 1671 ++++++++++++++++++++++++++ docs/notebooks/09_EWMA_options.md | 454 +++++++ docs/notebooks/09_EWMA_options.py | 423 +++++++ 3 files changed, 2548 insertions(+) create mode 100644 docs/notebooks/09_EWMA_options.ipynb create mode 100644 docs/notebooks/09_EWMA_options.md create mode 100644 docs/notebooks/09_EWMA_options.py diff --git a/docs/notebooks/09_EWMA_options.ipynb b/docs/notebooks/09_EWMA_options.ipynb new file mode 100644 index 0000000..6018d25 --- /dev/null +++ b/docs/notebooks/09_EWMA_options.ipynb @@ -0,0 +1,1671 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "bd2ee536", + "metadata": {}, + "outputs": [], + "source": [ + "# Uncomment to run the notebook in Colab\n", + "# ! pip install -q \"wax-ml[complete]@git+https://github.com/eserie/wax-ml.git\"\n", + "# ! pip install -q --upgrade jax jaxlib==0.1.70+cuda111 -f https://storage.googleapis.com/jax-releases/jax_releases.html" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "956a5611", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "source": [ + "%pylab inline\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8c949906", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/emmanuelserie/mambaforge/envs/waxml39/lib/python3.9/site-packages/jax/_src/lib/__init__.py:31: UserWarning: JAX on Mac ARM machines is experimental and minimally tested. Please see https://github.com/google/jax/issues/5501 in the event of problems.\n", + " warnings.warn(\"JAX on Mac ARM machines is experimental and minimally tested. \"\n" + ] + } + ], + "source": [ + "from functools import partial\n", + "\n", + "import jax\n", + "import jax.numpy as jnp\n", + "import numpy as onp\n", + "import pandas as pd\n", + "from jax.config import config\n", + "\n", + "from wax.modules.ewma import EWMA\n", + "from wax.unroll import unroll_transform_with_state" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7cf7110b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "jax backend cpu\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# check available devices\n", + "print(\"jax backend {}\".format(jax.lib.xla_bridge.get_backend().platform))\n", + "jax.devices()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "06e812c2", + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "adjust = True\n", + "ignore_na = False\n", + "config.update(\"jax_enable_x64\", True)\n", + "\n", + "T = 20\n", + "\n", + "x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1)\n", + "\n", + "rng = jax.random.PRNGKey(38)\n", + "x = jax.random.normal(rng, (T,))\n", + "\n", + "x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1)\n", + "\n", + "\n", + "@partial(unroll_transform_with_state, dynamic=True)\n", + "def fun(x):\n", + " return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x)\n", + "\n", + "\n", + "rng = jax.random.PRNGKey(42)\n", + "params, state = fun.init(rng, x)\n", + "(res, info), final_state = fun.apply(params, state, rng, x)\n", + "\n", + "\n", + "res = pd.DataFrame(onp.array(res))\n", + "\n", + "ref_res = (\n", + " pd.DataFrame(onp.array(x))\n", + " .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na)\n", + " .mean()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7c4b0855", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
0NaN
1NaN
21.000000
31.000000
41.000000
51.000000
61.000000
71.000000
81.000000
91.000000
10-0.398145
11-0.398145
12-0.398145
13-0.398145
14-0.398145
15-0.398145
16-0.398145
17-0.398145
18-0.398145
19-0.398145
\n", + "
" + ], + "text/plain": [ + " 0\n", + "0 NaN\n", + "1 NaN\n", + "2 1.000000\n", + "3 1.000000\n", + "4 1.000000\n", + "5 1.000000\n", + "6 1.000000\n", + "7 1.000000\n", + "8 1.000000\n", + "9 1.000000\n", + "10 -0.398145\n", + "11 -0.398145\n", + "12 -0.398145\n", + "13 -0.398145\n", + "14 -0.398145\n", + "15 -0.398145\n", + "16 -0.398145\n", + "17 -0.398145\n", + "18 -0.398145\n", + "19 -0.398145" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ed2c4c76", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
0NaN
1NaN
21.000000
31.000000
41.000000
51.000000
61.000000
71.000000
81.000000
91.000000
10-0.398145
11-0.398145
12-0.398145
13-0.398145
14-0.398145
15-0.398145
16-0.398145
17-0.398145
18-0.398145
19-0.398145
\n", + "
" + ], + "text/plain": [ + " 0\n", + "0 NaN\n", + "1 NaN\n", + "2 1.000000\n", + "3 1.000000\n", + "4 1.000000\n", + "5 1.000000\n", + "6 1.000000\n", + "7 1.000000\n", + "8 1.000000\n", + "9 1.000000\n", + "10 -0.398145\n", + "11 -0.398145\n", + "12 -0.398145\n", + "13 -0.398145\n", + "14 -0.398145\n", + "15 -0.398145\n", + "16 -0.398145\n", + "17 -0.398145\n", + "18 -0.398145\n", + "19 -0.398145" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ref_res" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4a2acfa9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'com_eff': DeviceArray([0. , 0. , 0. , 0.9 , 0.81 ,\n", + " 0.729 , 0.6561 , 0.59049 , 0.531441 , 0.4782969 ,\n", + " 0.43046721, 1.28742049, 1.15867844, 1.0428106 , 0.93852954,\n", + " 0.84467658, 0.76020892, 0.68418803, 0.61576923, 0.55419231], dtype=float64)}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "info" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8c319435", + "metadata": {}, + "outputs": [], + "source": [ + "pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6)" + ] + }, + { + "cell_type": "markdown", + "id": "02093de9", + "metadata": {}, + "source": [ + "## check gradient" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6c6afe80", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(DeviceArray(0.223253, dtype=float64),\n", + " FlatMap({'ewma': FlatMap({'logcom': DeviceArray(0.18699575, dtype=float64)})}))" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@jax.value_and_grad\n", + "def batch(params):\n", + " (res, info), final_state = fun.apply(params, state, rng, x)\n", + " return jnp.nanmean(res)\n", + "\n", + "\n", + "score, grad = batch(params)\n", + "assert not jnp.isnan(grad[\"ewma\"][\"logcom\"])\n", + "score, grad" + ] + }, + { + "cell_type": "markdown", + "id": "f2b5c401", + "metadata": {}, + "source": [ + "# Linear adjustement" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "35abe086", + "metadata": { + "lines_to_end_of_cell_marker": 2, + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [ + "adjust = True\n", + "ignore_na = False\n", + "config.update(\"jax_enable_x64\", True)\n", + "\n", + "T = 20\n", + "\n", + "x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1)\n", + "\n", + "rng = jax.random.PRNGKey(38)\n", + "x = jax.random.normal(rng, (T,))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "924962ce", + "metadata": {}, + "outputs": [], + "source": [ + "from wax.unroll import unroll" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "7b92edc4", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = jnp.full((20,), jnp.nan).at[2].set(1).at[10].set(-1)\n", + "(res, info) = unroll(\n", + " lambda x: EWMA(com=10, adjust=\"linear\", ignore_na=True, return_info=True)(x)\n", + ")(x)\n", + "res = pd.DataFrame(onp.array(res))\n", + "pd.Series(info[\"com_eff\"]).plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e741d016", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [ + "# rng = jax.random.PRNGKey(42)\n", + "# x = jax.random.normal(rng, (100,)).at[30:50].set(jnp.nan)\n", + "# x = jnp.full((100,), jnp.nan).at[2].set(1).at[10].set(-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0d6b5bcf", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAagUlEQVR4nO3de5hcdZ3n8fe3b0lfknSS7nRIQkgCnSAXFZ7mIuAgF3cARXBGd2FEGDc72R2dAX181svM7uPOXhxn1/U2j/pMBhBQB1wBER3EC4Kig2ACjEBCVYeES0K6upPQSVV30rf67h+/6qTJRZKu6j51zvm8nqeeOnVJ1/dwuj+c+p3v7xxzd0REJH5qoi5AREQmRwEuIhJTCnARkZhSgIuIxJQCXEQkpuqm88Pa2tp82bJl0/mRIiKxt379+h3u3n7w89Ma4MuWLWPdunXT+ZEiIrFnZi8d7nkNoYiIxJQCXEQkphTgIiIxpQAXEYkpBbiISEy9YYCb2a1m1mtmz054bp6Z/dTMukv3c6e2TBEROdjR7IHfBlx20HOfAh5y907godJjERGZRm/YB+7uvzSzZQc9fRXwjtLy7cAjwCcrWZhMjadf6efnG3NRlyGSOject4z5LTMq+jMnO5Gnw923l5Z7gI4jvdHM1gBrAJYuXTrJj5NK+ewDG3liyy7Moq5EJF3e89bFVRPg+7m7m9kRrwrh7muBtQBdXV26ekSE3J1sLs+fnLOUz7739KjLEZEyTbYLJWdmxwGU7nsrV5JMlb78EP2DI6xc0BJ1KSJSAZMN8PuBG0rLNwDfr0w5MpUyuTwAKxfOirgSEamEo2kjvBN4DFhlZlvNbDXwOeCdZtYNXFp6LFUu0xMCfFWHAlwkCY6mC+XaI7x0SYVrkSnWnSvQ1tJQ8QMpIhINzcRMkUwuz0rtfYskhgI8JYpFp1sBLpIoCvCU2Na/l4HhMQW4SIIowFMiW+pAWbVQLYQiSaEAT4lsrgBAp/bARRJDAZ4S2VyeRXNmMntmfdSliEiFKMBTItOT1wQekYRRgKfA6FiRTX0FHcAUSRgFeAq8tGuQ4dGiAlwkYRTgKdCd0xR6kSRSgKdApqeAGZyksxCKJIoCPAWyuTwnzGuisaE26lJEpIIU4CmQyeXV/y2SQArwhBsaHWPLjgGNf4skkAI84bbsGGCs6OoBF0kgBXjC6SIOIsmlAE+4bC5PXY2xvK056lJEpMIU4AmX6SmwvK2ZhjptapGk0V91wnX36hwoIkmlAE+wweFRXt41qPFvkYRSgCfYpt4C7ugcKCIJpQBPsP0dKBpCEUkkBXiCZXN5ZtTVsHReU9SliMgUUIAnWDZX4KQFLdTWWNSliMgUUIAnWDaX1wFMkQRTgCfU7r0jbN+9Ty2EIgmmAE+o8Ys4rOzQOcBFkqqsADezj5nZc2b2rJndaWYzK1WYlCezP8C1By6SVJMOcDNbDNwIdLn7aUAtcE2lCpPydOcKNDfUsri1MepSRGSKlDuEUgc0mlkd0AS8Wn5JUgmZnjCF3kwdKCJJNekAd/dtwOeBl4HtwG53/8nB7zOzNWa2zszW9fX1Tb5SOSbZXJ6VCzR8IpJk5QyhzAWuApYDi4BmM7vu4Pe5+1p373L3rvb29slXKkdtR2GInQPD6kARSbhyhlAuBba4e5+7jwD3AudVpiwpR1YXcRBJhXIC/GXgXDNrsjDQegmwsTJlSTmy4x0oC9VCKJJk5YyBPw7cDTwJPFP6WWsrVJeUIZMrMLepnvaWGVGXIiJTqK6cf+zunwE+U6FapEKyuTwrO9SBIpJ0momZMO5OtievCTwiKaAAT5jtu/eRHxpVB4pICijAE2b8AKY6UESSTwGeMFmdxEokNRTgCZPpKdAxewatTQ1RlyIiU0wBnjDjHSgiknwK8AQpFp3uXgW4SFoowBPkldcG2TdS1AFMkZRQgCdIpmd8Cr0CXCQNFOAJMt6B0rlAHSgiaaAAT5BMrsCSuY00zyjrDAkiEhMK8ATJ9uQ1/i2SIgrwhBgZK7J5R4FOBbhIaijAE+LFHQOMjDkn6wCmSGoowBMis38KvQJcJC0U4AmR7clTY7CivTnqUkRkmijAEyKbK7CsrZmZ9bVRlyIi00QBnhDZnDpQRNJGAZ4A+0bGeHHngMa/RVJGAZ4Am3oLFB1WqQNFJFUU4AmgiziIpJMCPAGyuQINtTWcMF8dKCJpogBPgGwuz4r2ZuprtTlF0kR/8QmQ6clr/FskhRTgMZffN8K2/r3qQBFJIQV4zHX3FgBNoRdJIwV4zHWXOlA0iUckfcoKcDNrNbO7zex5M9toZm+rVGFydDI9BRrra1kytzHqUkRkmpV76ZYvAw+6+/vMrAFoqkBNcgyyuTwrO1qoqbGoSxGRaTbpPXAzmwP8AXALgLsPu3t/heqSo5TJ5TX+LZJS5QyhLAf6gG+Y2VNmdrOZHTKTxMzWmNk6M1vX19dXxsfJwV4bGKYvP6QAF0mpcgK8DjgT+Lq7nwEMAJ86+E3uvtbdu9y9q729vYyPk4Ptn0KvHnCRVConwLcCW9398dLjuwmBLtMkqw4UkVSbdIC7ew/wipmtKj11CbChIlXJUcnk8syeWUfH7BlRlyIiESi3C+UvgW+XOlA2Ax8qvyQ5WtmeAis7ZmGmDhSRNCorwN39aaCrMqXIsXB3sr15rjj9uKhLEZGIaCZmTPXlh+gfHNH4t0iKKcBjKrP/Ig4KcJG0UoDHVKZHV+ERSTsFeExlc3naWhqY36IOFJG0UoDHVDZX0PCJSMopwGOoWHS6dQ4UkdRTgMfQtv69DAyP6TJqIimnAI+hrDpQRAQFeCyNtxB2qgNFJNUU4DHUnSuwaM5MZs+sj7oUEYmQAjyGMj15nUJWRBTgcTM6VmRTX0FT6EVEAR43L+0aZHi0SKcCXCT1FOAxk+3RRRxEJFCAx0w2V8AMTlqgDhSRtFOAx0w2l+eEeU00NtRGXYqIREwBHjMZTaEXkRIFeIwMjY6xZceAptCLCKAAj5XNfQOMFV0dKCICKMBjZfwcKOpAERFQgMdKNpenrsZY3tYcdSkiUgUU4DGS6Smwor2ZhjptNhFRgMdKVh0oIjKBAjwmBodHeXnXoAJcRPZTgMfEpt4CoIs4iMgBCvCYyIyfA0U94CJSogCPiWwuz4y6GpbOa4q6FBGpEmUHuJnVmtlTZvbDShQkh5fJFejsaKG2xqIuRUSqRCX2wG8CNlbg58jvke3Js3KBhk9E5ICyAtzMlgDvAm6uTDlyOLv3jtCzZ58uoyYir1PuHviXgE8AxSO9wczWmNk6M1vX19dX5selU3dpCv1KXYVeRCaYdICb2buBXndf//ve5+5r3b3L3bva29sn+3Gplhk/B8rC2RFXIiLVpJw98POB95jZi8BdwMVm9q2KVCWvk+3J0zKjjkVzZkZdiohUkUkHuLt/2t2XuPsy4Brg5+5+XcUqk/0yuTydHS2YqQNFRA5QH3gMdOcKOoWsiByirhI/xN0fAR6pxM+S19tRGGLnwLCm0IvIIbQHXuWymkIvIkegAK9ymf0thApwEXk9BXiVy+byzG2qp62lIepSRKTKKMCrXKYnXMRBHSgicjAFeBVz99CBovFvETkMBXgV2757H/mhUY1/i8hhKcCrmA5gisjvowCvYuMthDqJlYgcjgK8imVyeTpmz6C1SR0oInIoBXgV684VNHwiIkekAK9SY0Wnuzevc6CIyBFV5Fwo1eDpV/r5ykPdjBU96lIqYmSsyL6RovbAReSIEhPg33tyK49293HKojlRl1Ix566YxwWdbVGXISJVKjEBnsnlOX3xHO798PlRlyIiMi0SMQbu7mR68pqxKCKpkogA31EY5rXBEToXKMBFJD0SEeDZnM6ZLSLpk6gAV8eGiKRJYgJ8XnODzpktIqmSiAAP58zWVdtFJF1iH+DuTlZTzkUkhWIf4K/u3kdB58wWkRSKfYCrA0VE0ir+AT5+zmz1gItIysQ+wDO5PAtnz2ROU33UpYiITKvYB3g2l6dTV6wRkRSKdYCPFUtXbdcBTBFJoUkHuJkdb2YPm9kGM3vOzG6qZGFH45VdgwyNFlmpA5gikkLlnE52FPi4uz9pZrOA9Wb2U3ffUKHa3tD4Vdu1By4iaTTpPXB33+7uT5aW88BGYHGlCjsa4x0oGgMXkTSqyBi4mS0DzgAeP8xra8xsnZmt6+vrq8TH7ZfJ5Tl+XiNNDYm5LoWIyFErO8DNrAW4B/iou+85+HV3X+vuXe7e1d7eXu7HvU42p4v+ikh6lRXgZlZPCO9vu/u9lSnp6AyPFtncN6Ap9CKSWuV0oRhwC7DR3b9QuZKOzos7BxgtuqbQi0hqlbMHfj7wQeBiM3u6dLuiQnW9oUyPLuIgIuk26aN/7v4rILITcGdzeWprjBXtzVGVICISqdjOxMz05Fk2v4kZdbVRlyIiEonYBnh3b0Hj3yKSarEM8H0jY7y4Ux0oIpJusQzwTb0F3DWFXkTSLZYBntk/hV4BLiLpFcsAz+byNNTWsGx+U9SliIhEJrYBfuKCFupqY1m+iEhFxDIBs7kCq3QGQhFJudgFeH7fCNv69+oiDiKSerEL8GyuAOgq9CIiMQzw0lV4tAcuIikXuyshZHN5mhpqWdzaGHUpIhKVYhHGhku3ESiOhPuxYSiOhtvYCBTHwmvjzxVHS88ddO9jBx6PL3sx3PYvT3yueGD5sDc/sExp+cJPQsuCiv5niGWAdy5ooaYmsvNoicjhFIswXAi3oXxpeQCGSvcjAzA8CCODMLK3dBuE0X1heXQoLO+/DYf7seHw2thQCOXRoRCmVcHADKwWrOYwyxaWMTj3wwrwTE+Bi0+u7JV9hPDHYga19VFXIlEbHoTBHTCwAwZ3wd5dMLgT9r4Ge/vD/b7dB25De2DfHhjOH/1nWA3UN0HdzHBfPxPqZkBdY7hvmh9eqys9X9tQuq+H2tLj2rrSfQPUjC/Xl5ZL9wffauuhpjaE7P7nS4G7f7l2wn1NKYzH3zMezjUHQjpCsQrwnYUhdhSGdA6UYzE2Cnu2wu5tsOdVyL8K+R4o5CCfC/cDfbCvH1oWwnX3wMLToq5apsJQIfwO7NkKe7ZDfnvpd6EHCr3hd6HQF/aUj2TmHJjZCo2tYbntJJgxB2bOhhmzDtwaWkr3zSGgG1qgoam03BzCNuLwS4JYBfj+DhQF+KGGB6Hnd9C7Afoy0Pc87NoCu7ce+nWzvhlmdYTA7jg1fK1raoP1t8HtV8L134fj3hzJakgZxkah/yXYtRleezFs//6XoP/lcNvXf+i/mdkKsxaG34ElZ0HzAmhug+b2sBfc3AaN86BpXgjsGp2+uZrEKsC7e9WBst/eftjyC3jhYdi6LgT3eFDXN0P7yvAHefr7oPUEaD0eZi+GWceFvaXDefP74bYrSyF+Hyw6Y7rWRo7FyL7wP+jxW+/zsLM7hHZx9MD76hph7gnQuhSOPxvmLIHZS2D2Iph9XPhdqFczQJzFKsAzPXnmNNazYNaMqEuJxlABnvsePP1P8MrjIbAbZoU/zlWXwaIzYeHpIahrJtEhOm8FfOifSyF+FVz7T7Dsgsqvhxy9vf2w/WnY/q/w6tOQey6EtRfD6zX1MP9EWHAKvOk9MP+ksB3nLYeWDg1TJFysAjyby7OyowVL2y/l7m3wy/8Nz9wdjuzP74QLPgYnXRL2sit54HHuMvjQA/CtP4Zvvhf+6B/h1Ksr9/PlyIrFsEf98mPhW9XW34awHjdnaRjaOvXqENgLTglBrQPPqRWbAHd3Mj15rnzLoqhLmT4j++Cxv4dHvxB6UU9/P5z5QTj+nKnds2o9Hv79g3DnNfDdP4X85+Dc/zR1n5dW7iGwNz8CWx6Fl/8ldHhAGINecha85ZowlHXcW6F5fpTVShWKTYDn9gyxZ99oesa/cxvgrmvDuOabroR/8z/D3vF0aZoXDmbe8x/gwU/Cjixc9jmoa5i+GpJobz9sfhi6fwqbfhY6PwDmLoeT3wUnnA9L3xa2ddq+acoxi02AZ0pT6FPRgdLzDNxxVRjf/OB9cOJF0dRR3wj/9g546L/Dr78U9hbffzu0qA//mOx5FZ7/Z9j4A3jp1+FA48zWMAS24iJYcWE40ChyjGIT4N1pCfBXn4I7rg69sjf8IBygilJNLbzzb8LB0e9/BNa+A95/Gxx/VrR1VbuBnbDhPnjmu2FMG8Kxi/P+ElZeBou7wkQUkTLE5jco05OnrWUG85onfIV/7nvw668AHlldFbejOwxf3PCD6R0yeSOnvy/8z+T/XQ/fuAwu/q9w3o2T63ZJqrFR6P4JPPUt6P5x2NNuWwUX/TWcchW0r4q6QkmY2AR4Npdn1cIJF3EYHoQffTJMq11wcnSFVdq8E+HS/xYOJFabRWfAf3wUfnAj/Owz8OKjcNXXwqSgNNu9FdZ9A576ZhjTbl4A5/45vPnfQcdpGsuWKROLAC8WnWyuwDVnTwi1dbeEP5Y/fQCWnR9dcWnT2BrGwdfdCj/+K/jaOXDF5+G0P05fUL30GPzma2F8G4fOP4Qzr4fOd6q1T6ZFLAJ862t72Tsyxqrx8e+hAvzqi+EAkMJ7+pnBWath2dvhvj+He1aH8d4rPh+mZSdZsRiGR371xTCZqnEunPcX0LU6zHoUmUZlBbiZXQZ8GagFbnb3z1WkqoOMd6B0jgf4E/8Qzo528X+Zio+To9W+Elb/BP7l7+Hh/wWbfxG2Sdfq5B2gcw972o/8LeSeDZNqLv8/cMZ14SRNIhGY9BEoM6sFvgpcDpwCXGtmp1SqsImy+ztQWsLpK3/9lfB1dUnXVHycHIuaWrjgo/Dh34Tt8aNPwD9eFIYXkmLTz8I6fecD4bzV7/0HuPFJOGeNwlsiVU4LwdnAJnff7O7DwF3AVZUp6/WyuTyLWxuZNbMenlgbzqp20V9NxUfJZM0/Ea67N7QYDuwInSrfuQ52vhB1ZZPXuxG++UfhtAKDO8MB2488EWZHaoxbqkA533MXA69MeLwVOOfgN5nZGmANwNKlk5ussKKthbaW0gmstvwynLRp0Vsn9bNkCpnBqe8N344e+2oYJ878KBzYe/vHw9nw4mBvP/z8f4QDtTNmwR9+Fs76M81Claoz5QOV7r4WWAvQ1dU1qYbtmy7tPPCgd2OYCCHVq6EJLvzPIbh/8Xfw5B2hN/rM68NJuKo1yN3h2XvgwU+HK9J0rYZ3fFrnIJGqVU6AbwMmNisvKT03dQp94eoxC6ZkqF0qbVYHvPsLYYz80f8bLhix/rbQcnjejdV15Z/dW+H+G+GFh0K/+we+q295UvXKCfDfAp1mtpwQ3NcAf1KRqo6kb2O4T9LEnTRoXQpXfjkMo/zm67D+dvjdd2D5hXD2n8HKy6PrWnGHf70rTAorjobOkrNW68ozEguT/qtx91Ez+wvgx4Q2wlvd/bmKVXY4veMBrj3wWGpdCpf9LVz4iTC+/Ntbw4HO2Utg6TlABBOB8j3w0q9g6Xlw9dfC+bVFYqKs3R53fwB4oEK1vLHeDWHiREvKp27HXePcsDd+3k2QfTCE+atPR1NLTV04Ve+5H9Zet8ROvGZb9D4f9r7TNmU7qWrr4E3vDjcROWbxOZWcexhCWfCmqCsREakK8QnwPa/C0G5o1wFMERGIU4DrAKaIyOvEKMA3hHsNoYiIALEK8I3QsjBcrUZERGIU4H0bNYFHRGSCeAR4sXighVBERIC4BHj/izC6V+PfIiITxCPA1YEiInKImAR4qQOlfVW0dYiIVJGYBPjGcA3CGbOirkREpGrE41woHafCnOPf+H0iIikSjwB/+8ejrkBEpOrEYwhFREQOoQAXEYkpBbiISEwpwEVEYkoBLiISUwpwEZGYUoCLiMSUAlxEJKbM3afvw8z6gJcm+c/bgB0VLCcu0rjeaVxnSOd6a52Pzgnu3n7wk9Ma4OUws3Xu3hV1HdMtjeudxnWGdK631rk8GkIREYkpBbiISEzFKcDXRl1ARNK43mlcZ0jnemudyxCbMXAREXm9OO2Bi4jIBApwEZGYikWAm9llZpYxs01m9qmo65kKZna8mT1sZhvM7Dkzu6n0/Dwz+6mZdZfu50Zda6WZWa2ZPWVmPyw9Xm5mj5e293fMrCHqGivNzFrN7G4ze97MNprZ25K+rc3sY6Xf7WfN7E4zm5nEbW1mt5pZr5k9O+G5w25bC75SWv/fmdmZx/JZVR/gZlYLfBW4HDgFuNbMknh5+lHg4+5+CnAu8JHSen4KeMjdO4GHSo+T5iZg44THfwd80d1PAl4DVkdS1dT6MvCgu58MvIWw/ond1ma2GLgR6HL304Ba4BqSua1vAy476LkjbdvLgc7SbQ3w9WP5oKoPcOBsYJO7b3b3YeAu4KqIa6o4d9/u7k+WlvOEP+jFhHW9vfS224GrIylwipjZEuBdwM2lxwZcDNxdeksS13kO8AfALQDuPuzu/SR8WxMu4dhoZnVAE7CdBG5rd/8lsOugp4+0ba8C7vDgN0CrmR13tJ8VhwBfDLwy4fHW0nOJZWbLgDOAx4EOd99eeqkH6IiqrinyJeATQLH0eD7Q7+6jpcdJ3N7LgT7gG6Who5vNrJkEb2t33wZ8HniZENy7gfUkf1uPO9K2LSvf4hDgqWJmLcA9wEfdfc/E1zz0fCam79PM3g30uvv6qGuZZnXAmcDX3f0MYICDhksSuK3nEvY2lwOLgGYOHWZIhUpu2zgE+Dbg+AmPl5SeSxwzqyeE97fd/d7S07nxr1Sl+96o6psC5wPvMbMXCUNjFxPGhltLX7Mhmdt7K7DV3R8vPb6bEOhJ3taXAlvcvc/dR4B7Cds/6dt63JG2bVn5FocA/y3QWTpa3UA48HF/xDVVXGns9xZgo7t/YcJL9wM3lJZvAL4/3bVNFXf/tLsvcfdlhO36c3f/APAw8L7S2xK1zgDu3gO8YmarSk9dAmwgwduaMHRyrpk1lX7Xx9c50dt6giNt2/uB60vdKOcCuycMtbwxd6/6G3AFkAVeAP466nqmaB0vIHyt+h3wdOl2BWFM+CGgG/gZMC/qWqdo/d8B/LC0vAJ4AtgEfBeYEXV9U7C+bwXWlbb3fcDcpG9r4G+A54FngW8CM5K4rYE7CeP8I4RvW6uPtG0BI3TZvQA8Q+jSOerP0lR6EZGYisMQioiIHIYCXEQkphTgIiIxpQAXEYkpBbiISEwpwEVEYkoBLiISU/8f1m7o11H+UPIAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = (\n", + " jnp.ones((100,))\n", + " .at[0]\n", + " .set(-1)\n", + " .at[30:50]\n", + " .set(-1)\n", + " .at[40:50]\n", + " .set(jnp.nan)\n", + " .at[3:20]\n", + " .set(jnp.nan)\n", + ")\n", + "\n", + "(res, info) = unroll(\n", + " lambda x: EWMA(com=10, adjust=\"linear\", ignore_na=True, return_info=True)(x)\n", + ")(x)\n", + "res = pd.Series(onp.array(res))\n", + "pd.Series(info[\"com_eff\"]).plot()\n", + "res.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "8ca2721c", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAkSUlEQVR4nO3deXhcd33v8fd3tEsz8iZp5DWyE0m2w5KAoVloIAncG0JKciktoexbukALPLQFut2297aFpxRa7uUhhLCXhiVNkzQ3ZWkITYEScAJksTMjO3bibUbyPiNrnfndP86MLDtSLGmWM+fM5/U884xmtJzf+Mgfnfme7/n9zDmHiIgET8TvAYiIyNIowEVEAkoBLiISUApwEZGAUoCLiARUYzU31tXV5fr6+qq5SRGRwHvooYcOO+e6z36+qgHe19fH9u3bq7lJEZHAM7On5npeJRQRkYBSgIuIBJQCXEQkoBTgIiIBpQAXEQmocwa4mX3ezIbN7LFZz600s++a2VDhfkVlhykiImdbyBH4F4FrznruQ8B9zrl+4L7CYxERqaJz9oE75x4ws76znr4eeFnh4y8B3wc+WM6BiX8OnRjj6z/dRz5fvamGr94S5/nrl1dte3O582cHeHIk6+sYJLzeclkfq6ItZf2ZS72QJ+6cO1T4OAXE5/tCM7sJuAlgw4YNS9ycVNOXfvQUN//Hbsyqsz3n4Md7jvKN37y0Ohucw8nxKd739Z8DVO11S3159UVraybAZzjnnJnNe6jmnLsFuAVg27ZtWj0iAJLpDJt7Y3zrfVdUZXt/cuej3PWzgzjnMJ/Sc+fBkwB84W0v4srBHl/GILJYS+1CSZvZaoDC/XD5hiR+S6QyDMRjVdve1tXLyExMs//YWNW2ebYdh7wAv3B1p29jEFmspQb43cBbCh+/BbirPMMRv2XGpzhwfIzB3ioG+BovNB8vHAX7YcfBk3RFm+mOlfctrkglLaSN8Dbgv4BBM9tvZu8APgK8wsyGgJcXHksIDA17J/GqeQS+uTdGxE4fBfthx6GTbFnd6VsJR2QpFtKF8vp5PnV1mcciNWAonQFgsIoB3trUwPndUXYcPFG1bc42OZ1nKJ3l7S/Z6Mv2RZZKV2LKGRKpLG1NDaxb0VbV7W5d08kOn0oou0eyTObyM6UckaBQgMsZkukM/fEokUh1SwlbV3dy8MQ4x0Ynq7pdOF1736oTmBIwCnA5QyJd3Q6UouLR704f6uA7Dp6ktSnCxq6Oqm9bpBQKcJlxbHSSkcxEVevfRcWjXz86UXYcOsHm3k4aqvyuQ6RUCnCZkSycwOyPR6u+7VXRFno7W6veieKcY8fBk6p/SyApwGVGMcCr2QM+mx8nMg8cH+Pk+LTq3xJICnCZkUhniLU20tvZ6sv2t67uZNdIlvGpXNW2WfyDcaGOwCWAFOAyI5nKMhiP+XYxy4VrOsnlHUPp6s0I+PjBk0QMNvcqwCV4FOACeLXgRDpDvw8nMItOX1JfvQt6dhw6ycauDtqaG6q2TZFyUYALACOZCU6MTTHowwnMovUr2om2NFb1RKZ3AnNZ1bYnUk4KcAG8+jfAgE8nMAEiEWPL6ljVTmSeGPMm7tqy2r/XLFIKBbgA3hSyUN05UOYy2Bsjkc7gXOWnji923WxR/VsCSgEugBdmqzqay75iyGINxmNkxqdJn5yo+LaSNfCuQ6QUCnABIJHO+nIJ/dmKJ1GLJZ1KSqYyRFsaWbPMn7ZJkVIpwIV83rErnfHtAp7Zin9EkqnKB3iiMHGX5gCXoFKACweOjzE6mauJI/CVHd6qOJU+AnfOkUhlfK/5i5RCAS6zLqH3r4VwtsF4bGZMlXI4O8mxU1M18UdLZKkU4DJztOvnRTyz9cejDKWz5POV60QZ8nneF5FyUIALQ+ksa5a10tna5PdQAO8IfGwqV9FV6mf63mvkj5bIUijAhUTK30voz1Zs66tkHTyZzrCivYmuaHPFtiFSaQrwOjedy7NrJFtTpYT+Hq8WX8k6eCLlrTykDhQJMgV4nXvq6Ckmp/M1VUqItTaxdnlbxQLcOW/Gw1r6oyWyFArwOpeskUvozzYQj85c3l9uh06Mk5mYrqk/WiJLoQCvc8l0FjO4oKc2WgiLBnpjPDkyylQuX/afnVAHioSEArzOJdMZzlvZXnPzYQ/GY0zm8jx1ZLTsP7v4rmOgRwEuwaYAr3N+L+Iwn2J5I5Eq/+o8iXSGeGcLy9pro21SZKkU4HVsYjrHnsOjNVf/Bq+kY1aZTpShGpm4S6RUJQW4mb3fzB43s8fM7DYz07RuAfLkyCi5vKvJ6VRbmxroW9VR9gDP5R1Dw5oDRcJhyQFuZmuB3wO2OeeeAzQAN5ZrYFJ5M3Og1GiYVaITZd/RU4xP1VbbpMhSlVpCaQTazKwRaAcOlj4kqZZkOkNjxNjY1eH3UOY0GI+x98go41O5sv3MWlg6TqRclhzgzrkDwMeAp4FDwAnn3HfO/jozu8nMtpvZ9pGRkaWPVMoukcqysauD5sbaPBXSH4+Rd16pp1yKk1j111jbpMhSlFJCWQFcD2wE1gAdZvbGs7/OOXeLc26bc25bd3f30kcqZZdMZ2r6SLTYp13OOnginWX9yjY6WhrL9jNF/FLKodfLgT3OuRHn3BRwB3BZeYYllXZqcpqnj56q2fo3QN+qDpoarKyTWiW1iIOESCkB/jRwiZm1mzcj0NXAzvIMSypt17DXX13LJ/OaGyNs6oqWbXm1yek8u0fUQijhUUoN/EHgduBh4NHCz7qlTOOSCit2d9T65eQDvbGyHYHvPTLKdN4pwCU0Sjp75Zz7n865zc655zjn3uScmyjXwKSykukMLY0RNqxs93soz2owHmX/sTFGJ6ZL/llJLeIgIVOb7QdScYl0lgt6ojREans+7OJl/kPDpV9Sn0xlaIgYm7prs21SZLEU4HUqKCfzimMsRx08kc7Qt6qd1qbamrhLZKkU4HXoxNgUqZPjNd1CWLR+ZTutTZGy1MGTWsRBQkYBXoeGavwS+tkaIkZ/T6zkXvDxqRx7j4zSrylkJUQU4HUoaJeTD8RLD/Bdw1mcq/2uG5HFUIDXoWQqQ7SlkTXLgjF55GBvlPTJCY6fmlzyz1AHioSRArwOeYs4RAOzInsxdJPppXeiJNIZmhsi9K2q7bZJkcVQgNehoXQ2EPXvopnVeUoooyRTGc7vidLYoF95CQ/9NteZw9kJjoxOBqqUsHpZK7GWxpJaCZPpLANxzUAo4aIArzPJgFxCP5uZMdC79BOZmfEpDhwfC9QfLZGFUIDXmWIZoj9gR6MDcW9OFOfcor93KAATd4kshQK8ziTTGVa0N9EdbfF7KIsyGI9y/NQUI9nFT7dTfNexOUDvOkQWQgFeZ5LpLP3xWGA6UIpmOlFSi+9ESaQztDU1sHZ5W7mHJeIrBXgdcc6RTGUCeSRavOhoKZ0oyXSGgXiUSI1P3CWyWArwOnLoxDiZielA1oK7oi2s6miemQZgMbwOlOC9ZpFzUYDXkUTAr0YsnshcjKOjk4xkJgLVdSOyUArwOjI0E+DB6kApGuyNkUwtrhNFl9BLmCnA60gilSXe2cLy9ma/h7Ik/fEoo5M5DhwfW/D3KMAlzBTgdcQ7mRfcIJtZ3GERZZREKkNnayPxzmC1TYoshAK8TuTyjqHhYKzCM5/+JUxqNVRYxCFobZMiC6EArxP7jp5ifCof6CPwZW1NrF7WuuA5UZxzJAL+rkPk2SjA60QyYIs4zGcxnSjDmQlOjE2pA0VCSwFeJ4oB3t8TzA6UooF4lKHhLLn8uTtREqnia1aASzgpwOtEIp1l/co2Oloa/R5KSQbiMSan8zx1ZPScX5sMeNukyLkowOtEMhXsE5hFxXLIQk5kJtMZ7wrOgE3cJbJQCvA6MJXL8+Th7EwXR5Bd0BPFbGGthIl0lsFeHX1LeCnA68Dew6NM5VwojsDbmxvZsLL9nCcy83nHkDpQJORKCnAzW25mt5vZE2a208wuLdfApHyCPgfK2fp7YudsJTxwfIxTk7nQvGaRuZR6BP4PwLecc5uB5wM7Sx+SlFsylaEhYmzq7vB7KGUx2Btlz+FRJqfz835NsQNFJzAlzJYc4Ga2DLgC+ByAc27SOXe8TOOSMkqkM/Staqe1qcHvoZTFQDzGdN6x5/D8nSjJ4XC96xCZSylH4BuBEeALZvYzM7vVzJ5xiGdmN5nZdjPbPjIyUsLmZKmGQjYf9uACFndIpjKsXd5GrLWpWsMSqbpSArwReAHwaefcxcAo8KGzv8g5d4tzbptzblt3d3cJm5OlGJ/KsffIaKgCfFNXlMaIPWsdPJHOqnwioVdKgO8H9jvnHiw8vh0v0KWG7BrOkneE6nLy5sYIfV0d8x6BT+fy7B4O17sOkbksOcCdcylgn5kNFp66GthRllFJ2YR1PuzBeGzeXvC9R04xmQv2xF0iC1FqF8rvAl81s0eAi4C/LnlEUlaJdIbmhgh9q9r9HkpZDcRjPH30FGOTuWd8rrjyUJjedYjMpaSJMZxzPwe2lWcoUglD6SybujtobAjXNVuDvVGc80pEz1237IzPJdIZzLyrNkXCLFz/q+UZEqlMKI9Ei+WRuergyXSGvlUdoWmbFJmPAjzEMuNTHDg+Fspa8HmrOmhujMxZB0+kMoGfNldkIRTgITY07M3YF4Y5UM7WEDEu6I7OXHFZNDGdY++RU6F81yFyNgV4iCVT4exAKRrsjc2csCx6cmSUXN6F9jWLzKYAD7FkOktbUwPrVrT5PZSKGIjHOHhinJPjUzPPJdWBInVEAR5iyXSGgXiUSCScK7IX5/qefRSeSGVoajD6VoVj4i6RZ6MAD7Gwr8heXOsykTq9Ok8ynWFjl3eCUyTs9FseUkdHJxnJTIS6lLB2eRsdzQ1ndKKE/Y+WyGwK8JCaWYU+xGEWiRj98dhMJ8roxDT7jo6FsutGZC7BXqJc5jVzOXnIw2wwHuM7O1Lc/8QwTx89BcBAiN91iMymAA+pRDpDZ2sj8c5wr8j+3HXL+Pr2fbztiz8FwAwuXNPp86hEqkMBHlLJVJbB3hhm4exAKXr9izdw0frlTOcdAMvamli3IlwTd4nMRwEeQs45EukMr3rear+HUnENEeM5a5ed+wtFQkgnMUNoODPBibGp0Ne/ReqdAjyEwrqIg4icSQEeQomZOVA0I59ImCnAQyiZztAVbWFVNNwdKCL1TgEeQol0dmaeEBEJLwV4yOTzjqF0ZmaeEBEJLwV4yBw4PsapyVyo50AREY8CPGTUgSJSPxTgIZNIqwNFpF4owEMmmcqwdnkbsdYmv4ciIhWmAA+ZRDpLv46+ReqCAjxEpnN5do9kdQm9SJ1QgIfIU0dPMTmd1wlMkTqhAA+RZEorsovUk5ID3MwazOxnZnZPOQYkS5dIZzCDC3pUAxepB+U4An8vsLMMP0dKlExnOG9lO61NDX4PRUSqoKQAN7N1wKuAW8szHClFMp1V/VukjpR6BP73wB8C+fm+wMxuMrPtZrZ9ZGSkxM3JfCamc+w5PKoAF6kjSw5wM7sOGHbOPfRsX+ecu8U5t805t627u3upm5NzeHJklFze6QSmSB0p5Qj8cuDVZrYX+BpwlZn9Y1lGJYtWnANFAS5SP5Yc4M65Dzvn1jnn+oAbge85595YtpHJoiRSGRojRt+qDr+HIiJVoj7wkEims2zq7qC5UbtUpF6U5X+7c+77zrnryvGzZGmS6YxOYIrUGR2uhcCpyWmePnpKc6CI1BkFeAgMpbMADOgEpkhdUYCHQEKr8IjUJQV4CAylM7Q0Rtiwst3voYhIFSnAQ6C4iENDxPweiohUkQI8BJIpdaCI1CMFeMCdGJsidXJcAS5ShxTgATdUvIReAS5SdxTgATfTgaIWQpG6owAPuGQqQ7SlkTXLWv0eiohUmQI84BLpDAPxKGbqQBGpNwrwgNMqPCL1SwEeYIezExwdnaRfAS5SlxTgAZZMeScwN+sEpkhdUoAHmOZAEalvCvAAS6YzrOxopiva7PdQRMQHCvAAS6Qy9PeoA0WkXinAA8o5x1A6q0WMReqYAjygDp0YJzMxrfq3SB1TgAdU8QSmjsBF6pcCPKCKLYQDPQpwkXqlAA+oRDpDvLOFZe1Nfg9FRHyiAA+oIV1CL1L3FOABlMs7hoYzmgNcpM4pwANo39FTjE/lNQe4SJ1TgAdQQqvwiAgK8EAqdqBc0BP1eSQi4qclB7iZrTez+81sh5k9bmbvLefAZH7J4SzrV7bR0dLo91BExEelJMA08AHn3MNmFgMeMrPvOud2lGlsMo9kSicwRaSEAHfOHQIOFT7OmNlOYC1QtQB/IDnCp7+/G4cDoG9VB3/zmueGenKnqVyeJw9nuXpLj99DERGflaUGbmZ9wMXAg3N87iYz225m20dGRsqxuRnf2L6PX+w/Tt7BSGaCr/10H6mT42XdRq3Zc3iUqZxTD7iIlB7gZhYF/hl4n3Pu5Nmfd87d4pzb5pzb1t3dXermzpBMZ7js/FV84zcv5a//x3MBb4rVMCu+PgW4iJQU4GbWhBfeX3XO3VGeIS3M5HSeJ0dGZ4KseD+UzlZzGFU3lM7QEDE2dXf4PRQR8VkpXSgGfA7Y6Zz7ePmGtDB7j4wynXczs/Gt6GimJ9Yy0yMdVol0hr5V7bQ2Nfg9FBHxWSlH4JcDbwKuMrOfF27Xlmlc5zRXKWGwN0Yy5AGe1CIOIlJQShfKDwDf2j2Sc5QS+nti/NNPniKfd0Qi4etEGZ/KsffIKK9+/hq/hyIiNSCwV2ImUl4poaXxdClhsDfK+FSefcdO+Tiyytk1nMU5LeIgIp7ABvjQ8DNLCcVySjKkJzKL5SF1oIgIBDTAi6WEs4OsfybAw1kHT6QzNDdE6FvV7vdQRKQGBDLAZ0oJZwV4tKWRdSvaQtsLnkxlOL8nSmNDIHebiJRZIJOgGND9c5QSBuLh7URJprMMxDUDoYh4AhngyWcpJQzEY+weyTKVy/swssrJjE9x4PiY6t8iMiOwAT5fKWGwN8pUzvHUkVEfRlY5Q8PeiVnNQigiRQEN8CyD85QSikeoiVS4OlGKiziohVBEigIX4DOlhHmC7PzuKBEjdJfUJ9IZ2psbWLu8ze+hiEiNCFyAF3u8B3rmDvDWpgb6VnXMHLGGRTKdob8nGsorTEVkaQIY4OcuJYSxEyWRyuoEpoicIXCLKiYXUEoY6I3xnR0pxqdywZ21b/QI/PM7YNKbdfEzk8dZt78Nbm2t3Da7BuBVH4MmlWkkwJyD3BTkJgu3KchPFe6nTz/OT0Nu2rufueVOf+xyhce5WR8Xn8+Dy59+vvixy3vbn3lu1u3S90C0vGsiBDLAz1VKGIzHyDvYPZLlwjXLqji6Mkr+Gzx5P5z3ErI5GHWtNLXFoLm5MttzOfj5V2F0BF73j9BYoe1IfXIOpk7BRAYmsjBZvI2evk2dKtzGZt2Pw3TxfhymJ868z03A9OSs+0kvnGuFNYBFvNtFb1CAJ1JZrtr87P8Ig71eh0oynQlugO95ANq74K33cPePn+LP9jzOg79xNXRW8Ah8++fhnvfDv/wm/OqtEAnouxepnOlJOHUYTh2ZdTsKY8dh7BiMH/c+Hj8O4ydg/CRMnPCC2y3i2ozGNu+dYFMbNLaevm9shbbl0NDiHWQ0tkJDs3drbCl83HT6uYYm7xaZfd8463EDRAqPI42Fx4XnrOHM5+zs+0IwF58743EEqrA2b6AC/Eh2gsPZiXPWgs9b1UFTgwW3ldA5L8A3XgFmJFIZOlsb6Ym1VHa7297u/Uf77p9BSxSu+weIBO40iSzF9CRkDsKJ/XDykPdxJgXZNGTS3v3oiBfM82nqgLYVXsC2LoPlG6ClE1o7vfuWmPd71dIJzR3QHC3cd0BT++n7xlb93i1QoAJ8pgPlHAHe1BDh/O5ocE9kHtkNmUNegOO9kxjsjWFV+IvO5e/1QvyBv/WOmH7lkzoSDwPnvN+po096t2N74dhTcPxp75ZNA+7M72lqh1gvROMQ3+rdd3RD+yro6PLeIbavhLaVXnCr7FZ1gQrwoeGFX8wyEI/x8NPHKj2kytjzH979xitwzpFMZ7nueaurt/0r/9h7C/gfH/VqjTfc7L3tlNqXm4Zje2B4Bww/AYcTcHgIjuzy6spF1gDL1sGK8+CCl8Py9dC5Fpathdga6FztHSlX46BBlixQ/ysTqQzL2poWVEoY7I1x9y8Okp2YJtoSqJfplU8618LKTQxnJjgxNlXdKzDN4Mo/8mqK9/2lF+K/eqv3WGrH1DikH4eDD0PqEUg9CsM7vZN7AJhXxujqh/Muh1Xne7eVm6Bznf4oh0Cg9mAynWEgHl1QKeH0KvUZLt6wotJDK598Hvb+APpfMVP/Bp8WcfjlD3gnk779YfjKa+DGf/TeKos/ju+DfQ/Cvp949+nHT3dctK2E3ufCi94J8QuhZwt0DUKz5o4Ps8AEuHOORCrDryxwPcjitKvJoAX4yE7vLH/fLwM1sArPpb/j1T3v/G34/DXwhm96R3VSeScPwpPf9/6g7/1Pr1YNXm167QvhsvfAmothzQu8cojKHXUnMAGePjnByfHpBZcS1q9op7UpErxOlD0PePcbvQBPpDJ0RVtY2eHjCaLn/RrE4vC1N8Ktr4Abvwrrtvk3nrCanoSnfwTJ78Du73l/zME7aXjeZXDJu+G8S6HnQpU/BAhQgCcWeSQaiRgD8djMic/A2PMArNg4c5SbHM7O9LX7auMV8I5vwz+9Dr7wSnjV38EL3uz3qIJvIgtD34ad/wq77oOJk16P83mXwUW/Aedf6QW22upkDoEJ8KEllBIG4jEeSI5Uakjll8/B3h/ChTd4D/OOoXSG171ovb/jKurZAjd937vE/+7fhYM/g2s+opObizU17oX2o9+Eoe96Jx07umHr9TD4Stj0Mq8nWuQcAhPgc5YSHv8X+OEneUb/asEHMxO8aWKc6Zs7aQzCLH65Ke+qtUL/94HjY5yazNXWIg7tK+ENt3vdKT/8e9i/HV77ea/TQebnHBx4CB7+Muy407tKMRr33sVsvR42XKp+e1m0wAS4dzHLrFLC5Cn4tw96bzd7Ns/5PREmOHL8BJmG5axoD8hFBt2D0P/fgGdf+9NXkQZ4xV/Ahkvgzt+Bz1wB1/6tN9eDTqSdafwkPPJ1eOiLkH7MOwG55Vfgea/zjrQV2lKCQAR4Pu9dzHLji2eVErZ/zrt67K33Qt/lc37f5Ikx3v433+N/PedC3nRpX3UGW0an6/41UAOfy+Ar4bd/CHfcBHe9G564F677uHf1Xr07thce/Aw8/BWYzEDv8+C6T8Bzf827pFykDAIR4PuPjTE2NauUMJGFH3wCNl05b3gD9Ha2EmttDOzqPMl0hrXL24i1Nvk9lPl1roE33wX/9Sm4/6/gUy/26uLPf319Ho2nHoX//DvYcZd3NeuFr4Ff+i1Y90K/RyYhVNKpbTO7xswSZrbLzD5UrkGdrRjAM6WEn3zGmwXtqj851/gYjMdm5lAJmmQ6W7tH37NFGuDy34Pf+iF0b/F6xr/8ahhJ+D2y6jnwMPzTjXDzS2Do3705Zd73KPzqZxXeUjFLDnAzawA+BbwS2Aq83sy2lmtgsyVnlxLGT3gnLvv/+4J6kfsLq/M4N/eJzlo1ncuzezhgq/B0XQBvuxeu/Rgc+gV8+jL4zp96k2OF1eEh+Mab4bNXwr4fe/PIvP9RePmfe+9ORCqolBLKi4FdzrknAczsa8D1wI5yDGy2M0oJD9ziTWl55R8t6HsH41Fu+8kU137yBwShEaVoOueYzOWDFeDgHY2/+F2w9Qb49z+HH30SfnEbvPSD8MK3enMwh8HoEbj/f8NDX/Lmqn7ph+DSd3tTp4pUSSkBvhbYN+vxfuCXzv4iM7sJuAlgw4alXYK9qStKV7TQa7znAe/S4TUXLeh7X3FhLz/de4yJ6dyStu2n/niUlw6WdwWPqol2ww2f8uYY/+6fwr2/Dw/e7P3h3XpDcLsvctPeCfT7/8o7F/Oid8IVf1D2lVZEFsKWWlows9cC1zjn3ll4/Cbgl5xz75nve7Zt2+a2b9++pO3N+NsLYOAauP7/lvZzpHqcg+S3vCPykSe8SZau+AN4zmuCFeQHHvYuYEo/5rUAXvPReVtYRcrJzB5yzj2jZlzKScwDwOxLBNcVnquc7Ii3KkhPRUrtUilmhZbDH8Frv+B1Z9zxTvg/L4SffNZbD7GWTY7Ct/8Ybr3aO3n+61+BN92p8BbflVJC+SnQb2Yb8YL7RuA3yjKq+RQn99F/nGCKNHhH3VtvgCf+1TsZfe/ve+WI9Zcsve2wowuu/BNvwq1y278d7niXt4rNC9/mXcDUGtB1ViV0lhzgzrlpM3sP8G2gAfi8c+7xso1sLsPFANcReKBFIt7l41te7c1r/eNPw9HdS/95u78HiW/Baz4D519VnjHmpuEHH4fvf8TrJnnLPTMzRIrUipIu5HHO3QvcW6axnNvwDm9BgWgFjrSk+sy8y/E3XFLazxneCd98q7foxEveDy/9Q68zZKlOHoTb3w5P/5d35eS1H/MW6hWpMcGao3L4Ce/oux6v8JP59WyBd90PF7/RO2r+5MXe3CO56cX/rD3/6c3tcugReM1nvaXkFN5So4IT4M55R1o9W/weidSi5navM+mt/w+WrYd/fa93Wf+Pb4axBSxu7ZxXk//y9d67vHd9D57365Uft0gJghPgJw96U6126wSmPIu+l8A7vgM33uadbPzWB+HvNsO//Ja30s3U+DO/Z3oS7nqP16++5TovvHWiXAIgEJNZATqBKQtnBpuv9W6HfuGVUx75pndFaHMULrjamwht4xXe/ObfeLN3gdhLPwgv+7BKdBIYAQrwwhX6KqHIYqx+vjeN6zUf8erbT9wDiX/zZgsEaGj2yic33AwXvd7fsYosUoACfCdEe70jJpHFamyB/pd7t+s+AUd2eyu9H/qFt7jCeZf6PUKRRQtOgI/sVF1SysPMmzmx6wK/RyJSkmCcxMznT7cQiogIEJQAP74XpsdU/xYRmSUYAa4OFBGRZwhIgBc6ULoH/R2HiEgNCUiA74RlG7Sat4jILMHoQolf6F0eLSIiM4IR4L/8Ab9HICJSc4JRQhERkWdQgIuIBJQCXEQkoBTgIiIBpQAXEQkoBbiISEApwEVEAkoBLiISUOacq97GzEaAp5b47V3A4TIOJyjq8XXX42uG+nzdes0Lc55zrvvsJ6sa4KUws+3OuW1+j6Pa6vF11+Nrhvp83XrNpVEJRUQkoBTgIiIBFaQAv8XvAfikHl93Pb5mqM/XrddcgsDUwEVE5ExBOgIXEZFZFOAiIgEViAA3s2vMLGFmu8zsQ36PpxLMbL2Z3W9mO8zscTN7b+H5lWb2XTMbKtyv8Hus5WZmDWb2MzO7p/B4o5k9WNjfXzezZr/HWG5mttzMbjezJ8xsp5ldGvZ9bWbvL/xuP2Zmt5lZaxj3tZl93syGzeyxWc/NuW/N88nC63/EzF6wmG3VfICbWQPwKeCVwFbg9WYWxuXpp4EPOOe2ApcA7y68zg8B9znn+oH7Co/D5r3AzlmPPwp8wjl3AXAMeIcvo6qsfwC+5ZzbDDwf7/WHdl+b2Vrg94BtzrnnAA3AjYRzX38RuOas5+bbt68E+gu3m4BPL2ZDNR/gwIuBXc65J51zk8DXgOt9HlPZOecOOeceLnycwfsPvRbvtX6p8GVfAm7wZYAVYmbrgFcBtxYeG3AVcHvhS8L4mpcBVwCfA3DOTTrnjhPyfY23hGObmTUC7cAhQrivnXMPAEfPenq+fXs98GXn+TGw3MxWL3RbQQjwtcC+WY/3F54LLTPrAy4GHgTizrlDhU+lgLhf46qQvwf+EMgXHq8CjjvnpguPw7i/NwIjwBcKpaNbzayDEO9r59wB4GPA03jBfQJ4iPDv66L59m1J+RaEAK8rZhYF/hl4n3Pu5OzPOa/nMzR9n2Z2HTDsnHvI77FUWSPwAuDTzrmLgVHOKpeEcF+vwDva3AisATp4ZpmhLpRz3wYhwA8A62c9Xld4LnTMrAkvvL/qnLuj8HS6+JaqcD/s1/gq4HLg1Wa2F680dhVebXh54W02hHN/7wf2O+ceLDy+HS/Qw7yvXw7scc6NOOemgDvw9n/Y93XRfPu2pHwLQoD/FOgvnK1uxjvxcbfPYyq7Qu33c8BO59zHZ33qbuAthY/fAtxV7bFVinPuw865dc65Prz9+j3n3BuA+4HXFr4sVK8ZwDmXAvaZ2WDhqauBHYR4X+OVTi4xs/bC73rxNYd6X88y3769G3hzoRvlEuDErFLLuTnnav4GXAskgd3AH/s9ngq9xpfgva16BPh54XYtXk34PmAI+Hdgpd9jrdDrfxlwT+HjTcBPgF3AN4EWv8dXgdd7EbC9sL/vBFaEfV8DfwE8ATwGfAVoCeO+Bm7Dq/NP4b3besd8+xYwvC673cCjeF06C96WLqUXEQmoIJRQRERkDgpwEZGAUoCLiASUAlxEJKAU4CIiAaUAFxEJKAW4iEhA/X+BNww+D2xJkgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = (\n", + " jnp.ones((100,))\n", + " .at[0]\n", + " .set(-1)\n", + " .at[30:50]\n", + " .set(-1)\n", + " .at[40:45]\n", + " .set(jnp.nan)\n", + " .at[3:20]\n", + " .set(jnp.nan)\n", + ")\n", + "\n", + "(res, info) = unroll(\n", + " lambda x: EWMA(com=10, adjust=\"linear\", ignore_na=False, return_info=True)(x)\n", + ")(x)\n", + "res = pd.Series(onp.array(res))\n", + "pd.Series(info[\"com_eff\"]).plot()\n", + "res.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "23afd5c6", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = (\n", + " jnp.ones((100,))\n", + " .at[0]\n", + " .set(-1)\n", + " .at[30:50]\n", + " .set(-1)\n", + " .at[40:50]\n", + " .set(jnp.nan)\n", + " .at[3:20]\n", + " .set(jnp.nan)\n", + ")\n", + "\n", + "(res, info) = unroll(\n", + " lambda x: EWMA(com=10, adjust=\"linear\", ignore_na=False, return_info=True)(x)\n", + ")(x)\n", + "res = pd.Series(onp.array(res))\n", + "pd.Series(info[\"com_eff\"]).plot()\n", + "res.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "c6ddf6c9", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = (\n", + " jnp.ones((100,))\n", + " .at[0]\n", + " .set(-1)\n", + " .at[30:50]\n", + " .set(-1)\n", + " .at[40:50]\n", + " .set(jnp.nan)\n", + " .at[3:20]\n", + " .set(jnp.nan)\n", + ")\n", + "\n", + "(res, info) = unroll(\n", + " lambda x: EWMA(\n", + " com=10, adjust=False, ignore_na=False, return_info=True, initial_value=jnp.nan\n", + " )(x)\n", + ")(x)\n", + "res = pd.Series(onp.array(res))\n", + "# pd.Series(info[\"com_eff\"]).plot()\n", + "res.plot()\n", + "(res, info) = unroll(\n", + " lambda x: EWMA(\n", + " com=10, adjust=False, ignore_na=False, return_info=True, initial_value=0.0\n", + " )(x)\n", + ")(x)\n", + "res = pd.Series(onp.array(res))\n", + "# pd.Series(info[\"com_eff\"]).plot()\n", + "res.plot()\n", + "plt.legend((\"init nan\", \"init 0\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "bd4e27fd", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = (\n", + " jnp.ones((100,))\n", + " .at[0]\n", + " .set(-1)\n", + " .at[30:50]\n", + " .set(-1)\n", + " .at[40:50]\n", + " .set(jnp.nan)\n", + " .at[3:20]\n", + " .set(jnp.nan)\n", + ")\n", + "\n", + "(res, info) = unroll(\n", + " lambda x: EWMA(com=10, adjust=True, ignore_na=False, return_info=True)(x)\n", + ")(x)\n", + "res = pd.Series(onp.array(res))\n", + "pd.Series(info[\"com_eff\"]).plot()\n", + "res.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "b34301ee", + "metadata": { + "lines_to_end_of_cell_marker": 2, + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = (\n", + " jnp.ones((100,))\n", + " .at[0]\n", + " .set(-1)\n", + " .at[30:50]\n", + " .set(-1)\n", + " .at[40:50]\n", + " .set(jnp.nan)\n", + " .at[3:20]\n", + " .set(jnp.nan)\n", + ")\n", + "\n", + "alpha = 1 / (1 + 10)\n", + "(res, info) = unroll(\n", + " lambda x: EWMA(com=10, adjust=True, ignore_na=True, return_info=True)(x),\n", + " dynamic=False,\n", + ")(x)\n", + "res = pd.Series(onp.array(res))\n", + "pd.Series(info[\"com_eff\"]).plot()\n", + "# pd.Series(info[\"old_wt\"]/alpha).plot()\n", + "\n", + "res.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "952835af", + "metadata": {}, + "source": [ + "# Exponential adjustement " + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "5ef8be39", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "@partial(unroll_transform_with_state, dynamic=True)\n", + "def fun(x):\n", + " return EWMA(1 / 10, adjust=True, ignore_na=False, return_info=True)(x)\n", + "\n", + "\n", + "rng = jax.random.PRNGKey(42)\n", + "params, state = fun.init(rng, x)\n", + "(res, info), final_state = fun.apply(params, state, rng, x)\n", + "\n", + "\n", + "res = pd.DataFrame(onp.array(res))\n", + "\n", + "\n", + "c1 = pd.DataFrame(info[\"com_eff\"])\n", + "c1.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "73635469", + "metadata": {}, + "source": [ + "# More checks " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "0b4443df", + "metadata": {}, + "outputs": [], + "source": [ + "adjust = False\n", + "ignore_na = False\n", + "\n", + "adjust = True\n", + "ignore_na = False\n", + "\n", + "\n", + "def run():\n", + " x = jnp.ones((30,), \"float64\").at[0].set(-1).at[5:20].set(jnp.nan)\n", + "\n", + " @partial(unroll_transform_with_state)\n", + " def fun(x):\n", + " return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x)\n", + "\n", + " rng = jax.random.PRNGKey(42)\n", + " params, state = fun.init(rng, x)\n", + " (res, info), final_state = fun.apply(params, state, rng, x)\n", + " res = pd.Series(onp.array(res))\n", + "\n", + " ref_res = (\n", + " pd.Series(onp.array(x))\n", + " .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na)\n", + " .mean()\n", + " .values\n", + " )\n", + "\n", + " df = pd.concat(\n", + " [\n", + " pd.Series(x),\n", + " pd.Series(onp.array(ref_res)),\n", + " pd.Series(onp.array(res)),\n", + " ],\n", + " axis=1,\n", + " keys=[\"x\", \"pandas\", \"wax\"],\n", + " )\n", + "\n", + " return df\n", + "\n", + " df = pd.concat(\n", + " [\n", + " pd.Series(x),\n", + " ref_res,\n", + " res,\n", + " pd.Series(onp.array(info[\"mean\"])),\n", + " pd.Series(info[\"norm\"]),\n", + " pd.Series(onp.array(info[\"mean\"])) / ref_res,\n", + " ],\n", + " axis=1,\n", + " keys=[\"x\", \"pandas\", \"wax\", \"wax-mean\", \"wax-norm\", \"pandas-norm\"],\n", + " )\n", + " df.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "7e11817f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "adjust = False\n", + "ignore_na = False\n", + "df = run()\n", + "df.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "f86ba1ef", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "adjust = True\n", + "ignore_na = False\n", + "df = run()\n", + "df.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "0ce607ec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "adjust = False\n", + "ignore_na = True\n", + "df = run()\n", + "df.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "991b352d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "adjust = True\n", + "ignore_na = True\n", + "df = run()\n", + "df.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "8e460594", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "adjust = \"linear\"\n", + "ignore_na = True\n", + "df = run()\n", + "df.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "925b3097", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "adjust = \"linear\"\n", + "ignore_na = False\n", + "df = run()\n", + "df.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "12d7638b", + "metadata": {}, + "source": [ + "# Numba implementation " + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "c8093924", + "metadata": {}, + "outputs": [], + "source": [ + "from wax.modules.ewma_numba import ewma, init" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "639559b5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAD4CAYAAADsKpHdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAc/ElEQVR4nO3dfXRc9X3n8ffH8oPAzw/CNpaNDTgFE4idCmfT9GRTAsE4rU2ah5qc7jpNWPechd1sc5ribLZJSkJL0t2S3U02rUtISJriJNAUd2MgDiGbNIQHgQx+IGDHBllG8qMkYyzZlvTdP+bKjGWNZPuONZq5n9c5c3QfZ76XOczH9/7u7/4UEZiZmY0odQFmZjY8OBDMzAxwIJiZWcKBYGZmgAPBzMwSI0tdwNmYNm1azJ07t9RlmJmVlWeeeWZ/RNQUWl+WgTB37lzq6+tLXYaZWVmR9MpA633JyMzMAAeCmZklHAhmZgaUaRtCf44fP05TUxOdnZ2lLqWg6upqamtrGTVqVKlLMTM7RcUEQlNTE+PHj2fu3LlIKnU5p4gIDhw4QFNTE/PmzSt1OWZmpyjKJSNJ90jaK2lzgfWS9L8kbZf0vKS35q1bKWlb8lp5tjV0dnYyderUYRkGAJKYOnXqsD6DMbNsK1YbwjeBJQOsvwGYn7xWAV8DkDQF+CzwNmAx8FlJk8+2iOEaBr2Ge31mlm1FuWQUET+TNHeATZYD34rcs7afkDRJ0kzgXcCGiDgIIGkDuWC5rxh1mVl63T3BN36xk0Mdx0tdigErf2suU8eNOSfvPVRtCLOAXXnzTcmyQstPIWkVubML5syZc26qTOnhhx/m4x//ON3d3dx8882sXr261CWZpfbUzoN84YcvAOCT3NJbtnBW2QdCahGxBlgDUFdXN+xG9enu7uaWW25hw4YN1NbWcvXVV7Ns2TIWLFhQ6tLMUnm2sRWAhj+/jsljR5e4GjuXhqofwm5gdt58bbKs0PKy89RTT3HppZdy8cUXM3r0aFasWMGDDz5Y6rLMUmtobOPiaWMdBhkwVGcI64BbJa0l14DcHhHNkh4B/jKvIfk9wKfSfthf/MsWtr56KO3bnGTBhRP47O9dUXD97t27mT37jWyrra3lySefLGoNZkMtIti4q5V/+6YLSl2KDYGiBIKk+8g1EE+T1ETuzqFRABHxt8B6YCmwHTgC/FGy7qCkzwNPJ291e28Ds5mVXlNrB/sPH2PRnEmlLsWGQLHuMrppkPUB3FJg3T3APcWoo9dA/5I/V2bNmsWuXW+0jzc1NTFrVr/t42Zlo7f9wIGQDX6WUZFcffXVbNu2jZ07d3Ls2DHWrl3LsmXLSl2WWSoNjW2cP7qK35g+vtSl2BAom7uMhruRI0fyla98heuvv57u7m4++tGPcsUVQ3+mYlZMDY2tXFU7kZFV/rdjFjgQimjp0qUsXbq01GWYFUXn8W62vHqI//DOi0tdig0Rx76Z9Wvz7na6eoJFsyeVuhQbIg4EM+tXQ2MbAIvmnPXjxazMVFQg5G5mGr6Ge31m+Z5tbGX2lPOoGX9uHpNgw0/FBEJ1dTUHDhwYtj+6veMhVFdXl7oUs9PS0NjGotk+O8iSimlUrq2tpampiX379pW6lIJ6R0wzG+6a2ztoOdTJW93/IFMqJhBGjRrlkcjMiuTZV9oAtx9kTcVcMjKz4mlobGXMyBFcPnNCqUuxIeRAMLNTNOxq48pZExk90j8RWeJv28xOcqyrh0272/38ogxyIJjZSbY2H+JYV4/bDzLIgWBmJ2lInnD6VgdC5jgQzOwkzza2MXNiNTMmus9M1jgQzOwkDY2tbj/IqKIEgqQlkl6UtF3S6n7W3yVpY/J6SVJb3rruvHXrilGPmZ2dva910tTa4ctFGZW6Y5qkKuCrwHVAE/C0pHURsbV3m4j4k7zt/xOwKO8tOiJiYdo6zCy9Nx5oN6mkdVhpFOMMYTGwPSJ2RMQxYC2wfIDtbwLuK8LnmlmRNTS2MapKXHHhxFKXYiVQjECYBezKm29Klp1C0kXAPOAneYurJdVLekLSjYU+RNKqZLv64fy8IrNy1tDYyoILJ1I9qqrUpVgJDHWj8grg/ojozlt2UUTUAR8Gvizpkv52jIg1EVEXEXU1NTVDUatZpnR19/B8U7sHxMmwYgTCbmB23nxtsqw/K+hzuSgidid/dwA/5eT2BTMbIr9qeY2O491uP8iwYgTC08B8SfMkjSb3o3/K3UKSLgMmA7/MWzZZ0phkehrwDmBr333N7Nxr2NUGuENalqW+yygiuiTdCjwCVAH3RMQWSbcD9RHRGw4rgLVx8gg2lwN/J6mHXDjdmX93kpkNnYbGVqaNG0Pt5PNKXYqVSFHGQ4iI9cD6Pss+02f+c/3s9zhwZTFqMLN0GhrbWDRnEpJKXYqViHsqmxmtrx9j5/7X3X6QcQ4EM2Oj2w8MB4KZAc82tjJCcFWtO6RlmQPBzGhobOOyGRM4f3TFDLNuZ8GBYJZx3T3Bxl1tvPWiSaUuxUrMgWCWcdv3Hubw0S4WzXb7QdY5EMwyrneENN9hZA4Es4xraGxj0vmjmDdtbKlLsRJzIJhl3LONrSya7Q5p5kAwy7T2juNs23uYRe5/YDgQzDLt+aY2wB3SLMeBYJZhz77ShgRXzXaHNHMgmGVaw65W5l8wjgnVo0pdig0DDgSzjIoIGhrbfLnITnAgmGXUjv2v095x3P0P7AQHgllGNTS2AfgOIzuhKIEgaYmkFyVtl7S6n/UfkbRP0sbkdXPeupWStiWvlcWox8wG19DYyvgxI7m0ZlypS7FhIvWjDSVVAV8FrgOagKclretnKMzvRsStffadAnwWqAMCeCbZtzVtXcNVx7FuDh/tKnUZZjzzSisL50xixAh3SLOcYjzrdjGwPSJ2AEhaCywHTmds5OuBDRFxMNl3A7AEuK8IdQ07L+15jfd/7XFe63Qg2PDwnitmlLoEG0aKEQizgF15803A2/rZ7v2S3gm8BPxJROwqsO+s/j5E0ipgFcCcOXOKUPbQ6uru4ZPff45RVSP4/PIrwI8JsBKrklh6pQPB3jBUo2H8C3BfRByV9MfAvcA1Z/IGEbEGWANQV1cXxS/x3Lr7X3fyXFM7//umRfzeWy4sdTlmZqcoRqPybmB23nxtsuyEiDgQEUeT2buB3zzdfSvB9r2H+ZsNL3H9FdP53atmlrocM7N+FSMQngbmS5onaTSwAliXv4Gk/F/BZcALyfQjwHskTZY0GXhPsqxidPcEf3b/c5w/uorP3/hmP1HSzIat1JeMIqJL0q3kfsirgHsiYouk24H6iFgH/GdJy4Au4CDwkWTfg5I+Ty5UAG7vbWCuFN/4xU6ebWzjrj94CxeMry51OWZmBSmi7C7HU1dXF/X19aUuY1Av73+dJf/zZ7zjkmncvbLOZwdmVlKSnomIukLr3VP5HOnpCf7sgecZVTWCO953pcPAzIY9B8I58u0nXuGpnQf5899dwIyJvlRkZsOfA+Ec2HXwCF98+Fe88001fPA3a0tdjpnZaXEgFFlEcNsDzzNC4q9+35eKzKx8OBCK7B+fauTxXx/gU0svY9ak80pdjpnZaXMgFNHutg7+av2v+K1LpvLhxeX3eA0zyzYHQpFEBKsfeJ6eCL74/qt8qcjMyo4DoUi+/0wTP9+2n9uWXMbsKeeXuhwzszPmQCiClvZOPv9/t7J43hT+3b+5qNTlmJmdFQdCEfy3f97M8e4evvT+qzzYiJmVLQdCSo0HjvDjF/bwH991KXOnjS11OWZmZ82BkNL6zc0AvG9Rv+P6mJmVDQdCSg9tauaq2oluSDazsudASGHXwSM819TO0is96I2ZlT8HQgoPb24BYOmbHQhmVv6KEgiSlkh6UdJ2Sav7Wf8JSVslPS/pUUkX5a3rlrQxea3ru+9w9sNNzbx51gTmTPXlIjMrf6kDQVIV8FXgBmABcJOkBX02awDqIuIq4H7gS3nrOiJiYfJalraeobK7rYONu9q4wWcHZlYhinGGsBjYHhE7IuIYsBZYnr9BRDwWEUeS2SeAsn8m9EObcncXuf3AzCpFMQJhFrArb74pWVbIx4CH8uarJdVLekLSjYV2krQq2a5+3759qQouhoc2t3D5zAnMc98DM6sQQ9qoLOkPgTrgr/MWX5SM8flh4MuSLulv34hYExF1EVFXU1MzBNUW1tzewTOvtPLeK2eUtA4zs2IqRiDsBmbnzdcmy04i6Vrg08CyiDjauzwidid/dwA/BRYVoaZzqvfuoht8ucjMKkgxAuFpYL6keZJGAyuAk+4WkrQI+DtyYbA3b/lkSWOS6WnAO4CtRajpnFq/qZnLZoznkppxpS7FzKxoUgdCRHQBtwKPAC8A34uILZJul9R719BfA+OA7/e5vfRyoF7Sc8BjwJ0RMawDYc+hTupfafXdRWZWcUYW400iYj2wvs+yz+RNX1tgv8eBK4tRw1B5eHMLEbDU7QdmVmHcU/kMrd/UzPwLxjF/+vhSl2JmVlQOhDOw97VOnnr5oBuTzawiORDOwCNb9hAB73UgmFkFciCcgfXPN3NxzVjeNN13F5lZ5XEgnKb9h4/y5M4DvPfKmUgeJtPMKo8D4TQ9sqWFnsC3m5pZxXIgnKaHNrUwb9pYLp/pu4vMrDI5EE7DwdeP8csdB7jhzTN8ucjMKpYD4TT8aEsL3T3hR12bWUVzIJyG9ZtbmDPlfK64cEKpSzEzO2ccCINoO3KMx7fvZ6nvLjKzCudAGMSPtu6hqyf87CIzq3gOhEGs39RM7eTzuHLWxFKXYmZ2TjkQBtB+5Di/8OUiM8sIB8IANrywh+PdvrvIzLLBgTCAhzY1M2vSebyl1peLzKzyFSUQJC2R9KKk7ZJW97N+jKTvJuuflDQ3b92nkuUvSrq+GPUUw6HO4/x82353RjOzzEgdCJKqgK8CNwALgJskLeiz2ceA1oi4FLgL+GKy7wJyYzBfASwB/k/yfiX36At7ONbd47EPzCwzinGGsBjYHhE7IuIYsBZY3meb5cC9yfT9wLuV+2f3cmBtRByNiJ3A9uT9Sm79phZmTqxm0exJpS7FzGxIFCMQZgG78uabkmX9bhMRXUA7MPU09wVA0ipJ9ZLq9+3bV4SyB7apqZ23XzKVESN8ucjMsqFsGpUjYk1E1EVEXU1NzTn9rK7uHva+1kntpPPO6eeYmQ0nxQiE3cDsvPnaZFm/20gaCUwEDpzmvkNu3+Gj9ATMmOhAMLPsKEYgPA3MlzRP0mhyjcTr+myzDliZTH8A+ElERLJ8RXIX0jxgPvBUEWpKpbm9E4CZE6tLXImZ2dAZmfYNIqJL0q3AI0AVcE9EbJF0O1AfEeuArwPflrQdOEguNEi2+x6wFegCbomI7rQ1pdWSBMIMB4KZZUjqQACIiPXA+j7LPpM33Ql8sMC+dwB3FKOOYnm1rQPwGYKZZUvZNCoPpZb2Ts4bVcXE80aVuhQzsyHjQOhH86FOZk6sdg9lM8sUB0I/Wto73X5gZpnjQOiHA8HMssiB0Ed3T7AnuWRkZpYlDoQ+9h8+SldPuFOamWWOA6GPE53SJvgMwcyyxYHQR0t70gdhkgPBzLLFgdDHG4+t8CUjM8sWB0IfLe2djB45gsnnu1OamWWLA6GP5nZ3SjOzbHIg9NHS3skMNyibWQY5EPp4tb3DfRDMLJMcCHl6ejuleaQ0M8sgB0KeA68f43h3+AzBzDLJgZDnxMA4bkMwswxKFQiSpkjaIGlb8ndyP9sslPRLSVskPS/pD/LWfVPSTkkbk9fCNPWk1dzbKc19EMwsg9KeIawGHo2I+cCjyXxfR4B/HxFXAEuAL0ualLf+kxGxMHltTFlPKi2HPHSmmWVX2kBYDtybTN8L3Nh3g4h4KSK2JdOvAnuBmpSfe0682tbJqCoxdezoUpdiZjbk0gbC9IhoTqZbgOkDbSxpMTAa+HXe4juSS0l3SRozwL6rJNVLqt+3b1/KsvvX0t7B9AnVjBjhTmlmlj2DBoKkH0va3M9ref52ERFADPA+M4FvA38UET3J4k8BlwFXA1OA2wrtHxFrIqIuIupqas7NCUZzeycXuv3AzDJq5GAbRMS1hdZJ2iNpZkQ0Jz/4ewtsNwH4IfDpiHgi7717zy6OSvoG8KdnVH2RtRzq5C21k0pZgplZyaS9ZLQOWJlMrwQe7LuBpNHAD4BvRcT9fdbNTP6KXPvD5pT1nLWIOPEcIzOzLEobCHcC10naBlybzCOpTtLdyTYfAt4JfKSf20u/I2kTsAmYBnwhZT1nrfXIcY519fgOIzPLrEEvGQ0kIg4A7+5neT1wczL9D8A/FNj/mjSfX0xv9EFwIJhZNrmncqK5rbcPghuVzSybHAiJ5qRT2oU+QzCzjHIgJFraOxg5QkwdV7ArhJlZRXMgJJrbO5k+oZoqd0ozs4xyICRa2jt9h5GZZZoDIeFAMLOscyCQ65T2ansHMz0OgpllmAMBaO84Tudxd0ozs2xzIJBrUAa40GMpm1mGORDIGzrTZwhmlmEOBN44Q/BjK8wsyxwI5DqljRDUuFOamWWYAwF4tb2TC8ZXM7LK/znMLLv8C4j7IJiZgQMByD362u0HZpZ1qQJB0hRJGyRtS/5OLrBdd97gOOvyls+T9KSk7ZK+m4yuNqTeGCnNt5yaWbalPUNYDTwaEfOBR5P5/nRExMLktSxv+ReBuyLiUqAV+FjKes7Ya0e7OHKs22cIZpZ5aQNhOXBvMn0vuXGRT0syjvI1QO84y2e0f7G4D4KZWU7aQJgeEc3JdAswvcB21ZLqJT0h6cZk2VSgLSK6kvkmYFahD5K0KnmP+n379qUs+w3ug2BmljPomMqSfgzM6GfVp/NnIiIkRYG3uSgidku6GPiJpE1A+5kUGhFrgDUAdXV1hT7njDW35cZS9hmCmWXdoIEQEdcWWidpj6SZEdEsaSawt8B77E7+7pD0U2AR8AAwSdLI5CyhFth9FseQSnN7JxJM95NOzSzj0l4yWgesTKZXAg/23UDSZEljkulpwDuArRERwGPABwba/1xrae+kZtwYRrlTmpllXNpfwTuB6yRtA65N5pFUJ+nuZJvLgXpJz5ELgDsjYmuy7jbgE5K2k2tT+HrKes5Y86FOtx+YmXEal4wGEhEHgHf3s7weuDmZfhy4ssD+O4DFaWpIq6W9g3nTxpayBDOzYSHz10ncKc3MLCfTgXD4aBevdXb5DiMzMzIeCC3tuVtO3YZgZpbxQOjtlDbDt5yamTkQwGMpm5lBxgOh9zlGF0zwSGlmZpkOhOb2TqaNG82YkVWlLsXMrOQyHggdvsPIzCyR6UBoae9kxgS3H5iZQcYDIdcpzWcIZmaQ4UA4cqyL9o7jvmRkZpbIbCC0nLjl1IFgZgYOBLchmJklMhsIHjrTzOxkGQ4ED51pZpYvw4HQyeTzR1E9yp3SzMwgZSBImiJpg6Rtyd/J/WzzO5I25r06Jd2YrPumpJ156xamqedMtLR3MsPjIJiZnZD2DGE18GhEzAceTeZPEhGPRcTCiFgIXAMcAX6Ut8kne9dHxMaU9Zy25vZOLvTlIjOzE9IGwnLg3mT6XuDGQbb/APBQRBxJ+bmptRzqdPuBmVmetIEwPSKak+kWYPog268A7uuz7A5Jz0u6S1LBx45KWiWpXlL9vn37UpQMnce7Ofj6Md9hZGaWZ9BAkPRjSZv7eS3P3y4iAogB3mcmcCXwSN7iTwGXAVcDU4DbCu0fEWsioi4i6mpqagYre0An+iC4DcHM7ISRg20QEdcWWidpj6SZEdGc/ODvHeCtPgT8ICKO571379nFUUnfAP70NOtOxX0QzMxOlfaS0TpgZTK9EnhwgG1vos/loiREkCRy7Q+bU9ZzWloOuQ+CmVlfaQPhTuA6SduAa5N5JNVJurt3I0lzgdnA/+uz/3ckbQI2AdOAL6Ss57T4DMHM7FSDXjIaSEQcAN7dz/J64Oa8+ZeBWf1sd02azz9bLe2dTDxvFOePTnX4ZmYVJZM9lT0OgpnZqTIaCB4608ysr0wGQovPEMzMTpG5QDja1c3+w8c8DoKZWR+ZC4S9h44CvsPIzKyvzAVC84leyg4EM7N8GQyEXKc0j6VsZnayzAWCn2NkZta/zAVCc3sn48eMZNwYd0ozM8uXwUBwHwQzs/5kLhByQ2c6EMzM+spcIPixFWZm/ctUIBzv7mHf4aPMdIOymdkpMhUIe187SoQ7pZmZ9SdTgdDc5oFxzMwKyVYgnBgYx5eMzMz6ShUIkj4oaYukHkl1A2y3RNKLkrZLWp23fJ6kJ5Pl35U0Ok09g2nxYyvMzApKe4awGfh94GeFNpBUBXwVuAFYANwkaUGy+ovAXRFxKdAKfCxlPQNqbu/k/NFVTKh2pzQzs75SBUJEvBARLw6y2WJge0TsiIhjwFpguSQB1wD3J9vdC9yYpp7BtBzKdUrLfbSZmeUbin8qzwJ25c03AW8DpgJtEdGVt/yUcZd7SVoFrAKYM2fOWRVyxYUTuWjq2LPa18ys0g0aCJJ+DMzoZ9WnI+LB4pfUv4hYA6wBqKuri7N5j1t+59Ki1mRmVkkGDYSIuDblZ+wGZufN1ybLDgCTJI1MzhJ6l5uZWQkMxW2nTwPzkzuKRgMrgHUREcBjwAeS7VYCQ3bGYWZmJ0t72+n7JDUBbwd+KOmRZPmFktYDJP/6vxV4BHgB+F5EbEne4jbgE5K2k2tT+HqaeszM7Owp9w/18lJXVxf19fWlLsPMrKxIeiYiCvYZy1RPZTMzK8yBYGZmgAPBzMwSDgQzMwPKtFFZ0j7glbxF04D9JSrnXKvUY/NxlZ9KPbYsHddFEVFTaIeyDIS+JNUP1HJezir12Hxc5adSj83H9QZfMjIzM8CBYGZmiUoJhDWlLuAcqtRj83GVn0o9Nh9XoiLaEMzMLL1KOUMwM7OUHAhmZgZUQCBIWiLpRUnbJa0udT3FIullSZskbZRU1k/yk3SPpL2SNuctmyJpg6Rtyd/JpazxbBQ4rs9J2p18bxslLS1ljWdD0mxJj0naKmmLpI8ny8v6OxvguCrhO6uW9JSk55Jj+4tk+TxJTya/j99NhiAo/D7l3IYgqQp4CbiO3BCcTwM3RcTWkhZWBJJeBuoiouw7zEh6J3AY+FZEvDlZ9iXgYETcmQT55Ii4rZR1nqkCx/U54HBE/PdS1paGpJnAzIh4VtJ44Bly451/hDL+zgY4rg9R/t+ZgLERcVjSKOBfgY8DnwD+KSLWSvpb4LmI+Fqh9yn3M4TFwPaI2BERx4C1wPIS12R9RMTPgIN9Fi8H7k2m7yX3P2ZZKXBcZS8imiPi2WT6NXLjmMyizL+zAY6r7EXO4WR2VPIK4Brg/mT5oN9ZuQfCLGBX3nwTFfIFk/syfyTpGUmrSl3MOTA9IpqT6RZgeimLKbJbJT2fXFIqq8sqfUmaCywCnqSCvrM+xwUV8J1JqpK0EdgLbAB+DbQlg5TBafw+lnsgVLLfjoi3AjcAtySXJypSMpxq+V67PNnXgEuAhUAz8D9KWk0KksYBDwD/JSIO5a8r5++sn+OqiO8sIrojYiG58ekXA5ed6XuUeyDsBmbnzdcmy8peROxO/u4FfkDuC64ke5Jrur3XdveWuJ6iiIg9yf+YPcDfU6bfW3Id+gHgOxHxT8nisv/O+juuSvnOekVEG7nx6t8OTJI0Mlk16O9juQfC08D8pCV9NLACWFfimlKTNDZp9ELSWOA9wOaB9yo764CVyfRK4MES1lI0vT+YifdRht9b0kD5deCFiPibvFVl/Z0VOq4K+c5qJE1Kps8jd6PNC+SC4QPJZoN+Z2V9lxFAcovYl4Eq4J6IuKO0FaUn6WJyZwUAI4F/LOfjknQf8C5yj+PdA3wW+Gfge8Acco8y/1BElFUDbYHjehe5Sw8BvAz8cd5197Ig6beBnwObgJ5k8X8ld729bL+zAY7rJsr/O7uKXKNxFbl/6H8vIm5PfkvWAlOABuAPI+Jowfcp90AwM7PiKPdLRmZmViQOBDMzAxwIZmaWcCCYmRngQDAzs4QDwczMAAeCmZkl/j/ld6jsNmLqDwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x = onp.ones((30,), \"float64\")\n", + "x[0] = onp.nan\n", + "\n", + "x[1] = -1\n", + "\n", + "x[5:20] = onp.nan\n", + "x = x.reshape(-1, 1)\n", + "state = init(x)\n", + "\n", + "\n", + "res, state = ewma(com=10, adjust=\"linear\")(x, state)\n", + "pd.DataFrame(res).plot()" + ] + }, + { + "cell_type": "markdown", + "id": "880f591c", + "metadata": {}, + "source": [ + "# Online pandas ewm " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "c0b265bb", + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
totres1res2
000
0NaNNaNNaN
1-1.000000-1.000000NaN
20.0000000.000000NaN
30.3333330.333333NaN
40.5000000.500000NaN
50.5000000.500000NaN
60.5000000.500000NaN
70.5000000.500000NaN
80.5000000.500000NaN
90.5000000.500000NaN
100.500000NaN0.500000
110.500000NaN0.500000
120.500000NaN0.500000
130.500000NaN0.500000
140.500000NaN0.500000
150.500000NaN0.500000
160.500000NaN0.500000
170.500000NaN0.500000
180.500000NaN0.500000
190.500000NaN0.500000
200.600000NaN0.600000
210.666667NaN0.666667
220.714286NaN0.714286
230.750000NaN0.750000
240.777778NaN0.777778
250.800000NaN0.800000
260.818182NaN0.818182
270.833333NaN0.833333
280.846154NaN0.846154
290.857143NaN0.857143
\n", + "
" + ], + "text/plain": [ + " tot res1 res2\n", + " 0 0 0\n", + "0 NaN NaN NaN\n", + "1 -1.000000 -1.000000 NaN\n", + "2 0.000000 0.000000 NaN\n", + "3 0.333333 0.333333 NaN\n", + "4 0.500000 0.500000 NaN\n", + "5 0.500000 0.500000 NaN\n", + "6 0.500000 0.500000 NaN\n", + "7 0.500000 0.500000 NaN\n", + "8 0.500000 0.500000 NaN\n", + "9 0.500000 0.500000 NaN\n", + "10 0.500000 NaN 0.500000\n", + "11 0.500000 NaN 0.500000\n", + "12 0.500000 NaN 0.500000\n", + "13 0.500000 NaN 0.500000\n", + "14 0.500000 NaN 0.500000\n", + "15 0.500000 NaN 0.500000\n", + "16 0.500000 NaN 0.500000\n", + "17 0.500000 NaN 0.500000\n", + "18 0.500000 NaN 0.500000\n", + "19 0.500000 NaN 0.500000\n", + "20 0.600000 NaN 0.600000\n", + "21 0.666667 NaN 0.666667\n", + "22 0.714286 NaN 0.714286\n", + "23 0.750000 NaN 0.750000\n", + "24 0.777778 NaN 0.777778\n", + "25 0.800000 NaN 0.800000\n", + "26 0.818182 NaN 0.818182\n", + "27 0.833333 NaN 0.833333\n", + "28 0.846154 NaN 0.846154\n", + "29 0.857143 NaN 0.857143" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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7ke+V/0Q+J6Z5RO5p/DHKOups6bF29mrVsoijUqrVq345je/ecxf3QAffvgh11xzDQDXX389c+bMObps9OjRpKSk0KdPH7Zu3QpEAmHWrFkMHDiQQYMGsXz5clatWlXpMUOhEHfffTcPP/zwMfPnzJnD9ddfD8BFF11EYWEhe/bsAeCSSy4hPT2dnJwc2rVrx9atW3n77beZP38+gwcPZsCAAbz99tusXr06Nr+YGkTVMM3dC4GhlczPA24KXv8T6FfF9quBIdHUEK3WpTvY1LJ/PEsQkXpw5513MmjQIP7jP/6jVuunp6cffR25gBH595577uGWW26p1T6uv/56Hn74Yfr27VvnY4ZCIUpLS3F3xo0bd1ywNISk7svIw2FywkWUNFejNJHGJisri6uuuoo//vFfFx6+/OUvM3XqVACef/55zjvvvGr3MXLkSJ566in27dsHwMaNG9m2LXKrdOjQoWzceOxtzyZNmvDd7373mPsX55133tFLPrNnzyYnJ4dWrVpVecyhQ4cyffr0o8cpKipi3bp1tT3tqCR1IOwu2kaalWItNXSmSGN01113HfO00W9/+1uefvpp+vfvz7PPPsuvf/3rarcfMWIE11xzDeeccw79+vXjyiuvZO/evYTDYfLz88nKOv7+44033khpaenR6UmTJjF//nz69+/PxIkTeeaZZ47bprw+ffrw4IMPMmLECPr378/w4cPZvHlztdvEih35apRIcnNzPS8vL+r9rFnyMd3/dwTzhzzOF/+tdl8rRaRhLVu2jDPPPDPeZRxj8eLFPPXUU/zqV7+KdylVquz3ZmbzgyYAlUrqbwh7t0eGzmyerbGURaT2+vbte1KHwYlK6kA4tPNIK2U1ShMRSepAKNsdaaWc1UH9GImIJHUgpOzbyi5akNG0ebxLERGJu6QOhLQDW9iZokZpIiKQ5IHQ/PAO9qYpEEREIMkDoU3pDg5ltIt3GSJykjt48CBf/epXKSsrY+3atfzlL3+pcZsFCxbwxhtv1Gr/zzzzDD179qRnz57HtFMYNmwYO3fuPOG66yppA6GstJQs30VZc42lLCLVe+qpp7j88ssJhUIxD4SioiJ++tOf8vHHHx/t5O5ICFx//fX813/9V9T111ZUfRklsp07NpFjYVJaqZWySKL46atLWLppT0z32eeUVtz/jbOqXef5558/GgIT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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "online_ewm = pd.DataFrame(x).ewm(10).online()\n", + "res_tot = online_ewm.mean()\n", + "\n", + "\n", + "data = pd.DataFrame(x)\n", + "online_ewm = data.iloc[:10].ewm(10).online()\n", + "res1 = online_ewm.mean()\n", + "\n", + "res2 = online_ewm.mean(update=data.iloc[10:])\n", + "\n", + "df = pd.concat([res_tot, res1, res2], keys=[\"tot\", \"res1\", \"res2\"], axis=1)\n", + "df.plot()\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee819763", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "jupytext": { + "encoding": "# -*- coding: utf-8 -*-", + "formats": "ipynb,py,md" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/notebooks/09_EWMA_options.md b/docs/notebooks/09_EWMA_options.md new file mode 100644 index 0000000..a9fbe42 --- /dev/null +++ b/docs/notebooks/09_EWMA_options.md @@ -0,0 +1,454 @@ +--- +jupyter: + jupytext: + encoding: '# -*- coding: utf-8 -*-' + formats: ipynb,py,md + text_representation: + extension: .md + format_name: markdown + format_version: '1.3' + jupytext_version: 1.13.3 + kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- + +```python +# Uncomment to run the notebook in Colab +# ! pip install -q "wax-ml[complete]@git+https://github.com/eserie/wax-ml.git" +# ! pip install -q --upgrade jax jaxlib==0.1.70+cuda111 -f https://storage.googleapis.com/jax-releases/jax_releases.html +``` + +```python +%pylab inline +%load_ext autoreload +%autoreload 2 +``` + +```python +from functools import partial + +import jax +import jax.numpy as jnp +import numpy as onp +import pandas as pd +from jax.config import config + +from wax.modules.ewma import EWMA +from wax.unroll import unroll_transform_with_state +``` + +```python +# check available devices +print("jax backend {}".format(jax.lib.xla_bridge.get_backend().platform)) +jax.devices() +``` + +```python +adjust = True +ignore_na = False +config.update("jax_enable_x64", True) + +T = 20 + +x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1) + +rng = jax.random.PRNGKey(38) +x = jax.random.normal(rng, (T,)) + +x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1) + + +@partial(unroll_transform_with_state, dynamic=True) +def fun(x): + return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x) + + +rng = jax.random.PRNGKey(42) +params, state = fun.init(rng, x) +(res, info), final_state = fun.apply(params, state, rng, x) + + +res = pd.DataFrame(onp.array(res)) + +ref_res = ( + pd.DataFrame(onp.array(x)) + .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) + .mean() +) +``` +```python +res +``` + +```python +ref_res +``` + +```python +info +``` + +```python +pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) +``` + +## check gradient + +```python +@jax.value_and_grad +def batch(params): + (res, info), final_state = fun.apply(params, state, rng, x) + return jnp.nanmean(res) + + +score, grad = batch(params) +assert not jnp.isnan(grad["ewma"]["logcom"]) +score, grad +``` + +# Linear adjustement + +```python +adjust = True +ignore_na = False +config.update("jax_enable_x64", True) + +T = 20 + +x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1) + +rng = jax.random.PRNGKey(38) +x = jax.random.normal(rng, (T,)) +``` + + +```python +from wax.unroll import unroll +``` + +```python +x = jnp.full((20,), jnp.nan).at[2].set(1).at[10].set(-1) +(res, info) = unroll( + lambda x: EWMA(com=10, adjust="linear", ignore_na=True, return_info=True)(x) +)(x) +res = pd.DataFrame(onp.array(res)) +pd.Series(info["com_eff"]).plot() +``` + + +```python +# rng = jax.random.PRNGKey(42) +# x = jax.random.normal(rng, (100,)).at[30:50].set(jnp.nan) +# x = jnp.full((100,), jnp.nan).at[2].set(1).at[10].set(-1) +``` + + +```python +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA(com=10, adjust="linear", ignore_na=True, return_info=True)(x) +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +res.plot() +``` + + +```python +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:45] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA(com=10, adjust="linear", ignore_na=False, return_info=True)(x) +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +res.plot() +``` + + +```python +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA(com=10, adjust="linear", ignore_na=False, return_info=True)(x) +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +res.plot() +``` + + +```python +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA( + com=10, adjust=False, ignore_na=False, return_info=True, initial_value=jnp.nan + )(x) +)(x) +res = pd.Series(onp.array(res)) +# pd.Series(info["com_eff"]).plot() +res.plot() +(res, info) = unroll( + lambda x: EWMA( + com=10, adjust=False, ignore_na=False, return_info=True, initial_value=0.0 + )(x) +)(x) +res = pd.Series(onp.array(res)) +# pd.Series(info["com_eff"]).plot() +res.plot() +plt.legend(("init nan", "init 0")) +``` + + +```python +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA(com=10, adjust=True, ignore_na=False, return_info=True)(x) +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +res.plot() +``` + + +```python +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +alpha = 1 / (1 + 10) +(res, info) = unroll( + lambda x: EWMA(com=10, adjust=True, ignore_na=True, return_info=True)(x), + dynamic=False, +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +# pd.Series(info["old_wt"]/alpha).plot() + +res.plot() +``` + + +# Exponential adjustement + +```python +@partial(unroll_transform_with_state, dynamic=True) +def fun(x): + return EWMA(1 / 10, adjust=True, ignore_na=False, return_info=True)(x) + + +rng = jax.random.PRNGKey(42) +params, state = fun.init(rng, x) +(res, info), final_state = fun.apply(params, state, rng, x) + + +res = pd.DataFrame(onp.array(res)) + + +c1 = pd.DataFrame(info["com_eff"]) +c1.plot() +``` + +# More checks + +```python +adjust = False +ignore_na = False + +adjust = True +ignore_na = False + + +def run(): + x = jnp.ones((30,), "float64").at[0].set(-1).at[5:20].set(jnp.nan) + + @partial(unroll_transform_with_state) + def fun(x): + return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x) + + rng = jax.random.PRNGKey(42) + params, state = fun.init(rng, x) + (res, info), final_state = fun.apply(params, state, rng, x) + res = pd.Series(onp.array(res)) + + ref_res = ( + pd.Series(onp.array(x)) + .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) + .mean() + .values + ) + + df = pd.concat( + [ + pd.Series(x), + pd.Series(onp.array(ref_res)), + pd.Series(onp.array(res)), + ], + axis=1, + keys=["x", "pandas", "wax"], + ) + + return df + + df = pd.concat( + [ + pd.Series(x), + ref_res, + res, + pd.Series(onp.array(info["mean"])), + pd.Series(info["norm"]), + pd.Series(onp.array(info["mean"])) / ref_res, + ], + axis=1, + keys=["x", "pandas", "wax", "wax-mean", "wax-norm", "pandas-norm"], + ) + df.plot() +``` + +```python +adjust = False +ignore_na = False +df = run() +df.plot() +``` + +```python +adjust = True +ignore_na = False +df = run() +df.plot() +``` + +```python +adjust = False +ignore_na = True +df = run() +df.plot() +``` + +```python +adjust = True +ignore_na = True +df = run() +df.plot() +``` + +```python +adjust = "linear" +ignore_na = True +df = run() +df.plot() +``` + +```python +adjust = "linear" +ignore_na = False +df = run() +df.plot() +``` + +# Numba implementation + +```python +from wax.modules.ewma_numba import ewma, init +``` + +```python +x = onp.ones((30,), "float64") +x[0] = onp.nan + +x[1] = -1 + +x[5:20] = onp.nan +x = x.reshape(-1, 1) +state = init(x) + + +res, state = ewma(com=10, adjust="linear")(x, state) +pd.DataFrame(res).plot() +``` + +# Online pandas ewm + +```python +online_ewm = pd.DataFrame(x).ewm(10).online() +res_tot = online_ewm.mean() + + +data = pd.DataFrame(x) +online_ewm = data.iloc[:10].ewm(10).online() +res1 = online_ewm.mean() + +res2 = online_ewm.mean(update=data.iloc[10:]) + +df = pd.concat([res_tot, res1, res2], keys=["tot", "res1", "res2"], axis=1) +df.plot() +df +``` +```python + +``` + diff --git a/docs/notebooks/09_EWMA_options.py b/docs/notebooks/09_EWMA_options.py new file mode 100644 index 0000000..086e14b --- /dev/null +++ b/docs/notebooks/09_EWMA_options.py @@ -0,0 +1,423 @@ +# -*- coding: utf-8 -*- +# --- +# jupyter: +# jupytext: +# formats: ipynb,py,md +# text_representation: +# extension: .py +# format_name: light +# format_version: '1.5' +# jupytext_version: 1.13.3 +# kernelspec: +# display_name: Python 3 (ipykernel) +# language: python +# name: python3 +# --- + +# + +# Uncomment to run the notebook in Colab +# # ! pip install -q "wax-ml[complete]@git+https://github.com/eserie/wax-ml.git" +# # ! pip install -q --upgrade jax jaxlib==0.1.70+cuda111 -f https://storage.googleapis.com/jax-releases/jax_releases.html +# - + +# %pylab inline +# %load_ext autoreload +# %autoreload 2 + +# + +from functools import partial + +import jax +import jax.numpy as jnp +import numpy as onp +import pandas as pd +from jax.config import config + +from wax.modules.ewma import EWMA +from wax.unroll import unroll_transform_with_state +# - + +# check available devices +print("jax backend {}".format(jax.lib.xla_bridge.get_backend().platform)) +jax.devices() + +# + +adjust = True +ignore_na = False +config.update("jax_enable_x64", True) + +T = 20 + +x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1) + +rng = jax.random.PRNGKey(38) +x = jax.random.normal(rng, (T,)) + +x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1) + + +@partial(unroll_transform_with_state, dynamic=True) +def fun(x): + return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x) + + +rng = jax.random.PRNGKey(42) +params, state = fun.init(rng, x) +(res, info), final_state = fun.apply(params, state, rng, x) + + +res = pd.DataFrame(onp.array(res)) + +ref_res = ( + pd.DataFrame(onp.array(x)) + .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) + .mean() +) +# - +res + +ref_res + +info + +pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) + + +# ## check gradient + +# + +@jax.value_and_grad +def batch(params): + (res, info), final_state = fun.apply(params, state, rng, x) + return jnp.nanmean(res) + + +score, grad = batch(params) +assert not jnp.isnan(grad["ewma"]["logcom"]) +score, grad +# - + +# # Linear adjustement + +# + +adjust = True +ignore_na = False +config.update("jax_enable_x64", True) + +T = 20 + +x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1) + +rng = jax.random.PRNGKey(38) +x = jax.random.normal(rng, (T,)) + + +# - + + +from wax.unroll import unroll + +x = jnp.full((20,), jnp.nan).at[2].set(1).at[10].set(-1) +(res, info) = unroll( + lambda x: EWMA(com=10, adjust="linear", ignore_na=True, return_info=True)(x) +)(x) +res = pd.DataFrame(onp.array(res)) +pd.Series(info["com_eff"]).plot() + + +# + +# rng = jax.random.PRNGKey(42) +# x = jax.random.normal(rng, (100,)).at[30:50].set(jnp.nan) +# x = jnp.full((100,), jnp.nan).at[2].set(1).at[10].set(-1) + + +# + +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA(com=10, adjust="linear", ignore_na=True, return_info=True)(x) +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +res.plot() + + +# + +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:45] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA(com=10, adjust="linear", ignore_na=False, return_info=True)(x) +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +res.plot() + + +# + +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA(com=10, adjust="linear", ignore_na=False, return_info=True)(x) +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +res.plot() + + +# + +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA( + com=10, adjust=False, ignore_na=False, return_info=True, initial_value=jnp.nan + )(x) +)(x) +res = pd.Series(onp.array(res)) +# pd.Series(info["com_eff"]).plot() +res.plot() +(res, info) = unroll( + lambda x: EWMA( + com=10, adjust=False, ignore_na=False, return_info=True, initial_value=0.0 + )(x) +)(x) +res = pd.Series(onp.array(res)) +# pd.Series(info["com_eff"]).plot() +res.plot() +plt.legend(("init nan", "init 0")) + + +# + +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +(res, info) = unroll( + lambda x: EWMA(com=10, adjust=True, ignore_na=False, return_info=True)(x) +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +res.plot() + + +# + +x = ( + jnp.ones((100,)) + .at[0] + .set(-1) + .at[30:50] + .set(-1) + .at[40:50] + .set(jnp.nan) + .at[3:20] + .set(jnp.nan) +) + +alpha = 1 / (1 + 10) +(res, info) = unroll( + lambda x: EWMA(com=10, adjust=True, ignore_na=True, return_info=True)(x), + dynamic=False, +)(x) +res = pd.Series(onp.array(res)) +pd.Series(info["com_eff"]).plot() +# pd.Series(info["old_wt"]/alpha).plot() + +res.plot() + + +# - + + +# # Exponential adjustement + +# + +@partial(unroll_transform_with_state, dynamic=True) +def fun(x): + return EWMA(1 / 10, adjust=True, ignore_na=False, return_info=True)(x) + + +rng = jax.random.PRNGKey(42) +params, state = fun.init(rng, x) +(res, info), final_state = fun.apply(params, state, rng, x) + + +res = pd.DataFrame(onp.array(res)) + + +c1 = pd.DataFrame(info["com_eff"]) +c1.plot() +# - + +# # More checks + +# + +adjust = False +ignore_na = False + +adjust = True +ignore_na = False + + +def run(): + x = jnp.ones((30,), "float64").at[0].set(-1).at[5:20].set(jnp.nan) + + @partial(unroll_transform_with_state) + def fun(x): + return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x) + + rng = jax.random.PRNGKey(42) + params, state = fun.init(rng, x) + (res, info), final_state = fun.apply(params, state, rng, x) + res = pd.Series(onp.array(res)) + + ref_res = ( + pd.Series(onp.array(x)) + .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) + .mean() + .values + ) + + df = pd.concat( + [ + pd.Series(x), + pd.Series(onp.array(ref_res)), + pd.Series(onp.array(res)), + ], + axis=1, + keys=["x", "pandas", "wax"], + ) + + return df + + df = pd.concat( + [ + pd.Series(x), + ref_res, + res, + pd.Series(onp.array(info["mean"])), + pd.Series(info["norm"]), + pd.Series(onp.array(info["mean"])) / ref_res, + ], + axis=1, + keys=["x", "pandas", "wax", "wax-mean", "wax-norm", "pandas-norm"], + ) + df.plot() + + +# - + +adjust = False +ignore_na = False +df = run() +df.plot() + +adjust = True +ignore_na = False +df = run() +df.plot() + +adjust = False +ignore_na = True +df = run() +df.plot() + +adjust = True +ignore_na = True +df = run() +df.plot() + +adjust = "linear" +ignore_na = True +df = run() +df.plot() + +adjust = "linear" +ignore_na = False +df = run() +df.plot() + +# # Numba implementation + +from wax.modules.ewma_numba import ewma, init + +# + +x = onp.ones((30,), "float64") +x[0] = onp.nan + +x[1] = -1 + +x[5:20] = onp.nan +x = x.reshape(-1, 1) +state = init(x) + + +res, state = ewma(com=10, adjust="linear")(x, state) +pd.DataFrame(res).plot() +# - + +# # Online pandas ewm + +# + +online_ewm = pd.DataFrame(x).ewm(10).online() +res_tot = online_ewm.mean() + + +data = pd.DataFrame(x) +online_ewm = data.iloc[:10].ewm(10).online() +res1 = online_ewm.mean() + +res2 = online_ewm.mean(update=data.iloc[10:]) + +df = pd.concat([res_tot, res1, res2], keys=["tot", "res1", "res2"], axis=1) +df.plot() +df +# - + + From 78fb86b3a19979ceef95e16f908f90d6f63d3482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Mon, 14 Mar 2022 11:34:41 +0100 Subject: [PATCH 18/46] add some tests --- wax/modules/ewma_numba.py | 26 ++++++++++++++++---------- wax/modules/ewma_numba_test.py | 31 +++++++++++++++++++++++++++---- wax/modules/ewma_test.py | 23 ++++++++++++++++++++++- 3 files changed, 65 insertions(+), 15 deletions(-) diff --git a/wax/modules/ewma_numba.py b/wax/modules/ewma_numba.py index 379f566..f982b23 100644 --- a/wax/modules/ewma_numba.py +++ b/wax/modules/ewma_numba.py @@ -45,8 +45,6 @@ def ewma( adjust: bool = True, ignore_na: bool = False, initial_value=np.nan, - return_info: bool = False, - name: str = None, ): """Compute exponentioal moving average. @@ -95,11 +93,6 @@ def ewma( initial_value : initial value for the state. - - return_info : if true, a dictionary is returned in addition to the module output which - contains additional variables. - - name : name of the module instance. """ assert ( com is not None or alpha is not None @@ -112,13 +105,23 @@ def ewma( assert cast(float, com) > 0.0 alpha = 1.0 / (1.0 + com) - def apply(values, state): + def apply(values: np.ndarray, state: State = None): + is_1d = False + if values.ndim == 1: + values = values.reshape(-1, 1) + is_1d = True + + if state is None: + state = init(values) mean = state.mean old_wt = state.old_wt nobs = state.nobs res, mean, old_wt, nobs = numba_apply(values, mean, old_wt, nobs) state = State(mean, old_wt, nobs) + + if is_1d: + res = res.reshape(values.shape[0]) return res, state @numba.jit(nopython=True, nogil=True, parallel=False) @@ -138,9 +141,12 @@ def numba_apply(values, mean, old_wt, nobs): new_wt = alpha # deltas = np.ones(values.shape) - result = np.empty(values.shape) - weighted_avg = values[0].copy() + if np.isnan(initial_value): + weighted_avg = values[0].copy() + else: + weighted_avg = np.full_like(values[0], initial_value) + nobs = (~np.isnan(weighted_avg)).astype(np.int64) result[0] = np.where(nobs >= minimum_periods, weighted_avg, np.nan) diff --git a/wax/modules/ewma_numba_test.py b/wax/modules/ewma_numba_test.py index 959c2f9..1f00565 100644 --- a/wax/modules/ewma_numba_test.py +++ b/wax/modules/ewma_numba_test.py @@ -50,7 +50,14 @@ def test_nan_at_beginning(adjust, ignore_na): x[1] = -1 x[5:20] = np.nan - compare_nan_at_beginning( + res = compare_nan_at_beginning( + x, + com=10, + adjust=adjust, + ignore_na=ignore_na, + ) + + res = compare_nan_at_beginning( x, com=10, adjust=adjust, @@ -59,10 +66,26 @@ def test_nan_at_beginning(adjust, ignore_na): def compare_nan_at_beginning(x, **ewma_kwargs): - x = x.reshape(-1, 1) - state = init(x) - res, state = ewma(**ewma_kwargs)(x, state) + res, state = ewma(**ewma_kwargs)(x, state=None) res = pd.DataFrame(np.array(res)) ref_res = pd.DataFrame(x).ewm(**ewma_kwargs).mean() pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) + return res + + +def test_init_value(): + # check random variable with nans + x = np.ones((30,), "float64") + x[0] = np.nan + x[1] = -1 + x[5:20] = np.nan + + x = x.reshape(-1, 1) + res, state = ewma(com=10, adjust=False, ignore_na=False)(x) + + res_init0, state = ewma(com=10, adjust=False, ignore_na=False, initial_value=0)(x) + + assert res_init0[0] == 0 + assert np.isnan(res[0]) + assert np.linalg.norm(res_init0) < np.linalg.norm(np.nan_to_num(res)) diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index c7ad356..68a1a83 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -193,7 +193,7 @@ def test_nan_at_beginning(adjust, ignore_na): ) # check random variable with nans - rng = jax.random.PRNGKey(42) + # rng = jax.random.PRNGKey(42) # x = jax.random.normal(rng, (6,)).at[3].set(jnp.nan) # x = jnp.ones((6,), "float64").at[0].set(-1).at[3].set(jnp.nan) x = jnp.ones((30,), "float64").at[0].set(-1).at[5:20].set(jnp.nan) @@ -228,6 +228,27 @@ def batch(params): assert not jnp.isnan(grad["ewma"]["logcom"]) +def test_init_value(): + x = ( + jnp.ones((30,), "float64") + .at[0] + .set(jnp.nan) + .at[1] + .set(-1) + .at[5:20] + .set(jnp.nan) + ) + + res = unroll(lambda x: EWMA(com=10, adjust=False, ignore_na=False)(x))(x) + res_init0 = unroll( + lambda x: EWMA(com=10, adjust=False, ignore_na=False, initial_value=0.0)(x) + )(x) + + assert res_init0[0] == 0 + assert jnp.isnan(res[0]) + assert jnp.linalg.norm(res_init0) < jnp.linalg.norm(jnp.nan_to_num(res)) + + def test_train_ewma(): import optax from tqdm.auto import tqdm From 59990a49bc74ebeb415adad9aa9a064a5a83241a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Mon, 14 Mar 2022 12:11:35 +0100 Subject: [PATCH 19/46] correct numba implementation with state management --- wax/modules/ewma_numba.py | 46 ++++++++++++++++------------------ wax/modules/ewma_numba_test.py | 27 +++++++++++++++++--- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/wax/modules/ewma_numba.py b/wax/modules/ewma_numba.py index f982b23..54df041 100644 --- a/wax/modules/ewma_numba.py +++ b/wax/modules/ewma_numba.py @@ -18,26 +18,12 @@ import numpy as np -class State(NamedTuple): +class EWMAState(NamedTuple): mean: Any old_wt: Any nobs: Any -def init(x): - x = x[0] - - dtype = x.dtype - shape = x.shape - - state = State( - mean=np.full(shape, np.nan, dtype), - old_wt=np.full(shape, 1.0, dtype), - nobs=np.full(shape, 0.0, dtype=dtype), - ) - return state - - def ewma( alpha: float = None, com: float = None, @@ -105,20 +91,33 @@ def ewma( assert cast(float, com) > 0.0 alpha = 1.0 / (1.0 + com) - def apply(values: np.ndarray, state: State = None): + def init_ewma_state(x): + x = x[0] + + dtype = x.dtype + shape = x.shape + + state = EWMAState( + mean=np.full(shape, initial_value, dtype), + old_wt=np.full(shape, 1.0, dtype), + nobs=np.full(shape, 0.0, dtype=dtype), + ) + return state + + def apply(values: np.ndarray, state: EWMAState = None): is_1d = False if values.ndim == 1: values = values.reshape(-1, 1) is_1d = True if state is None: - state = init(values) + state = init_ewma_state(values) mean = state.mean old_wt = state.old_wt nobs = state.nobs res, mean, old_wt, nobs = numba_apply(values, mean, old_wt, nobs) - state = State(mean, old_wt, nobs) + state = EWMAState(mean, old_wt, nobs) if is_1d: res = res.reshape(values.shape[0]) @@ -142,15 +141,12 @@ def numba_apply(values, mean, old_wt, nobs): # deltas = np.ones(values.shape) result = np.empty(values.shape) - if np.isnan(initial_value): - weighted_avg = values[0].copy() - else: - weighted_avg = np.full_like(values[0], initial_value) + weighted_avg = mean - nobs = (~np.isnan(weighted_avg)).astype(np.int64) + # nobs = (~np.isnan(weighted_avg)).astype(np.int64) result[0] = np.where(nobs >= minimum_periods, weighted_avg, np.nan) - for i in range(1, len(values)): + for i in range(len(values)): cur = values[i] is_observations = ~np.isnan(cur) nobs += is_observations.astype(np.int64) @@ -189,7 +185,7 @@ def numba_apply(values, mean, old_wt, nobs): weighted_avg[j] = cur[j] result[i] = np.where(nobs >= minimum_periods, weighted_avg, np.nan) - + mean = weighted_avg return result, mean, old_wt, nobs return apply diff --git a/wax/modules/ewma_numba_test.py b/wax/modules/ewma_numba_test.py index 1f00565..39ef238 100644 --- a/wax/modules/ewma_numba_test.py +++ b/wax/modules/ewma_numba_test.py @@ -2,7 +2,7 @@ import pandas as pd import pytest -from wax.modules.ewma_numba import ewma, init +from wax.modules.ewma_numba import ewma def test_ewma_numba(): @@ -14,8 +14,7 @@ def test_ewma_numba(): x[5:20] = np.nan x = x.reshape(-1, 1) - state = init(x) - res, state = ewma(com=10, adjust="linear")(x, state) + res, state = ewma(com=10, adjust="linear")(x) pd.DataFrame(res).plot() @@ -89,3 +88,25 @@ def test_init_value(): assert res_init0[0] == 0 assert np.isnan(res[0]) assert np.linalg.norm(res_init0) < np.linalg.norm(np.nan_to_num(res)) + + +def test_state(): + x = np.ones((30,), "float64") + x[0] = np.nan + x[1] = -1 + x[5:20] = np.nan + + x = x.reshape(-1, 1) + + ewma_apply = ewma(com=10, adjust="linear", min_periods=5) + res_full, _ = ewma_apply(x) + + T = 10 + res1, state = ewma_apply(x[:T]) + res2, _ = ewma_apply(x[T:], state) + res12 = np.concatenate([res1, res2]) + df = pd.concat( + [pd.DataFrame(res_full), pd.DataFrame(res12)], axis=1, keys=["full", "12"] + ) + + assert np.allclose(res_full, res12, equal_nan=True) From 1e4c702e15146364763d7b47d257e2fbd2e5a75e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Mon, 14 Mar 2022 12:11:52 +0100 Subject: [PATCH 20/46] update notebook --- docs/notebooks/09_EWMA_options.ipynb | 375 ++++++++++++++++++++++----- docs/notebooks/09_EWMA_options.md | 28 +- docs/notebooks/09_EWMA_options.py | 29 ++- 3 files changed, 343 insertions(+), 89 deletions(-) diff --git a/docs/notebooks/09_EWMA_options.ipynb b/docs/notebooks/09_EWMA_options.ipynb index 6018d25..fdd6def 100644 --- a/docs/notebooks/09_EWMA_options.ipynb +++ b/docs/notebooks/09_EWMA_options.ipynb @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "956a5611", "metadata": {}, "outputs": [ @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "8c949906", "metadata": {}, "outputs": [ @@ -58,12 +58,12 @@ "from jax.config import config\n", "\n", "from wax.modules.ewma import EWMA\n", - "from wax.unroll import unroll_transform_with_state" + "from wax.unroll import unroll_transform_with_state\n" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "7cf7110b", "metadata": {}, "outputs": [ @@ -84,10 +84,10 @@ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -100,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "06e812c2", "metadata": { "lines_to_next_cell": 0 @@ -142,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "7c4b0855", "metadata": {}, "outputs": [ @@ -279,7 +279,7 @@ "19 -0.398145" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -290,7 +290,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "ed2c4c76", "metadata": {}, "outputs": [ @@ -427,7 +427,7 @@ "19 -0.398145" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -438,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "4a2acfa9", "metadata": {}, "outputs": [ @@ -451,7 +451,7 @@ " 0.84467658, 0.76020892, 0.68418803, 0.61576923, 0.55419231], dtype=float64)}" ] }, - "execution_count": 9, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -462,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "id": "8c319435", "metadata": {}, "outputs": [], @@ -480,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "id": "6c6afe80", "metadata": {}, "outputs": [ @@ -491,7 +491,7 @@ " FlatMap({'ewma': FlatMap({'logcom': DeviceArray(0.18699575, dtype=float64)})}))" ] }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -518,10 +518,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "id": "35abe086", "metadata": { - "lines_to_end_of_cell_marker": 2, "lines_to_next_cell": 2 }, "outputs": [], @@ -540,7 +539,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "924962ce", "metadata": {}, "outputs": [], @@ -550,7 +549,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "7b92edc4", "metadata": { "lines_to_next_cell": 2 @@ -562,7 +561,7 @@ "" ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, @@ -590,7 +589,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "e741d016", "metadata": { "lines_to_next_cell": 2 @@ -604,7 +603,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "0d6b5bcf", "metadata": { "lines_to_next_cell": 2 @@ -616,7 +615,7 @@ "" ] }, - "execution_count": 16, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, @@ -656,7 +655,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "8ca2721c", "metadata": { "lines_to_next_cell": 2 @@ -668,7 +667,7 @@ "" ] }, - "execution_count": 17, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, @@ -708,7 +707,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "id": "23afd5c6", "metadata": { "lines_to_next_cell": 2 @@ -720,7 +719,7 @@ "" ] }, - "execution_count": 18, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, @@ -760,7 +759,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "id": "c6ddf6c9", "metadata": { "lines_to_next_cell": 2 @@ -769,10 +768,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 19, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, @@ -823,7 +822,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "id": "bd4e27fd", "metadata": { "lines_to_next_cell": 2 @@ -835,7 +834,7 @@ "" ] }, - "execution_count": 20, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, @@ -875,7 +874,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "id": "b34301ee", "metadata": { "lines_to_end_of_cell_marker": 2, @@ -888,7 +887,7 @@ "" ] }, - "execution_count": 21, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, @@ -935,12 +934,12 @@ "id": "952835af", "metadata": {}, "source": [ - "# Exponential adjustement " + "# Exponential adjustement" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 20, "id": "5ef8be39", "metadata": {}, "outputs": [ @@ -950,7 +949,7 @@ "" ] }, - "execution_count": 22, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, @@ -990,12 +989,12 @@ "id": "73635469", "metadata": {}, "source": [ - "# More checks " + "# More checks" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 21, "id": "0b4443df", "metadata": {}, "outputs": [], @@ -1055,7 +1054,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 22, "id": "7e11817f", "metadata": {}, "outputs": [ @@ -1065,7 +1064,7 @@ "" ] }, - "execution_count": 24, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, @@ -1091,7 +1090,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 23, "id": "f86ba1ef", "metadata": {}, "outputs": [ @@ -1101,7 +1100,7 @@ "" ] }, - "execution_count": 25, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, @@ -1127,7 +1126,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 24, "id": "0ce607ec", "metadata": {}, "outputs": [ @@ -1137,7 +1136,7 @@ "" ] }, - "execution_count": 26, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, @@ -1163,7 +1162,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 25, "id": "991b352d", "metadata": {}, "outputs": [ @@ -1173,7 +1172,7 @@ "" ] }, - "execution_count": 27, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, @@ -1199,7 +1198,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 26, "id": "8e460594", "metadata": {}, "outputs": [ @@ -1209,7 +1208,7 @@ "" ] }, - "execution_count": 28, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, @@ -1235,7 +1234,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 27, "id": "925b3097", "metadata": {}, "outputs": [ @@ -1245,7 +1244,7 @@ "" ] }, - "execution_count": 29, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, @@ -1274,22 +1273,22 @@ "id": "12d7638b", "metadata": {}, "source": [ - "# Numba implementation " + "# Numba implementation" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 28, "id": "c8093924", "metadata": {}, "outputs": [], "source": [ - "from wax.modules.ewma_numba import ewma, init" + "from wax.modules.ewma_numba import ewma" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 29, "id": "639559b5", "metadata": {}, "outputs": [ @@ -1299,7 +1298,7 @@ "" ] }, - "execution_count": 32, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" }, @@ -1324,28 +1323,268 @@ "\n", "x[5:20] = onp.nan\n", "x = x.reshape(-1, 1)\n", - "state = init(x)\n", "\n", "\n", - "res, state = ewma(com=10, adjust=\"linear\")(x, state)\n", + "res, state = ewma(com=10, adjust=\"linear\")(x)\n", "pd.DataFrame(res).plot()" ] }, + { + "cell_type": "code", + "execution_count": 39, + "id": "55d2327d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
full12
00
0NaNNaN
1NaNNaN
2NaNNaN
30.3333330.333333
40.5000000.500000
50.5000000.500000
60.5000000.500000
70.5000000.500000
80.5000000.500000
90.5000000.500000
100.5000000.500000
110.5000000.500000
120.5000000.500000
130.5000000.500000
140.5000000.500000
150.5000000.500000
160.5000000.500000
170.5000000.500000
180.5000000.500000
190.5000000.500000
201.0000001.000000
211.0000001.000000
221.0000001.000000
231.0000001.000000
241.0000001.000000
251.0000001.000000
261.0000001.000000
271.0000001.000000
281.0000001.000000
291.0000001.000000
\n", + "
" + ], + "text/plain": [ + " full 12\n", + " 0 0\n", + "0 NaN NaN\n", + "1 NaN NaN\n", + "2 NaN NaN\n", + "3 0.333333 0.333333\n", + "4 0.500000 0.500000\n", + "5 0.500000 0.500000\n", + "6 0.500000 0.500000\n", + "7 0.500000 0.500000\n", + "8 0.500000 0.500000\n", + "9 0.500000 0.500000\n", + "10 0.500000 0.500000\n", + "11 0.500000 0.500000\n", + "12 0.500000 0.500000\n", + "13 0.500000 0.500000\n", + "14 0.500000 0.500000\n", + "15 0.500000 0.500000\n", + "16 0.500000 0.500000\n", + "17 0.500000 0.500000\n", + "18 0.500000 0.500000\n", + "19 0.500000 0.500000\n", + "20 1.000000 1.000000\n", + "21 1.000000 1.000000\n", + "22 1.000000 1.000000\n", + "23 1.000000 1.000000\n", + "24 1.000000 1.000000\n", + "25 1.000000 1.000000\n", + "26 1.000000 1.000000\n", + "27 1.000000 1.000000\n", + "28 1.000000 1.000000\n", + "29 1.000000 1.000000" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ewma_apply = ewma(com=10, adjust=\"linear\", min_periods=3)\n", + "res_full, _ = ewma_apply(x)\n", + "\n", + "T = 10\n", + "res1, state = ewma_apply(x[:T])\n", + "res2, _ = ewma_apply(x[T:], state)\n", + "res12 = np.concatenate([res1, res2])\n", + "assert np.allclose(res_full, res12, equal_nan=True)\n", + "pd.concat([pd.DataFrame(res_full), pd.DataFrame(res12)], axis=1, keys=[\"full\", \"12\"])" + ] + }, { "cell_type": "markdown", "id": "880f591c", "metadata": {}, "source": [ - "# Online pandas ewm " + "# Online pandas ewm" ] }, { "cell_type": "code", "execution_count": 36, "id": "c0b265bb", - "metadata": { - "lines_to_next_cell": 0 - }, + "metadata": {}, "outputs": [ { "data": { @@ -1633,13 +1872,9 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "ee819763", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [], + "cell_type": "markdown", + "id": "db2d0e84", + "metadata": {}, "source": [] } ], diff --git a/docs/notebooks/09_EWMA_options.md b/docs/notebooks/09_EWMA_options.md index a9fbe42..d063074 100644 --- a/docs/notebooks/09_EWMA_options.md +++ b/docs/notebooks/09_EWMA_options.md @@ -37,6 +37,7 @@ from jax.config import config from wax.modules.ewma import EWMA from wax.unroll import unroll_transform_with_state + ``` ```python @@ -292,7 +293,7 @@ res.plot() ``` -# Exponential adjustement +# Exponential adjustement ```python @partial(unroll_transform_with_state, dynamic=True) @@ -312,7 +313,7 @@ c1 = pd.DataFrame(info["com_eff"]) c1.plot() ``` -# More checks +# More checks ```python adjust = False @@ -410,10 +411,10 @@ df = run() df.plot() ``` -# Numba implementation +# Numba implementation ```python -from wax.modules.ewma_numba import ewma, init +from wax.modules.ewma_numba import ewma ``` ```python @@ -424,14 +425,25 @@ x[1] = -1 x[5:20] = onp.nan x = x.reshape(-1, 1) -state = init(x) -res, state = ewma(com=10, adjust="linear")(x, state) +res, state = ewma(com=10, adjust="linear")(x) pd.DataFrame(res).plot() ``` -# Online pandas ewm +```python +ewma_apply = ewma(com=10, adjust="linear", min_periods=3) +res_full, _ = ewma_apply(x) + +T = 10 +res1, state = ewma_apply(x[:T]) +res2, _ = ewma_apply(x[T:], state) +res12 = np.concatenate([res1, res2]) +assert np.allclose(res_full, res12, equal_nan=True) +pd.concat([pd.DataFrame(res_full), pd.DataFrame(res12)], axis=1, keys=["full", "12"]) +``` + +# Online pandas ewm ```python online_ewm = pd.DataFrame(x).ewm(10).online() @@ -448,7 +460,5 @@ df = pd.concat([res_tot, res1, res2], keys=["tot", "res1", "res2"], axis=1) df.plot() df ``` -```python -``` diff --git a/docs/notebooks/09_EWMA_options.py b/docs/notebooks/09_EWMA_options.py index 086e14b..8d6235d 100644 --- a/docs/notebooks/09_EWMA_options.py +++ b/docs/notebooks/09_EWMA_options.py @@ -35,6 +35,7 @@ from wax.modules.ewma import EWMA from wax.unroll import unroll_transform_with_state + # - # check available devices @@ -110,8 +111,6 @@ def batch(params): rng = jax.random.PRNGKey(38) x = jax.random.normal(rng, (T,)) - - # - @@ -275,7 +274,7 @@ def batch(params): # - -# # Exponential adjustement +# # Exponential adjustement # + @partial(unroll_transform_with_state, dynamic=True) @@ -295,7 +294,7 @@ def fun(x): c1.plot() # - -# # More checks +# # More checks # + adjust = False @@ -383,9 +382,9 @@ def fun(x): df = run() df.plot() -# # Numba implementation +# # Numba implementation -from wax.modules.ewma_numba import ewma, init +from wax.modules.ewma_numba import ewma # + x = onp.ones((30,), "float64") @@ -395,14 +394,24 @@ def fun(x): x[5:20] = onp.nan x = x.reshape(-1, 1) -state = init(x) -res, state = ewma(com=10, adjust="linear")(x, state) +res, state = ewma(com=10, adjust="linear")(x) pd.DataFrame(res).plot() + +# + +ewma_apply = ewma(com=10, adjust="linear", min_periods=3) +res_full, _ = ewma_apply(x) + +T = 10 +res1, state = ewma_apply(x[:T]) +res2, _ = ewma_apply(x[T:], state) +res12 = np.concatenate([res1, res2]) +assert np.allclose(res_full, res12, equal_nan=True) +pd.concat([pd.DataFrame(res_full), pd.DataFrame(res12)], axis=1, keys=["full", "12"]) # - -# # Online pandas ewm +# # Online pandas ewm # + online_ewm = pd.DataFrame(x).ewm(10).online() @@ -420,4 +429,4 @@ def fun(x): df # - - +# From 7a140eab9db4bd5d1d025ba05b2b7c24211ba47d Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Mon, 14 Mar 2022 12:54:51 +0100 Subject: [PATCH 21/46] add dataframe online.ewma --- wax/modules/ewma_numba.py | 43 ++++++++++++++++++++++++++++++++++ wax/modules/ewma_numba_test.py | 22 ++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/wax/modules/ewma_numba.py b/wax/modules/ewma_numba.py index 54df041..a27ef84 100644 --- a/wax/modules/ewma_numba.py +++ b/wax/modules/ewma_numba.py @@ -189,3 +189,46 @@ def numba_apply(values, mean, old_wt, nobs): return result, mean, old_wt, nobs return apply + + +class EWMAAccessor: + def __init__(self, pandas_obj): + self._obj = pandas_obj + + def ewma(self, + alpha: float = None, + com: float = None, + min_periods: int = 0, + adjust: bool = True, + ignore_na: bool = False, + initial_value=np.nan, + state=None, + ): + if state is not None: + state = state._replace( + mean=state.mean.values, + old_wt=state.old_wt.values, + nobs=state.nobs.values) + + res, state = ewma( + alpha=alpha, + com=com, + min_periods=min_periods, + adjust=adjust, + ignore_na=ignore_na, + initial_value=initial_value)(self._obj.values, state) + + res = pd.DataFrame(res, self._obj.index, self._obj.columns) + + state = state._replace( + mean=pd.Series(state.mean, self._obj.columns), + old_wt=pd.Series(state.old_wt, self._obj.columns), + nobs=pd.Series(state.nobs, self._obj.columns), + ) + return res, state + +def register_online_ewma(): + pd.api.extensions.register_dataframe_accessor("online")(EWMAAccessor) + +import pandas as pd + diff --git a/wax/modules/ewma_numba_test.py b/wax/modules/ewma_numba_test.py index 39ef238..998233c 100644 --- a/wax/modules/ewma_numba_test.py +++ b/wax/modules/ewma_numba_test.py @@ -2,7 +2,7 @@ import pandas as pd import pytest -from wax.modules.ewma_numba import ewma +from wax.modules.ewma_numba import ewma, register_online_ewma def test_ewma_numba(): @@ -110,3 +110,23 @@ def test_state(): ) assert np.allclose(res_full, res12, equal_nan=True) + + +def test_pandas_online(): + x = np.ones((30,), "float64") + x[0] = np.nan + x[1] = -1 + x[5:20] = np.nan + + x = x.reshape(-1, 1) + X = pd.DataFrame(x) + + register_online_ewma() + res_full, state = pd.DataFrame(X).online.ewma(com=10, state=None) + res1, state = pd.DataFrame(X).iloc[:10].online.ewma(com=10, state=None) + res2, state = pd.DataFrame(X).iloc[10:].online.ewma(com=10, state=state) + + res12 = pd.concat([res1, res2]) + pd.testing.assert_frame_equal(res_full, res12) + + \ No newline at end of file From 18e61c29494d93328c08b237e7baf4ff339e1579 Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Mon, 14 Mar 2022 12:56:51 +0100 Subject: [PATCH 22/46] format --- wax/modules/ewma_numba.py | 30 ++++++++++++++++-------------- wax/modules/ewma_numba_test.py | 2 -- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/wax/modules/ewma_numba.py b/wax/modules/ewma_numba.py index a27ef84..b40dbea 100644 --- a/wax/modules/ewma_numba.py +++ b/wax/modules/ewma_numba.py @@ -16,6 +16,7 @@ import numba import numpy as np +import pandas as pd class EWMAState(NamedTuple): @@ -195,20 +196,22 @@ class EWMAAccessor: def __init__(self, pandas_obj): self._obj = pandas_obj - def ewma(self, - alpha: float = None, - com: float = None, - min_periods: int = 0, - adjust: bool = True, - ignore_na: bool = False, - initial_value=np.nan, - state=None, - ): + def ewma( + self, + alpha: float = None, + com: float = None, + min_periods: int = 0, + adjust: bool = True, + ignore_na: bool = False, + initial_value=np.nan, + state=None, + ): if state is not None: state = state._replace( mean=state.mean.values, old_wt=state.old_wt.values, - nobs=state.nobs.values) + nobs=state.nobs.values, + ) res, state = ewma( alpha=alpha, @@ -216,7 +219,8 @@ def ewma(self, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na, - initial_value=initial_value)(self._obj.values, state) + initial_value=initial_value, + )(self._obj.values, state) res = pd.DataFrame(res, self._obj.index, self._obj.columns) @@ -227,8 +231,6 @@ def ewma(self, ) return res, state + def register_online_ewma(): pd.api.extensions.register_dataframe_accessor("online")(EWMAAccessor) - -import pandas as pd - diff --git a/wax/modules/ewma_numba_test.py b/wax/modules/ewma_numba_test.py index 998233c..1fc9fce 100644 --- a/wax/modules/ewma_numba_test.py +++ b/wax/modules/ewma_numba_test.py @@ -128,5 +128,3 @@ def test_pandas_online(): res12 = pd.concat([res1, res2]) pd.testing.assert_frame_equal(res_full, res12) - - \ No newline at end of file From 66ad97489b928a14fee8c6f1881c3af7493ba887 Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Mon, 14 Mar 2022 14:29:01 +0100 Subject: [PATCH 23/46] reactivate test --- wax/modules/ewma_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index 68a1a83..0940529 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -123,7 +123,7 @@ def model(x): assert jnp.allclose(ema, pandas_ema.values) -def off_test_run_ema_vs_pandas_adjust_finite(): +def test_run_ema_vs_pandas_adjust_finite(): config.update("jax_enable_x64", True) seq = hk.PRNGSequence(42) From 16db94a324c1c8ff2cb8f7616503c86a77130888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Tue, 15 Mar 2022 00:04:46 +0100 Subject: [PATCH 24/46] state as dataframe, check dtypes --- wax/modules/ewma_numba.py | 13 +++++++------ wax/modules/ewma_numba_test.py | 6 ++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/wax/modules/ewma_numba.py b/wax/modules/ewma_numba.py index b40dbea..cda207b 100644 --- a/wax/modules/ewma_numba.py +++ b/wax/modules/ewma_numba.py @@ -101,7 +101,7 @@ def init_ewma_state(x): state = EWMAState( mean=np.full(shape, initial_value, dtype), old_wt=np.full(shape, 1.0, dtype), - nobs=np.full(shape, 0.0, dtype=dtype), + nobs=np.full(shape, 0.0, dtype=np.int64), ) return state @@ -145,7 +145,6 @@ def numba_apply(values, mean, old_wt, nobs): weighted_avg = mean # nobs = (~np.isnan(weighted_avg)).astype(np.int64) - result[0] = np.where(nobs >= minimum_periods, weighted_avg, np.nan) for i in range(len(values)): cur = values[i] @@ -207,10 +206,11 @@ def ewma( state=None, ): if state is not None: - state = state._replace( - mean=state.mean.values, - old_wt=state.old_wt.values, - nobs=state.nobs.values, + state = state.reindex(self._obj.columns) + state = EWMAState( + mean=state["mean"].values, + old_wt=state["old_wt"].values, + nobs=state["nobs"].values, ) res, state = ewma( @@ -229,6 +229,7 @@ def ewma( old_wt=pd.Series(state.old_wt, self._obj.columns), nobs=pd.Series(state.nobs, self._obj.columns), ) + state = pd.concat(state._asdict(), axis=1) return res, state diff --git a/wax/modules/ewma_numba_test.py b/wax/modules/ewma_numba_test.py index 1fc9fce..e045d6d 100644 --- a/wax/modules/ewma_numba_test.py +++ b/wax/modules/ewma_numba_test.py @@ -122,9 +122,11 @@ def test_pandas_online(): X = pd.DataFrame(x) register_online_ewma() - res_full, state = pd.DataFrame(X).online.ewma(com=10, state=None) + res_full, _ = pd.DataFrame(X).online.ewma(com=10, state=None) res1, state = pd.DataFrame(X).iloc[:10].online.ewma(com=10, state=None) - res2, state = pd.DataFrame(X).iloc[10:].online.ewma(com=10, state=state) + res2, _ = pd.DataFrame(X).iloc[10:].online.ewma(com=10, state=state) res12 = pd.concat([res1, res2]) pd.testing.assert_frame_equal(res_full, res12) + assert state.dtypes.tolist() == [np.float64, np.float64, np.int64] + \ No newline at end of file From fcf9d41faf4b892073a7fce1338d2488bf2e6104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Tue, 15 Mar 2022 00:05:26 +0100 Subject: [PATCH 25/46] format --- docs/notebooks/09_EWMA_options.ipynb | 2 +- docs/notebooks/09_EWMA_options.md | 1 - docs/notebooks/09_EWMA_options.py | 1 - wax/modules/ewma_numba_test.py | 3 +-- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/notebooks/09_EWMA_options.ipynb b/docs/notebooks/09_EWMA_options.ipynb index fdd6def..094491b 100644 --- a/docs/notebooks/09_EWMA_options.ipynb +++ b/docs/notebooks/09_EWMA_options.ipynb @@ -58,7 +58,7 @@ "from jax.config import config\n", "\n", "from wax.modules.ewma import EWMA\n", - "from wax.unroll import unroll_transform_with_state\n" + "from wax.unroll import unroll_transform_with_state" ] }, { diff --git a/docs/notebooks/09_EWMA_options.md b/docs/notebooks/09_EWMA_options.md index d063074..ac2ad93 100644 --- a/docs/notebooks/09_EWMA_options.md +++ b/docs/notebooks/09_EWMA_options.md @@ -37,7 +37,6 @@ from jax.config import config from wax.modules.ewma import EWMA from wax.unroll import unroll_transform_with_state - ``` ```python diff --git a/docs/notebooks/09_EWMA_options.py b/docs/notebooks/09_EWMA_options.py index 8d6235d..13c0727 100644 --- a/docs/notebooks/09_EWMA_options.py +++ b/docs/notebooks/09_EWMA_options.py @@ -35,7 +35,6 @@ from wax.modules.ewma import EWMA from wax.unroll import unroll_transform_with_state - # - # check available devices diff --git a/wax/modules/ewma_numba_test.py b/wax/modules/ewma_numba_test.py index e045d6d..3e28abf 100644 --- a/wax/modules/ewma_numba_test.py +++ b/wax/modules/ewma_numba_test.py @@ -128,5 +128,4 @@ def test_pandas_online(): res12 = pd.concat([res1, res2]) pd.testing.assert_frame_equal(res_full, res12) - assert state.dtypes.tolist() == [np.float64, np.float64, np.int64] - \ No newline at end of file + assert state.dtypes.tolist() == [np.float64, np.float64, np.int64] From 9a55586bf0099b6472016a28f349f7d55b44506c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Wed, 16 Mar 2022 23:07:08 +0100 Subject: [PATCH 26/46] add Series accessor + format --- wax/modules/ewma.py | 3 +- wax/modules/ewma_numba.py | 26 +++++++++++++-- wax/modules/ewma_numba_test.py | 58 ++++++++++++++++------------------ wax/modules/ewma_test.py | 52 +++++++++++++++--------------- wax/modules/ewmcov.py | 16 +++++++--- 5 files changed, 89 insertions(+), 66 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 60085c9..783745e 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. """Compute exponentioal moving average.""" -from typing import Dict, Tuple, Union, cast +from typing import Dict, Tuple, Union import haiku as hk from jax import numpy as jnp @@ -94,7 +94,6 @@ def __init__( elif alpha is not None: assert com is None com = 1.0 / alpha - 1.0 - assert cast(float, com) > 0.0 self.com = com self.min_periods = min_periods diff --git a/wax/modules/ewma_numba.py b/wax/modules/ewma_numba.py index cda207b..d831735 100644 --- a/wax/modules/ewma_numba.py +++ b/wax/modules/ewma_numba.py @@ -191,7 +191,7 @@ def numba_apply(values, mean, old_wt, nobs): return apply -class EWMAAccessor: +class EWMADataFrameAccessor: def __init__(self, pandas_obj): self._obj = pandas_obj @@ -233,5 +233,27 @@ def ewma( return res, state +class EWMASeriesAccessor: + def __init__(self, pandas_obj): + self._obj = pandas_obj + + def ewma( + self, + alpha: float = None, + com: float = None, + min_periods: int = 0, + adjust: bool = True, + ignore_na: bool = False, + initial_value=np.nan, + state=None, + ): + res, state = EWMADataFrameAccessor(self._obj.to_frame()).ewma( + alpha, com, min_periods, adjust, ignore_na, initial_value, state + ) + res = res.iloc[:, 0] + return res, state + + def register_online_ewma(): - pd.api.extensions.register_dataframe_accessor("online")(EWMAAccessor) + pd.api.extensions.register_dataframe_accessor("online")(EWMADataFrameAccessor) + pd.api.extensions.register_series_accessor("online")(EWMASeriesAccessor) diff --git a/wax/modules/ewma_numba_test.py b/wax/modules/ewma_numba_test.py index 3e28abf..c616285 100644 --- a/wax/modules/ewma_numba_test.py +++ b/wax/modules/ewma_numba_test.py @@ -18,24 +18,31 @@ def test_ewma_numba(): pd.DataFrame(res).plot() +def check_against_pandas_ewm(x, **ewma_kwargs): + res, state = ewma(**ewma_kwargs)(x, state=None) + res = pd.DataFrame(np.array(res)) + + ref_res = pd.DataFrame(x).ewm(**ewma_kwargs).mean() + pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) + return res + + @pytest.mark.parametrize( "adjust, ignore_na", [(False, False), (False, True), (True, False), (True, True)], # , ) def test_nan_at_beginning(adjust, ignore_na): - T = 20 x = np.full((T,), np.nan) x[2] = 1 x[10] = -1 - compare_nan_at_beginning(x, com=10, adjust=adjust, ignore_na=ignore_na) + check_against_pandas_ewm(x, com=10, adjust=adjust, ignore_na=ignore_na) # check min_periods option with random variable random_state = np.random.RandomState(42) x = random_state.normal(size=(5,)) - - compare_nan_at_beginning( + check_against_pandas_ewm( x, com=10, adjust=adjust, @@ -48,30 +55,13 @@ def test_nan_at_beginning(adjust, ignore_na): x[0] = np.nan x[1] = -1 x[5:20] = np.nan - - res = compare_nan_at_beginning( + res = check_against_pandas_ewm( x, com=10, adjust=adjust, ignore_na=ignore_na, ) - res = compare_nan_at_beginning( - x, - com=10, - adjust=adjust, - ignore_na=ignore_na, - ) - - -def compare_nan_at_beginning(x, **ewma_kwargs): - res, state = ewma(**ewma_kwargs)(x, state=None) - res = pd.DataFrame(np.array(res)) - - ref_res = pd.DataFrame(x).ewm(**ewma_kwargs).mean() - pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) - return res - def test_init_value(): # check random variable with nans @@ -90,7 +80,7 @@ def test_init_value(): assert np.linalg.norm(res_init0) < np.linalg.norm(np.nan_to_num(res)) -def test_state(): +def test_ewma_state(): x = np.ones((30,), "float64") x[0] = np.nan x[1] = -1 @@ -112,20 +102,28 @@ def test_state(): assert np.allclose(res_full, res12, equal_nan=True) -def test_pandas_online(): +@pytest.mark.parametrize("obj_type", ["frame", "series"]) +def test_pandas_online(obj_type): x = np.ones((30,), "float64") x[0] = np.nan x[1] = -1 x[5:20] = np.nan - x = x.reshape(-1, 1) - X = pd.DataFrame(x) + if obj_type == "frame": + x = x.reshape(-1, 1) + X = pd.DataFrame(x) + else: + X = pd.Series(x) register_online_ewma() - res_full, _ = pd.DataFrame(X).online.ewma(com=10, state=None) - res1, state = pd.DataFrame(X).iloc[:10].online.ewma(com=10, state=None) - res2, _ = pd.DataFrame(X).iloc[10:].online.ewma(com=10, state=state) + res_full, _ = X.online.ewma(com=10, state=None) + res1, state = X.iloc[:10].online.ewma(com=10, state=None) + res2, _ = X.iloc[10:].online.ewma(com=10, state=state) res12 = pd.concat([res1, res2]) - pd.testing.assert_frame_equal(res_full, res12) + if obj_type == "frame": + pd.testing.assert_frame_equal(res_full, res12) + else: + pd.testing.assert_series_equal(res_full, res12) + assert state.dtypes.tolist() == [np.float64, np.float64, np.int64] diff --git a/wax/modules/ewma_test.py b/wax/modules/ewma_test.py index 0940529..7609d5e 100644 --- a/wax/modules/ewma_test.py +++ b/wax/modules/ewma_test.py @@ -169,6 +169,28 @@ def batch(params): assert not jnp.isnan(grad["ewma"]["logcom"]) +def check_against_pandas_ewm(x, **ewma_kwargs): + @partial(unroll_transform_with_state, dynamic=True) + def fun(x): + return EWMA(return_info=True, **ewma_kwargs)(x) + + rng = jax.random.PRNGKey(42) + params, state = fun.init(rng, x) + (res, info), final_state = fun.apply(params, state, rng, x) + res = pd.DataFrame(onp.array(res)) + + ref_res = pd.DataFrame(onp.array(x)).ewm(**ewma_kwargs).mean() + pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) + + @jax.value_and_grad + def batch(params): + (res, info), final_state = fun.apply(params, state, rng, x) + return jnp.nanmean(res) + + score, grad = batch(params) + assert not jnp.isnan(grad["ewma"]["logcom"]) + + @pytest.mark.parametrize( "adjust, ignore_na", [(False, False), (False, True), (True, False), (True, True)], # , @@ -178,13 +200,12 @@ def test_nan_at_beginning(adjust, ignore_na): T = 20 x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1) - - compare_nan_at_beginning(x, com=10, adjust=adjust, ignore_na=ignore_na) + check_against_pandas_ewm(x, com=10, adjust=adjust, ignore_na=ignore_na) # check min_periods option with random variable rng = jax.random.PRNGKey(42) x = jax.random.normal(rng, (5,)) - compare_nan_at_beginning( + check_against_pandas_ewm( x, com=10, adjust=adjust, @@ -197,8 +218,7 @@ def test_nan_at_beginning(adjust, ignore_na): # x = jax.random.normal(rng, (6,)).at[3].set(jnp.nan) # x = jnp.ones((6,), "float64").at[0].set(-1).at[3].set(jnp.nan) x = jnp.ones((30,), "float64").at[0].set(-1).at[5:20].set(jnp.nan) - - compare_nan_at_beginning( + check_against_pandas_ewm( x, com=10, adjust=adjust, @@ -206,28 +226,6 @@ def test_nan_at_beginning(adjust, ignore_na): ) -def compare_nan_at_beginning(x, **ewma_kwargs): - @partial(unroll_transform_with_state, dynamic=True) - def fun(x): - return EWMA(return_info=True, **ewma_kwargs)(x) - - rng = jax.random.PRNGKey(42) - params, state = fun.init(rng, x) - (res, info), final_state = fun.apply(params, state, rng, x) - res = pd.DataFrame(onp.array(res)) - - ref_res = pd.DataFrame(onp.array(x)).ewm(**ewma_kwargs).mean() - pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) - - @jax.value_and_grad - def batch(params): - (res, info), final_state = fun.apply(params, state, rng, x) - return jnp.nanmean(res) - - score, grad = batch(params) - assert not jnp.isnan(grad["ewma"]["logcom"]) - - def test_init_value(): x = ( jnp.ones((30,), "float64") diff --git a/wax/modules/ewmcov.py b/wax/modules/ewmcov.py index 45d8633..86a4e49 100644 --- a/wax/modules/ewmcov.py +++ b/wax/modules/ewmcov.py @@ -60,17 +60,23 @@ def __call__(self, x, y=None): "may be removed in the future." ) x, y = x - mean_xy = EWMA(self.alpha, self.adjust, initial_value=jnp.nan, name="mean_xy")( - jnp.outer(x, y) - ) + mean_xy = EWMA( + alpha=self.alpha, adjust=self.adjust, initial_value=jnp.nan, name="mean_xy" + )(jnp.outer(x, y)) if self.assume_centered: cov = mean_xy else: mean_x = EWMA( - self.alpha, self.adjust, initial_value=jnp.nan, name="mean_x" + alpha=self.alpha, + adjust=self.adjust, + initial_value=jnp.nan, + name="mean_x", )(x) mean_y = EWMA( - self.alpha, self.adjust, initial_value=jnp.nan, name="mean_y" + alpha=self.alpha, + adjust=self.adjust, + initial_value=jnp.nan, + name="mean_y", )(y) cov = mean_xy - jnp.outer(mean_x, mean_y) return cov From 11279a2c11b146a34da6e23ffcb65cf5af935392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Wed, 16 Mar 2022 23:12:52 +0100 Subject: [PATCH 27/46] fix mypy --- setup.cfg | 3 +++ wax/modules/ewma_numba.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 8cad413..d325f0b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -207,6 +207,9 @@ ignore_errors = True [mypy-numpy.*] ignore_missing_imports = True +[mypy-numba.*] +ignore_missing_imports = True + [mypy-opt_einsum.*] ignore_missing_imports = True diff --git a/wax/modules/ewma_numba.py b/wax/modules/ewma_numba.py index d831735..c4644c8 100644 --- a/wax/modules/ewma_numba.py +++ b/wax/modules/ewma_numba.py @@ -89,7 +89,8 @@ def ewma( elif alpha is not None: assert com is None com = 1.0 / alpha - 1.0 - assert cast(float, com) > 0.0 + com = cast(float, com) + assert com > 0.0 alpha = 1.0 / (1.0 + com) def init_ewma_state(x): From c985fa075790fb97249c909954a355a5c991adc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Wed, 16 Mar 2022 23:13:48 +0100 Subject: [PATCH 28/46] move numba modules --- docs/notebooks/09_EWMA_options.md | 2 +- docs/notebooks/09_EWMA_options.py | 2 +- wax/numba/__init__.py | 0 wax/{modules => numba}/ewma_numba.py | 0 wax/{modules => numba}/ewma_numba_test.py | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 wax/numba/__init__.py rename wax/{modules => numba}/ewma_numba.py (100%) rename wax/{modules => numba}/ewma_numba_test.py (98%) diff --git a/docs/notebooks/09_EWMA_options.md b/docs/notebooks/09_EWMA_options.md index ac2ad93..d710f46 100644 --- a/docs/notebooks/09_EWMA_options.md +++ b/docs/notebooks/09_EWMA_options.md @@ -413,7 +413,7 @@ df.plot() # Numba implementation ```python -from wax.modules.ewma_numba import ewma +from wax.numba.ewma_numba import ewma ``` ```python diff --git a/docs/notebooks/09_EWMA_options.py b/docs/notebooks/09_EWMA_options.py index 13c0727..5dae866 100644 --- a/docs/notebooks/09_EWMA_options.py +++ b/docs/notebooks/09_EWMA_options.py @@ -383,7 +383,7 @@ def fun(x): # # Numba implementation -from wax.modules.ewma_numba import ewma +from wax.numba.ewma_numba import ewma # + x = onp.ones((30,), "float64") diff --git a/wax/numba/__init__.py b/wax/numba/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/wax/modules/ewma_numba.py b/wax/numba/ewma_numba.py similarity index 100% rename from wax/modules/ewma_numba.py rename to wax/numba/ewma_numba.py diff --git a/wax/modules/ewma_numba_test.py b/wax/numba/ewma_numba_test.py similarity index 98% rename from wax/modules/ewma_numba_test.py rename to wax/numba/ewma_numba_test.py index c616285..9e23602 100644 --- a/wax/modules/ewma_numba_test.py +++ b/wax/numba/ewma_numba_test.py @@ -2,7 +2,7 @@ import pandas as pd import pytest -from wax.modules.ewma_numba import ewma, register_online_ewma +from wax.numba.ewma_numba import ewma, register_online_ewma def test_ewma_numba(): From dff0b22a0fb85b2d280b48a584f6684109261879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Wed, 16 Mar 2022 23:18:47 +0100 Subject: [PATCH 29/46] remove line --- wax/numba/ewma_numba.py | 5 ++--- wax/numba/ewma_numba_test.py | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/wax/numba/ewma_numba.py b/wax/numba/ewma_numba.py index c4644c8..adad255 100644 --- a/wax/numba/ewma_numba.py +++ b/wax/numba/ewma_numba.py @@ -168,7 +168,6 @@ def numba_apply(values, mean, old_wt, nobs): old_wt_factor = 1.0 - alpha if is_observations[j] or not ignore_na: - # note that len(deltas) = len(vals) - 1 and deltas[i] is to be # used in conjunction with vals[i+1] old_wt[j] *= old_wt_factor # ** deltas[j - 1] @@ -256,5 +255,5 @@ def ewma( def register_online_ewma(): - pd.api.extensions.register_dataframe_accessor("online")(EWMADataFrameAccessor) - pd.api.extensions.register_series_accessor("online")(EWMASeriesAccessor) + pd.api.extensions.register_dataframe_accessor("wax")(EWMADataFrameAccessor) + pd.api.extensions.register_series_accessor("wax")(EWMASeriesAccessor) diff --git a/wax/numba/ewma_numba_test.py b/wax/numba/ewma_numba_test.py index 9e23602..0367392 100644 --- a/wax/numba/ewma_numba_test.py +++ b/wax/numba/ewma_numba_test.py @@ -116,9 +116,9 @@ def test_pandas_online(obj_type): X = pd.Series(x) register_online_ewma() - res_full, _ = X.online.ewma(com=10, state=None) - res1, state = X.iloc[:10].online.ewma(com=10, state=None) - res2, _ = X.iloc[10:].online.ewma(com=10, state=state) + res_full, _ = X.wax.ewma(com=10, state=None) + res1, state = X.iloc[:10].wax.ewma(com=10, state=None) + res2, _ = X.iloc[10:].wax.ewma(com=10, state=state) res12 = pd.concat([res1, res2]) if obj_type == "frame": From 9420ed65e831cbab59c301fc80032ba779834de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Wed, 16 Mar 2022 23:19:57 +0100 Subject: [PATCH 30/46] remove comment --- wax/numba/ewma_numba.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/wax/numba/ewma_numba.py b/wax/numba/ewma_numba.py index adad255..9470b4e 100644 --- a/wax/numba/ewma_numba.py +++ b/wax/numba/ewma_numba.py @@ -145,8 +145,6 @@ def numba_apply(values, mean, old_wt, nobs): result = np.empty(values.shape) weighted_avg = mean - # nobs = (~np.isnan(weighted_avg)).astype(np.int64) - for i in range(len(values)): cur = values[i] is_observations = ~np.isnan(cur) From 4120aca9b5c8366110aac3612fb3b6b37de88960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Wed, 16 Mar 2022 23:41:45 +0100 Subject: [PATCH 31/46] correct flake8 --- wax/numba/ewma_numba_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wax/numba/ewma_numba_test.py b/wax/numba/ewma_numba_test.py index 0367392..eb4f6d6 100644 --- a/wax/numba/ewma_numba_test.py +++ b/wax/numba/ewma_numba_test.py @@ -55,7 +55,7 @@ def test_nan_at_beginning(adjust, ignore_na): x[0] = np.nan x[1] = -1 x[5:20] = np.nan - res = check_against_pandas_ewm( + check_against_pandas_ewm( x, com=10, adjust=adjust, @@ -98,6 +98,7 @@ def test_ewma_state(): df = pd.concat( [pd.DataFrame(res_full), pd.DataFrame(res12)], axis=1, keys=["full", "12"] ) + assert len(df) assert np.allclose(res_full, res12, equal_nan=True) From 12ca1f13c050d2b97141904d02b3e3d1565a7d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Wed, 16 Mar 2022 23:54:59 +0100 Subject: [PATCH 32/46] add license --- wax/numba/__init__.py | 13 +++++++++++++ wax/numba/ewma_numba_test.py | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/wax/numba/__init__.py b/wax/numba/__init__.py index e69de29..be4e15b 100644 --- a/wax/numba/__init__.py +++ b/wax/numba/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2021 The WAX-ML Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/wax/numba/ewma_numba_test.py b/wax/numba/ewma_numba_test.py index eb4f6d6..9ed0a32 100644 --- a/wax/numba/ewma_numba_test.py +++ b/wax/numba/ewma_numba_test.py @@ -1,3 +1,16 @@ +# Copyright 2021 The WAX-ML Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. import numpy as np import pandas as pd import pytest From e868ab43ed0bf518db88512a602c0273365d4b21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Thu, 17 Mar 2022 00:01:58 +0100 Subject: [PATCH 33/46] format --- docs/notebooks/09_EWMA_options.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/09_EWMA_options.ipynb b/docs/notebooks/09_EWMA_options.ipynb index 094491b..f61bc1c 100644 --- a/docs/notebooks/09_EWMA_options.ipynb +++ b/docs/notebooks/09_EWMA_options.ipynb @@ -1283,7 +1283,7 @@ "metadata": {}, "outputs": [], "source": [ - "from wax.modules.ewma_numba import ewma" + "from wax.numba.ewma_numba import ewma" ] }, { From 17ed82dea5e01658e85b0556bfa1ca189b7a68e6 Mon Sep 17 00:00:00 2001 From: Emmanuel Serie Date: Thu, 17 Mar 2022 14:54:34 +0100 Subject: [PATCH 34/46] correct PctChange() to align with pandas behaviour. Introduce fillna_zero option to control behaviour --- wax/modules/pct_change.py | 22 +++++++++++++++++++++- wax/modules/pct_change_test.py | 5 ++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/wax/modules/pct_change.py b/wax/modules/pct_change.py index 2caee2a..4652bc6 100644 --- a/wax/modules/pct_change.py +++ b/wax/modules/pct_change.py @@ -13,24 +13,40 @@ # limitations under the License. """Relative change between the current and a prior element.""" import haiku as hk +import jax.numpy as jnp from wax.modules import Ffill, Lag class PctChange(hk.Module): - """Relative change between the current and a prior element.""" + """Relative change between the current and a prior element. + + Computes the relative change from the immediately previous observation by + default. This is useful in comparing the relative of change in a time + series of elements. + + Args: + periods : Periods to shift for forming relative change. + fill_method : How to handle NAs before computing percent changes. + limit : The number of consecutive NAs to fill before stopping. + fillna_zero: if true (default), behave as in pandas: the module return 0 + where the current observation is NA and the previous observation is + not NA; else return NA. + """ def __init__( self, periods: int = 1, fill_method: str = "pad", limit: int = None, + fillna_zero: bool = True, name: str = None, ): super().__init__(name=name) self.periods = periods self.fill_method = fill_method self.limit = limit + self.fillna_zero = fillna_zero assert periods == 1, "periods > 1 not implemented." def __call__(self, x): @@ -39,4 +55,8 @@ def __call__(self, x): else: previous_x = Lag(self.periods)() pct_change = x / previous_x - 1.0 + if self.fillna_zero: + pct_change = jnp.where( + jnp.isnan(x) & ~jnp.isnan(previous_x), 0.0, pct_change + ) return pct_change diff --git a/wax/modules/pct_change_test.py b/wax/modules/pct_change_test.py index 46fd9fe..e088598 100644 --- a/wax/modules/pct_change_test.py +++ b/wax/modules/pct_change_test.py @@ -45,14 +45,13 @@ def pct_change(x): def test_pct_change_ffill(): - - x = jnp.array([90, 91, jnp.nan, 85]) + x = jnp.array([jnp.nan, 90, 91, jnp.nan, 85]) fun = hk.transform_with_state(lambda x: PctChange()(x)) res = unroll(fun)(x) assert jnp.allclose( res, - jnp.array([jnp.nan, 0.0111111, jnp.nan, -0.065934], dtype=jnp.float32), + jnp.array([jnp.nan, jnp.nan, 0.0111111, 0.0, -0.065934], dtype=jnp.float32), equal_nan=True, ) From 54313f8cfa6e11198839d513dcc054c8c463d20f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 18 Mar 2022 23:05:10 +0100 Subject: [PATCH 35/46] remove notebook 09 --- docs/notebooks/09_EWMA_options.ipynb | 1906 -------------------------- docs/notebooks/09_EWMA_options.md | 463 ------- docs/notebooks/09_EWMA_options.py | 431 ------ 3 files changed, 2800 deletions(-) delete mode 100644 docs/notebooks/09_EWMA_options.ipynb delete mode 100644 docs/notebooks/09_EWMA_options.md delete mode 100644 docs/notebooks/09_EWMA_options.py diff --git a/docs/notebooks/09_EWMA_options.ipynb b/docs/notebooks/09_EWMA_options.ipynb deleted file mode 100644 index f61bc1c..0000000 --- a/docs/notebooks/09_EWMA_options.ipynb +++ /dev/null @@ -1,1906 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "bd2ee536", - "metadata": {}, - "outputs": [], - "source": [ - "# Uncomment to run the notebook in Colab\n", - "# ! pip install -q \"wax-ml[complete]@git+https://github.com/eserie/wax-ml.git\"\n", - "# ! pip install -q --upgrade jax jaxlib==0.1.70+cuda111 -f https://storage.googleapis.com/jax-releases/jax_releases.html" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "956a5611", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", - "Populating the interactive namespace from numpy and matplotlib\n" - ] - } - ], - "source": [ - "%pylab inline\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "8c949906", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/emmanuelserie/mambaforge/envs/waxml39/lib/python3.9/site-packages/jax/_src/lib/__init__.py:31: UserWarning: JAX on Mac ARM machines is experimental and minimally tested. Please see https://github.com/google/jax/issues/5501 in the event of problems.\n", - " warnings.warn(\"JAX on Mac ARM machines is experimental and minimally tested. \"\n" - ] - } - ], - "source": [ - "from functools import partial\n", - "\n", - "import jax\n", - "import jax.numpy as jnp\n", - "import numpy as onp\n", - "import pandas as pd\n", - "from jax.config import config\n", - "\n", - "from wax.modules.ewma import EWMA\n", - "from wax.unroll import unroll_transform_with_state" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "7cf7110b", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "jax backend cpu\n" - ] - }, - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# check available devices\n", - "print(\"jax backend {}\".format(jax.lib.xla_bridge.get_backend().platform))\n", - "jax.devices()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "06e812c2", - "metadata": { - "lines_to_next_cell": 0 - }, - "outputs": [], - "source": [ - "adjust = True\n", - "ignore_na = False\n", - "config.update(\"jax_enable_x64\", True)\n", - "\n", - "T = 20\n", - "\n", - "x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1)\n", - "\n", - "rng = jax.random.PRNGKey(38)\n", - "x = jax.random.normal(rng, (T,))\n", - "\n", - "x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1)\n", - "\n", - "\n", - "@partial(unroll_transform_with_state, dynamic=True)\n", - "def fun(x):\n", - " return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x)\n", - "\n", - "\n", - "rng = jax.random.PRNGKey(42)\n", - "params, state = fun.init(rng, x)\n", - "(res, info), final_state = fun.apply(params, state, rng, x)\n", - "\n", - "\n", - "res = pd.DataFrame(onp.array(res))\n", - "\n", - "ref_res = (\n", - " pd.DataFrame(onp.array(x))\n", - " .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na)\n", - " .mean()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "7c4b0855", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
0
0NaN
1NaN
21.000000
31.000000
41.000000
51.000000
61.000000
71.000000
81.000000
91.000000
10-0.398145
11-0.398145
12-0.398145
13-0.398145
14-0.398145
15-0.398145
16-0.398145
17-0.398145
18-0.398145
19-0.398145
\n", - "
" - ], - "text/plain": [ - " 0\n", - "0 NaN\n", - "1 NaN\n", - "2 1.000000\n", - "3 1.000000\n", - "4 1.000000\n", - "5 1.000000\n", - "6 1.000000\n", - "7 1.000000\n", - "8 1.000000\n", - "9 1.000000\n", - "10 -0.398145\n", - "11 -0.398145\n", - "12 -0.398145\n", - "13 -0.398145\n", - "14 -0.398145\n", - "15 -0.398145\n", - "16 -0.398145\n", - "17 -0.398145\n", - "18 -0.398145\n", - "19 -0.398145" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "ed2c4c76", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
0
0NaN
1NaN
21.000000
31.000000
41.000000
51.000000
61.000000
71.000000
81.000000
91.000000
10-0.398145
11-0.398145
12-0.398145
13-0.398145
14-0.398145
15-0.398145
16-0.398145
17-0.398145
18-0.398145
19-0.398145
\n", - "
" - ], - "text/plain": [ - " 0\n", - "0 NaN\n", - "1 NaN\n", - "2 1.000000\n", - "3 1.000000\n", - "4 1.000000\n", - "5 1.000000\n", - "6 1.000000\n", - "7 1.000000\n", - "8 1.000000\n", - "9 1.000000\n", - "10 -0.398145\n", - "11 -0.398145\n", - "12 -0.398145\n", - "13 -0.398145\n", - "14 -0.398145\n", - "15 -0.398145\n", - "16 -0.398145\n", - "17 -0.398145\n", - "18 -0.398145\n", - "19 -0.398145" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ref_res" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "4a2acfa9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'com_eff': DeviceArray([0. , 0. , 0. , 0.9 , 0.81 ,\n", - " 0.729 , 0.6561 , 0.59049 , 0.531441 , 0.4782969 ,\n", - " 0.43046721, 1.28742049, 1.15867844, 1.0428106 , 0.93852954,\n", - " 0.84467658, 0.76020892, 0.68418803, 0.61576923, 0.55419231], dtype=float64)}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "info" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "8c319435", - "metadata": {}, - "outputs": [], - "source": [ - "pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6)" - ] - }, - { - "cell_type": "markdown", - "id": "02093de9", - "metadata": {}, - "source": [ - "## check gradient" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "6c6afe80", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(DeviceArray(0.223253, dtype=float64),\n", - " FlatMap({'ewma': FlatMap({'logcom': DeviceArray(0.18699575, dtype=float64)})}))" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "@jax.value_and_grad\n", - "def batch(params):\n", - " (res, info), final_state = fun.apply(params, state, rng, x)\n", - " return jnp.nanmean(res)\n", - "\n", - "\n", - "score, grad = batch(params)\n", - "assert not jnp.isnan(grad[\"ewma\"][\"logcom\"])\n", - "score, grad" - ] - }, - { - "cell_type": "markdown", - "id": "f2b5c401", - "metadata": {}, - "source": [ - "# Linear adjustement" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "35abe086", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [], - "source": [ - "adjust = True\n", - "ignore_na = False\n", - "config.update(\"jax_enable_x64\", True)\n", - "\n", - "T = 20\n", - "\n", - "x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1)\n", - "\n", - "rng = jax.random.PRNGKey(38)\n", - "x = jax.random.normal(rng, (T,))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "924962ce", - "metadata": {}, - "outputs": [], - "source": [ - "from wax.unroll import unroll" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "7b92edc4", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAbIklEQVR4nO3de3Bc93ne8e9DXEgRpCSQhCiVV4lkG8t1dClGVmrXlic2TWli0UkzKVXXlm/DcSq1cW+pXM9IrvxPHLdJxrZimbU5sjOOpMa2EqZDRVJjp0rqyCGk0LpG2iVDWaRl7IqkSCxvIIC3f+wBu4QAYkWcy2LxfGZ2sPs75+y+WCweHJzz7v4UEZiZWfuaV3QBZmaWLQe9mVmbc9CbmbU5B72ZWZtz0JuZtbnOoguYzLJly2Lt2rVFl2FmNms8+eSTr0VE32TLWjLo165dy8DAQNFlmJnNGpJenmqZD92YmbU5B72ZWZtz0JuZtTkHvZlZm3PQm5m1uWmDXtIqST+Q9Lyk5yT9xiTrSNKXJJUlPS3p2oZlt0oqJZdb0/4GzMzs3JpprxwB/kNEPCVpMfCkpMci4vmGdW4ENiSXtwNfBd4uaQlwF9APRLLtjog4nOp3YWZmU5o26CPiVeDV5PqQpBeAFUBj0G8GvhX1zzx+QtLFki4DbgAei4hDAJIeAzYB96f6XZi1gV37DvGXL1WLLsMKtHB+J59697rU7/dNvWFK0lrgGuBHExatAF5puL0/GZtqfLL73gpsBVi9evWbKcusLfzXP32OZw8cRSq6EivKskXziw16SYuA7wKfjoijaRcSEduAbQD9/f2eDcXmlLGxoFyp8fF3XM6dH7iy6HKszTTVdSOpi3rIfzsivjfJKgeAVQ23VyZjU42bWYMDr5/g5OkxNixfVHQp1oaa6boR8A3ghYj4nSlW2wF8JOm+uR44khzbfwTYKKlXUi+wMRkzswblSg2A9Zc46C19zRy6eQfwYeAZSbuTsf8CrAaIiHuBncBNQBk4DnwsWXZI0ueBXcl2d4+fmDWz/+9M0Pc56C19zXTd/BVwztNDSbfNbVMs2w5sP6/qzOaIUmWIZYu66e3pLroUa0N+Z6xZCyhXaj5sY5lx0JsVLCIoOegtQw56s4JVh04xdHKEDZcsLroUa1MOerOCldxxYxlz0JsVbLzjZoOD3jLioDcrWKkyxOIFnfQtnl90KdamHPRmBStXamy4ZBHyh9xYRhz0ZgVza6VlzUFvVqDDx4Z5rTbsjhvLlIPerEDlqjtuLHsOerMC+cPMLA8OerMClQZrXNDVwYqLLyi6FGtjDnqzApWrNdZd0sO8ee64sew46M0KVB4c8kcTW+Yc9GYFqZ0a4adHTvr4vGXOQW9WkD1nTsS6tdKyNe3EI5K2A78EVCLiH0+y/D8BH2q4v7cAfcnsUvuAIWAUGImI/rQKN5vt3HFjeWlmj/4+YNNUCyPiixFxdURcDXwG+D8Tpgt8T7LcIW/WoFyt0dUh1ixdWHQp1uamDfqIeBxodp7XW4D7Z1SR2RxRGqyxdmkPXR0+gmrZSu0VJmkh9T3/7zYMB/CopCclbZ1m+62SBiQNVKvVtMoya1l7qjU2LPdhG8temrsSHwD+74TDNu+MiGuBG4HbJL1rqo0jYltE9EdEf19fX4plmbWek6dHefngMbdWWi7SDPotTDhsExEHkq8V4CHguhQfz2zW2nfwGGMB65e748ayl0rQS7oIeDfwJw1jPZIWj18HNgLPpvF4ZrNdaTDpuPEeveWgmfbK+4EbgGWS9gN3AV0AEXFvstovA49GxLGGTZcDDyWTKXQCfxgRf5Ze6WazV7lSY57gir6eokuxOWDaoI+IW5pY5z7qbZiNY3uBq863MLN2Vq7UWLVkIQu6OoouxeYA93WZFWB8+kCzPDjozXI2MjrG3tdqrHPQW04c9GY5+8mh45weDU8faLlx0JvlrOTPuLGcOejNcuYPM7O8OejNclau1LjsogUsmj9t05tZKhz0ZjkrV2rem7dcOejNcjQ2Fg56y52D3ixHPz1yghOnR91xY7ly0JvlyB03VgQHvVmOxueJ9btiLU8OerMclQZrLO3pprenu+hSbA5x0JvlqFz1iVjLn4PeLCcRQWlwyEFvuXPQm+WkWjvF0ZMjPj5vuXPQm+WkPD6rlFsrLWfTBr2k7ZIqkiadBlDSDZKOSNqdXO5sWLZJ0ouSypLuSLNws9mmXE06bpZ7j97y1cwe/X3ApmnW+cuIuDq53A0gqQO4B7gRuBK4RdKVMynWbDYrDdZYPL+TSxbPL7oUm2OmDfqIeBw4dB73fR1Qjoi9ETEMPABsPo/7MWsL5UqN9csXkcyjbJabtI7R/4KkH0t6WNJbk7EVwCsN6+xPxiYlaaukAUkD1Wo1pbLMWkepUmN9nw/bWP7SCPqngDURcRXwZeCPz+dOImJbRPRHRH9fX18KZZm1jtePD/Na7ZRbK60QMw76iDgaEbXk+k6gS9Iy4ACwqmHVlcmY2ZwzPtmIT8RaEWYc9JIuVXLQUdJ1yX0eBHYBGyRdLqkb2ALsmOnjmc1GZ2aV6nNrpeVv2iluJN0P3AAsk7QfuAvoAoiIe4FfBX5d0ghwAtgSEQGMSLodeAToALZHxHOZfBdmLa5UqbGgax4rei8ouhSbg6YN+oi4ZZrlXwG+MsWyncDO8yvNrH2UKzWuWLaIjnnuuLH8+Z2xZjkoV2o+Pm+FcdCbZezYqREOvH7CrZVWGAe9Wcb2Vo8B7rix4jjozTJWqgwBnj7QiuOgN8tYuVKjc55Ys7Sn6FJsjnLQm2WsVKmxdlkPXR3+dbNi+JVnlrE9lZonG7FCOejNMnRqZJR9B4/5+LwVykFvlqF9rx1nLHwi1orloDfLkDturBU46M0yVK7UkGCd3yxlBXLQm2WoVKmxqnchC7o6ii7F5jAHvVmG3HFjrcBBb5aRkdEx9lbdcWPFc9CbZeSVwycYHh1z0Fvhpg16SdslVSQ9O8XyD0l6WtIzkn4o6aqGZfuS8d2SBtIs3KzVlQbdcWOtoZk9+vuATedY/vfAuyPibcDngW0Tlr8nIq6OiP7zK9FsdipXk+kDHfRWsGZmmHpc0tpzLP9hw80nqE8CbjbnlQdrXHrhAhYv6Cq6FJvj0j5G/wng4YbbATwq6UlJW8+1oaStkgYkDVSr1ZTLMstfuepZpaw1pBb0kt5DPej/c8PwOyPiWuBG4DZJ75pq+4jYFhH9EdHf19eXVllmhRgbC8qVmt8oZS0hlaCX9PPA14HNEXFwfDwiDiRfK8BDwHVpPJ5Zq3v16EmOD496j95awoyDXtJq4HvAhyPipYbxHkmLx68DG4FJO3fM2s2Zjhvv0VsLmPZkrKT7gRuAZZL2A3cBXQARcS9wJ7AU+H1JACNJh81y4KFkrBP4w4j4swy+B7OWU67UO242LF9ccCVmzXXd3DLN8k8Cn5xkfC9w1Ru3MGt/5UqNJT3dLOnpLroUM78z1iwL5UrN/fPWMhz0ZimLCEoOemshDnqzlL1WG+bIidM+EWstw0FvlrLxWaXcWmmtwkFvlrI9FX/GjbUWB71ZykqVGovmd3LphQuKLsUMcNCbpa5cqbHukkUk7yExK5yD3ixlJU8faC3GQW+WoiPHT1MdOuXj89ZSHPRmKSpXk44bB721EAe9WYrK7rixFuSgN0tRuVJjfuc8VvYuLLoUszMc9GYpKlVqXNG3iI557rix1uGgN0tR2R031oIc9GYpOT48wv7DJ3x83lqOg94sJXurxwB33FjraSroJW2XVJE06VSAqvuSpLKkpyVd27DsVkml5HJrWoWbtZrxDzPzHr21mmb36O8DNp1j+Y3AhuSyFfgqgKQl1KcefDv1icHvktR7vsWatbJypUbnPLFmaU/RpZidZdqpBAEi4nFJa8+xymbgWxERwBOSLpZ0GfW5Zh+LiEMAkh6j/gfj/hlV3aa2Pb6Hv/3J60WXYefp6f1HWLN0Id2dPiJqraWpoG/CCuCVhtv7k7Gpxt9A0lbq/w2wevXqlMqaPUZGx/hvj77EhQs6Pc/oLNUzv4NfuXZl0WWYvUFaQT9jEbEN2AbQ398fBZeTu1cOn2B4ZIzf3PRz/Fr/qqLLMbM2ktb/mAeAxnRamYxNNW4TjL913h0bZpa2tIJ+B/CRpPvmeuBIRLwKPAJslNSbnITdmIzZBOMdG+sc9GaWsqYO3Ui6n/qJ1WWS9lPvpOkCiIh7gZ3ATUAZOA58LFl2SNLngV3JXd09fmLWzlau1Lj0wgVcuKCr6FLMrM0023VzyzTLA7htimXbge1vvrS5pVypuf/azDLhPrAWEBEOejPLjIO+Bfz0yEmOD4866M0sEw76FuCOGzPLkoO+BZQG/RkpZpYdB30L2FOtsaSnm6WL5hddipm1IQd9CygN1ljf5715M8uGg75gEUGpUmP9cge9mWXDQV+w12rDHDlx2nv0ZpYZB33BznTceI/ezDLioC9Y2bMSmVnGHPQFK1dqLJrfyaUXLii6FDNrUw76gpUqNdZdsghJRZdiZm3KQV+wcqXmd8SaWaYc9AU6cuI0laFTPj5vZply0BfIn3FjZnlw0BdoTxL03qM3syw1FfSSNkl6UVJZ0h2TLP9dSbuTy0uSXm9YNtqwbEeKtc96pcoQ3Z3zWNm7sOhSzKyNTTvDlKQO4B7gfcB+YJekHRHx/Pg6EfHvGtb/N8A1DXdxIiKuTq3iNlKu1FjXt4iOee64MbPsNLNHfx1Qjoi9ETEMPABsPsf6twD3p1Fcuyt5Vikzy0EzQb8CeKXh9v5k7A0krQEuB77fMLxA0oCkJyR9cKoHkbQ1WW+gWq02Udbsdnx4hAOvn/CJWDPLXNonY7cA34mI0YaxNRHRD/xL4PckrZtsw4jYFhH9EdHf19eXclmtZ2/1GBE+EWtm2Wsm6A8Aqxpur0zGJrOFCYdtIuJA8nUv8Becffx+znJrpZnlpZmg3wVskHS5pG7qYf6G7hlJPwf0An/dMNYraX5yfRnwDuD5idvORaXKEB3zxJqlPUWXYmZtbtqum4gYkXQ78AjQAWyPiOck3Q0MRMR46G8BHoiIaNj8LcDXJI1R/6PyW43dOnNZuVJj7dKFdHf6rQxmlq1pgx4gInYCOyeM3Tnh9ucm2e6HwNtmUF/bKvkzbswsJ96dLMDwyBgvHzzOhksWF12Kmc0BDvoC7Dt4jNGxcMeNmeXCQV+Asj/jxsxy5KAvQGmwhgTrPCG4meXAQV+AcrXGyt4LuKC7o+hSzGwOcNAXoDQ4xHrvzZtZThz0ORsdC/a+dowNy91xY2b5cNDn7JVDxxkeGfMevZnlxkGfszMdN8sd9GaWDwd9zkpurTSznDnoc1au1Fh+4XwuXNBVdClmNkc46HNWrgx5b97McuWgz1FEUK7U/Bk3ZpYrB32OXj1ykmPDo6zzHr2Z5chBnyPPKmVmRWgq6CVtkvSipLKkOyZZ/lFJVUm7k8snG5bdKqmUXG5Ns/jZxh03ZlaEaScekdQB3AO8D9gP7JK0Y5KZoh6MiNsnbLsEuAvoBwJ4Mtn2cCrVzzLlSo3ehV0s7ekuuhQzm0Oa2aO/DihHxN6IGAYeADY3ef/vBx6LiENJuD8GbDq/Ume/8Y4bSUWXYmZzSDNBvwJ4peH2/mRson8u6WlJ35G06k1ui6StkgYkDVSr1SbKml0iglKlxnp33JhZztI6GfunwNqI+Hnqe+3ffLN3EBHbIqI/Ivr7+vpSKqt1HDw2zOvHT/v4vJnlrpmgPwCsari9Mhk7IyIORsSp5ObXgX/S7LZzhTtuzKwozQT9LmCDpMsldQNbgB2NK0i6rOHmzcALyfVHgI2SeiX1AhuTsTnHHTdmVpRpu24iYkTS7dQDugPYHhHPSbobGIiIHcC/lXQzMAIcAj6abHtI0uep/7EAuDsiDmXwfbS8PZUaPd0dXHbRgqJLMbM5ZtqgB4iIncDOCWN3Nlz/DPCZKbbdDmyfQY1toeSOGzMriN8Zm5OyO27MrCAO+hwcPXmawaOnfHzezArhoM+BO27MrEgO+hyUB91xY2bFcdDnoFyt0d05j1VLFhZdipnNQQ76HJQGh7hiWQ8d89xxY2b5c9DnoFytsWG5O27MrBgO+oydGB5l/+ETrO/z8XkzK4aDPmN7qjUiYMNyB72ZFcNBn7GyP+PGzArmoM9YuVKjY55Yu7Sn6FLMbI5y0GesVBlizdKFdHf6qTazYjh9Mlau1PyOWDMrlIM+Q8MjY+w7eNzH582sUA76DL188BijY8EGf2qlmRXIQZ8hzyplZq2gqaCXtEnSi5LKku6YZPm/l/S8pKcl/bmkNQ3LRiXtTi47Jm7bzsqVGhKs85ulzKxA084wJakDuAd4H7Af2CVpR0Q837Da3wL9EXFc0q8Dvw38i2TZiYi4Ot2yZ4dSpcaKiy/ggu6OoksxszmsmT3664ByROyNiGHgAWBz4woR8YOIOJ7cfAJYmW6Zs5M7bsysFTQT9CuAVxpu70/GpvIJ4OGG2wskDUh6QtIHp9pI0tZkvYFqtdpEWa1tdCzYU635+LyZFa6pycGbJelfAf3AuxuG10TEAUlXAN+X9ExE7Jm4bURsA7YB9Pf3R5p1FWH/4eMMj4y548bMCtfMHv0BYFXD7ZXJ2FkkvRf4LHBzRJwaH4+IA8nXvcBfANfMoN5Zo5TMKrXOe/RmVrBmgn4XsEHS5ZK6gS3AWd0zkq4BvkY95CsN472S5ifXlwHvABpP4ratctWtlWbWGqY9dBMRI5JuBx4BOoDtEfGcpLuBgYjYAXwRWAT8kSSAn0TEzcBbgK9JGqP+R+W3JnTrtK3SYI1LFs/nogu6ii7FzOa4po7RR8ROYOeEsTsbrr93iu1+CLxtJgXOVvVZpbw3b2bF8ztjMxAR7KnUPKuUmbUEB30Gfnb0JLVTI6z3PLFm1gIc9BkY77jxHr2ZtQIHfQbGpw/0MXozawUO+gyUKjUuXtjF0p7uoksxM3PQZ2FP8hk3SaupmVmhHPQZKFWG/EYpM2sZDvqUHayd4vDx06z3Z9yYWYtw0KfMs0qZWatx0KfsTMeNg97MWoSDPmXlSo2e7g4uu2hB0aWYmQEO+tSVK/XJRtxxY2atwkGfslJlyJ9Bb2YtxUGfoqMnTzN49JRnlTKzluKgT1HZHTdm1oIc9Clyx42ZtaKmgl7SJkkvSipLumOS5fMlPZgs/5GktQ3LPpOMvyjp/SnW3nLKlRrdnfNYtWRh0aWYmZ0xbdBL6gDuAW4ErgRukXTlhNU+ARyOiPXA7wJfSLa9kvocs28FNgG/n9xfWypXalyxrIeOee64MbPW0cxUgtcB5YjYCyDpAWAzZ0/yvRn4XHL9O8BXVO8v3Aw8EBGngL+XVE7u76/TKf9sH/jyX3Hy9GgWd92Ulw8dZ+OVywt7fDOzyTQT9CuAVxpu7wfePtU6yWTiR4ClyfgTE7ZdMdmDSNoKbAVYvXp1M7W/wbq+HoZHx85r2zT8w+WL+fD1awp7fDOzyTQ1OXgeImIbsA2gv78/zuc+fm/LNanWZGbWDpo5GXsAWNVwe2UyNuk6kjqBi4CDTW5rZmYZaibodwEbJF0uqZv6ydUdE9bZAdyaXP9V4PsREcn4lqQr53JgA/A36ZRuZmbNmPbQTXLM/XbgEaAD2B4Rz0m6GxiIiB3AN4A/SE62HqL+x4Bkvf9J/cTtCHBbRBR3ttTMbA5Sfce7tfT398fAwEDRZZiZzRqSnoyI/smW+Z2xZmZtzkFvZtbmHPRmZm3OQW9m1uZa8mSspCrw8nluvgx4LcVy0ub6Zsb1zYzrm5lWrm9NRPRNtqAlg34mJA1Mdea5Fbi+mXF9M+P6ZqbV65uKD92YmbU5B72ZWZtrx6DfVnQB03B9M+P6Zsb1zUyr1zeptjtGb2ZmZ2vHPXozM2vgoDcza3OzNuhnMmF5DrWtkvQDSc9Lek7Sb0yyzg2SjkjanVzuzKu+5PH3SXomeew3fIKc6r6UPH9PS7o2x9r+UcPzslvSUUmfnrBOrs+fpO2SKpKebRhbIukxSaXka+8U296arFOSdOtk62RU3xcl/V3y83tI0sVTbHvO10KG9X1O0oGGn+FNU2x7zt/1DOt7sKG2fZJ2T7Ft5s/fjEXErLtQ/7jkPcAVQDfwY+DKCev8a+De5PoW4MEc67sMuDa5vhh4aZL6bgD+V4HP4T5g2TmW3wQ8DAi4HvhRgT/rn1F/M0hhzx/wLuBa4NmGsd8G7kiu3wF8YZLtlgB7k6+9yfXenOrbCHQm178wWX3NvBYyrO9zwH9s4ud/zt/1rOqbsPy/A3cW9fzN9DJb9+jPTFgeEcPA+ITljTYD30yufwf4xWTC8sxFxKsR8VRyfQh4gSnmym1hm4FvRd0TwMWSLiugjl8E9kTE+b5TOhUR8Tj1uRYaNb7Gvgl8cJJN3w88FhGHIuIw8BiwKY/6IuLRiBhJbj5BfYa3Qkzx/DWjmd/1GTtXfUlu/Bpwf9qPm5fZGvSTTVg+MUjPmrAcGJ+wPFfJIaNrgB9NsvgXJP1Y0sOS3ppvZQTwqKQnk4nZJ2rmOc7DFqb+BSvy+QNYHhGvJtd/BiyfZJ1WeR4/Tv0/tMlM91rI0u3JoaXtUxz6aoXn758BgxFRmmJ5kc9fU2Zr0M8KkhYB3wU+HRFHJyx+ivrhiKuALwN/nHN574yIa4EbgdskvSvnx5+W6lNX3gz80SSLi37+zhL1/+FbsldZ0mepz/D27SlWKeq18FVgHXA18Cr1wyOt6BbOvTff8r9LszXoZzJheS4kdVEP+W9HxPcmLo+IoxFRS67vBLokLcurvog4kHytAA9R/xe5UStM7H4j8FREDE5cUPTzlxgcP5yVfK1Msk6hz6OkjwK/BHwo+WP0Bk28FjIREYMRMRoRY8D/mOJxi37+OoFfAR6cap2inr83Y7YG/UwmLM9cckzvG8ALEfE7U6xz6fg5A0nXUf9Z5PKHSFKPpMXj16mftHt2wmo7gI8k3TfXA0caDlPkZco9qSKfvwaNr7FbgT+ZZJ1HgI2SepNDExuTscxJ2gT8JnBzRByfYp1mXgtZ1dd4zueXp3jcZn7Xs/Re4O8iYv9kC4t8/t6Uos8Gn++FelfIS9TPyH82Gbub+osaYAH1f/nLwN8AV+RY2zup/xv/NLA7udwEfAr4VLLO7cBz1LsIngD+aY71XZE87o+TGsafv8b6BNyTPL/PAP05/3x7qAf3RQ1jhT1/1P/gvAqcpn6c+BPUz/n8OVAC/jewJFm3H/h6w7YfT16HZeBjOdZXpn58e/w1ON6F9g+Aned6LeRU3x8kr62nqYf3ZRPrS26/4Xc9j/qS8fvGX3MN6+b+/M304o9AMDNrc7P10I2ZmTXJQW9m1uYc9GZmbc5Bb2bW5hz0ZmZtzkFvZtbmHPRmZm3u/wEfEeRmJdF6tQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = jnp.full((20,), jnp.nan).at[2].set(1).at[10].set(-1)\n", - "(res, info) = unroll(\n", - " lambda x: EWMA(com=10, adjust=\"linear\", ignore_na=True, return_info=True)(x)\n", - ")(x)\n", - "res = pd.DataFrame(onp.array(res))\n", - "pd.Series(info[\"com_eff\"]).plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "e741d016", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [], - "source": [ - "# rng = jax.random.PRNGKey(42)\n", - "# x = jax.random.normal(rng, (100,)).at[30:50].set(jnp.nan)\n", - "# x = jnp.full((100,), jnp.nan).at[2].set(1).at[10].set(-1)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "0d6b5bcf", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = (\n", - " jnp.ones((100,))\n", - " .at[0]\n", - " .set(-1)\n", - " .at[30:50]\n", - " .set(-1)\n", - " .at[40:50]\n", - " .set(jnp.nan)\n", - " .at[3:20]\n", - " .set(jnp.nan)\n", - ")\n", - "\n", - "(res, info) = unroll(\n", - " lambda x: EWMA(com=10, adjust=\"linear\", ignore_na=True, return_info=True)(x)\n", - ")(x)\n", - "res = pd.Series(onp.array(res))\n", - "pd.Series(info[\"com_eff\"]).plot()\n", - "res.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "8ca2721c", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = (\n", - " jnp.ones((100,))\n", - " .at[0]\n", - " .set(-1)\n", - " .at[30:50]\n", - " .set(-1)\n", - " .at[40:45]\n", - " .set(jnp.nan)\n", - " .at[3:20]\n", - " .set(jnp.nan)\n", - ")\n", - "\n", - "(res, info) = unroll(\n", - " lambda x: EWMA(com=10, adjust=\"linear\", ignore_na=False, return_info=True)(x)\n", - ")(x)\n", - "res = pd.Series(onp.array(res))\n", - "pd.Series(info[\"com_eff\"]).plot()\n", - "res.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "23afd5c6", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = (\n", - " jnp.ones((100,))\n", - " .at[0]\n", - " .set(-1)\n", - " .at[30:50]\n", - " .set(-1)\n", - " .at[40:50]\n", - " .set(jnp.nan)\n", - " .at[3:20]\n", - " .set(jnp.nan)\n", - ")\n", - "\n", - "(res, info) = unroll(\n", - " lambda x: EWMA(com=10, adjust=\"linear\", ignore_na=False, return_info=True)(x)\n", - ")(x)\n", - "res = pd.Series(onp.array(res))\n", - "pd.Series(info[\"com_eff\"]).plot()\n", - "res.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "c6ddf6c9", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = (\n", - " jnp.ones((100,))\n", - " .at[0]\n", - " .set(-1)\n", - " .at[30:50]\n", - " .set(-1)\n", - " .at[40:50]\n", - " .set(jnp.nan)\n", - " .at[3:20]\n", - " .set(jnp.nan)\n", - ")\n", - "\n", - "(res, info) = unroll(\n", - " lambda x: EWMA(\n", - " com=10, adjust=False, ignore_na=False, return_info=True, initial_value=jnp.nan\n", - " )(x)\n", - ")(x)\n", - "res = pd.Series(onp.array(res))\n", - "# pd.Series(info[\"com_eff\"]).plot()\n", - "res.plot()\n", - "(res, info) = unroll(\n", - " lambda x: EWMA(\n", - " com=10, adjust=False, ignore_na=False, return_info=True, initial_value=0.0\n", - " )(x)\n", - ")(x)\n", - "res = pd.Series(onp.array(res))\n", - "# pd.Series(info[\"com_eff\"]).plot()\n", - "res.plot()\n", - "plt.legend((\"init nan\", \"init 0\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "bd4e27fd", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = (\n", - " jnp.ones((100,))\n", - " .at[0]\n", - " .set(-1)\n", - " .at[30:50]\n", - " .set(-1)\n", - " .at[40:50]\n", - " .set(jnp.nan)\n", - " .at[3:20]\n", - " .set(jnp.nan)\n", - ")\n", - "\n", - "(res, info) = unroll(\n", - " lambda x: EWMA(com=10, adjust=True, ignore_na=False, return_info=True)(x)\n", - ")(x)\n", - "res = pd.Series(onp.array(res))\n", - "pd.Series(info[\"com_eff\"]).plot()\n", - "res.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "b34301ee", - "metadata": { - "lines_to_end_of_cell_marker": 2, - "lines_to_next_cell": 2 - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAjYUlEQVR4nO3deZwU9Z3/8dene+4Z5gCGgWGAATnkkEPGO8QD4xUVjWY94prDxOxvs2rW3NnNL7/d/a05NzHZmORHPDfxXGWjG02iEhFZFQUEkWO4j4FhZhiYmzm6+/v7o3oEUXRkeqa6ut/Px6MfXVXdTH2Kmnl39be+3ypzziEiIsET8rsAERE5PgpwEZGAUoCLiASUAlxEJKAU4CIiAZUxmCsbPny4q6ysHMxViogE3sqVK/c750qPXj6oAV5ZWcmKFSsGc5UiIoFnZjvfa7maUEREAkoBLiISUApwEZGAUoCLiASUAlxEJKA+MMDN7F4zqzezt45YNtTMnjOzzfHnkoEtU0REjtaXI/D7gYuOWvZNYLFzbhKwOD4vIiKD6AP7gTvnlppZ5VGLFwDnxKcfAJYA30hkYSIiHyQWc/TEYkSijkjU0R2NEYnPR2OOSMy9az7mvPfGnDcfjcWIxiAafy3m3OHpGESdwzlHNAaxt6cdMdc7T/zfHX7dWxafB5xzfPas8QzNz0ro9h/vQJ4y51xtfHofUHasN5rZzcDNAGPHjj3O1YlIsovFHO3dETq6o7R1RejoitIRn+/ojnKoJ8qh7giHeqJ09sTi81G6IjG6euLPkd75GF3RGN2RGN2RKD1RR3ckRk80RnfUe+6Jh3IQmMGC2aOTJsDf5pxzZnbM/0Xn3EJgIUBVVVUw/rdF0lQ05mjq6OZgRzeNbd00HeqhqaObpo4emg95j5bOCC2Hemjp7KG1M0JbZ4S2Lu/xYWSGjZyMMNmZYXIyQ2RnhMjOCJOdGSIrHKIoN5OssLc8K8NblplhZIa96YywN50ZDpER6p02wqHe14yQecvDISMjZPHnEKEQZIS85eGQETYjFOLtaTM7YtpbHoq/J2TedNgMC4Fx+HXofR3siOeBcrwBXmdmo5xztWY2CqhPZFEiklhdkSh1zV3sa+mktvkQ9S1d1Ld2Ut/aRUNrF41t3exv6+JgRzfHOqjNCBlFuZkU5mZSmJPBkJxMRhbmMCQ+nZ+dwZDsDPKzM8jPDpOXlUFeVpjcrDD58emcTG8+JyNERlid4PrreAP8KeDTwPfjz08mrCJJa0uq63l+Q92grS8jFOKmj4xnzNC8QVvnQIjGHHubDrGjsZ1dBzrYdaCDmgOHqGk6xN6mQzS0dr3r32RnhBhRmE1pQTbjhuUxt7KE4flZDM3PYmhBNiV5mZTkZVGcl0lxXhb5WeEBPZqUD+8DA9zMHsY7YTnczGqA7+IF92NmdhOwE/irgSxS0seP/lzN5ro2huQMznXWGtu7yc8O87ULTxyU9fVXZ0+ULfVtbKprZUt9G1vq29ja0MauAx30RA8fOmeGjYqSPEYX53LelBGUF+cyqiiHkUU5jCrKYURhDoU5GQrkgOtLL5TrjvHS/ATXImkuGnNsqW/jxjPG8Y+XThuUdV7406Ws29syKOv6sA62d7Ompon1tS2s29vChr0t7Ghsf7uJIyNkVA7P54TSAj42bSSVw/IYNyyfccPyKCvMIRxSOKe6Qb2crMj72XWgg65IjMkjhwzaOqeXF/LSlv2Dtr5jiURjbKhtZcXOA6za1cSa3U3sOtDx9utjhuYydWQhl80qZ8rIIUwuK2DcsHwy1Y6c1hTgkjSq97UCMKVsEAN8dBGL3thDfWsnI4bkDNp6I9EYb+5p5pWtjby6rZGVOw/S0R0FYFRRDnPGFnP9aWOZWVHE9PIiinIzB602CQ4FuCSNTXVegE8cUTBo65xeXgjAur0tjJgysAG+r7mTF6rrWbqpgWVb9tPa6XW7m1xWwNVzK6iqHErVuBLKi3MHtA5JHQpwSRqb6loZMzSX/OzB+7Wc1hvge5o5d8qIhP/8TXWt/OmtfTy/oY43a5oBGFmYw8UzRjJvUilnnDCM4QXZCV+vpAcFuCSNTXWtg9p8AlCYk8m4YXkJPZG5raGNp9bs5ek3a9lc34YZzBlTzNcunML5U8uYXFag3h+SEApwSQrdkRjbGto5f+oxr8owYKaXF/LWnv4FeHNHD0+9uZdFq2p4Y1cTZnBq5VD+ZcF0LpwxclDb1yV9KMAlKexobCcSc0we5CNwgOnlRTyzdh8tnT0U5vT9ZKFzjtW7m3hw+S7+e81euiIxppQN4duXnMiC2aMpK1Roy8BSgEtS6O2B4k+Ae+3g6/e2cPqEYR/4/p5ojGfW1nL3S9tZu6eZ/KwwV82t4PpTxzK9vFDNIzJoFOCSFDbVtRIOGRNK8wd93dPLiwB4a0/z+wZ4e1eEh5bv4p5l29nX0smE0nz+5YoZXDlnNAWDeOJVpJd+6yQpVO9rpXJYHjmZ4UFfd+mQbEYMyWb9MU5ktnb28B+v7OSeZds50N7NGROGcccnZnDO5BGENNpRfKQAl6Swub6NqaMGv/mk1/Tywnf1ROmKRPndq7v4xV82c7Cjh3OmlHLLeZOYO053EJTkoAAX33X2RNnR2M7ls8p9q2HG6CKWbt5PZ0+U7IwQT63Zyw//VM2epkN8ZOJwvnbhFGaNKfatPpH3ogAX322pb8M5mDKI10A52vTyQqIxx3+9sYdFq2p4fcdBppcX8v2rTmLepFLf6hJ5Pwpw8V3vEHo/eqD06j2R+a1Faxman8UPrjqJT84dozZuSWoKcPFddV0rWeEQlcP8u6lCRUkuH5tWRnlRDrd/bApFebp4lCQ/Bbj4KhZzrN7VxITSfF9vsWVm/ObGKt/WL3I8dDFh8U1dSyc33vsay7cf4IJpgz+EXiTodAQuvnh+fR1fe3wNnT0xvveJk7j2lDF+lyQSOApwGVTRmOMnz1Vz1wtbmTaqkJ9fN2dQr/8tkkoU4DJomjq6ue2R1by4qYFrqsbwTwum+zLyUiRVKMBlUGxtaOOz971ObfMh7rjyJK4/bazfJYkEngJcBtxr2w/whf9YQUbIeOTmMzQUXSRBFOAyoJ5as5evPraGiqG53P+ZUxnrY19vkVSjAJcB89tXdvCdJ9dx6vihLPzruRTnZfldkkhKUYDLgFi4dCt3PLOR86eO4BfXn6yTlSIDQAEuCeWc42eLN3Pn85v5+MxR3HnNbDJ9HGEpksoU4JJQd72whTuf38xVJ1fww6tnEtbFoEQGTL8Ojczs781snZm9ZWYPm5nu4prG7l22nR8/u4kr54zmRwpvkQF33AFuZqOBW4Eq59wMIAxcm6jCJFgee303//yH9Vw4vYwfXT1Tl2EVGQT9bZzMAHLNLAPIA/b2vyQJmmfX7eMbi97k7Mml/Py6Ob5eVVAknRz3X5pzbg/wY2AXUAs0O+eePfp9Znazma0wsxUNDQ3HX6kkpTW7m7j1kTeYWVHMr2+YS3aGepuIDJb+NKGUAAuA8UA5kG9mNxz9PufcQudclXOuqrRUt6ZKJbsPdHDTAysYXpDN3TdWkZul8BYZTP35rns+sN051+Cc6wEWAWcmpixJdi2dPXzu/tfpikS57zOnUDok2++SRNJOfwJ8F3C6meWZmQHzgQ2JKUuSWSzmuP3RNWzf387/u2Euk3y8l6VIOutPG/hy4HFgFbA2/rMWJqguSWK/XLKF5zfU8e1LpnLmxOF+lyOStvo1kMc5913guwmqRQLgxU0N/Ntzm1gwu5zPnlXpdzkiaU39vaTPag52cNsjbzClbAjf+8RJeC1nIuIXBbj0SSQa48uPrCYSdfz6hrnkZekqDCJ+01+h9Mkvl2xlxc6D3HnNbCqH5/tdjoigI3Dpg5U7D/KzxZu5YnY5V8wZ7Xc5IhKnAJf31drZw5cffYNRRTn88xUz/C5HRI6gJhR5X3c8s5E9Bw/x2BfPoDAn0+9yROQIOgKXY3p5634efm0Xn583garKoX6XIyJHUYDLezrUHeVbi9Yyblgef3/+ZL/LEZH3oCYUeU8/ea6anY0dPPSF03SRKpEkpSNweZc1u5u4Z9l2rjt1LGeeoKHyIslKAS7vEIs5vvPkWwwvyOZbl5zodzki8j4U4PIOj63YzZs1zXz7kqnqdSKS5BTg8rbmjh5++OdqTqksYcHscr/LEZEPoACXt/30+U00dXTzfy6frgtViQSAAlwA2Livhd++upPrTxvL9PIiv8sRkT5QgAsA//r0BgqyM/jKx6b4XYqI9JECXPifLft5afN+bjlvIiX5WX6XIyJ9pABPc7GY4/t/3Eh5UQ43nD7O73JE5ENQgKe5Z96qZe2eZm6/YAo5mRpxKRIkCvA01hON8eM/VzOlbAhX6jrfIoGjAE9jj76+mx2NHXz9oimEQ+o2KBI0CvA01R2JcdcLW5g7roTzThzhdzkichwU4GnqiVU11DZ3cuv8SRq0IxJQCvA01BON8cslW5hVUcRHJ+lqgyJBpQBPQ0+u3svuA4e45TwdfYsEmQI8zURjjl++sIWpowqZP1Vt3yJBpgBPM0+vrWXb/nZuOW+ijr5FAq5fAW5mxWb2uJltNLMNZnZGogqTxHPO8aslW5k4ooCLpo/0uxwR6af+HoH/DPiTc+5EYBawof8lyUB5ZWsjG2pb+MK88YTU71sk8I77psZmVgR8FPgMgHOuG+hOTFkyEO5Ztp1h+VksmK1RlyKpoD9H4OOBBuA+M3vDzO42s/yj32RmN5vZCjNb0dDQ0I/VSX9sbWhj8cZ6bjh9nK55IpIi+hPgGcDJwK+cc3OAduCbR7/JObfQOVflnKsqLS3tx+qkP+5dtp2sjJCuOCiSQvoT4DVAjXNueXz+cbxAlyRzsL2bJ1bVcMXsckqHZPtdjogkyHEHuHNuH7DbzHpv4TIfWJ+QqiShHnptF509MW76yAS/SxGRBDruk5hxtwAPmlkWsA34bP9LkkSKRGP87tWdfGTicKaMHOJ3OSKSQP0KcOfcaqAqMaXIQHihuoHa5k6+e9l0v0sRkQTTSMwU99DynYwYkq1h8yIpSAGewmoOdrBkUwPXnDKGzLB2tUiq0V91Cnv09d0AXHPKGJ8rEZGBoABPUT3RGI++vptzJpdSUZLndzkiMgAU4Clq8YZ66lu7+NRpGrgjkqoU4Cnqodd2Maooh3OmaPSrSKpSgKegfc2dvLS5gU/OrSBDJy9FUpb+ulPQk6v34Bx84uQKv0sRkQGkAE8xzjmeWFXD3HElVA5/18UhRSSFKMBTzLq9LWyqa+PKObrmt0iqU4CnmEWr9pAVDnHpzFF+lyIiA0wBnkIi0RhPrdnD/KkjKM7L8rscERlgCvAU8tLm/exv69bJS5E0oQBPIU+sqmFofhZnT1bfb5F0oABPEe1dEZ5bX8elM0eRlaHdKpIO9JeeIhZvrKcrEuPSmeV+lyIig0QBniKeebOWEUOyqRpX4ncpIjJIFOApoL0rwgvV9Vxy0ihCIfO7HBEZJArwFNDbfHLJSer7LZJOFOApQM0nIulJAR5wvc0nF88YqeYTkTSjAA+43uaTj6v3iUjaUYAHnJpPRNKXAjzAOrrVfCKSzhTgAbZs8366IjEumD7S71JExAcK8ABbvKGeITkZnDp+qN+liIgPFOABFYs5Fm+s4+zJpWTqvpciaanff/lmFjazN8zsD4koSPpmdU0T+9u6+di0Mr9LERGfJOLQ7TZgQwJ+jnwIizfUEQ4Z50we4XcpIuKTfgW4mVUAHwfuTkw50lfPr6/nlMoSivIy/S5FRHzS3yPwO4GvA7FjvcHMbjazFWa2oqGhoZ+rE4DdBzqormvl/KlqPhFJZ8cd4GZ2KVDvnFv5fu9zzi10zlU556pKS3WnmER4fkMdgAJcJM315wj8LOByM9sBPAKcZ2a/S0hV8r4Wb6hn4ogCKofn+12KiPjouAPcOfct51yFc64SuBb4i3PuhoRVJu+ptbOHV7c1Mn+qTl6KpDt1IA6Yl7c2Eok5zp2iABdJdxmJ+CHOuSXAkkT8LHl/L21uID8rzMljdfEqkXSnI/CAWbppP2ecMEx3nhcRBXiQ7GxsZ9eBDuZNUm8eEVGAB8rSzfsB+OhkBbiIKMADZemmBipKcqkclud3KSKSBBTgAdETjfHK1kbmTSrFTDdvEBEFeGC8sauJtq4IZ08e7ncpIpIkFOAB8dLmBsIh44wTFOAi4lGAB8TSTQ3MHlNMUa6uPigiHgV4ABxs7+bNPc3Mm6SjbxE5TAEeAMu3H8A5OGuiAlxEDlOAB8Cr2xrJyQwxq6LY71JEJIkowAPg1W2NVI0bquHzIvIOSoQkd7C9m437Wjl9wlC/SxGRJKMAT3LLtx8A4PQJw3yuRESSjQI8yb26rZHczDAz1f4tIkdJyPXAk0V3JIbD+V1Gv4TNyAgf/lx9dVsjVZUlav8WkXdJmQB/fGUNX/3PNX6X0W9DcjK4/7OnMndcCQfi7d+XzSr3uywRSUIpE+Avb91PSV4mn583we9S+uWh5bu4/bHVPHPrPF7b3gigE5gi8p5SJsA31bUyY3QRXzp3ot+l9MvccSVc95tX+d4fN5ARCpGbGeak0cV+lyUiSSglAjwac2yua+OvTx/ndyn9dvqEYXz+I+P5zUvbKcrNVPu3iBxTSiTD7gMddEViTB45xO9SEuIrF0xh0ogCmg/1qPugiBxTSgR4dV0rAJPLUiPAczLD/PSa2UwYns8F08r8LkdEklRKNKFs2ucF+KQRBT5XkjgzRhfxl6+e43cZIpLEUuYIfMzQXPKzU+LzSESkT1IiwDfVtTIlRZpPRET6KvAB3h2Jsa2hnUkKcBFJM4EP8B2N7URiTkfgIpJ2jjvAzWyMmb1gZuvNbJ2Z3ZbIwvqqel9q9UAREemr/pz1iwBfcc6tMrMhwEoze845tz5BtfXJprpWwiFjQmn+YK5WRMR3x30E7pyrdc6tik+3AhuA0YkqrK+q97UyblgeOZnhwV61iIivEtIGbmaVwBxg+Xu8drOZrTCzFQ0NDYlY3Ttsrm9T+7eIpKV+B7iZFQBPAF92zrUc/bpzbqFzrso5V1VaWtrf1b1DZ0+UHY3tav8WkbTUrwA3s0y88H7QObcoMSX13Zb6NpyDKSlyDRQRkQ+jP71QDLgH2OCc+0niSuq7wz1QUmcIvYhIX/XnCPws4K+B88xsdfxxSYLq6pPqulaywiHGDVMPFBFJP8fdjdA5twywBNbyoa2taWbKyCFkhgM/HklE5EMLbPLFYo639jQzs6LI71JERHwR2ADftr+d1q4IsyqK/S5FRMQXgQ3wN2uaAJg5RkfgIpKeAhzgzeRmhplYqh4oIpKeAhvga2qamDG6kAydwBSRNBXI9OuJxli/t4WZav8WkTQWyADfVNdKVySmHigiktYCGeBv1jQDqAeKiKS1gAZ4E0W5mYwblud3KSIivglkgK/Z7Q3g8S7HIiKSngIX4J09UarrWtX+LSJprz+3VPPFur0tRGNOPVBE0lEsCtHu+KPniOkIxHq8ZbGe+Pt6IBY5PB+LHPGIHl7m4tMudvi1I5f1Pt4x3zvtjljm3vn+3gfOe23+/4YhIxP63xG4AO8dgakTmP0Ui8Ghg9DR6D0fOgjFY6Bsut+VSRBFI9DdCl2t0NXmPXe3QXe79+hph+4O6Ol9HDr8HOmKP3fGH/H5aLc3He2CSLf37GL+bqeFwULeIxSfxuLLLP4IHzEfOvyeee0JLydwAb62ppkRQ7IZWZTjdynJyzlorYUD26BpFxzcCS010LrPe7TVecF99B9DKAM+9yxUzPWnbvFfpAva90N7A3Tsh47eD/kD8Q/6Ju+5s/nwo6vFC+O+ysiBzFzIyIXMHMjM85Zl5EBuifcczoovy4Jw9uHncFZ8OgtCmRDO9KbDmd7vbzgzvjzDe357WdgL1t73WdhbFso4/FpvIL9j/shlyXfOLXABvr62hRmj1f79tmgP1K+HPSthzyqo3wAN1d7R0NsMCkbAkFFQPBYqqiC/1HvkDoW8EsgqgCc+D098Dr74EuQU+rZJMgCiEWjbB817vA/zllrvQ761FlrrvA/1tnroaj7GDzDvdyK3BHKKIbcYCkdBdiHkFHnP2UOOeBR4v1NZ+V5AZxVAVp43HdINyBMlUAHe2RNlS30b508t87sUfzXtgs3PwubnYftS7+speGE8cgbMvg6GT4ZhJ0DxOCiqgIzsD/65V90N910Mz3wVPrFwYLdBEq+rFRq3woGtcGC792ja6T1a9nrtu0fKyPE+1IeMhLJpcMK5kD8C8od7H+55w7zp3KFeYCt4k06gAnxLfRuRmGNaeRoeHUa6YeMfYOX9sP1Fb1nxOJh1LVSeBaPnevP9+Zo39nQ4+xuw5HtwwnyYdU1CSpcE62yBunXQsAHqN3rP+zd7R9NHKiiDkkoYc5r3zatojPdhXjjaO3rOKU7KZgHpu0AF+Pq93k3vp41KowCPxWDNQ/D8P0F7vfdHeO4/wPQrYdjExP8BzvsqbFsCT9/uHc3rpKa/DjVB7WqveWzvG7BvLRzcfvj1rAIonQITzoXhE73fiaEnwNDxXvOFpLRABfi6vc3kZ4UZOzRNRmDuWwtPfwV2L4eKU+GKX8IJ5w3sV9lwBlx1D9w9Hx66Bj6/GIakeZPVYDq4E3Ys8/b57uXQsPHwayWVMGoWzPkUlJ3kNXsUjdFRdBoLVICvr21h6qhCQqE0+IVd+zgsutk7abTglzDrOggN0rirotFw3cNw3yXwyHXwmae9XgOSeO37YesLsPUvXnA37/KW5xTDmFNhxtVer6BRsyFvqJ+VShIKTIDHYo4Nta1cdfJov0sZeG89AYu+AGPPhGt+688fbvkc+MRv4NEb4L++CFffp5NYieCc13698WnY9EfYuxpw3gd15Tw48xao/AiUnjh4H9gSWIEJ8N0HO2jriqT+Ccx1v4cnvgBjTofrH/W6Y/ll6qVwwb/As/8IT90Kl/+7QuV4OAe1a7wP5vVPer1CMK8757nfhonzvSNsfUDKhxSYAD98AvOIPuCv/hpeuANw/hQ1ELpavV4Dn3rM3/DudeYt3si6F78PBlymEO+zpt2w5mFY84jXtS+U4Z1snHc7TL5Y5xak34IT4LUthEPGpLJ4qHW2wJI7oGSc95UzVWQXwhlf8gZDJItzvumN2lz6Q29U2qU/U4gfSzRyuLvntiWA85pGzroNpl6mdmxJqOAE+N4WJpYWkJMZ/5r5+m+8YbyX/9xrr5WBY+Z91XcxeOnH3lDqKxd6I+vE03EAVt4Hr9/rjXQsrPD61M++zus9IjIAAhPg6/a2cMYJw7yZrjZ4+Rcw6QKF92Axg/P+0Rud9+dvQ8tlcN0jUFDqd2X+at4Dr/zCO+Lu6YDxZ8MlP4TJF6lNWwZcIAK8sa2LfS2dhwfwrLjHu7jOR7/ub2HpxgzO+FvvqoVPfAHuOR+uedAb8JNumvd4TUpvPOh9M5n5V14zyYipflcmaaRfDZlmdpGZVZvZFjP7ZqKKOtqGWu/CTNPKC71LUr78796AljGnDNQq5f1MvczrG97T6Q34WfmA19MiHXQcgGe/A/9+shfeJ98It74BV/5a4S2D7riPwM0sDNwFfAyoAV43s6ecc+sTVVyv9bXeFdKmjSqEVfd4l7rU0be/KubC37zk9Vf/71th5//Ax/8tuU6+JlIsCivuhb/8X+/cy6xrvZO7at8WH/WnCeVUYItzbhuAmT0CLAASH+B7WygvyqEkPwu2LIYR02DcGYlejXxYBSPghkXw0r95F8Da+TJcdidMPN/vyhJr16vw9Fehbq3Xo+TiH+gaMZIU+tOEMhrYfcR8TXzZO5jZzWa2wsxWNDQ0HNeKJo4o4LJZ5d5MQ7X+eJJJKAxnfx0+92dvuP3vroLf/63X1BB03e3wzNfh3ou8njeffAA+/d/6/ZOkMeAnMZ1zC4GFAFVVVcfVUPp3503yJrravGtFlN6YsPokQcac6t0IYukPYdmd3lDxc74Fp9zk3QUlaHYsgye/BAd3wKlf9O5nmAwDq0SO0J8j8D3AmCPmK+LLBs7+Td5z6YkDuho5Tpk5XtD9zTLvqnl/+gb86iwvzINykjMa8dq577/UG7T02T963QIV3pKE+hPgrwOTzGy8mWUB1wJPJaasY2io9p4V4MmtbBrc+CRc+7B3F5hHroeFZ0P1H5M7yJv3wAOXwdIfeZds/ZtlMO5Mv6sSOabjbkJxzkXM7O+APwNh4F7n3LqEVfZe9ld7NyotGT+gq5EEMIMTL/EGW735KLz4A3j4Wiib4V0qYMbV3s1pk8XOl70rL/Z0eqNMdTciCYB+9QN3zj3jnJvsnDvBOfeviSrqmBqqvTuOhAMx/kjA21dzPgW3rIQFd3nd8X7/v+DOk2DJ96G5xu8KYdVv4YHLvUu6fvFFhbcERrCSsGEjjJzpdxVyPMKZMOcGmP0p7+YFr9zldT188Qdet8Mxp/lzZ5nGbbD6dzDhHPjk/V6IiwREcAK8p9PrEXDSX/ldifSHmXf964nzvf256rew+kHY/KxfBXm9TC68Q9/sJHCC8xvbuMW75kTpZL8rkUQpqYT53/EukhXt9qkIS662eJEPITgB3ntzV/VAST1mkJHtdxUigROcq/I3VHv9codN9LsSEZGkEKAA3whDJ+hITUQkLkABXg3Dp/hdhYhI0ghGgEd7vJvClirARUR6BSPAD2zzhmTrBKaIyNuCEeBv90DREbiISK+ABHj8IlbDJ/lbh4hIEglOgBePhax8vysREUkawRjIUzYdiir8rkJEJKkEI8Dn3e53BSIiSScYTSgiIvIuCnARkYBSgIuIBJQCXEQkoBTgIiIBpQAXEQkoBbiISEApwEVEAsqcc4O3MrMGYOdx/vPhwP4ElhMU6bjd6bjNkJ7brW3um3HOudKjFw5qgPeHma1wzlX5XcdgS8ftTsdthvTcbm1z/6gJRUQkoBTgIiIBFaQAX+h3AT5Jx+1Ox22G9NxubXM/BKYNXERE3ilIR+AiInIEBbiISEAFIsDN7CIzqzazLWb2Tb/rGQhmNsbMXjCz9Wa2zsxuiy8fambPmdnm+HOJ37UmmpmFzewNM/tDfH68mS2P7+9HzSzL7xoTzcyKzexxM9toZhvM7IxU39dm9vfx3+23zOxhM8tJxX1tZveaWb2ZvXXEsvfct+b5eXz73zSzkz/MupI+wM0sDNwFXAxMA64zs2n+VjUgIsBXnHPTgNOBL8W385vAYufcJGBxfD7V3AZsOGL+B8BPnXMTgYPATb5UNbB+BvzJOXciMAtv+1N2X5vZaOBWoMo5NwMIA9eSmvv6fuCio5Yda99eDEyKP24GfvVhVpT0AQ6cCmxxzm1zznUDjwALfK4p4Zxztc65VfHpVrw/6NF42/pA/G0PAFf4UuAAMbMK4OPA3fF5A84DHo+/JRW3uQj4KHAPgHOu2znXRIrva7xbOOaaWQaQB9SSgvvaObcUOHDU4mPt2wXAfzjPq0CxmY3q67qCEOCjgd1HzNfEl6UsM6sE5gDLgTLnXG38pX1AmV91DZA7ga8Dsfj8MKDJOReJz6fi/h4PNAD3xZuO7jazfFJ4Xzvn9gA/BnbhBXczsJLU39e9jrVv+5VvQQjwtGJmBcATwJedcy1Hvua8Pp8p0+/TzC4F6p1zK/2uZZBlACcDv3LOzQHaOaq5JAX3dQne0eZ4oBzI593NDGkhkfs2CAG+BxhzxHxFfFnKMbNMvPB+0Dm3KL64rvcrVfy53q/6BsBZwOVmtgOvaew8vLbh4vjXbEjN/V0D1DjnlsfnH8cL9FTe1+cD251zDc65HmAR3v5P9X3d61j7tl/5FoQAfx2YFD9bnYV34uMpn2tKuHjb7z3ABufcT4546Sng0/HpTwNPDnZtA8U59y3nXIVzrhJvv/7FOfcp4AXg6vjbUmqbAZxz+4DdZjYlvmg+sJ4U3td4TSenm1le/He9d5tTel8f4Vj79ingxnhvlNOB5iOaWj6Ycy7pH8AlwCZgK/APftczQNv4EbyvVW8Cq+OPS/DahBcDm4HngaF+1zpA238O8If49ATgNWAL8J9Att/1DcD2zgZWxPf374GSVN/XwD8BG4G3gN8C2am4r4GH8dr5e/C+bd10rH0LGF4vu63AWrxeOn1el4bSi4gEVBCaUERE5D0owEVEAkoBLiISUApwEZGAUoCLiASUAlxEJKAU4CIiAfX/AfTPKigSXaZWAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = (\n", - " jnp.ones((100,))\n", - " .at[0]\n", - " .set(-1)\n", - " .at[30:50]\n", - " .set(-1)\n", - " .at[40:50]\n", - " .set(jnp.nan)\n", - " .at[3:20]\n", - " .set(jnp.nan)\n", - ")\n", - "\n", - "alpha = 1 / (1 + 10)\n", - "(res, info) = unroll(\n", - " lambda x: EWMA(com=10, adjust=True, ignore_na=True, return_info=True)(x),\n", - " dynamic=False,\n", - ")(x)\n", - "res = pd.Series(onp.array(res))\n", - "pd.Series(info[\"com_eff\"]).plot()\n", - "# pd.Series(info[\"old_wt\"]/alpha).plot()\n", - "\n", - "res.plot()" - ] - }, - { - "cell_type": "markdown", - "id": "952835af", - "metadata": {}, - "source": [ - "# Exponential adjustement" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "5ef8be39", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "@partial(unroll_transform_with_state, dynamic=True)\n", - "def fun(x):\n", - " return EWMA(1 / 10, adjust=True, ignore_na=False, return_info=True)(x)\n", - "\n", - "\n", - "rng = jax.random.PRNGKey(42)\n", - "params, state = fun.init(rng, x)\n", - "(res, info), final_state = fun.apply(params, state, rng, x)\n", - "\n", - "\n", - "res = pd.DataFrame(onp.array(res))\n", - "\n", - "\n", - "c1 = pd.DataFrame(info[\"com_eff\"])\n", - "c1.plot()" - ] - }, - { - "cell_type": "markdown", - "id": "73635469", - "metadata": {}, - "source": [ - "# More checks" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "0b4443df", - "metadata": {}, - "outputs": [], - "source": [ - "adjust = False\n", - "ignore_na = False\n", - "\n", - "adjust = True\n", - "ignore_na = False\n", - "\n", - "\n", - "def run():\n", - " x = jnp.ones((30,), \"float64\").at[0].set(-1).at[5:20].set(jnp.nan)\n", - "\n", - " @partial(unroll_transform_with_state)\n", - " def fun(x):\n", - " return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x)\n", - "\n", - " rng = jax.random.PRNGKey(42)\n", - " params, state = fun.init(rng, x)\n", - " (res, info), final_state = fun.apply(params, state, rng, x)\n", - " res = pd.Series(onp.array(res))\n", - "\n", - " ref_res = (\n", - " pd.Series(onp.array(x))\n", - " .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na)\n", - " .mean()\n", - " .values\n", - " )\n", - "\n", - " df = pd.concat(\n", - " [\n", - " pd.Series(x),\n", - " pd.Series(onp.array(ref_res)),\n", - " pd.Series(onp.array(res)),\n", - " ],\n", - " axis=1,\n", - " keys=[\"x\", \"pandas\", \"wax\"],\n", - " )\n", - "\n", - " return df\n", - "\n", - " df = pd.concat(\n", - " [\n", - " pd.Series(x),\n", - " ref_res,\n", - " res,\n", - " pd.Series(onp.array(info[\"mean\"])),\n", - " pd.Series(info[\"norm\"]),\n", - " pd.Series(onp.array(info[\"mean\"])) / ref_res,\n", - " ],\n", - " axis=1,\n", - " keys=[\"x\", \"pandas\", \"wax\", \"wax-mean\", \"wax-norm\", \"pandas-norm\"],\n", - " )\n", - " df.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "7e11817f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "adjust = False\n", - "ignore_na = False\n", - "df = run()\n", - "df.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "f86ba1ef", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "adjust = True\n", - "ignore_na = False\n", - "df = run()\n", - "df.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "0ce607ec", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "adjust = False\n", - "ignore_na = True\n", - "df = run()\n", - "df.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "991b352d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "adjust = True\n", - "ignore_na = True\n", - "df = run()\n", - "df.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "8e460594", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "adjust = \"linear\"\n", - "ignore_na = True\n", - "df = run()\n", - "df.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "925b3097", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "adjust = \"linear\"\n", - "ignore_na = False\n", - "df = run()\n", - "df.plot()" - ] - }, - { - "cell_type": "markdown", - "id": "12d7638b", - "metadata": {}, - "source": [ - "# Numba implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "c8093924", - "metadata": {}, - "outputs": [], - "source": [ - "from wax.numba.ewma_numba import ewma" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "639559b5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x = onp.ones((30,), \"float64\")\n", - "x[0] = onp.nan\n", - "\n", - "x[1] = -1\n", - "\n", - "x[5:20] = onp.nan\n", - "x = x.reshape(-1, 1)\n", - "\n", - "\n", - "res, state = ewma(com=10, adjust=\"linear\")(x)\n", - "pd.DataFrame(res).plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "55d2327d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
full12
00
0NaNNaN
1NaNNaN
2NaNNaN
30.3333330.333333
40.5000000.500000
50.5000000.500000
60.5000000.500000
70.5000000.500000
80.5000000.500000
90.5000000.500000
100.5000000.500000
110.5000000.500000
120.5000000.500000
130.5000000.500000
140.5000000.500000
150.5000000.500000
160.5000000.500000
170.5000000.500000
180.5000000.500000
190.5000000.500000
201.0000001.000000
211.0000001.000000
221.0000001.000000
231.0000001.000000
241.0000001.000000
251.0000001.000000
261.0000001.000000
271.0000001.000000
281.0000001.000000
291.0000001.000000
\n", - "
" - ], - "text/plain": [ - " full 12\n", - " 0 0\n", - "0 NaN NaN\n", - "1 NaN NaN\n", - "2 NaN NaN\n", - "3 0.333333 0.333333\n", - "4 0.500000 0.500000\n", - "5 0.500000 0.500000\n", - "6 0.500000 0.500000\n", - "7 0.500000 0.500000\n", - "8 0.500000 0.500000\n", - "9 0.500000 0.500000\n", - "10 0.500000 0.500000\n", - "11 0.500000 0.500000\n", - "12 0.500000 0.500000\n", - "13 0.500000 0.500000\n", - "14 0.500000 0.500000\n", - "15 0.500000 0.500000\n", - "16 0.500000 0.500000\n", - "17 0.500000 0.500000\n", - "18 0.500000 0.500000\n", - "19 0.500000 0.500000\n", - "20 1.000000 1.000000\n", - "21 1.000000 1.000000\n", - "22 1.000000 1.000000\n", - "23 1.000000 1.000000\n", - "24 1.000000 1.000000\n", - "25 1.000000 1.000000\n", - "26 1.000000 1.000000\n", - "27 1.000000 1.000000\n", - "28 1.000000 1.000000\n", - "29 1.000000 1.000000" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ewma_apply = ewma(com=10, adjust=\"linear\", min_periods=3)\n", - "res_full, _ = ewma_apply(x)\n", - "\n", - "T = 10\n", - "res1, state = ewma_apply(x[:T])\n", - "res2, _ = ewma_apply(x[T:], state)\n", - "res12 = np.concatenate([res1, res2])\n", - "assert np.allclose(res_full, res12, equal_nan=True)\n", - "pd.concat([pd.DataFrame(res_full), pd.DataFrame(res12)], axis=1, keys=[\"full\", \"12\"])" - ] - }, - { - "cell_type": "markdown", - "id": "880f591c", - "metadata": {}, - "source": [ - "# Online pandas ewm" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "c0b265bb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
totres1res2
000
0NaNNaNNaN
1-1.000000-1.000000NaN
20.0000000.000000NaN
30.3333330.333333NaN
40.5000000.500000NaN
50.5000000.500000NaN
60.5000000.500000NaN
70.5000000.500000NaN
80.5000000.500000NaN
90.5000000.500000NaN
100.500000NaN0.500000
110.500000NaN0.500000
120.500000NaN0.500000
130.500000NaN0.500000
140.500000NaN0.500000
150.500000NaN0.500000
160.500000NaN0.500000
170.500000NaN0.500000
180.500000NaN0.500000
190.500000NaN0.500000
200.600000NaN0.600000
210.666667NaN0.666667
220.714286NaN0.714286
230.750000NaN0.750000
240.777778NaN0.777778
250.800000NaN0.800000
260.818182NaN0.818182
270.833333NaN0.833333
280.846154NaN0.846154
290.857143NaN0.857143
\n", - "
" - ], - "text/plain": [ - " tot res1 res2\n", - " 0 0 0\n", - "0 NaN NaN NaN\n", - "1 -1.000000 -1.000000 NaN\n", - "2 0.000000 0.000000 NaN\n", - "3 0.333333 0.333333 NaN\n", - "4 0.500000 0.500000 NaN\n", - "5 0.500000 0.500000 NaN\n", - "6 0.500000 0.500000 NaN\n", - "7 0.500000 0.500000 NaN\n", - "8 0.500000 0.500000 NaN\n", - "9 0.500000 0.500000 NaN\n", - "10 0.500000 NaN 0.500000\n", - "11 0.500000 NaN 0.500000\n", - "12 0.500000 NaN 0.500000\n", - "13 0.500000 NaN 0.500000\n", - "14 0.500000 NaN 0.500000\n", - "15 0.500000 NaN 0.500000\n", - "16 0.500000 NaN 0.500000\n", - "17 0.500000 NaN 0.500000\n", - "18 0.500000 NaN 0.500000\n", - "19 0.500000 NaN 0.500000\n", - "20 0.600000 NaN 0.600000\n", - "21 0.666667 NaN 0.666667\n", - "22 0.714286 NaN 0.714286\n", - "23 0.750000 NaN 0.750000\n", - "24 0.777778 NaN 0.777778\n", - "25 0.800000 NaN 0.800000\n", - "26 0.818182 NaN 0.818182\n", - "27 0.833333 NaN 0.833333\n", - "28 0.846154 NaN 0.846154\n", - "29 0.857143 NaN 0.857143" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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7ke+V/0Q+J6Z5RO5p/DHKOups6bF29mrVsoijUqrVq345je/ecxf3QAffvgh11xzDQDXX389c+bMObps9OjRpKSk0KdPH7Zu3QpEAmHWrFkMHDiQQYMGsXz5clatWlXpMUOhEHfffTcPP/zwMfPnzJnD9ddfD8BFF11EYWEhe/bsAeCSSy4hPT2dnJwc2rVrx9atW3n77beZP38+gwcPZsCAAbz99tusXr06Nr+YGkTVMM3dC4GhlczPA24KXv8T6FfF9quBIdHUEK3WpTvY1LJ/PEsQkXpw5513MmjQIP7jP/6jVuunp6cffR25gBH595577uGWW26p1T6uv/56Hn74Yfr27VvnY4ZCIUpLS3F3xo0bd1ywNISk7svIw2FywkWUNFejNJHGJisri6uuuoo//vFfFx6+/OUvM3XqVACef/55zjvvvGr3MXLkSJ566in27dsHwMaNG9m2LXKrdOjQoWzceOxtzyZNmvDd7373mPsX55133tFLPrNnzyYnJ4dWrVpVecyhQ4cyffr0o8cpKipi3bp1tT3tqCR1IOwu2kaalWItNXSmSGN01113HfO00W9/+1uefvpp+vfvz7PPPsuvf/3rarcfMWIE11xzDeeccw79+vXjyiuvZO/evYTDYfLz88nKOv7+44033khpaenR6UmTJjF//nz69+/PxIkTeeaZZ47bprw+ffrw4IMPMmLECPr378/w4cPZvHlztdvEih35apRIcnNzPS8vL+r9rFnyMd3/dwTzhzzOF/+tdl8rRaRhLVu2jDPPPDPeZRxj8eLFPPXUU/zqV7+KdylVquz3ZmbzgyYAlUrqbwh7t0eGzmyerbGURaT2+vbte1KHwYlK6kA4tPNIK2U1ShMRSepAKNsdaaWc1UH9GImIJHUgpOzbyi5akNG0ebxLERGJu6QOhLQDW9iZokZpIiKQ5IHQ/PAO9qYpEEREIMkDoU3pDg5ltIt3GSJykjt48CBf/epXKSsrY+3atfzlL3+pcZsFCxbwxhtv1Gr/zzzzDD179qRnz57HtFMYNmwYO3fuPOG66yppA6GstJQs30VZc42lLCLVe+qpp7j88ssJhUIxD4SioiJ++tOf8vHHHx/t5O5ICFx//fX813/9V9T111ZUfRklsp07NpFjYVJaqZWySKL46atLWLppT0z32eeUVtz/jbOqXef5558/GgIT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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "online_ewm = pd.DataFrame(x).ewm(10).online()\n", - "res_tot = online_ewm.mean()\n", - "\n", - "\n", - "data = pd.DataFrame(x)\n", - "online_ewm = data.iloc[:10].ewm(10).online()\n", - "res1 = online_ewm.mean()\n", - "\n", - "res2 = online_ewm.mean(update=data.iloc[10:])\n", - "\n", - "df = pd.concat([res_tot, res1, res2], keys=[\"tot\", \"res1\", \"res2\"], axis=1)\n", - "df.plot()\n", - "df" - ] - }, - { - "cell_type": "markdown", - "id": "db2d0e84", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "jupytext": { - "encoding": "# -*- coding: utf-8 -*-", - "formats": "ipynb,py,md" - }, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/notebooks/09_EWMA_options.md b/docs/notebooks/09_EWMA_options.md deleted file mode 100644 index d710f46..0000000 --- a/docs/notebooks/09_EWMA_options.md +++ /dev/null @@ -1,463 +0,0 @@ ---- -jupyter: - jupytext: - encoding: '# -*- coding: utf-8 -*-' - formats: ipynb,py,md - text_representation: - extension: .md - format_name: markdown - format_version: '1.3' - jupytext_version: 1.13.3 - kernelspec: - display_name: Python 3 (ipykernel) - language: python - name: python3 ---- - -```python -# Uncomment to run the notebook in Colab -# ! pip install -q "wax-ml[complete]@git+https://github.com/eserie/wax-ml.git" -# ! pip install -q --upgrade jax jaxlib==0.1.70+cuda111 -f https://storage.googleapis.com/jax-releases/jax_releases.html -``` - -```python -%pylab inline -%load_ext autoreload -%autoreload 2 -``` - -```python -from functools import partial - -import jax -import jax.numpy as jnp -import numpy as onp -import pandas as pd -from jax.config import config - -from wax.modules.ewma import EWMA -from wax.unroll import unroll_transform_with_state -``` - -```python -# check available devices -print("jax backend {}".format(jax.lib.xla_bridge.get_backend().platform)) -jax.devices() -``` - -```python -adjust = True -ignore_na = False -config.update("jax_enable_x64", True) - -T = 20 - -x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1) - -rng = jax.random.PRNGKey(38) -x = jax.random.normal(rng, (T,)) - -x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1) - - -@partial(unroll_transform_with_state, dynamic=True) -def fun(x): - return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x) - - -rng = jax.random.PRNGKey(42) -params, state = fun.init(rng, x) -(res, info), final_state = fun.apply(params, state, rng, x) - - -res = pd.DataFrame(onp.array(res)) - -ref_res = ( - pd.DataFrame(onp.array(x)) - .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) - .mean() -) -``` -```python -res -``` - -```python -ref_res -``` - -```python -info -``` - -```python -pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) -``` - -## check gradient - -```python -@jax.value_and_grad -def batch(params): - (res, info), final_state = fun.apply(params, state, rng, x) - return jnp.nanmean(res) - - -score, grad = batch(params) -assert not jnp.isnan(grad["ewma"]["logcom"]) -score, grad -``` - -# Linear adjustement - -```python -adjust = True -ignore_na = False -config.update("jax_enable_x64", True) - -T = 20 - -x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1) - -rng = jax.random.PRNGKey(38) -x = jax.random.normal(rng, (T,)) -``` - - -```python -from wax.unroll import unroll -``` - -```python -x = jnp.full((20,), jnp.nan).at[2].set(1).at[10].set(-1) -(res, info) = unroll( - lambda x: EWMA(com=10, adjust="linear", ignore_na=True, return_info=True)(x) -)(x) -res = pd.DataFrame(onp.array(res)) -pd.Series(info["com_eff"]).plot() -``` - - -```python -# rng = jax.random.PRNGKey(42) -# x = jax.random.normal(rng, (100,)).at[30:50].set(jnp.nan) -# x = jnp.full((100,), jnp.nan).at[2].set(1).at[10].set(-1) -``` - - -```python -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA(com=10, adjust="linear", ignore_na=True, return_info=True)(x) -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -res.plot() -``` - - -```python -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:45] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA(com=10, adjust="linear", ignore_na=False, return_info=True)(x) -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -res.plot() -``` - - -```python -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA(com=10, adjust="linear", ignore_na=False, return_info=True)(x) -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -res.plot() -``` - - -```python -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA( - com=10, adjust=False, ignore_na=False, return_info=True, initial_value=jnp.nan - )(x) -)(x) -res = pd.Series(onp.array(res)) -# pd.Series(info["com_eff"]).plot() -res.plot() -(res, info) = unroll( - lambda x: EWMA( - com=10, adjust=False, ignore_na=False, return_info=True, initial_value=0.0 - )(x) -)(x) -res = pd.Series(onp.array(res)) -# pd.Series(info["com_eff"]).plot() -res.plot() -plt.legend(("init nan", "init 0")) -``` - - -```python -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA(com=10, adjust=True, ignore_na=False, return_info=True)(x) -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -res.plot() -``` - - -```python -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -alpha = 1 / (1 + 10) -(res, info) = unroll( - lambda x: EWMA(com=10, adjust=True, ignore_na=True, return_info=True)(x), - dynamic=False, -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -# pd.Series(info["old_wt"]/alpha).plot() - -res.plot() -``` - - -# Exponential adjustement - -```python -@partial(unroll_transform_with_state, dynamic=True) -def fun(x): - return EWMA(1 / 10, adjust=True, ignore_na=False, return_info=True)(x) - - -rng = jax.random.PRNGKey(42) -params, state = fun.init(rng, x) -(res, info), final_state = fun.apply(params, state, rng, x) - - -res = pd.DataFrame(onp.array(res)) - - -c1 = pd.DataFrame(info["com_eff"]) -c1.plot() -``` - -# More checks - -```python -adjust = False -ignore_na = False - -adjust = True -ignore_na = False - - -def run(): - x = jnp.ones((30,), "float64").at[0].set(-1).at[5:20].set(jnp.nan) - - @partial(unroll_transform_with_state) - def fun(x): - return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x) - - rng = jax.random.PRNGKey(42) - params, state = fun.init(rng, x) - (res, info), final_state = fun.apply(params, state, rng, x) - res = pd.Series(onp.array(res)) - - ref_res = ( - pd.Series(onp.array(x)) - .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) - .mean() - .values - ) - - df = pd.concat( - [ - pd.Series(x), - pd.Series(onp.array(ref_res)), - pd.Series(onp.array(res)), - ], - axis=1, - keys=["x", "pandas", "wax"], - ) - - return df - - df = pd.concat( - [ - pd.Series(x), - ref_res, - res, - pd.Series(onp.array(info["mean"])), - pd.Series(info["norm"]), - pd.Series(onp.array(info["mean"])) / ref_res, - ], - axis=1, - keys=["x", "pandas", "wax", "wax-mean", "wax-norm", "pandas-norm"], - ) - df.plot() -``` - -```python -adjust = False -ignore_na = False -df = run() -df.plot() -``` - -```python -adjust = True -ignore_na = False -df = run() -df.plot() -``` - -```python -adjust = False -ignore_na = True -df = run() -df.plot() -``` - -```python -adjust = True -ignore_na = True -df = run() -df.plot() -``` - -```python -adjust = "linear" -ignore_na = True -df = run() -df.plot() -``` - -```python -adjust = "linear" -ignore_na = False -df = run() -df.plot() -``` - -# Numba implementation - -```python -from wax.numba.ewma_numba import ewma -``` - -```python -x = onp.ones((30,), "float64") -x[0] = onp.nan - -x[1] = -1 - -x[5:20] = onp.nan -x = x.reshape(-1, 1) - - -res, state = ewma(com=10, adjust="linear")(x) -pd.DataFrame(res).plot() -``` - -```python -ewma_apply = ewma(com=10, adjust="linear", min_periods=3) -res_full, _ = ewma_apply(x) - -T = 10 -res1, state = ewma_apply(x[:T]) -res2, _ = ewma_apply(x[T:], state) -res12 = np.concatenate([res1, res2]) -assert np.allclose(res_full, res12, equal_nan=True) -pd.concat([pd.DataFrame(res_full), pd.DataFrame(res12)], axis=1, keys=["full", "12"]) -``` - -# Online pandas ewm - -```python -online_ewm = pd.DataFrame(x).ewm(10).online() -res_tot = online_ewm.mean() - - -data = pd.DataFrame(x) -online_ewm = data.iloc[:10].ewm(10).online() -res1 = online_ewm.mean() - -res2 = online_ewm.mean(update=data.iloc[10:]) - -df = pd.concat([res_tot, res1, res2], keys=["tot", "res1", "res2"], axis=1) -df.plot() -df -``` - - diff --git a/docs/notebooks/09_EWMA_options.py b/docs/notebooks/09_EWMA_options.py deleted file mode 100644 index 5dae866..0000000 --- a/docs/notebooks/09_EWMA_options.py +++ /dev/null @@ -1,431 +0,0 @@ -# -*- coding: utf-8 -*- -# --- -# jupyter: -# jupytext: -# formats: ipynb,py,md -# text_representation: -# extension: .py -# format_name: light -# format_version: '1.5' -# jupytext_version: 1.13.3 -# kernelspec: -# display_name: Python 3 (ipykernel) -# language: python -# name: python3 -# --- - -# + -# Uncomment to run the notebook in Colab -# # ! pip install -q "wax-ml[complete]@git+https://github.com/eserie/wax-ml.git" -# # ! pip install -q --upgrade jax jaxlib==0.1.70+cuda111 -f https://storage.googleapis.com/jax-releases/jax_releases.html -# - - -# %pylab inline -# %load_ext autoreload -# %autoreload 2 - -# + -from functools import partial - -import jax -import jax.numpy as jnp -import numpy as onp -import pandas as pd -from jax.config import config - -from wax.modules.ewma import EWMA -from wax.unroll import unroll_transform_with_state -# - - -# check available devices -print("jax backend {}".format(jax.lib.xla_bridge.get_backend().platform)) -jax.devices() - -# + -adjust = True -ignore_na = False -config.update("jax_enable_x64", True) - -T = 20 - -x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1) - -rng = jax.random.PRNGKey(38) -x = jax.random.normal(rng, (T,)) - -x = jnp.full((T,), jnp.nan).at[2].set(1).at[10].set(-1) - - -@partial(unroll_transform_with_state, dynamic=True) -def fun(x): - return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x) - - -rng = jax.random.PRNGKey(42) -params, state = fun.init(rng, x) -(res, info), final_state = fun.apply(params, state, rng, x) - - -res = pd.DataFrame(onp.array(res)) - -ref_res = ( - pd.DataFrame(onp.array(x)) - .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) - .mean() -) -# - -res - -ref_res - -info - -pd.testing.assert_frame_equal(res, ref_res, atol=1.0e-6) - - -# ## check gradient - -# + -@jax.value_and_grad -def batch(params): - (res, info), final_state = fun.apply(params, state, rng, x) - return jnp.nanmean(res) - - -score, grad = batch(params) -assert not jnp.isnan(grad["ewma"]["logcom"]) -score, grad -# - - -# # Linear adjustement - -# + -adjust = True -ignore_na = False -config.update("jax_enable_x64", True) - -T = 20 - -x = jnp.full((T,), jnp.nan).at[0].set(1).at[10].set(-1) - -rng = jax.random.PRNGKey(38) -x = jax.random.normal(rng, (T,)) -# - - - -from wax.unroll import unroll - -x = jnp.full((20,), jnp.nan).at[2].set(1).at[10].set(-1) -(res, info) = unroll( - lambda x: EWMA(com=10, adjust="linear", ignore_na=True, return_info=True)(x) -)(x) -res = pd.DataFrame(onp.array(res)) -pd.Series(info["com_eff"]).plot() - - -# + -# rng = jax.random.PRNGKey(42) -# x = jax.random.normal(rng, (100,)).at[30:50].set(jnp.nan) -# x = jnp.full((100,), jnp.nan).at[2].set(1).at[10].set(-1) - - -# + -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA(com=10, adjust="linear", ignore_na=True, return_info=True)(x) -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -res.plot() - - -# + -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:45] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA(com=10, adjust="linear", ignore_na=False, return_info=True)(x) -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -res.plot() - - -# + -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA(com=10, adjust="linear", ignore_na=False, return_info=True)(x) -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -res.plot() - - -# + -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA( - com=10, adjust=False, ignore_na=False, return_info=True, initial_value=jnp.nan - )(x) -)(x) -res = pd.Series(onp.array(res)) -# pd.Series(info["com_eff"]).plot() -res.plot() -(res, info) = unroll( - lambda x: EWMA( - com=10, adjust=False, ignore_na=False, return_info=True, initial_value=0.0 - )(x) -)(x) -res = pd.Series(onp.array(res)) -# pd.Series(info["com_eff"]).plot() -res.plot() -plt.legend(("init nan", "init 0")) - - -# + -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -(res, info) = unroll( - lambda x: EWMA(com=10, adjust=True, ignore_na=False, return_info=True)(x) -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -res.plot() - - -# + -x = ( - jnp.ones((100,)) - .at[0] - .set(-1) - .at[30:50] - .set(-1) - .at[40:50] - .set(jnp.nan) - .at[3:20] - .set(jnp.nan) -) - -alpha = 1 / (1 + 10) -(res, info) = unroll( - lambda x: EWMA(com=10, adjust=True, ignore_na=True, return_info=True)(x), - dynamic=False, -)(x) -res = pd.Series(onp.array(res)) -pd.Series(info["com_eff"]).plot() -# pd.Series(info["old_wt"]/alpha).plot() - -res.plot() - - -# - - - -# # Exponential adjustement - -# + -@partial(unroll_transform_with_state, dynamic=True) -def fun(x): - return EWMA(1 / 10, adjust=True, ignore_na=False, return_info=True)(x) - - -rng = jax.random.PRNGKey(42) -params, state = fun.init(rng, x) -(res, info), final_state = fun.apply(params, state, rng, x) - - -res = pd.DataFrame(onp.array(res)) - - -c1 = pd.DataFrame(info["com_eff"]) -c1.plot() -# - - -# # More checks - -# + -adjust = False -ignore_na = False - -adjust = True -ignore_na = False - - -def run(): - x = jnp.ones((30,), "float64").at[0].set(-1).at[5:20].set(jnp.nan) - - @partial(unroll_transform_with_state) - def fun(x): - return EWMA(1 / 10, adjust=adjust, ignore_na=ignore_na, return_info=True)(x) - - rng = jax.random.PRNGKey(42) - params, state = fun.init(rng, x) - (res, info), final_state = fun.apply(params, state, rng, x) - res = pd.Series(onp.array(res)) - - ref_res = ( - pd.Series(onp.array(x)) - .ewm(alpha=1 / 10, adjust=adjust, ignore_na=ignore_na) - .mean() - .values - ) - - df = pd.concat( - [ - pd.Series(x), - pd.Series(onp.array(ref_res)), - pd.Series(onp.array(res)), - ], - axis=1, - keys=["x", "pandas", "wax"], - ) - - return df - - df = pd.concat( - [ - pd.Series(x), - ref_res, - res, - pd.Series(onp.array(info["mean"])), - pd.Series(info["norm"]), - pd.Series(onp.array(info["mean"])) / ref_res, - ], - axis=1, - keys=["x", "pandas", "wax", "wax-mean", "wax-norm", "pandas-norm"], - ) - df.plot() - - -# - - -adjust = False -ignore_na = False -df = run() -df.plot() - -adjust = True -ignore_na = False -df = run() -df.plot() - -adjust = False -ignore_na = True -df = run() -df.plot() - -adjust = True -ignore_na = True -df = run() -df.plot() - -adjust = "linear" -ignore_na = True -df = run() -df.plot() - -adjust = "linear" -ignore_na = False -df = run() -df.plot() - -# # Numba implementation - -from wax.numba.ewma_numba import ewma - -# + -x = onp.ones((30,), "float64") -x[0] = onp.nan - -x[1] = -1 - -x[5:20] = onp.nan -x = x.reshape(-1, 1) - - -res, state = ewma(com=10, adjust="linear")(x) -pd.DataFrame(res).plot() - -# + -ewma_apply = ewma(com=10, adjust="linear", min_periods=3) -res_full, _ = ewma_apply(x) - -T = 10 -res1, state = ewma_apply(x[:T]) -res2, _ = ewma_apply(x[T:], state) -res12 = np.concatenate([res1, res2]) -assert np.allclose(res_full, res12, equal_nan=True) -pd.concat([pd.DataFrame(res_full), pd.DataFrame(res12)], axis=1, keys=["full", "12"]) -# - - -# # Online pandas ewm - -# + -online_ewm = pd.DataFrame(x).ewm(10).online() -res_tot = online_ewm.mean() - - -data = pd.DataFrame(x) -online_ewm = data.iloc[:10].ewm(10).online() -res1 = online_ewm.mean() - -res2 = online_ewm.mean(update=data.iloc[10:]) - -df = pd.concat([res_tot, res1, res2], keys=["tot", "res1", "res2"], axis=1) -df.plot() -df -# - - -# From 1ba8e04cba1dbf75c9054fb4bf0531c788bf0a5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Wed, 23 Mar 2022 10:50:37 +0100 Subject: [PATCH 36/46] add numba to requirements --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index d325f0b..d9d0952 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,6 +42,7 @@ install_requires = jaxlib>=0.1.67 jax<=0.2.21 dm-haiku >= 0.0.4 + numba [options.extras_require] optional = From 1896f63dcb0f6636aee5f4063e4e52b82789d2a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 00:49:21 +0100 Subject: [PATCH 37/46] refactor accessors --- wax/accessors.py | 19 ++++++++++--------- wax/accessors_test.py | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/wax/accessors.py b/wax/accessors.py index 7fa5ea2..95d25c9 100644 --- a/wax/accessors.py +++ b/wax/accessors.py @@ -315,22 +315,23 @@ def ewm(self, *args, **kwargs): @dataclass(frozen=True) class ExponentialMovingWindow: accessor: WaxAccessor - alpha: float + com: float = None + alpha: float = None + min_periods: int = 0 adjust: bool = True + ignore_na: bool = False + initial_value: float = jnp.nan return_state: bool = False format_outputs: bool = True def mean(self): from wax.modules import EWMA - def _apply_ema( - accessor, alpha, adjust, params=None, state=None, *args, **kwargs - ): - return accessor.stream(*args, **kwargs).apply( - lambda x: EWMA(alpha, adjust)(x), - params=params, - state=state, - rng=None, + def _apply_ema(*, accessor, return_state, format_outputs, **kwargs): + return accessor.stream( + return_state=return_state, format_outputs=format_outputs + ).apply( + lambda x: EWMA(**kwargs)(x), ) return _apply_ema(**self.__dict__) diff --git a/wax/accessors_test.py b/wax/accessors_test.py index 2afdc2d..6f33c43 100644 --- a/wax/accessors_test.py +++ b/wax/accessors_test.py @@ -41,7 +41,7 @@ def module_map(x): def check_ema_state(state, ref_count=124): - assert (state["ewma"]["count"] == ref_count).all() + assert (state["ewma"]["nobs"] == ref_count).all() def prepare_format_data(format): From d9bb2e6fa68774206c91ae4006197f073595db67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 00:49:47 +0100 Subject: [PATCH 38/46] always have nobs state --- wax/modules/ewma.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 783745e..586ade7 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -24,6 +24,7 @@ class EWMA(hk.Module): def __init__( self, alpha: float = None, + *, com: float = None, min_periods: int = 0, adjust: bool = True, @@ -189,17 +190,18 @@ def __call__( hk.set_state("old_wt", old_wt) hk.set_state("mean", mean) + nobs = hk.get_state( + "nobs", + shape=x.shape, + dtype=x.dtype, + init=lambda shape, dtype: jnp.full(shape, 0, dtype=int), + ) + nobs = jnp.where(is_observation, nobs + 1, nobs) + if self.return_info: + info["nobs"] = nobs + hk.set_state("nobs", nobs) + if self.min_periods: - nobs = hk.get_state( - "nobs", - shape=x.shape, - dtype=x.dtype, - init=lambda shape, dtype: jnp.full(shape, 0, dtype=int), - ) - nobs = jnp.where(is_observation, nobs + 1, nobs) - if self.return_info: - info["nobs"] = nobs - hk.set_state("nobs", nobs) result = jnp.where(nobs >= self.min_periods, mean, jnp.nan) else: result = mean From 04bcc143cffa18cb1b54651b08320c550632740c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 00:50:01 +0100 Subject: [PATCH 39/46] refactor numba --- wax/numba/ewma_numba.py | 142 ++++++++++++++++++++--------------- wax/numba/ewma_numba_test.py | 10 +-- 2 files changed, 88 insertions(+), 64 deletions(-) diff --git a/wax/numba/ewma_numba.py b/wax/numba/ewma_numba.py index 9470b4e..e07d430 100644 --- a/wax/numba/ewma_numba.py +++ b/wax/numba/ewma_numba.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. """Compute exponentioal moving average.""" +from dataclasses import dataclass from typing import Any, NamedTuple, cast import numba @@ -26,8 +27,9 @@ class EWMAState(NamedTuple): def ewma( - alpha: float = None, + *, com: float = None, + alpha: float = None, min_periods: int = 0, adjust: bool = True, ignore_na: bool = False, @@ -189,69 +191,91 @@ def numba_apply(values, mean, old_wt, nobs): return apply -class EWMADataFrameAccessor: - def __init__(self, pandas_obj): - self._obj = pandas_obj - - def ewma( - self, - alpha: float = None, - com: float = None, - min_periods: int = 0, - adjust: bool = True, - ignore_na: bool = False, - initial_value=np.nan, - state=None, - ): - if state is not None: - state = state.reindex(self._obj.columns) - state = EWMAState( - mean=state["mean"].values, - old_wt=state["old_wt"].values, - nobs=state["nobs"].values, +class WaxAccessor: + def ewm(self, *args, **kwargs): + return NumbaExponentialMovingWindow(accessor=self, *args, **kwargs) + + +@dataclass(frozen=True) +class NumbaExponentialMovingWindow: + accessor: WaxAccessor + com: float = None + alpha: float = None + min_periods: int = 0 + adjust: bool = True + ignore_na: bool = False + initial_value: float = np.nan + return_state: bool = False + + def mean(self, state=None): + def _apply_ema( + *, + state, + obj, + com, + alpha, + min_periods, + adjust, + ignore_na, + initial_value, + return_state, + ): + if state is not None: + state = state.reindex(obj.columns) + state = EWMAState( + mean=state["mean"].values, + old_wt=state["old_wt"].values, + nobs=state["nobs"].values, + ) + + res, state = ewma( + alpha=alpha, + com=com, + min_periods=min_periods, + adjust=adjust, + ignore_na=ignore_na, + initial_value=initial_value, + )(obj.values, state) + + res = pd.DataFrame(res, obj.index, obj.columns) + + state = state._replace( + mean=pd.Series(state.mean, obj.columns), + old_wt=pd.Series(state.old_wt, obj.columns), + nobs=pd.Series(state.nobs, obj.columns), ) - - res, state = ewma( - alpha=alpha, - com=com, - min_periods=min_periods, - adjust=adjust, - ignore_na=ignore_na, - initial_value=initial_value, - )(self._obj.values, state) - - res = pd.DataFrame(res, self._obj.index, self._obj.columns) - - state = state._replace( - mean=pd.Series(state.mean, self._obj.columns), - old_wt=pd.Series(state.old_wt, self._obj.columns), - nobs=pd.Series(state.nobs, self._obj.columns), - ) - state = pd.concat(state._asdict(), axis=1) - return res, state + state = pd.concat(state._asdict(), axis=1) + if return_state: + return res, state + else: + return res + + kwargs = self.__dict__.copy() + obj = kwargs.pop("accessor")._obj + + if isinstance(obj, pd.Series): + kwargs["obj"] = obj.to_frame() + res = _apply_ema(state=state, **kwargs) + if self.return_state: + res, state = res + res = res.iloc[:, 0] + if self.return_state: + return res, state + else: + return res + else: + kwargs["obj"] = obj + return _apply_ema(state=state, **kwargs) -class EWMASeriesAccessor: +class WaxNumbaEWMAccessor: def __init__(self, pandas_obj): self._obj = pandas_obj - def ewma( - self, - alpha: float = None, - com: float = None, - min_periods: int = 0, - adjust: bool = True, - ignore_na: bool = False, - initial_value=np.nan, - state=None, - ): - res, state = EWMADataFrameAccessor(self._obj.to_frame()).ewma( - alpha, com, min_periods, adjust, ignore_na, initial_value, state - ) - res = res.iloc[:, 0] - return res, state + def ewm(self, *args, **kwargs): + return NumbaExponentialMovingWindow(accessor=self, *args, **kwargs) -def register_online_ewma(): - pd.api.extensions.register_dataframe_accessor("wax")(EWMADataFrameAccessor) - pd.api.extensions.register_series_accessor("wax")(EWMASeriesAccessor) +def register_wax_numba(): + pd.api.extensions.register_dataframe_accessor("wax_numba")(WaxNumbaEWMAccessor) + pd.api.extensions.register_series_accessor("wax_numba")(WaxNumbaEWMAccessor) diff --git a/wax/numba/ewma_numba_test.py b/wax/numba/ewma_numba_test.py index 9ed0a32..2610bfd 100644 --- a/wax/numba/ewma_numba_test.py +++ b/wax/numba/ewma_numba_test.py @@ -15,7 +15,7 @@ import pandas as pd import pytest -from wax.numba.ewma_numba import ewma, register_online_ewma +from wax.numba.ewma_numba import ewma, register_wax_numba def test_ewma_numba(): @@ -129,10 +129,10 @@ def test_pandas_online(obj_type): else: X = pd.Series(x) - register_online_ewma() - res_full, _ = X.wax.ewma(com=10, state=None) - res1, state = X.iloc[:10].wax.ewma(com=10, state=None) - res2, _ = X.iloc[10:].wax.ewma(com=10, state=state) + register_wax_numba() + res_full = X.wax_numba.ewm(com=10).mean() + res1, state = X.iloc[:10].wax_numba.ewm(com=10, return_state=True).mean() + res2 = X.iloc[10:].wax_numba.ewm(com=10).mean(state=state) res12 = pd.concat([res1, res2]) if obj_type == "frame": From 6e02a2b21cc3e004a35027a6d915bf482c85cbbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 00:50:17 +0100 Subject: [PATCH 40/46] correct notebooks 1 & 2 --- docs/notebooks/01_demo_EWMA.ipynb | 99 ++++++++++++++----- docs/notebooks/01_demo_EWMA.md | 32 ++++-- docs/notebooks/01_demo_EWMA.py | 27 +++-- .../02_Synchronize_data_streams.ipynb | 88 +++++++++-------- docs/notebooks/02_Synchronize_data_streams.md | 10 +- docs/notebooks/02_Synchronize_data_streams.py | 10 +- 6 files changed, 177 insertions(+), 89 deletions(-) diff --git a/docs/notebooks/01_demo_EWMA.ipynb b/docs/notebooks/01_demo_EWMA.ipynb index df338ac..744b4d2 100644 --- a/docs/notebooks/01_demo_EWMA.ipynb +++ b/docs/notebooks/01_demo_EWMA.ipynb @@ -33,7 +33,6 @@ "name": "stderr", "output_type": "stream", "text": [ - "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n", "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" ] }, @@ -47,7 +46,7 @@ { "data": { "text/plain": [ - "[CpuDevice(id=0)]" + "[]" ] }, "execution_count": 3, @@ -493,8 +492,7 @@ " grid-template-columns: 125px auto;\n", "}\n", "\n", - ".xr-attrs dt,\n", - ".xr-attrs dd {\n", + ".xr-attrs dt, dd {\n", " padding: 0;\n", " margin: 0;\n", " float: left;\n", @@ -542,17 +540,17 @@ " title: 4x daily NMC reanalysis (1948)\n", " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." ], "text/plain": [ @@ -620,7 +618,50 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAESCAYAAAD0aQL3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABCdklEQVR4nO2deXhU1dnAf2/2PSEkQAKBsK8KCCLugBti+7nUKta6tFW/WlvFpRVbta6t+9bWflK12tZaq1C1ggsoLqiggOwg+76FACEsSUhyvj/unckkmSSTZGbuzNz39zx5cu655977TnLnvve8513EGIOiKIriPuKcFkBRFEVxBlUAiqIoLkUVgKIoiktRBaAoiuJSVAEoiqK4FFUAiqIoLiXBaQFaQ15enikuLnZaDEVRlKhiwYIFe4wx+Q37o0oBFBcXM3/+fKfFUBRFiSpEZJO/fjUBKYqiuBRVAIqiKC5FFYCiKIpLUQWgKIriUlQBKIqiuBRVAIqiKC5FFYDSbqpratG04ooSfagCUNpFxdEa+vzmXS549gunRVEUpZWoAlDaxd1vLQNg8Zb9VNfUOiyN4laqa2r5+9xNbCo95LQoUUVURQIrkYMxhtW7DvLv+Vu9fU/OWs0vzxngoFSKGzlSVcPAu99r1L/h9xMQEQckih5UASitxhhDzztmNOr/euM+B6RR3MrCzfu4qBnT45frSzmpd14YJYo+1ASktJqfv/qN3/6vNuwNsySKm2nu4Q9w7cvzqThaQ+nBSiqra5g8dQlrdx8Mk3TRgc4AlFax91AV05fsqNc39fqT+N6fdRFYCR/b9h9p1HfjGX1585tt1NQatu0/wqGqGgbcVd809K+vtwDw7k2nMrAgKyyyRjI6A1ACxhjDcffP9G5fOrKIr35zBiN6dOC0flam2fUl+oalhJ7H3v+23vb0G0/hlrP68emvxjLn9rEtHn/u05+FSrSookUFICJFIjJbRFaIyHIRucnuHyoiX4rIUhH5r4hk+Rxzh4isFZFvReScJs7bU0Tm2eNeE5Gk4H0sJZgcrKym4mgNT3+4pl7/wxcfS6fMFAB2lVUAMO7xT8Iun+IOSsoreWrWakrKK/nPN9sAeOrSYWx86DwGF2Z7x4kIXXNSWzzfhj3qMRTIDKAauNUYMwgYDdwgIoOA54HJxphjgP8AvwSw900EBgPjgWdFJN7PeR8GnjTG9AH2AT9p74dRgs+iLfsZ8tv3GXDXezw1q04BfPXrM+qN+9Plx3nb89aXhk0+xT0c/+Asnpq1huMfnOXtO2dwF79jP7rtdG/7zIGdAJh1y2k8/v2h3v7r/7EgRJJGDy2uARhjdgA77Ha5iKwEugL9gE/tYTOB94G7gPOBfxljKoENIrIWGAV86TmnWL5Z44Af2F0vA/cAf27/R1KChTGGC/70eaP+l350PJ2yUur19c5P97b/9uUmTujVMeTyKe7hYGW13/7UJH/vlpCcEM/Gh85r1N+nUyYjiztw+qMfs+9wVVBljEZatQYgIsXAcGAesBzrYQ/wfaDIbncFtvgcttXu86UjsN8YU93MGMVhPlld0qiva04qY/p3atQvIjx68bEATF+6o9F+RWkPz85e26jv52P7tOlcPTpaLyu7DlS2S6ZYIGAFICIZwFRgkjHmAPBj4GcisgDIBEKiTkXkOhGZLyLzS0oaP5CU4FNTazj90dlc/devvX2n9s3j7EGd+fRXTS+wXXRcN297o9pXlSDy/JwNAPzZNjV2SEvk1rP7tfl8mSmW8aOpmYVbCMgNVEQSsR7+rxhjpgEYY1YBZ9v7+wGe+dY26mYDAN3sPl9KgRwRSbBnAf7GYF9nCjAFYOTIkZpxLAwcd/9Myo4c9W7PuPFUBhW27DIXH1cXdTl/0z6K89KbGa0ogVFTa6iqttKMjB/Sxa9pp7UMLMjiqw17GXrvB6x54Fzi4twZMRyIF5AALwArjTFP+PR3sn/HAXcC/2fvehuYKCLJItIT6At85XtOY6WOnA1cbHddBbzVvo+iBIOvNuyt9/AHGFiQGfDxz9pvaLe9vjiocinu5OlZa+j967qo82Cldvjh6B6ApVx6/XqGa7PZBmICOhm4AhgnIovsnwnAZSKyGlgFbAf+CmCMWQ78G1gBvAfcYIypARCRGSJSaJ/3duAWe5G4I5aSURzAGMP6koMYY7jkuS/r7Zv2s5Na9aUb67M+0DBgTFFaw42vfsOTs1Z7t0f3yg3auf9naGG97fveWUFtrfuUQCBeQHOApp4ATzdxzIPAg376J/i012N5BykO48nr47uoNunMvkw6s/U2Vl+vjBv+uZDzjm3/dF1xHxv2HOLtxdvr9T13xcigXuP8YYW8tci6xl8/38inq0v48NYxQb1GpKORwC5l3yFrzX7rvsPevj/6eFq05eHvYcoVI7ztD5bvbPN5FHdSdvgoYx/7uF7fZaOKyE5NDOp1np44nNm3jfFurys5RGV1TVCvEemoAnAhZz/5CcPvn8k9by/nlIdnN9p/7/8Mbt/5fYJzrvu7BtsoreOm1+qSDaYnWf78v7/o2JBcq2deOhePqPNem7rAry9KzKIKwGVsKj3E6l1Wvp6Xvtjod8yVJ/Zo93Xm33mmt90wnsCtC25Ky5QerOTjb+vulwV3nRXyaz72/aHcepY1473n7eUhv14koQrAZTwxc7Xf/uX3nsOonrk8evGxQfG0yMtI9ravevErfj9jJcYYLnz2c3reMYOKo+6aaiuBcdaTn3rbH956OimJ/iN9g83P7PWvKpdVtVMF4DI8i16+/Gp8f9KTE/j3/57I90cW+TmqbXw+eZy3/dyn63lw+kq+2bwfgHv/6643LSUw9h6qiyftnZ8Rtuv6xrC4aYaq9QBcyvJ7z+FAxVES4uLIz0xu+YA20DAjoyeaEywX0VDZdZXoZOnWMm/b14QYLm47ux+PfbCaQ1U1ZCS749GoMwAX4VswOz05gYLs1JA9/D181kTqiAMV7g7BVxrz27eXAVCYnVLPhBguPA/9txa5ZyFYFYCL2Gnn7J9wjP8UuqGgKDeNjQ+dR0F2XfbQTrbS2X2gImxyKJFNZXUNC23z4N9+coIjMpxo1w9et9s9eaxUAbiEw1XVXDplLgDXntor7NeffdsY+nfO5LHvD+X4Yiui809+Mjwq7uTyv8zztns5lEOqX2drzeGzNe5JOqkKwCVc+txcb9uJ6XVKYjzv33waF4/oxj12nMHLX24KuxxK5HGkqob5m/YB0K1DqmOJ2Tzeb2tcVDheFYBLWLqtboGtKDfNQUmot+4wf+NeByVRIoE9B+vy8k/72UkOSgJnDLByWbnFE0gVgAuo9vFtfuOnJzooSR0jenQAaFRnWHEf//p6MwCjeuZ6a0w7RW66VZp86kJ3LASrAnABH63aDVimn5HFwcuo2B7+74dWvqDP1uxxWBLFad5dZuWLuvs7gxyWBE7vnw/Ajv1HHJYkPKgCcAGefDyXn9DdYUnq8DUDNaw/oLiL9SWW182QrtkOSwLj7TxWjzcRMR9rqAJwET8+pafTItTD4w66dne5w5IoTrHMZ20qEkiId9cj0V2f1oXM/na3tx3sdLrtxVM9bPoSTRntVr7zhzkADCpoueRouPieXdu67HDsz0xVAcQw4x7/mB/Zhd3PHtTZYWkaU2Cninjx8w0tjFRinfsvGOK0CF5SEq3H4pfrY399KpCawEUiMltEVojIchG5ye4fJiJz7RKR80VklN3/S5/SkctEpEZEGq08ishLIrLBZ+ywoH86F7NmV7nXtgrw+CVDHZTGP765gjQ7qPuY8uk6b9vjFRYJeAIlV2w/4LAkoSeQGUA1cKsxZhAwGrhBRAYBjwD3GmOGAXfb2xhjHjXGDLP77wA+McY05ez9S89YY8yi9n0UxZflDW7ezJTIMv80ZMMe94TfKxa/m7EKgM5Z4Q9MbI5OtjzPfBT7keotKgBjzA5jzEK7XQ6sBLoCBvAY7rKxCsM35DLg1eCIqrSGSa8tAiAzOaFeWuZI49VrRwPUKwKixD5f+wQAvnKNM7l/miItKYG+nTLokuVsTEI4aNUagIgUA8OBecAk4FER2QI8hvW27zs2DRgPTG3mlA+KyBIReVJEIus1IIopr6hbvJr76zMapWWOJIZ3zwGgpLyy+YFKTDFr5S5vu0+nTAcl8U9SQhw7D1RQejC278uAFYCIZGA9zCcZYw4A1wM3G2OKgJuBFxoc8l3g82bMP3cAA4DjgVzg9iaue529xjC/pETfEgNhts/bdHqE5zVPSYyna04q+w9XtTxYiRme+2Q90HS6cKcZYweEnfbIbOas2cN9/11B8eTp/CHGItcDUgAikoj18H/FGDPN7r4K8LRfB0Y1OGwizZh/bNOSMcZUAn/1c7xn3BRjzEhjzMj8/PxAxHU9N75qFdWOpIW15ti2/wjTvnFH6L1Sn0idnZ450PKaO1RVww9fmOf1VHt85up6dTWinUC8gATr7X6lMeYJn13bgdPt9jhgjc8x2fa+t5o5b4HP+S8AlrVSdsUPtbV1SaweuTg6Km4N6GKZANQTyB28s6RuudCpzJ8tMbCZuIQ734ydR1UgM4CTgSuAcT4umxOAa4HHRWQx8DvgOp9jLgQ+MMbUU5UiMkNECu3NV0RkKbAUyAMeaOdnUaifViGcNVXbw49PtiKU17ooDa+b+fk/rRnq6f0id0afkhjfKHGiZ7YSS/mrWjQQG2PmAE2p6RFNHPMS8JKf/gk+7ch1TYli/mObUs4c2MlhSQKns10t7LWvt0REPhgldGwuPexte+pCRCoji3NZes/ZQJ0bdfHk6QDsKDtCQXZkmq9ag0YCxxj3vbMCgHMGh6/sY3s5tY9Viq/WJTnY3cyN//rG2y7u6GxdikDITEmsF0NzwTDLgLF8W2wEiakCiCF8i1hcMLyrg5K0Do8d+JV5mx2WRAk1i7bsB+CZy4Z7K3BFE9fYUcLXv7LAYUmCgyqAGOL95XVJ1RKjLKuhx75aW2v4cl0pT3zwrWuqMrmFg5XV3vZ3jy1wUJK2M7jQWhzulRcd62stEdlO4kqr+NNsK7fK+Cgy/3gYWdyBbYuOcMYTn3jTQpzQqyMn2+YhJfr5bHVdfEo0vv2DJfd5xxYwe9VujDFR+zk8RNdrotIsnrq/kZj4rSUutE1WvjmBLn9+nlPiKCHg5n8vAuD28QOcFaSddOuQyuGqGvYeiv7gRVUAMUikR//6Y0x//15LH/vUM1Cim4qjVm3qS0Z2c1iS9nFcdyvAcvv+CoclaT+qAGKEL9eVAlCQHb0JrP5w2XAArvGpXHa1Xc9AiW7mri/1tjtmRHfaL8961bb9h1sYGfmoAogRPAvAXaJYAXx3aCEbHzqPO78ziEV3n+W0OEqQOFJVw8QpcwFIijLnBH/0yk8nThqnXI9Gov+/oQBQYmctfOrSYc4KEiRy0pK8bY0Qjm5O+N0sb/vu7w5yUJLgkJaUQOesFLbtP+K0KO1GFUCMMH3JDgC650Z+cE2gTDqzLwD3/ne5w5IobWXvoSoOVNS5f15+QncHpQkeBdkpbFcFoEQSCXES9W5pvniCbjJTom9RW7H4w0d16ZMX//bsmLk/i3LT1ASkRAa7yy1vhOOiJP1zoGTY3kwzlu5sYaQSiWzff4S/fr4RgGtP7Ul2amSXJW0N/btkUl5RzeGq6pYHRzCqAGKAJVss///KGEynfNYgKy97VXWtw5IoreFoTS0nPfSRd/vWs/s7KE3w6ZhurVG9G+UvJ6oAYoApn1rVlR79fvQFgLWEJ2XwJ6u1Glw08eOX6rvvpiTGOyRJaDixlxWhvn5PdDsoqAKIcqqqa/nKLrCdH+X+1f7wVDVbuSP67a1uobqmtl7O/Ok3nuKgNKGhu53J1JN+JVpRBRDF1NQa+t35rne7Q3pSM6Ojk4EFWeRlJNVLEaFENr41qaffeAqDC2O7xkM0Jy1UBRDF/McldXSHdsth8db9TouhBMjkqUsAyyU5lh/+/3u65aX23rKdvLFgK29G4fcxkJrARSIyW0RWiMhyEbnJ7h8mInPtEpHzRWSU3T9GRMp8ykfe3cR5e4rIPBFZKyKviUjsvb6GmNteX+xtv3bdaAclCS29O2Wwbd+RqH7TchPltt//Wzec7LAkoeU7x1jFYf67ZDu3vb6YSa8t4scvfc0eOygzGghkBlAN3GqMGQSMBm4QkUHAI8C9xphhwN32tofPjDHD7J/7mjjvw8CTxpg+wD7gJ239EG7E92H49MRhnNCro4PShJaiDqlUVteysTT6c6+4gaoay2MrFk2SvnhqA/i6KX+0ajcXPvu5UyK1mhYVgDFmhzFmod0uB1YCXQEDZNnDsoHtgV5UrGiQccAbdtfLwAUBS62wcPN+b/v8YdFT/ast9O9i3WbrNCVExON5+40ln/+m8FSya8iWvdETIdyqNQARKQaGA/OAScCjIrIFeAy4w2foiSKyWETeFRF/lZ87AvuNMZ4oiq1YSkUJEI/5Z1RxrsOShJ6uHazsi+8sCfgdQ3GIe9620nZ43o5jnRvG9va2Z982xts+UhUdMTkBKwARyQCmApOMMQeA64GbjTFFwM3AC/bQhUAPY8xQ4A/Am+0RUESus9cY5peUqC+4B49XzO+/d4zDkoSevAzLlPDmIlUAkc7sVVb9htvOia3Ar6b45TkDeOKSocy8+TR65qXzyMXHAvDGwq0OSxYYASkAEUnEevi/YoyZZndfBXjarwOjAIwxB4wxB+32DCBRRBrW9SsFckTEk+SlG+B3Cd0YM8UYM9IYMzI/Pz/AjxXbHK2pi4rtnR8btUmbIzkhnrQkK5Co9GAlxZOnUzx5Oh+u3OWwZEpDDtlvvp6iKW7gouO60bdzJgAX2ObYaDFXBuIFJFhv9yuNMU/47NoOnG63xwFr7PFd7GOwPYPisB74Xoy1gjkbuNjuugp4q+0fw128OGcDYCV/cwuds6w6ByMeqEst/JOX51MRg+kvopUl6qpLUkIcvfLS+WB5dKSICGQGcDJwBTDOx7VzAnAt8LiILAZ+B1xnj78YWGb3PwNMtB/4iMgMESm0x90O3CIia7HWBF5ACYgdZVbyt7u+E/251QPl2cuP89s/4v6ZYZZEaYq3bBNdf/tt2K1075hGZZTkrmoxz64xZg7Q1KvmCD/j/wj8sYlzTfBpr8c2Gymt46UvNgJwxegezgoSRvr5PFT6dc7gn9eOZuQDszhUVcP8jXsZ6YLF8EjnBXtm+twVjR4LrqJPfgYff1vC0q1lHNMtsgPhNBI4imnKDS0WiY8Tvn1gPCvuO4cPbj6dvIxkb/1j34A4xXl6dIydokRtwROTM29DaQsjnUcVQJTh8bM+oaf73nitxeC6Sevnt48D0ACxCGDLXut/kJIYFzNFX9rKmQM7AfDA9JUOS9IyqgCijDcWWO5la6LEyyCUxMUJo2xFWHb4qMPSuJs5a63snwO6uMP/vzmiSQGqAogyNttvWn+8bLjDkkQGnnTRa3aXOyyJu7lj2lIAHrX94N3OrWf1A2B9SWS/qKkCiDL+OW8zAEOLcpwVJEK4eEQ3ADapGcgxfF1xO8ZgTYq24HFKWLkjsl9MVAFEEb7h5Z7AKLfTrUMqCXHC0m1lToviWtb5vOXmxngCuEAZWmR5/yzfHtn3pSqAKOLPH6/1tqPJzhhKkhPiKc5LZ6cdG6GEn8c/WA3AT0/v3cJI95CWlECv/PSIfzFRBRBFPPORpQAuHK5583zJy0iKqhzsscZHdv6fsf01VYsvgwqyvN5RkYoqgCjh87V1NVZ/Nd4dibYCJS8jmdJDVU6L4UrKjtR5X41yoWtyc/TomMbG0sOUV0Suh5oqgCjh8ufnedsF2akOShJ5FOaksnnvYc0L5AC+KbrVLFkfj0vsxj2ROwtQBRAFVFbXPdjuP99feQV30yc/g5paQ0m5moHCzW/+swyA287u57AkkUc3u47Ffe8sd1iSplEFEAU8PWuNt/1DF+X/CZS8TMvzRNcBwovvi8nEUd0dlCQy6d/Fyl/19cZ9DkvSNKoAooBnP14HwPHFHXSa7Yc82/d8t84AwsqAu97ztvPU/78RaUkJ3r/LocrqFkY7gyqAKOIf15zgtAgRSbcOVvKxVREedBNLbN9/BCvJO/TKT3dWmAjmRycXA3UR/JGGKoAIx7f6V3KCBn/5Izc9iU6ZyWzdF5lfsljkB3+Z622/eu1oByWJbE7pYxVDXBuhubtUAUQ4pQct90ZPygPFP4U5qd5COUpoMcZ4M7CO6pnrrdamNKZf50xEiNiAMFUAEc4/v7Jy/3g8ChT/FOWmsWLHAYzHLqGEjFkrd3vb+vbfPKlJ8fTOz2BzhOaqCqQmcJGIzBaRFSKyXERusvuHichcu0TkfLv+LyJyuYgsEZGlIvKFiAxt4rwvicgGnzKTw4L6yWIEzwPtMvWyaJah3bLZe6iKfZoWOuT45reJd1FRoraSmhjPexFaIziQGUA1cKsxZhAwGrhBRAYBjwD3GmOGAXfb2wAbgNONMccA9wNTmjn3L40xw+yfRW38DDGNJ9GWTrObp3uutRD88be7WxiptJenbLfkmTef5rAk0YEnQd4D76xwWJLGtKgAjDE7jDEL7XY5sBLoChjAU/0hG9huj/nCGONxfJ0LqPG6HcxYGplvDpHGoELrVly+/YDDkriH3vkZTosQFZzcxyoR+fycDXy6usRhaerTqjUAESkGhgPzgEnAoyKyBXgMuMPPIT8B3m3mlA/a5qInRUQdiZU2061DGnkZyRHrbx0reFKS9+2U4aqa1O3hRyf39LavfPErByVpTMAKQEQygKnAJGPMAeB64GZjTBFwM/BCg/FjsRTA7U2c8g5gAHA8kNvUOBG5zl5jmF9SElnaM9R4Fo5+7HMDKU3TtUNqvQVKJfis3mXFWmhJ0sBJjI9j5X3jvduR5KgQkAIQkUSsh/8rxphpdvdVgKf9OjDKZ/yxwPPA+caYUn/ntE1LxhhTCfzV9/gG46YYY0YaY0bm57sr3eyfP7HSP3+10e+fUGlAl6xkDlYejagvWKzx8bfWS9gTl/j17VCaIDUpnjvPGwjArgORE7EeiBeQYL3drzTGPOGzaztwut0eB6yxx3fHUgxXGGNWN3PeAp/zXwAsa4P8MU2vPMvG+tBFWmc1EI4vzqXiaG29FMVKcHlylvWV7tc502FJoo/h3XMAWLApcnIDJQQw5mTgCmCpiCyy+34NXAs8LSIJQAVwnb3vbqAj8Kydt6baGDMSQERmANcYY7YDr4hIPiDAIuCnwfhAscSDM1YCVmEJpWU8abI3lR4mJ01LEwab2tq6mZWmf2g9gwuziROrgM55xxY4LQ4QgAIwxszBekj7Y4Sf8dcA1zRxrgk+7XEByuh6dLEtMDyeQCt2HGBoUY6zwsQgG0oPedtpSYG8Oyq+pCTG0zkrhQ17Imf9RCOBI5jijmmcO6SL02JEDd1z00iMl4gvwxetXPvyfADOHNjZYUmil9P75UeUq7Kq8Qhl+fYyb74VJTDi44SuOams2BE5X7BYYc/BStbvsWYA3x+poT1tpXNWCpXVtWzcc4jiPOfNaDoDiFC+3Wm52+VnanhEaxhcmM36kkMtD1RaxRUv1PmvnzGgk4OSRDen9LWygy6JkORwqgAilBfmbADg4e+pB1Br6NbBqg/sW61KaT8rfWZVCfH62Ggrx3TNJj5OmLc+Mly79T8ZoXjshDoDaB2exd/PVu9xVpAYwjeu4t2bTnVQkugnJTGegQWZvL1ou9OiAKoAIpLFW/Z725kpic4JEoWc0DMXgD99vNZhSWKH1xds9bYHqktyuynumE55ZTUlEVDCVBVABPKHj/Th1VY8mRe/2byfVTt1MTgYTLUVwPnDCh2WJDY4f1hXAOZGgBlIFUAEMmvlLgD+8ROtAdxaRMRbh3X8U585K0yMMG/DXgB++93BDksSGwzpas2iPomAzKCqACIM32jLUbY5Q2kdd543yNuu9qmprLQPz+xKaR8F2amMKs711vpwElUAEcaOA3V1bZMS9N/TFuLjhGtPtTKoaixF+/AsAI/o0cFhSWKLYd1zWLq1zHFvNX3CRBjb9x8B4OqTip0VJMo5e7AVQb11nyqA9vD5WstOrW//wWVgQSbVtYat+444KocqgAjjln8vAuCk3h2dFSTK8ZSIXKt569vFLntG+oMTtCZ1MOmea0UBbyp1NmhRFUCEkZIQD6DJzNpJp8xk8jOTvRHVSttYvHU/AMO65TgqR6xR3NF6QdnksIlSFUAEYYzxVlrSIvDtQ0Qo6pDK9jJnp9jRzt++3ARAVqrGowST3PQkMpITVAEodRyu0vQFwaQwx0oLobSdpPg44uOEeE1JHlREhB4d09ioJiDFg+dtQBeAg8PAgiy27D1CeYVWCGsL60oOUlVTS4p6o4WEHh3TvHW/nUL/sxHE5GlLACiyFzCV9uFZCN6+v6KFkYo/znj8E8B6W1WCT4+O6WzZd5iaWudqWAdSE7hIRGaLyAoRWS4iN9n9w0RkrogsEpH5IjLK7hcReUZE1orIEhE5ronzjhCRpfa4Z8Tld9maXeUs2WqliP3u0MgoFxftdO3gKRGp6aFby6wVu7zt1396ooOSxC49ctM4WmPY5qAraCAzgGrgVmPMIGA0cIOIDAIeAe41xgzDqgP8iD3+XKCv/XMd8OcmzvtnrLrCnrHj2/gZop4V2w9w1pOferc7ZeoCcDDo3zmTOIGlEZJ7PZq45m/zvW0tAB8aetoFYT5YsdMxGVpUAMaYHcaYhXa7HFgJdAUM4EkNmA148pueD/zNWMwFckSk3iutvZ1ljJlrrFDDvwEXBOHzRCUTntGcNaEgPTmBwpxULRHZSo74OCM8dNExugAcIo4vtlK9OOmo0KqSkCJSDAwH5gGTgPdF5DEsRXKSPawrsMXnsK123w6fvq52f8Mx/q55HdZMgu7dYz8YZer1Ot0OJt1z01inFcJaxRsL676aF4/Q8o+hIi5OGNGjA6t2OBerEvAisIhkAFOBScaYA8D1wM3GmCLgZuCFUAhojJlijBlpjBmZn58fiks4ysLN+7ztFfedw4gemgAumAwuzOLbneX1ipoozXPXm8sAGNs/X6t/hZiBBZms3HnAsfszoP+uiCRiPfxfMcZMs7uvAjzt14FRdnsbUORzeDe7z5dtdn9zY1xB6cEqwLJXpyW1akKmBEDXnFSqamrZe6jKaVGihsR4y+Tz+CXDnBXEBQzokkV5RTWLfIpAhZNAvIAE6+1+pTHmCZ9d24HT7fY4YI3dfhu40vYGGg2UGWN8zT/Y2wdEZLR9/iuBt9r3UaKTL9dZybaevmyYs4LEKF2yrQX1nQfUFTRQjtZYb6OaAC70nGjn/Hr4vVWOXD+QV86TgSuApSKyyO77NZYHz9MikgBUYNvpgRnABGAtcBj4kedEIrLI9hoC+BnwEpAKvGv/uI4XP7eKv+dlaO3fUOBJurV290EGF2Y7LE3kU3HUWgD25KpRQkvv/AwA5q7f68j1W1QAxpg5QFNuACP8jDfADU2ca5hPez4wJCApXYAqgNDQK9+TdVE9gQLhgB01/ZNTejosiXv43nHdmLpwKyu2H2BQYXhrLusKj4Ooe2LoSUmMJy8j2dFgm2hi8RYrZqLsiKbPCBee1C8rdoS/hrUqAAf5Yt0ep0VwBV07pLJ1vyrbQFi+3VIA/buE903UzQwoyCQxXlhqp94OJ6oAHOT2qUsBePHqkQ5LEtsUddCsoIGSlmTVoxjdS92Rw0VifByDCrJY5UDtClUAEUCPjulOixDT9MxLZ8veI5QdVrNGS/xuhuWNkpGsLsnhpDgvnW37w2+mVAXgENU1td62xxNACQ0ed8afv7rQYUmiB5fnZgw7hTmp7Cir8HphhQtVAA6x97AGJoWLy0ZZKUQ+W7OHWSt2aVBYE3iiUQcVqP0/3AwpzKam1oS9hrUqAIeYZ/v93n/+YIcliX1SEuO97Wv+Np+zn/zEQWkiF09akhE9OjgsifvoYcddbN13JKz1AVQBOMQvXv0GQHOthIk1D57rbe85WEWtg0U4IhVPVHq1/m3CTmGOVbvip/9YQO9fz2BZmFKY69PHIQrtFAUThmjxl3CQGB/Ha9eN9m6vKwnvVDsa8Pih3z6+v8OSuI8OaYn1tt9evL2JkcFFFYADGGPYXmblpslu8I9XQscJvToy48ZTAbzV15Q6Ziy1CpNkpeg9GW4aLrqXlFeG5bqqAMLAsm1lFE+ezqerSwCoOGp5ADXU+kro6dc5g6yUBOZvcib3SjQQpwVgHGHx3Wfz1KXDGNUzN2xlTFUBhJjiydP5zh/mAHDli18BMHe9ZWv9+bi+jsnlVhLi4xhcmM3Uha7MPt4kngfO8O45zgriYrLTErlgeFd65aWHLXBRFUAIWbu7cWTf9v1HmPLpegD2HgrPNE+pT0FOClXVtd7EZwpMsxWiusg6T4+O6ew5WMX2MASGqQIIIWc+8WmjvpMe+og1tmL4hc4AHOHsQZ0B2KwZQgH4dHUJT39olfP4y5WalsRpxg6wKh++uyz0xeJVAYSBnLREbhzXx7u9x64C5uufroQPT+qNjWGys0Yy2/Yf8ZomwaqgpjjLgC5ZdExP4oXP1of8WqoAQoSvm+Giu8/mlrPVtS5S8ATdbNyjCuDkhz6qt52uOYAigp556ew9XBXyWsGqAELErBW7GvU9c9lwb7tfZ83/4xRpSQnkpiexo8zdZSJ981EBPHdFo/pOikP8z7BCKo7WsjXEdSwCqQlcJCKzRWSFiCwXkZvs/tdEZJH9s9FTLlJELvfpXyQitSIyzM957xGRbT7jJgT7wzmJZzHt7Z+f7O2bMKSLt/3nH+qXzUnyM5LZc9Ddi/Df7qpzUlh1/3jOGdylmdFKOBleZKXjWBriiOBA5nvVwK3GmIUikgksEJGZxphLPQNE5HGgDMAY8wrwit1/DPCmMWZRE+d+0hjzWHs+QKTynO3pM9AnsVZCfBw/HN2df8zdrBlAHaZTVrLrZwDnPWO5J/fvnKnrURFGT7uU6YYQmylbnAEYY3YYYxba7XJgJdDVs1+sELZLgFf9HH4Z8K/giBr5bN13mHeW1A/hTmyQ6+eBC45h40PnhVMsxQ89OqZpnWCbOyYMcFoEpQEZyQkUZKfw4crGpuRg0qoVHxEpBoYD83y6TwV2GWPW+DnkUuD8Zk75cxG5EpiPNcvY5+ea1wHXAXTv3r014oadUx6eDVir+AC98rTQS6TSOTOFsiNHqTha48q33wU+kdBj+ndyUBKlKXLSkli4eT9Lt5ZxTLfskFwj4EVgEckApgKTjDG+1Ysvw8/bv4icABw2xixr4pR/BnoDw4AdwOP+BhljphhjRhpjRubn5wcqbtiprK4r5HDmE1a64aoGi2xK5NA5y0rGF66cK5HGff9d4bQISgt4XMdnrghdPEBACkBEErEe/q8YY6b59CcAFwGv+TlsIv7NQgAYY3YZY2qMMbXAX4BRrRE80pjmJ7XA81dpUE2kkp+VDMBulyqAxXYyvD/+YHgLIxWnOPeYAvp0yuCbLftDdo1AvIAEeAFYaYx5osHuM4FVxpitDY6Jw1oXaNL+LyK+eZAvBJqaKUQFL87Z0KivUINqIpZOmZYCKCl390Lwd44tdFoEpRn6d8kMaV6gQGYAJwNXAOP8uGw29ZZ/GrDFGFMvlE1EnhcRz2vxIyKyVESWAGOBm9v2ESIDf3k7NK1u5NIp0zIB7TrgvhlAVbVlmszLSHJYEqUleuSmsW3fkUYxG8GixUVgY8wcwG9+WGPM1U30fwyM9tN/jU/7ikCFjAYOVVlrAPPvPJMLn/2cZybq1DqS6ZieRHycsNuFM4APbJtyiINMlSDQo2Ma1bWGHWUVFOWmBf38GvcdBHaUWW//XbJSyMtI5rNfjXNYIqUl4uKE/IxkdrtwBpBg5/t/auIwZwVRWsTz0N9UejgkCkBTQQSB+9+xPCqyU9XkE010ykp25SLwpNcWAXXuykrk4klcGKp1AFUAQcBTSm+yBtREFZ0yk9l1wF0moEOV1d6KdLnpugYQ6XTJSiEpPk4VQKRy1GdxZqwG1EQVnbJSXBcHcN3f53vb8Vr6MeKJjxPyMpJCdp+qAmgnH63a7bQIShvpnJlC6aEqKo7WtDw4BjDG8PlaqxzpOYM7OyyNEii5GUkhqx6oCqCdvD7fCoHwLfiiRAfHFlnh9VMXbm1hZGzw8bcl3vbjlwxzThClVeSmJ4esVKcqgHYyy07WdM1pvRyWRGkto3t2BOA3/1nGn2avdVia0POjl772tjO08EvU0DE9iVJVAJFNpn6hoo7UpHiGdLU8YV7+YqOzwoSYsiNHve1pPzvJQUmU1pKbnqQzgEjEE1HZKTMZK2OGEm2884tTuWxUd45U1dRL6Bdr+JYoPa57BwclUVpLbnoSh6tqQrJWpQqgHWyz0z/0yte0z9HM6F65lFdWs2bXwZYHRyl3v2Wl2rrmlJ4OS6K0lo62u25TFey27jvcZuWgCqAdeCKAfzGur8OSKO3BU7XtxTkb2FR6iH/M3RTyYtzhprrG+jyXj+7hsCRKa/GkLveXt+oPH67hlIdnM+Cu9/hi7Z5Wn1sVQDuY9K9FAORlJDsriNIuetqFe6Z9s43TH/2YO99cxu/fXeWwVMFl1U6r/m9PLVIUdXTJthSAv4STf/VZu7r77eWtPrcqgHbg8aQozgt+jg4lfCTGx5GVUn8Rf9aK0JbiU5RA6ZWfTnycsGrngXr9nlnquUO6ALD/8NFGx7aEKoA2UHbkKJ+uLmH9nkPkZSSRnOC+koKxxiMXH+ttH9c9hx1lFdTWxoYZyPM5rj6p2FlBlDaRnBBP15zURjWsd5RVsPdQFSf17sivJwxgz8FKtrQyZYT6LraBofd+4G3vORga9ywlvIwfUsA3d51FRXUNn63Zw6/eWMKqneUMKoz+hGkeF9DuIcgmqYSHHh3TWF9yqF7fsm1WVbfBXbO9GV6XbStrVdZQnQG0koZvhfpWFTt0SE+iIDvV6ybZcModrbyzZDtgJYJTopNBBVms2V1e7/mzbFsZcQIDu2TRt1MmIrDUVgqBojOAVvLusvoFmieOKnJIEiVU9OiYRkKcsHJHbCiAI7aL4NgBmqwwWinKTeNojWHz3sPMWLaDR9771rsvNckyQXfrkMqzH69j54EKNpceJictkd9+d3CzM4IWFYCIFAF/AzoDBphijHlaRF4D+tvDcoD9xphhIlIMrAQ8Es41xvzUz3lzsYrJFwMbgUuMMftakscpSsorqayuYe1uy1f80pFFnNYvX3OqxyCJ8XEMLMhi2bboVADGGCZPXcrw7jlMHNXdm/65X+dMhyVT2sroXrmAVcthkU+ReE8kO8DQbjls2XuEaQu3efu+WFfKivvGN3neQGYA1cCtxpiFIpIJLBCRmcaYSz0DRORxwHfusc4YM6yF804GPjTGPCQik+3t2wOQxxGOf3BWve0HLxxCQrxa0GKVHh3TvDbWaKKqupZ+d74LwGvzt3DB8K48MXM1AEkJer9GK306Wcrb9+EP1Cs9+/TE4byzZEe9/S2l/A6kJvAOYIfdLheRlUBXYAWAWDkQLgFaWwfxfGCM3X4Z+JgIVQD7Dzde6NWHf2xTmJPKByt2UVtriIuivPmXPPdlve2HYiyewc2cO6SL1wS98aHzGu2PjxNm3zaGPQcrOaZrNn/9fCMPv7fK7/PLQ6ueYrZ5Zzgwz6f7VGCXMWaNT19PEflGRD4RkVObOF1nW7kA7MQyMfm75nUiMl9E5peUlPgbEnJ886gAdEjT0o+xTp/8DKqqa9lQeqjlwRFC6cHKRm+IL9mBQheP6BZ+gZSgMvlcq+LgRcd1bXJMz7x0ji/OJSUxnn6dMwBYV9L0PRywAhCRDGAqMMkY42scvQx41Wd7B9DdGDMcuAX4p4g0ayg3VkSDX6drY8wUY8xIY8zI/Pz8QMUNKtOX1F/4nXBMgSNyKOGjp53faeu+xtGXkcrJD3/kbd9/wZB6+1bvKg+3OEqQ6dExnW/uOouHLjq25cFAX9ts1JwzQ0AKQEQSsR7+rxhjpvn0JwAXYS3mAmCMqTTGlNrtBcA6oJ+f0+4SkQL7PAVAxJbW2l1u1Y195xencOO4PtzzP4MdlkgJNYU5qQBsiyIF4FnsvWFsb65okPPn9xcd44RISpDpkJ4U8FpOUW4qHdOT+GxN05aTFs9k2/hfAFYaY55osPtMYJUxZqvP+HwRibfbvYC+wHo/p34buMpuXwW81ZIsThEfJ3TPTWNI12xuObs/iWr/j3k6ZyYTHyd+86+0hlU7D1A8eTovztkQJMn841ub+razLee8xb8929s3uDA7pNdXIg8RYXj3Dmzc03R0cCBPspOBK4BxIrLI/plg75tIffMPwGnAEhFZBLwB/NQYs9cW6HkRGWmPewg4S0TWYCmShwL8XGFn897D5Gdqwjc3kRAfR5esFG/K77by9y83AXDfOyv87q+qruVwVfsDtN5aZAV7je2f761NkZ2ayLrfTWDV/U27ASqxTVFuKlv2Na0AAvECmgP4dYMwxlztp28qlrnI3/hrfNqlwBktXT8SWLK1jNP7ObP+oDhH15zUdiuAFT721wfeWcFvzhtYr3jQsfe+T8XRWr656yw62Hnf28JOOzX57fZCoYf4OCE+TnNVuZVuHdI4XNV0rQC1ZbTAwcpqamoNQ2IgJ4zSOgpzUtq1BlBTa1i6tS6W4Pk5G+h5xwxq7HD+9SUHvXb7x2d+6/ccgfLYB5avf5/8jHadR4ktutprWU2hCqAF3llsTa2LNY+66+iVn8H2siMcbGMOnT0HK6muNdx8Zn0fiEfeW8XNry2q57Pvqyjag8anKL5069C8AoiqXEDtnY63lgv+9LnXr1qjKN1Hr/x0jLE8gfp3aX0ahR1llvfYkK5ZLL3nbK7+69cs2LSP5z6t7xNxSp881uxun5tmUW4qI7TWr9KAog7NZwaNqqeapwh7ODhYWV0vqEbXANyHxxW0rZ5AHrt8l+wUMlMSmXr9SY3G3HhGX44vzmXXgcpmIzab40hVDVv2HqGTXTpQUTxkpSZwWjPPrqhSAMGs02qM4d/zt/j1wDhaU8uQ377v3R7bP5/MFI3+dRse+2lbZ57b91szgILsumn4RcOtKM6T+3Tk+jG9+fnYPvToaL2lfbN5f5uus2GPFenZWRWA0gAR4W8/HtXk/qgyAfmm4q84WsPG0kNtzsZ54bNfsGjLfv7v43V8dNuYevte9qmz+eYNJzOsKKdN11Cim7yMZBLaEQuw80AFSQlx9VKHPHHpML4ztIATe+V50/ie2jcPgAWb9rUpZfOuA5ai0ftUaS1RNQOo9ZkBXPniV4x/6jPeX76zmSP842veWb+nfp6MiqM1PDB9pXdbv1TuJT5O6JKd0mYFsLn0MN1yUuu5fQKMG9DZ+/AHyE1PIik+rs31B/4x14o18BQPV5RAiSoFUFldizGG6ppavtqwF2icHjUQ5m/cW2/bY1qqrTUMuOs9b/+G309AcTeFOaleU05rWbO7nN6dWnbLFBFO7N2RXeVNX6fiaE2TNYo934FOGqyotJKoUgBgBdZs9il8/O3O1ntPfLmuFICrTrTypXiKvPhmfrx9/IBGb26K+yjqkNamjKAHK6tZV3KIPgEoAICC7BR2llX63fevrzYz4K73+MHzcxvtqzhaQ+mhKgqzUzRFidJqou6Omb5kB4++bwXNFGSn8NGq3fXyoARCycFKOqQleu2ta2wFsGCTVZAsMzmB68f0DqLUSrTSKz+dkvJKKo42HU3pD08KiJN75wU0vjAnldJDlRyoOFqvf/eBCiZPWwrA3PV7GzlC3PnmMgC2l7VtlqK4m6hTAM9+vM5bFGHi8d0B+LX9BQmUdbsPMqgwy2vf99h456zZA8AHt5wWJGmVaMdjVtl9wP/beVN8sMK6R0+wS/m1RL/OmRhjrRv48sxHa+ptlx6qwhjDXvv3GwusPIyPf39oq+RTFIhCBeDLT8f0AuD1BVspO3K0hdEWxhhrap6fQXaq5Z3x6lebAUhLiicnLbGe257ibjy+9c3Z5xtScbSGb3eWc8nIbgGbZTplWYqm5GB9RZOeZDnq/fIcK8Pn76avpOcdMzju/pnM21C3lnXesVqjQmk9UakALh1ZxMybTyM5IZ4Jx3QBrKjdQNh1oJKDldX06ZThtfFX2gFmO8oq6J7bfOSc4i6K7FD6f87bzA2vLPS+oT//2Xp+/+5Kv7Epa3cf5HBVDaf0DTx4MD/DUgBb99afAazeVU733DQuPb4IgGnf1BX8njjFWhM4pU8eKYma8E1pPVEVBzCoMIv3f3MGnTLr3N3+eNlx9Fo6wxsMA1ZkZFwcJCc0/lJ4Fnw93hmXjOzGv+dvxRjD6l3ljOih4fRKHT3tHFD/sR+805fWL7pdmJ3KVScV1+vbaqff7dWK/FGedONfri/lihPrzrfVTkORl9G0h8+952uBIqVtRNUMIF6k3sMfIC5OOMNezC09WMmUT9cx8O736H/ne+w91Di0fq2dc8XjneHJ1/LlulJ2Hqigt2ZTVHwQESbab9/++O3byxv1ecpItpSHxZeUxHgKslP4wvZQ87C7vJIuthnKXyoJQO9Zpc1ElQJoiomjrMXgjaWH+N2MVd7+txdtazT2nv9ahTk8U25v9aStZRhTZ4tVFA8Pfe9Ylt5zNivvG0+vvHRG9ujAzJtPIzPZmkDva/CisetABamJ8WSltm6CvaOsgv2Hj1J22FrPqqyuoezIUe/sYESPDrxw1Ug+nzxOZ6pKUIgJBdAzz3rTuv+dlfX6PQ97Dx7zD+C1/w8osLI8PvyepTgazjAUBSAzJZHUpHg+um0Mb1x/En07Z3LxyG4ADL9/Zr2xuw5U0jkrudVxJLeeZaWNnrlyFwBrdln3a1FunVPCGQM70zUnlReuGsmY/vnMuX1smz+TogRSE7hIRGaLyAoRWS4iN9n9r/mUiNxol4BERM4SkQUistT+Pa6J894jItv8lJlsNZ4psCci0neqvPtAnffGb/5juYu+ePVIb19yQjxZKXVvagPakPZXcSe3j6+rvuW7GLzrQEWbMnNeadv+l22zagNssReE+3VufE/mpCXx0o9G0a0VZiZFaUggM4Bq4FZjzCBgNHCDiAwyxlxqjBlmjBmGVQJymj1+D/BdY8wxWMXe/97MuZ/0nMMYM6OtH6Lhm9bwohxusd+mbn19sbff4zY3bkDneuOP+AT5FKkXkBIgKYnx/P6iYwBYvr0uj8/u8so2ZebMTkukT6cM70zVE/HeUlUnRWkrLSoAY8wOY8xCu10OrAS6evaL9fS9BLs4vDHmG2PMdnv3ciBVREJuWP/nNScAlr90XJxwzak9AfhszR72Haryvk0d1z2n0bF3njco1OIpMcpJvTsC8MEKy2xztKaWrfsOt/mhvXb3Qeas3UNtrWHptjIykxO88SqKEmxatUolIsXAcGCeT/epwC5jzBo/h3wPWGiMaSqM8uciciUwH2uWsc/PNa8DrgPo3r17k7Kd1CePjQ+d591OS0rglrP68cTM1fVstNed1jjFw5Un9qBLdgpj+7c+Fa/ibjxxI898uIarTyrmOPtea6sp8dwhXXh32U427T3Msm1lDOueozmplJAR8CKwiGRgmXomGWN889Zehv3232D8YOBh4H+bOOWfgd7AMGAH8Li/QcaYKcaYkcaYkfn5ravK5S+fzzg/+dZFhHMGd9Gyj0qrERFvSpHjfF40Bha0rU7F/55u3bMvztnAxtLDLGpjkRhFCYSAnngikoj18H/FGDPNpz8BuAh4rcH4bsB/gCuNMev8ndMYs8sYU2OMqQX+AjRdtqaNJMbH8ZBtowV46UfH60NeCTo3ndG33vaY/vltqiEMMLRbNgDz7cSEPzqlZ/uEU5RmaNEEZNv4XwBWGmOeaLD7TGCVMWarz/gcYDow2RjTZH4GESkwxnjCKi8ElrVS9oCYOKq7N05AUULB2AGd+M2EgTz6wbd8fvs4r99+WxAROmUme4vDNBeEpijtJZDX4ZOBK4Bxflw2J9LY/PNzoA9wt8/4TgAi8ryIeHwwH7FdRZcAY4Gb2/1pFMUhrj2tF6sfOLddD38Pu8vrlsy6aJ1fJYS0OAMwxswB/K5CGWOu9tP3APBAE+Ov8WlfEbCUiuIiuuakegvRx8XpArASOtQgrigRxm/OGwjAzWf2c1gSJdaJqmygiuIGJhxTwIbfT1D3TyXk6AxAUSIQffgr4UAVgKIoiktRBaAoiuJSVAEoiqK4FFUAiqIoLkUVgKIoiktRBaAoiuJSVAEoiqK4FPEtZRfpiEg58G0bDs0GysJwDEAeVlW01tLW66mcwb1euOVsyzXbKiO0Tc72XK8tx4bzb9ne46Ll/uxvjGmcotYYEzU/wPw2HjclHMeEW0aVM/rlbMs12ypjW+Vs5/Xa8t0L29/Sqf97pMjpFhPQf8N0THto6/VUzuBeL9xytuWa0fK3bO+x4byeK+WMNhPQfGPMyJZHOkc0yAgqZ7BROYNHNMjoIVpkbUrOaJsBTHFagACIBhlB5Qw2KmfwiAYZPUSLrH7ljKoZgKIoihI8om0GoCiKogQJVQCKoiguJSIVgIgcdFqGlhCRC0TEiMgAp2VpiZb+niLysU+t5rAjIt1E5C0RWSMi60TkaRFJamb8JBFJC6eMPtfWezPI6P3pHBGpAKKEy4A59u+AEZH40IgTnYhV+WQa8KYxpi/QD8gAHmzmsElAVHzBHELvzSAR6/dnxCoAEckQkQ9FZKGILBWR8+3+YhFZKSJ/EZHlIvKBiKSGWzbgFOAnwES7b4yIfCoi00XkWxH5PxGJs/cdFJHHRWQxcGI4ZfWReYyIvOOz/UcRudoJWRowDqgwxvwVwBhTA9wM/FhE0kXkMRFZJiJLROQXInIjUAjMFpHZTgis92ZI5Nb70wEiVgEAFcCFxpjjgLHA41JXJ68v8CdjzGBgP/C9MMt2PvCeMWY1UCoiI+z+UcAvgEFAb+Aiuz8dmGeMGWqMmRNmWSOdwcAC3w5jzAFgM3ANUAwMM8YcC7xijHkG2A6MNcaMDbOsHvTedA/ReH8GTCQrAAF+JyJLgFlAV6CzvW+DMWaR3V6A9U8IJ5cB/7Lb/6Juqv2VMWa9/ZbwKtabGEANMDW8IsYEY4DnjDHVAMaYvc6K40XvTQUi9/4MmASnBWiGy4F8YIQx5qiIbARS7H2VPuNqgLBNs0UkF2taeIyIGCAeMMB0+7cvnu0K+4vnJNXUV/gpTQ0MMyuAi307RCQL6A5sdEKgANB7M/jo/ekAkTwDyAZ221+wsUAPpwWyuRj4uzGmhzGm2BhTBGwATgVGiUhP2756KdZCXKSwCRgkIskikgOc4bA8Hj4E0kTkSvAuRD4OvAS8D/yviCTY+3LtY8qBxpkNw4fem8FH708HiDgFYP8xK4FXgJEishS4EljlqGB1XAb8p0HfVLv/a+CPwEqsL17DcWHH8/c0xmwB/g0ss39/46hgNsYKRb8Q+L6IrAFWY9nYfw08j2VrXWIvUv7APmwK8F64F9n03gw+en86S8SlghCRocBfjDGjnJalNYjIGOA2Y8x3HBalHtH694xEovVvGan3JkTv3zRWiKgZgIj8FGuB6k6nZYkF9O8ZPPRvGXz0b+o8ETcDUBRFUcKDozMAESkSkdkissIOnLnJ7s8VkZlihV7PFJEOdv8AEflSRCpF5Daf86SIyFcistg+z71OfSYldgjW/elzvngR+cY34ElRnMRpE1A1cKsxZhAwGrhBRAYBk4EP7dDrD+1tgL3AjcBjDc5TCYwzxgwFhgHjRWR0GORXYptg3Z8ebsJahFWUiMBRBWCM2WGMWWi3y7G+HF2xohlftoe9DFxgj9ltjPkaONrgPMYY40kolWj/qG1LaRfBuj/BSigGnIflOaIoEYHTMwAvIlIMDAfmAZ2NMTvsXTupi7Js7vh4EVkE7AZmGmPmhUhUxYW09/4EngJ+BdSGQj5FaQsRoQDsBFZTgUl2ng0vth9ui2/zxpgaY8wwoBtW0MuQUMiquI/23p8i8h2swLEFzY1TlHDjuAIQkUSsL9crxphpdvcuESmw9xdgvdUHhDFmPzAbGB9kURUXEqT782Tgf+yUEf8CxonIP0IksqIEjNNeQAK8AKw0xjzhs+tt4Cq7fRXwVgvnybfDxxEr/e5ZRE50phKlBOv+NMbcYYzpZowpxkrR/JEx5ochEFlRWoWjcQAicgrwGbCUOtvor7HsrP/GSri0CbjEGLNXRLoA84Ese/xBrPS2xViLcfFYSu3fxpj7wvdJlFgkWPenr9kokqNyFfehgWCKoiguxfE1AEVRFMUZVAEoiqK4FFUAiqIoLkUVgKIoiktRBaAoiuJSVAEoShOISI6I/MxuF4rIG07LpCjBRN1AFaUJ7Pw/7xhjNK2IEpMkOC2AokQwDwG97SSDa4CBxpghInI1VgbQdKAvVvrnJOAKrNTkE+zAsN7An4B84DBwrTFGI9SViEFNQIrSNJOBdXaSwV822DcEuAg4HngQOGyMGQ58iVUoHqzi4L8wxowAbgOeDYfQihIoOgNQlLYx264RUC4iZcB/7f6lwLF2BtGTgNetlEIAJIdfTEVpGlUAitI2Kn3atT7btVjfqzhgvz17UJSIRE1AitI05UBmWw60E8BtEJHvg5VZVESGBlM4RWkvqgAUpQmMMaXA5yKyDHi0Dae4HPiJiCwGlmOVklSUiEHdQBVFUVyKzgAURVFciioARVEUl6IKQFEUxaWoAlAURXEpqgAURVFciioARVEUl6IKQFEUxaWoAlAURXEp/w9crohaw3t1fgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "air_temp_ewma = dataframe.ewm(com=10).mean()\n", + "_ = air_temp_ewma.mean(1).plot()" + ] + }, + { + "cell_type": "markdown", + "id": "7cc35372", + "metadata": {}, + "source": [ + "## wax numba ewma " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "145f88b9", + "metadata": {}, + "outputs": [], + "source": [ + "from wax.numba.ewma_numba import register_wax_numba\n", + "register_wax_numba()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "896eddae", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", "text/plain": [ "
" ] @@ -632,8 +673,8 @@ } ], "source": [ - "air_temp_ewma = dataframe.ewm(alpha=1.0 / 10.0).mean()\n", - "_ = air_temp_ewma.iloc[:, 0].plot()" + "air_temp_ewma= dataframe.wax_numba.ewm(com=10).mean()\n", + "_ = air_temp_ewma.mean(1).plot()" ] }, { @@ -646,13 +687,13 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "id": "8092af49", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -664,8 +705,8 @@ } ], "source": [ - "air_temp_ewma = dataframe.wax.ewm(alpha=1.0 / 10.0).mean()\n", - "_ = air_temp_ewma.iloc[:, 0].plot()" + "air_temp_ewma = dataframe.wax.ewm(com=10).mean()\n", + "_ = air_temp_ewma.mean(1).plot()" ] }, { @@ -690,13 +731,15 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "id": "3fb242f2", - "metadata": {}, + "metadata": { + "lines_to_next_cell": 0 + }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -713,8 +756,8 @@ "\n", "def my_custom_function(dataset):\n", " return {\n", - " \"air_10\": EWMA(1.0 / 10.0)(dataset[\"air\"]),\n", - " \"air_100\": EWMA(1.0 / 100.0)(dataset[\"air\"]),\n", + " \"air_10\": EWMA(com=10)(dataset[\"air\"]),\n", + " \"air_100\": EWMA(com=100)(dataset[\"air\"]),\n", " }\n", "\n", "\n", @@ -723,8 +766,18 @@ " my_custom_function, format_dims=dataset.air.dims\n", ")\n", "\n", - "_ = output.isel(lat=0, lon=0).drop([\"lat\", \"lon\"]).to_pandas().plot(figsize=(12, 8))" + "_ = output.isel(lat=0, lon=0).drop([\"lat\", \"lon\"]).to_dataframe().plot(figsize=(12, 8))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7cd8d59c", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [] } ], "metadata": { @@ -733,7 +786,7 @@ "formats": "ipynb,py,md" }, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -747,7 +800,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.10" + "version": "3.9.9" } }, "nbformat": 4, diff --git a/docs/notebooks/01_demo_EWMA.md b/docs/notebooks/01_demo_EWMA.md index d22f373..6db9acb 100644 --- a/docs/notebooks/01_demo_EWMA.md +++ b/docs/notebooks/01_demo_EWMA.md @@ -9,7 +9,7 @@ jupyter: format_version: '1.3' jupytext_version: 1.13.3 kernelspec: - display_name: Python 3 + display_name: Python 3 (ipykernel) language: python name: python3 --- @@ -96,15 +96,27 @@ dataframe = dataset.air.to_series().unstack(["lon", "lat"]) ### EWMA with pandas ```python -air_temp_ewma = dataframe.ewm(alpha=1.0 / 10.0).mean() -_ = air_temp_ewma.iloc[:, 0].plot() +air_temp_ewma = dataframe.ewm(com=10).mean() +_ = air_temp_ewma.mean(1).plot() +``` + +## wax numba ewma + +```python +from wax.numba.ewma_numba import register_wax_numba +register_wax_numba() +``` + +```python +air_temp_ewma= dataframe.wax_numba.ewm(com=10).mean() +_ = air_temp_ewma.mean(1).plot() ``` ### EWMA with WAX-ML ```python -air_temp_ewma = dataframe.wax.ewm(alpha=1.0 / 10.0).mean() -_ = air_temp_ewma.iloc[:, 0].plot() +air_temp_ewma = dataframe.wax.ewm(com=10).mean() +_ = air_temp_ewma.mean(1).plot() ``` On small data, WAX-ML's EWMA is slower than Pandas' because of the expensive data conversion steps. @@ -122,8 +134,8 @@ from wax.modules import EWMA def my_custom_function(dataset): return { - "air_10": EWMA(1.0 / 10.0)(dataset["air"]), - "air_100": EWMA(1.0 / 100.0)(dataset["air"]), + "air_10": EWMA(com=10)(dataset["air"]), + "air_100": EWMA(com=100)(dataset["air"]), } @@ -132,5 +144,9 @@ output, state = dataset.wax.stream().apply( my_custom_function, format_dims=dataset.air.dims ) -_ = output.isel(lat=0, lon=0).drop(["lat", "lon"]).to_pandas().plot(figsize=(12, 8)) +_ = output.isel(lat=0, lon=0).drop(["lat", "lon"]).to_dataframe().plot(figsize=(12, 8)) ``` +```python + +``` + diff --git a/docs/notebooks/01_demo_EWMA.py b/docs/notebooks/01_demo_EWMA.py index 2ee6781..fc28374 100644 --- a/docs/notebooks/01_demo_EWMA.py +++ b/docs/notebooks/01_demo_EWMA.py @@ -9,7 +9,7 @@ # format_version: '1.5' # jupytext_version: 1.13.3 # kernelspec: -# display_name: Python 3 +# display_name: Python 3 (ipykernel) # language: python # name: python3 # --- @@ -84,13 +84,21 @@ # ### EWMA with pandas -air_temp_ewma = dataframe.ewm(alpha=1.0 / 10.0).mean() -_ = air_temp_ewma.iloc[:, 0].plot() +air_temp_ewma = dataframe.ewm(com=10).mean() +_ = air_temp_ewma.mean(1).plot() + +# ## wax numba ewma + +from wax.numba.ewma_numba import register_wax_numba +register_wax_numba() + +air_temp_ewma= dataframe.wax_numba.ewm(com=10).mean() +_ = air_temp_ewma.mean(1).plot() # ### EWMA with WAX-ML -air_temp_ewma = dataframe.wax.ewm(alpha=1.0 / 10.0).mean() -_ = air_temp_ewma.iloc[:, 0].plot() +air_temp_ewma = dataframe.wax.ewm(com=10).mean() +_ = air_temp_ewma.mean(1).plot() # On small data, WAX-ML's EWMA is slower than Pandas' because of the expensive data conversion steps. # WAX-ML's accessors are interesting to use on large data loads @@ -106,8 +114,8 @@ def my_custom_function(dataset): return { - "air_10": EWMA(1.0 / 10.0)(dataset["air"]), - "air_100": EWMA(1.0 / 100.0)(dataset["air"]), + "air_10": EWMA(com=10)(dataset["air"]), + "air_100": EWMA(com=100)(dataset["air"]), } @@ -116,4 +124,7 @@ def my_custom_function(dataset): my_custom_function, format_dims=dataset.air.dims ) -_ = output.isel(lat=0, lon=0).drop(["lat", "lon"]).to_pandas().plot(figsize=(12, 8)) +_ = output.isel(lat=0, lon=0).drop(["lat", "lon"]).to_dataframe().plot(figsize=(12, 8)) +# - + + diff --git a/docs/notebooks/02_Synchronize_data_streams.ipynb b/docs/notebooks/02_Synchronize_data_streams.ipynb index 5a03efe..c40eebc 100644 --- a/docs/notebooks/02_Synchronize_data_streams.ipynb +++ b/docs/notebooks/02_Synchronize_data_streams.ipynb @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "id": "82c6278c", "metadata": {}, "outputs": [], @@ -25,18 +25,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "id": "af22b470", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n", - "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -47,10 +39,10 @@ { "data": { "text/plain": [ - "[CpuDevice(id=0)]" + "[]" ] }, - "execution_count": 3, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -108,12 +100,29 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "id": "acb6ad2d", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/emmanuelserie/mambaforge/envs/waxml39/lib/python3.9/site-packages/xarray/core/common.py:1123: FutureWarning: 'base' in .resample() and in Grouper() is deprecated.\n", + "The new arguments that you should use are 'offset' or 'origin'.\n", + "\n", + ">>> df.resample(freq=\"3s\", base=2)\n", + "\n", + "becomes:\n", + "\n", + ">>> df.resample(freq=\"3s\", offset=\"2s\")\n", + "\n", + " grouper = pd.Grouper(\n" + ] + } + ], "source": [ "import xarray as xr\n", "\n", @@ -131,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "id": "b6627056", "metadata": {}, "outputs": [ @@ -453,8 +462,7 @@ " grid-template-columns: 125px auto;\n", "}\n", "\n", - ".xr-attrs dt,\n", - ".xr-attrs dd {\n", + ".xr-attrs dt, dd {\n", " padding: 0;\n", " margin: 0;\n", " float: left;\n", @@ -498,26 +506,26 @@ " * day (day) datetime64[ns] 2013-01-01 2013-01-02 ... 2014-12-31\n", "Data variables:\n", " air (time, lat, lon) float32 ...\n", - " ground (day, lat, lon) float32 231.9 231.8 231.8 ... 286.5 286.2 285.7\n", + " ground (day, lat, lon) float32 231.89 231.79999 ... 286.19 285.69\n", "Attributes:\n", " Conventions: COARDS\n", " title: 4x daily NMC reanalysis (1948)\n", " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." ], "text/plain": [ @@ -570,7 +578,7 @@ " * day (day) datetime64[ns] 2013-01-01 2013-01-02 ... 2014-12-31\n", "Data variables:\n", " air (time, lat, lon) float32 ...\n", - " ground (day, lat, lon) float32 231.9 231.8 231.8 ... 286.5 286.2 285.7\n", + " ground (day, lat, lon) float32 231.89 231.79999 ... 286.19 285.69\n", "Attributes:\n", " Conventions: COARDS\n", " title: 4x daily NMC reanalysis (1948)\n", @@ -579,7 +587,7 @@ " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." ] }, - "execution_count": 5, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -590,7 +598,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "id": "857223b4", "metadata": { "tags": [] @@ -604,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "id": "941a4815", "metadata": { "tags": [] @@ -616,22 +624,22 @@ "\n", "def my_custom_function(dataset):\n", " return {\n", - " \"air_10\": EWMA(1.0 / 10.0)(dataset[\"air\"]),\n", - " \"air_100\": EWMA(1.0 / 100.0)(dataset[\"air\"]),\n", - " \"ground_100\": EWMA(1.0 / 100.0)(dataset[\"ground\"]),\n", + " \"air_10\": EWMA(com=10)(dataset[\"air\"]),\n", + " \"air_100\": EWMA(com=100.0)(dataset[\"air\"]),\n", + " \"ground_100\": EWMA(com=100.0)(dataset[\"ground\"]),\n", " }" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "id": "8c42ff58", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b9e898d3266643e99fa964653504058a", + "model_id": "caed18f9d51340b9b6aa5aca81419e6d", "version_major": 2, "version_minor": 0 }, @@ -645,7 +653,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "048d2581b6a34818a60923790d86853a", + "model_id": "f92c1f4f95704efba40da41be1d87150", "version_major": 2, "version_minor": 0 }, @@ -659,7 +667,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0d4ace1231de40ea8265b59aeee232f5", + "model_id": "15303d17195f406cac49ed6a8a519038", "version_major": 2, "version_minor": 0 }, @@ -679,13 +687,13 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 13, "id": "d5109ab2", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -697,7 +705,7 @@ } ], "source": [ - "_ = results.isel(lat=0, lon=0).drop([\"lat\", \"lon\"]).to_pandas().plot(figsize=(12, 8))" + "_ = results.isel(lat=0, lon=0).drop([\"lat\", \"lon\"]).to_dataframe().plot(figsize=(12, 8))" ] } ], @@ -707,7 +715,7 @@ "formats": "ipynb,py,md" }, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -721,7 +729,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.10" + "version": "3.9.9" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/docs/notebooks/02_Synchronize_data_streams.md b/docs/notebooks/02_Synchronize_data_streams.md index a6f9d6c..421906f 100644 --- a/docs/notebooks/02_Synchronize_data_streams.md +++ b/docs/notebooks/02_Synchronize_data_streams.md @@ -9,7 +9,7 @@ jupyter: format_version: '1.3' jupytext_version: 1.13.3 kernelspec: - display_name: Python 3 + display_name: Python 3 (ipykernel) language: python name: python3 --- @@ -90,9 +90,9 @@ from wax.modules import EWMA def my_custom_function(dataset): return { - "air_10": EWMA(1.0 / 10.0)(dataset["air"]), - "air_100": EWMA(1.0 / 100.0)(dataset["air"]), - "ground_100": EWMA(1.0 / 100.0)(dataset["ground"]), + "air_10": EWMA(com=10)(dataset["air"]), + "air_100": EWMA(com=100.0)(dataset["air"]), + "ground_100": EWMA(com=100.0)(dataset["ground"]), } ``` @@ -103,5 +103,5 @@ results, state = dataset.wax.stream( ``` ```python -_ = results.isel(lat=0, lon=0).drop(["lat", "lon"]).to_pandas().plot(figsize=(12, 8)) +_ = results.isel(lat=0, lon=0).drop(["lat", "lon"]).to_dataframe().plot(figsize=(12, 8)) ``` diff --git a/docs/notebooks/02_Synchronize_data_streams.py b/docs/notebooks/02_Synchronize_data_streams.py index 7fc8696..4a555fc 100644 --- a/docs/notebooks/02_Synchronize_data_streams.py +++ b/docs/notebooks/02_Synchronize_data_streams.py @@ -9,7 +9,7 @@ # format_version: '1.5' # jupytext_version: 1.13.3 # kernelspec: -# display_name: Python 3 +# display_name: Python 3 (ipykernel) # language: python # name: python3 # --- @@ -82,9 +82,9 @@ def my_custom_function(dataset): return { - "air_10": EWMA(1.0 / 10.0)(dataset["air"]), - "air_100": EWMA(1.0 / 100.0)(dataset["air"]), - "ground_100": EWMA(1.0 / 100.0)(dataset["ground"]), + "air_10": EWMA(com=10)(dataset["air"]), + "air_100": EWMA(com=100.0)(dataset["air"]), + "ground_100": EWMA(com=100.0)(dataset["ground"]), } @@ -94,4 +94,4 @@ def my_custom_function(dataset): local_time="time", ffills={"day": 1}, pbar=True ).apply(my_custom_function, format_dims=dataset.air.dims) -_ = results.isel(lat=0, lon=0).drop(["lat", "lon"]).to_pandas().plot(figsize=(12, 8)) +_ = results.isel(lat=0, lon=0).drop(["lat", "lon"]).to_dataframe().plot(figsize=(12, 8)) From 180bc0e397c9c66f6be25da1caf270de2caa3d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 11:28:16 +0100 Subject: [PATCH 41/46] correct mypy --- wax/accessors.py | 6 +++--- wax/modules/ewma.py | 10 +++++----- wax/numba/ewma_numba.py | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/wax/accessors.py b/wax/accessors.py index 95d25c9..3b6174e 100644 --- a/wax/accessors.py +++ b/wax/accessors.py @@ -13,7 +13,7 @@ # limitations under the License. """Define accessors for xarray and pandas data containers.""" from dataclasses import dataclass, field -from typing import Any, Callable, Tuple, Union +from typing import Any, Callable, Optional, Tuple, Union import jax.numpy as jnp import numpy as onp @@ -315,8 +315,8 @@ def ewm(self, *args, **kwargs): @dataclass(frozen=True) class ExponentialMovingWindow: accessor: WaxAccessor - com: float = None - alpha: float = None + com: Optional[float] = None + alpha: Optional[float] = None min_periods: int = 0 adjust: bool = True ignore_na: bool = False diff --git a/wax/modules/ewma.py b/wax/modules/ewma.py index 586ade7..f64b52e 100644 --- a/wax/modules/ewma.py +++ b/wax/modules/ewma.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. """Compute exponentioal moving average.""" -from typing import Dict, Tuple, Union +from typing import Dict, Optional, Tuple, Union import haiku as hk from jax import numpy as jnp @@ -23,15 +23,15 @@ class EWMA(hk.Module): def __init__( self, - alpha: float = None, + alpha: Optional[float] = None, *, - com: float = None, + com: Optional[float] = None, min_periods: int = 0, adjust: bool = True, ignore_na: bool = False, - initial_value=jnp.nan, + initial_value: float = jnp.nan, return_info: bool = False, - name: str = None, + name: Optional[str] = None, ): """Initialize module. diff --git a/wax/numba/ewma_numba.py b/wax/numba/ewma_numba.py index e07d430..64ebd2a 100644 --- a/wax/numba/ewma_numba.py +++ b/wax/numba/ewma_numba.py @@ -13,7 +13,7 @@ # limitations under the License. """Compute exponentioal moving average.""" from dataclasses import dataclass -from typing import Any, NamedTuple, cast +from typing import Any, NamedTuple, Optional, cast import numba import numpy as np @@ -199,8 +199,8 @@ def ewm(self, *args, **kwargs): @dataclass(frozen=True) class NumbaExponentialMovingWindow: accessor: WaxAccessor - com: float = None - alpha: float = None + com: Optional[float] = None + alpha: Optional[float] = None min_periods: int = 0 adjust: bool = True ignore_na: bool = False From 38e972e0dc3903a8ebc562b6de83475506eeb692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 11:28:30 +0100 Subject: [PATCH 42/46] format notebook --- docs/notebooks/01_demo_EWMA.ipynb | 13 +++++++++++-- docs/notebooks/01_demo_EWMA.md | 5 ++++- docs/notebooks/01_demo_EWMA.py | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/notebooks/01_demo_EWMA.ipynb b/docs/notebooks/01_demo_EWMA.ipynb index 744b4d2..3c93807 100644 --- a/docs/notebooks/01_demo_EWMA.ipynb +++ b/docs/notebooks/01_demo_EWMA.ipynb @@ -642,6 +642,16 @@ "## wax numba ewma " ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "288e3926", + "metadata": {}, + "outputs": [], + "source": [ + "from wax.numba.ewma_numba import register_wax_numba" + ] + }, { "cell_type": "code", "execution_count": 9, @@ -649,7 +659,6 @@ "metadata": {}, "outputs": [], "source": [ - "from wax.numba.ewma_numba import register_wax_numba\n", "register_wax_numba()" ] }, @@ -673,7 +682,7 @@ } ], "source": [ - "air_temp_ewma= dataframe.wax_numba.ewm(com=10).mean()\n", + "air_temp_ewma = dataframe.wax_numba.ewm(com=10).mean()\n", "_ = air_temp_ewma.mean(1).plot()" ] }, diff --git a/docs/notebooks/01_demo_EWMA.md b/docs/notebooks/01_demo_EWMA.md index 6db9acb..3da5ffa 100644 --- a/docs/notebooks/01_demo_EWMA.md +++ b/docs/notebooks/01_demo_EWMA.md @@ -104,11 +104,14 @@ _ = air_temp_ewma.mean(1).plot() ```python from wax.numba.ewma_numba import register_wax_numba +``` + +```python register_wax_numba() ``` ```python -air_temp_ewma= dataframe.wax_numba.ewm(com=10).mean() +air_temp_ewma = dataframe.wax_numba.ewm(com=10).mean() _ = air_temp_ewma.mean(1).plot() ``` diff --git a/docs/notebooks/01_demo_EWMA.py b/docs/notebooks/01_demo_EWMA.py index fc28374..088fb74 100644 --- a/docs/notebooks/01_demo_EWMA.py +++ b/docs/notebooks/01_demo_EWMA.py @@ -90,9 +90,10 @@ # ## wax numba ewma from wax.numba.ewma_numba import register_wax_numba + register_wax_numba() -air_temp_ewma= dataframe.wax_numba.ewm(com=10).mean() +air_temp_ewma = dataframe.wax_numba.ewm(com=10).mean() _ = air_temp_ewma.mean(1).plot() # ### EWMA with WAX-ML From ae3de204d0ddb6da26e2b375af20ce95d3798cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 11:33:27 +0100 Subject: [PATCH 43/46] correct call to EWMA --- wax/modules/ewmcov.py | 5 ++++- wax/modules/ewmvar_test.py | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/wax/modules/ewmcov.py b/wax/modules/ewmcov.py index 86a4e49..eebab86 100644 --- a/wax/modules/ewmcov.py +++ b/wax/modules/ewmcov.py @@ -61,7 +61,10 @@ def __call__(self, x, y=None): ) x, y = x mean_xy = EWMA( - alpha=self.alpha, adjust=self.adjust, initial_value=jnp.nan, name="mean_xy" + alpha=self.alpha, + adjust=self.adjust, + initial_value=jnp.nan, + name="mean_xy", )(jnp.outer(x, y)) if self.assume_centered: cov = mean_xy diff --git a/wax/modules/ewmvar_test.py b/wax/modules/ewmvar_test.py index a03faa4..6102b92 100644 --- a/wax/modules/ewmvar_test.py +++ b/wax/modules/ewmvar_test.py @@ -46,9 +46,14 @@ def __init__(self, alpha=0.5, adjust=True, name=None): self.adjust = adjust def __call__(self, x): - mean = EWMA(self.alpha, self.adjust, initial_value=jnp.nan, name="mean")(x) + mean = EWMA( + alpha=self.alpha, adjust=self.adjust, initial_value=jnp.nan, name="mean" + )(x) mean_square = EWMA( - self.alpha, self.adjust, initial_value=jnp.nan, name="mean_square" + alpha=self.alpha, + adjust=self.adjust, + initial_value=jnp.nan, + name="mean_square", )(x * x) var = mean_square - mean**2 var = jnp.where(var < 0, 0.0, var) From 9e581f53641868350322957c56d9824b2af1cb30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 11:33:53 +0100 Subject: [PATCH 44/46] format notebook --- docs/notebooks/01_demo_EWMA.ipynb | 16 ++-------------- docs/notebooks/01_demo_EWMA.md | 6 +----- docs/notebooks/01_demo_EWMA.py | 5 +---- 3 files changed, 4 insertions(+), 23 deletions(-) diff --git a/docs/notebooks/01_demo_EWMA.ipynb b/docs/notebooks/01_demo_EWMA.ipynb index 3c93807..a44b323 100644 --- a/docs/notebooks/01_demo_EWMA.ipynb +++ b/docs/notebooks/01_demo_EWMA.ipynb @@ -639,7 +639,7 @@ "id": "7cc35372", "metadata": {}, "source": [ - "## wax numba ewma " + "## wax numba ewma" ] }, { @@ -742,9 +742,7 @@ "cell_type": "code", "execution_count": 12, "id": "3fb242f2", - "metadata": { - "lines_to_next_cell": 0 - }, + "metadata": {}, "outputs": [ { "data": { @@ -777,16 +775,6 @@ "\n", "_ = output.isel(lat=0, lon=0).drop([\"lat\", \"lon\"]).to_dataframe().plot(figsize=(12, 8))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7cd8d59c", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/docs/notebooks/01_demo_EWMA.md b/docs/notebooks/01_demo_EWMA.md index 3da5ffa..ee4eb4c 100644 --- a/docs/notebooks/01_demo_EWMA.md +++ b/docs/notebooks/01_demo_EWMA.md @@ -100,7 +100,7 @@ air_temp_ewma = dataframe.ewm(com=10).mean() _ = air_temp_ewma.mean(1).plot() ``` -## wax numba ewma +## wax numba ewma ```python from wax.numba.ewma_numba import register_wax_numba @@ -149,7 +149,3 @@ output, state = dataset.wax.stream().apply( _ = output.isel(lat=0, lon=0).drop(["lat", "lon"]).to_dataframe().plot(figsize=(12, 8)) ``` -```python - -``` - diff --git a/docs/notebooks/01_demo_EWMA.py b/docs/notebooks/01_demo_EWMA.py index 088fb74..e7c3c9d 100644 --- a/docs/notebooks/01_demo_EWMA.py +++ b/docs/notebooks/01_demo_EWMA.py @@ -87,7 +87,7 @@ air_temp_ewma = dataframe.ewm(com=10).mean() _ = air_temp_ewma.mean(1).plot() -# ## wax numba ewma +# ## wax numba ewma from wax.numba.ewma_numba import register_wax_numba @@ -126,6 +126,3 @@ def my_custom_function(dataset): ) _ = output.isel(lat=0, lon=0).drop(["lat", "lon"]).to_dataframe().plot(figsize=(12, 8)) -# - - - From ab07e7f800c1ac9f76fb1e9eef9acbad20aa2099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 12:10:18 +0100 Subject: [PATCH 45/46] remove versions in docs requirements --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 4b0778b..1c1d975 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,9 +1,9 @@ # sphinx <4 required by myst-nb v0.12.0 (Feb 2021) # sphinx >=3 required by sphinx-autodoc-typehints v1.11.1 (Oct 2020) -sphinx >=3, <4 +sphinx sphinx_rtd_theme -sphinx-autodoc-typehints==1.11.1 -jupyter-sphinx>=0.3.2 +sphinx-autodoc-typehints +jupyter-sphinx myst-nb # Packages used for notebook execution matplotlib From a39583193b59f38261a33e59ee2613cda13c26f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20S=C3=A9ri=C3=A9?= Date: Fri, 25 Mar 2022 12:15:37 +0100 Subject: [PATCH 46/46] move docs requirements in setup.cfg --- docs/requirements.txt | 12 +----------- setup.cfg | 6 +++++- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 1c1d975..3ebadc3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,11 +1 @@ -# sphinx <4 required by myst-nb v0.12.0 (Feb 2021) -# sphinx >=3 required by sphinx-autodoc-typehints v1.11.1 (Oct 2020) -sphinx -sphinx_rtd_theme -sphinx-autodoc-typehints -jupyter-sphinx -myst-nb -# Packages used for notebook execution -matplotlib -sklearn -.[dev,complete] +.[dev,complete,docs] diff --git a/setup.cfg b/setup.cfg index d9d0952..d048633 100644 --- a/setup.cfg +++ b/setup.cfg @@ -82,13 +82,17 @@ docs = sphinx sphinxcontrib-napoleon sphinx_rtd_theme + sphinx-autodoc-typehints sphinx-autosummary-accessors ipython ipykernel jupyter-client + jupyter-sphinx + myst-nb nbsphinx scanpydoc - + matplotlib + sklearn [options.package_data] wax = py.typed