HSGP#

class pymc_marketing.mmm.hsgp.HSGP(**data)[fuente]#

Componente HSGP.

Ejemplos

Configuración recomendada de HSGP según la literatura:

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

from pymc_marketing.mmm import HSGP

seed = sum(map(ord, "Out of the box GP"))
rng = np.random.default_rng(seed)

n = 52
X = np.arange(n)

hsgp = HSGP.parameterize_from_data(
    X=X,
    dims="time",
)

dates = pd.date_range("2022-01-01", periods=n, freq="W-MON")
coords = {
    "time": dates,
}
prior = hsgp.sample_prior(coords=coords, random_seed=rng)
curve = prior["f"]
hsgp.plot_curve(curve, random_seed=rng)
plt.show()

(Source code, png, hires.png, pdf)

../../_images/pymc_marketing-mmm-hsgp-HSGP-1.png

Usando una base desmedida para eliminar el efecto de «intercepto» de la primera base:

import numpy as np
import pandas as pd
import xarray as xr

import matplotlib.pyplot as plt

from pymc_marketing.mmm import HSGP
from pymc_marketing.plot import plot_curve

seed = sum(map(ord, "Out of the box GP"))
rng = np.random.default_rng(seed)

n = 52
X = np.arange(n)

kwargs = dict(X=X, ls=25, eta=1, dims="time", m=200, L=150, drop_first=False)

hsgp = HSGP(demeaned_basis=False, **kwargs)
hsgp_demeaned = HSGP(demeaned_basis=True, **kwargs)

dates = pd.date_range("2022-01-01", periods=n, freq="W-MON")
coords = {"time": dates}

def sample_curve(hsgp):
    return hsgp.sample_prior(coords=coords, random_seed=rng)["f"]

non_demeaned = sample_curve(hsgp).rename("False")
demeaned = sample_curve(hsgp_demeaned).rename("True")

combined = xr.merge([non_demeaned, demeaned]).to_array("demeaned")
_, axes = combined.pipe(plot_curve, "time", same_axes=True)
axes[0].set(title="Demeaned the intercepty first basis")
plt.show()

(Source code, png, hires.png, pdf)

../../_images/pymc_marketing-mmm-hsgp-HSGP-2.png

HSGP con diferente función de covarianza

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

from pymc_marketing.mmm import HSGP

seed = sum(map(ord, "Change of covariance function"))
rng = np.random.default_rng(seed)

n = 52
X = np.arange(n)

hsgp = HSGP.parameterize_from_data(
    X=X,
    cov_func="matern32",
    dims="time",
)

dates = pd.date_range("2022-01-01", periods=n, freq="W-MON")
coords = {
    "time": dates,
}
prior = hsgp.sample_prior(coords=coords, random_seed=rng)
curve = prior["f"]
hsgp.plot_curve(curve, random_seed=rng)
plt.show()

(Source code, png, hires.png, pdf)

../../_images/pymc_marketing-mmm-hsgp-HSGP-3.png

HSGP con una función de enlace diferente a través del argumento transform

Nota

El parámetro transform debe estar registrado o provenir de los espacios de nombres pytensor.tensor o pymc.math. Consulte la pymc_extras.prior.register_tensor_transform()

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

from pymc_marketing.mmm import HSGP

seed = sum(map(ord, "Change of covariance function"))
rng = np.random.default_rng(seed)

n = 52
X = np.arange(n)

hsgp = HSGP.parameterize_from_data(
    X=X,
    dims="time",
    transform="sigmoid",
)

dates = pd.date_range("2022-01-01", periods=n, freq="W-MON")
coords = {
    "time": dates,
}
prior = hsgp.sample_prior(coords=coords, random_seed=rng)
curve = prior["f"]
hsgp.plot_curve(curve, random_seed=rng)
plt.show()

(Source code, png, hires.png, pdf)

../../_images/pymc_marketing-mmm-hsgp-HSGP-4.png

Nuevas predicciones de datos con HSGP

import numpy as np
import pandas as pd

import pymc as pm

import matplotlib.pyplot as plt

from pymc_marketing.mmm import HSGP
from pymc_extras.prior import Prior

seed = sum(map(ord, "New data predictions"))
rng = np.random.default_rng(seed)

eta = Prior("Exponential", lam=1)
ls = Prior("InverseGamma", alpha=2, beta=1)
hsgp = HSGP(
    eta=eta,
    ls=ls,
    m=20,
    L=150,
    dims=("time", "channel"),
)

n = 52
X = np.arange(n)

dates = pd.date_range("2022-01-01", periods=n, freq="W-MON")
coords = {"time": dates, "channel": ["A", "B"]}
with pm.Model(coords=coords) as model:
    data = pm.Data("data", X, dims="time")
    hsgp.register_data(data).create_variable("f")
    idata = pm.sample_prior_predictive(random_seed=rng)

prior = idata.prior

n_new = 10
X_new = np.arange(n, n + n_new)
new_dates = pd.date_range("2023-01-01", periods=n_new, freq="W-MON")

with model:
    pm.set_data(
        new_data={
            "data": X_new,
        },
        coords={"time": new_dates},
    )
    post = pm.sample_posterior_predictive(
        prior,
        var_names=["f"],
        random_seed=rng,
    )

chain, draw = 0, 50
colors = ["C0", "C1"]

def get_sample(curve):
    return curve.loc[chain, draw].to_series().unstack()

ax = prior["f"].pipe(get_sample).plot(color=colors)
post.posterior_predictive["f"].pipe(get_sample).plot(
    ax=ax, color=colors, linestyle="--", legend=False
)
ax.set(xlabel="time", ylabel="f", title="New data predictions")
plt.show()

(Source code)

HSGP de dimensiones superiores

import numpy as np
import pymc as pm

import matplotlib.pyplot as plt

from pymc_marketing.mmm import HSGP

seed = sum(map(ord, "Higher dimensional HSGP"))
rng = np.random.default_rng(seed)

n = 52
X = np.arange(n)

hsgp = HSGP.parameterize_from_data(
    X=X,
    dims=("time", "channel", "product"),
)

coords = {
    "time": range(n),
    "channel": ["A", "B"],
    "product": ["X", "Y", "Z"],
}
prior = hsgp.sample_prior(coords=coords, random_seed=rng)
curve = prior["f"]
fig, _ = hsgp.plot_curve(
    curve,
    random_seed=rng,
    subplot_kwargs={"figsize": (12, 8), "ncols": 3},
)
fig.suptitle("Higher dimensional HSGP prior")
plt.show()

(Source code, png, hires.png, pdf)

../../_images/pymc_marketing-mmm-hsgp-HSGP-6.png

Métodos

HSGP.__init__(**data)

Cree un nuevo modelo analizando y validando los datos de entrada de los argumentos de palabras clave.

HSGP.construct([_fields_set])

HSGP.copy(*[, incluir, excluir, actualizar, profundo])

Devuelve una copia del modelo.

HSGP.create_variable(name[, xdist])

Cree una variable a partir de la configuración de HSGP.

HSGP.deterministics_to_replace%(name)s

Nombre de las variables determinísticas que se reemplazan con pm.Flat para fuera de muestra.

HSGP.dict(*[, incluir, excluir, por_alias, ...])

HSGP.from_dict(datos)

Cree un objeto a partir de un diccionario.

HSGP.from_orm(obj)

HSGP.json(*[, incluir, excluir, por_alias, ...])

HSGP.model_construct([_fields_set])

Crea una nueva instancia de la clase Model con datos validados.

HSGP.model_copy(*[, actualizar, profundo])

!!! abstract "Documentación de Uso"

HSGP.model_dump(*[, modo, incluir, excluir, ...])

!!! abstract "Documentación de Uso"

HSGP.model_dump_json(*[, indent, ...])

!!! abstract "Documentación de Uso"

HSGP.model_json_schema([por_alias, ...])

Genera un esquema JSON para una clase de modelo.

HSGP.model_parametrized_name(params)

Calcule el nombre de la clase para parametrizaciones de clases genéricas.

HSGP.model_post_init(contexto, /)

Sobrescriba este método para realizar una inicialización adicional después de __init__ y model_construct.

HSGP.model_rebuild(*[, forzar, raise_errors, ...])

Intente reconstruir el esquema de pydantic-core para el modelo.

HSGP.model_validate(obj, *[, estricto, extra, ...])

Valide una instancia de modelo pydantic.

HSGP.model_validate_json(json_data, *[, ...])

!!! abstract "Documentación de Uso"

HSGP.model_validate_strings(obj, *[, ...])

Valide el objeto dado con datos de cadena contra el modelo de Pydantic.

HSGP.parameterize_from_data(X, dims[, ...])

Cree un HSGP informado por los datos con recomendaciones basadas en la literatura.

HSGP.parse_file(ruta, *[, tipo_de_contenido, ...])

HSGP.parse_obj(obj)

HSGP.parse_raw(b, *[, tipo_de_contenido, ...])

HSGP.plot_curve(curve[, n_samples, ...])

Dibuje la curva.

HSGP.register_data(X)

Registre los datos que se utilizarán en el modelo.

HSGP.sample_prior([coords])

Muestra de la distribución previa.

HSGP.schema([por_alias, ref_template])

HSGP.schema_json(*[, por_alias, ref_template])

HSGP.to_dict()

Convierte el objeto a un diccionario.

HSGP.update_forward_refs(**localns)

HSGP.validate(valor)

Atributos

model_computed_fields

model_config

Configuración para el modelo, debe ser un diccionario que cumpla con [ConfigDict][pydantic.config.ConfigDict].

model_extra

Obtener campos adicionales establecidos durante la validación.

model_fields

model_fields_set

Devuelve el conjunto de campos que han sido establecidos explícitamente en esta instancia del modelo.

ls

eta

L

centered

drop_first

cov_func

m

X

X_mid

dims

transform

demeaned_basis