|
|
import numpy as np
|
|
|
import pandas as pd
|
|
|
|
|
|
|
|
|
def generate_synthetic_sku(
|
|
|
n_periods: int = 52,
|
|
|
base_price: float = 10.0,
|
|
|
base_demand: float = 120.0,
|
|
|
elasticity: float = -1.5,
|
|
|
noise_std: float = 0.1,
|
|
|
seed: int = 42,
|
|
|
) -> pd.DataFrame:
|
|
|
"""
|
|
|
Generate a single-SKU synthetic price–demand time series.
|
|
|
Elasticity is constant and known (ground truth).
|
|
|
"""
|
|
|
rng = np.random.default_rng(seed)
|
|
|
|
|
|
|
|
|
prices = base_price * (1 + rng.normal(0, 0.15, size=n_periods))
|
|
|
prices = np.clip(prices, base_price * 0.6, base_price * 1.4)
|
|
|
|
|
|
|
|
|
noise = np.exp(rng.normal(0, noise_std, size=n_periods))
|
|
|
demand = base_demand * (prices ** elasticity) * noise
|
|
|
|
|
|
df = pd.DataFrame(
|
|
|
{
|
|
|
"t": np.arange(n_periods),
|
|
|
"price": prices,
|
|
|
"qty": demand,
|
|
|
}
|
|
|
)
|
|
|
|
|
|
return df
|
|
|
|